Added: Effects and Limit

This commit is contained in:
TheJoKlLa 2023-02-26 00:44:26 +01:00
parent ae05cf14a1
commit e187036c0f
2 changed files with 290 additions and 12 deletions

View File

@ -3,7 +3,11 @@ MQTT Topics:
FABPELID is 5 Digits
SEGMENTID is 5 Digits
fabpel/FABPELID/SEGMENTID/set_color : Set Segment Color
fabpel/FABPELID/SEGMENTID/static : Set Segment Color - Static Mode
fabpel/FABPELID/SEGMENTID/pulse : Set Segment Color - Pulse Mode
fabpel/FABPELID/SEGMENTID/blink : Set Segment Color - Blink Mode
fabpel/FABPELID/SEGMENTID/fill : Set Segment Color - Fill Mode
fabpel/FABPELID/SEGMENTID/walk : Set Segment Color - Walk Mode
Payload == 3 Byte (R/G/B)
fabpel/FABPELID/buzzer : Set State of Buzzer
@ -12,3 +16,12 @@ Payload == 0 -> OFF
fabpel/FABPELID/clear : Clear LEDs
Payload == 0
# Power Consumption
0,395A (3,105V) = 1,22W
# Temperature (21°C)
0xFF = 69°C
0xCC = 63°C
0xAA = 60°C
0x88 = 53°C

View File

@ -6,11 +6,18 @@
#define PIN_BUZZER D2
#define PIN_LED D3
#define MODE_OFF 0
#define MODE_STATIC 1
#define MODE_PULSE 2
#define MODE_BLINK 3
#define MODE_FILL 4
#define MODE_WALK 5
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_NeoPixel pixels(SEGMENT_COUNT * 2, PIN_LED, NEO_GRB + NEO_KHZ800);
unsigned long lastMsg = 0;
unsigned long last_timeMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
@ -18,6 +25,20 @@ char msg[MSG_BUFFER_SIZE];
char topic_recv[TOPIC_BUFFER_SIZE];
char topic_send[TOPIC_BUFFER_SIZE];
byte led_color[SEGMENT_COUNT][4];
byte limit(byte value)
{
if(value > LIMIT)
{
return LIMIT;
}
else
{
return value;
}
}
void setup_wifi()
{
delay(10);
@ -37,10 +58,15 @@ void callback(char* topic, byte* payload, unsigned int length)
Serial.println("Receive message");
int topic_len = (int)strlen(topic);
int set_color_len = (int)strlen("/set_color");
int mode_static_len = (int)strlen("/static");
int mode_pulse_len = (int)strlen("/pulse");
int mode_blink_len = (int)strlen("/blink");
int mode_fill_len = (int)strlen("/fill");
int mode_walk_len = (int)strlen("/walk");
int buzzer_len = (int)strlen("/buzzer");
int clear_len = (int)strlen("/clear");
if(!strcmp(topic + topic_len - set_color_len, "/set_color"))
int i = 0;
if(!strcmp(topic + topic_len - mode_static_len, "/static"))
{
if(length != 3)
{
@ -48,7 +74,34 @@ void callback(char* topic, byte* payload, unsigned int length)
}
char str_id[6] = {0};
strncpy(str_id, topic + topic_len - set_color_len - 5, 5);
strncpy(str_id, topic + topic_len - mode_static_len - 5, 5);
int id = atoi(str_id);
if(id > SEGMENT_COUNT)
{
return;
}
for(i=0; i<SEGMENT_LENGTH; i++)
{
pixels.setPixelColor(id * SEGMENT_LENGTH+ i, pixels.Color(limit(payload[0]), limit(payload[1]), limit(payload[2])));
}
pixels.show();
led_color[id][0] = MODE_STATIC;
led_color[id][1] = limit(payload[0]);
led_color[id][2] = limit(payload[1]);
led_color[id][3] = limit(payload[2]);
}
if(!strcmp(topic + topic_len - mode_pulse_len, "/pulse"))
{
if(length != 3)
{
return;
}
char str_id[6] = {0};
strncpy(str_id, topic + topic_len - mode_pulse_len - 5, 5);
int id = atoi(str_id);
if(id > SEGMENT_COUNT)
@ -56,9 +109,76 @@ void callback(char* topic, byte* payload, unsigned int length)
return;
}
pixels.setPixelColor(id * 2, pixels.Color(payload[0], payload[1], payload[2]));
pixels.setPixelColor(id * 2 + 1, pixels.Color(payload[0], payload[1], payload[2]));
pixels.show();
led_color[id][0] = MODE_PULSE;
led_color[id][1] = limit(payload[0]);
led_color[id][2] = limit(payload[1]);
led_color[id][3] = limit(payload[2]);
}
if(!strcmp(topic + topic_len - mode_blink_len, "/blink"))
{
if(length != 3)
{
return;
}
char str_id[6] = {0};
strncpy(str_id, topic + topic_len - mode_blink_len - 5, 5);
int id = atoi(str_id);
if(id > SEGMENT_COUNT)
{
return;
}
led_color[id][0] = MODE_BLINK;
led_color[id][1] = limit(payload[0]);
led_color[id][2] = limit(payload[1]);
led_color[id][3] = limit(payload[2]);
}
if(!strcmp(topic + topic_len - mode_fill_len, "/fill"))
{
if(length != 3)
{
return;
}
char str_id[6] = {0};
strncpy(str_id, topic + topic_len - mode_fill_len - 5, 5);
int id = atoi(str_id);
if(id > SEGMENT_COUNT)
{
return;
}
led_color[id][0] = MODE_FILL;
led_color[id][1] = limit(payload[0]);
led_color[id][2] = limit(payload[1]);
led_color[id][3] = limit(payload[2]);
}
if(!strcmp(topic + topic_len - mode_walk_len, "/walk"))
{
if(length != 3)
{
return;
}
char str_id[6] = {0};
strncpy(str_id, topic + topic_len - mode_walk_len - 5, 5);
int id = atoi(str_id);
if(id > SEGMENT_COUNT)
{
return;
}
led_color[id][0] = MODE_WALK;
led_color[id][1] = limit(payload[0]);
led_color[id][2] = limit(payload[1]);
led_color[id][3] = limit(payload[2]);
}
if(!strcmp(topic + topic_len - buzzer_len, "/buzzer"))
@ -82,6 +202,14 @@ void callback(char* topic, byte* payload, unsigned int length)
{
pixels.clear();
pixels.show();
for(int i=0; i<SEGMENT_COUNT; i++)
{
led_color[i][0] = MODE_OFF;
led_color[i][1] = 0;
led_color[i][2] = 0;
led_color[i][3] = 0;
}
}
}
@ -105,7 +233,15 @@ void reconnect()
}
if (connected)
{
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/+/set_color", FABPELID);
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/+/static", FABPELID);
client.subscribe(topic_recv);
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/+/pulse", FABPELID);
client.subscribe(topic_recv);
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/+/blink", FABPELID);
client.subscribe(topic_recv);
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/+/walk", FABPELID);
client.subscribe(topic_recv);
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/+/fill", FABPELID);
client.subscribe(topic_recv);
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/buzzer", FABPELID);
client.subscribe(topic_recv);
@ -124,8 +260,6 @@ void reconnect()
void setup()
{
int i = 0;
Serial.begin(115200);
Serial.println();
@ -141,11 +275,142 @@ void setup()
pinMode(PIN_BUZZER, OUTPUT);
}
#define PATTERN_TIME 3000
#define BLINK_COUNT 6
unsigned long last_time_blink = 0;
unsigned long last_time_pulse = 0;
unsigned long last_time_walk_fill = 0;
int refresh_pulse = PATTERN_TIME / 2 / 255;
int refresh_blink = PATTERN_TIME / BLINK_COUNT;
int refresh_walk_fill = PATTERN_TIME / SEGMENT_COUNT;
int value_blink = 0;
int value_pulse = 0;
int value_walk_fill = 0;
int direction_pulse = 0;
void loop()
{
int i, e;
if (!client.connected())
{
reconnect();
}
client.loop();
// BLINK
if(millis() > last_time_blink + refresh_blink)
{
last_time_blink = millis();
value_blink = value_blink == 0 ? 1 : 0;
for(i=0; i < SEGMENT_COUNT; i++)
{
if(led_color[i][0] == MODE_BLINK)
{
u_int32_t segment_color = pixels.Color(led_color[i][1]*value_blink,led_color[i][2]*value_blink,led_color[i][3]*value_blink);
for(e=0; e<SEGMENT_LENGTH; e++)
{
pixels.setPixelColor(i * SEGMENT_LENGTH + e, segment_color);
}
}
}
pixels.show();
}
// PULSE
if(millis() > last_time_pulse + refresh_pulse)
{
last_time_pulse = millis();
if(direction_pulse == 0)
{
value_pulse--;
if(value_pulse <= 0)
{
direction_pulse = 1;
}
}
else
{
value_pulse++;
if(value_pulse >= 255)
{
direction_pulse = 0;
}
}
for(i=0; i < SEGMENT_COUNT; i++)
{
if(led_color[i][0] == MODE_PULSE)
{
u_int32_t segment_color = pixels.Color((value_pulse*led_color[i][1])/255, (value_pulse*led_color[i][2])/255, (value_pulse*led_color[i][3])/255);
for(e=0; e<SEGMENT_LENGTH; e++)
{
pixels.setPixelColor(i * SEGMENT_LENGTH + e, segment_color);
}
}
}
pixels.show();
}
// WALK or FILL
if(millis() > last_time_walk_fill + refresh_walk_fill)
{
last_time_walk_fill = millis();
if(value_walk_fill >= SEGMENT_COUNT)
{
value_walk_fill = 0;
for(i=0; i < SEGMENT_COUNT; i++)
{
if(led_color[i][0] == MODE_FILL)
{
u_int32_t segment_color = pixels.Color(0, 0, 0);
for(e=0; e<SEGMENT_LENGTH; e++)
{
pixels.setPixelColor(i * SEGMENT_LENGTH + e, segment_color);
}
}
}
}
else
{
value_walk_fill++;
if(value_walk_fill == SEGMENT_COUNT)
{
for(i=0; i < SEGMENT_COUNT; i++)
{
if(led_color[i][0] == MODE_FILL)
{
u_int32_t segment_color = pixels.Color(0, 0, 0);
for(e=0; e<SEGMENT_LENGTH; e++)
{
pixels.setPixelColor(i * SEGMENT_LENGTH + e, segment_color);
}
}
}
}
}
if(led_color[value_walk_fill][0] == MODE_FILL || led_color[value_walk_fill][0] == MODE_WALK)
{
u_int32_t segment_color = pixels.Color(led_color[value_walk_fill][1], led_color[value_walk_fill][2], led_color[value_walk_fill][3]);
for(e=0; e<SEGMENT_LENGTH; e++)
{
pixels.setPixelColor(value_walk_fill * SEGMENT_LENGTH + e, segment_color);
}
}
if(value_walk_fill > 0 && led_color[value_walk_fill - 1][0] == MODE_WALK)
{
u_int32_t segment_color = pixels.Color(0, 0, 0);
for(e=0; e<SEGMENT_LENGTH; e++)
{
pixels.setPixelColor((value_walk_fill - 1) * SEGMENT_LENGTH + e, segment_color);
}
}
pixels.show();
}
}