diff --git a/README.md b/README.md index 3b8de48..0e80c23 100644 --- a/README.md +++ b/README.md @@ -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 \ No newline at end of file diff --git a/Software/src/main.cpp b/Software/src/main.cpp index a541d49..fd4a3a5 100644 --- a/Software/src/main.cpp +++ b/Software/src/main.cpp @@ -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); @@ -26,7 +47,7 @@ void setup_wifi() WiFi.mode(WIFI_STA); WiFi.begin(WLAN_SSID, WLAN_PASS); - while (WiFi.status() != WL_CONNECTED) + while (WiFi.status() != WL_CONNECTED) { delay(500); } @@ -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_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 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 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 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 0 && led_color[value_walk_fill - 1][0] == MODE_WALK) + { + u_int32_t segment_color = pixels.Color(0, 0, 0); + for(e=0; e