mirror of
https://gitlab.com/fabinfra/fabhardware/fabpel.git
synced 2025-03-12 22:51:43 +01:00
Added: Effects and Limit
This commit is contained in:
parent
ae05cf14a1
commit
e187036c0f
15
README.md
15
README.md
@ -3,7 +3,11 @@ MQTT Topics:
|
|||||||
FABPELID is 5 Digits
|
FABPELID is 5 Digits
|
||||||
SEGMENTID 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)
|
Payload == 3 Byte (R/G/B)
|
||||||
|
|
||||||
fabpel/FABPELID/buzzer : Set State of Buzzer
|
fabpel/FABPELID/buzzer : Set State of Buzzer
|
||||||
@ -12,3 +16,12 @@ Payload == 0 -> OFF
|
|||||||
|
|
||||||
fabpel/FABPELID/clear : Clear LEDs
|
fabpel/FABPELID/clear : Clear LEDs
|
||||||
Payload == 0
|
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
|
@ -6,11 +6,18 @@
|
|||||||
#define PIN_BUZZER D2
|
#define PIN_BUZZER D2
|
||||||
#define PIN_LED D3
|
#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;
|
WiFiClient espClient;
|
||||||
PubSubClient client(espClient);
|
PubSubClient client(espClient);
|
||||||
Adafruit_NeoPixel pixels(SEGMENT_COUNT * 2, PIN_LED, NEO_GRB + NEO_KHZ800);
|
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)
|
#define MSG_BUFFER_SIZE (50)
|
||||||
char msg[MSG_BUFFER_SIZE];
|
char msg[MSG_BUFFER_SIZE];
|
||||||
|
|
||||||
@ -18,6 +25,20 @@ char msg[MSG_BUFFER_SIZE];
|
|||||||
char topic_recv[TOPIC_BUFFER_SIZE];
|
char topic_recv[TOPIC_BUFFER_SIZE];
|
||||||
char topic_send[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()
|
void setup_wifi()
|
||||||
{
|
{
|
||||||
delay(10);
|
delay(10);
|
||||||
@ -37,10 +58,15 @@ void callback(char* topic, byte* payload, unsigned int length)
|
|||||||
Serial.println("Receive message");
|
Serial.println("Receive message");
|
||||||
|
|
||||||
int topic_len = (int)strlen(topic);
|
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 buzzer_len = (int)strlen("/buzzer");
|
||||||
int clear_len = (int)strlen("/clear");
|
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)
|
if(length != 3)
|
||||||
{
|
{
|
||||||
@ -48,7 +74,34 @@ void callback(char* topic, byte* payload, unsigned int length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char str_id[6] = {0};
|
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);
|
int id = atoi(str_id);
|
||||||
|
|
||||||
if(id > SEGMENT_COUNT)
|
if(id > SEGMENT_COUNT)
|
||||||
@ -56,9 +109,76 @@ void callback(char* topic, byte* payload, unsigned int length)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pixels.setPixelColor(id * 2, pixels.Color(payload[0], payload[1], payload[2]));
|
led_color[id][0] = MODE_PULSE;
|
||||||
pixels.setPixelColor(id * 2 + 1, pixels.Color(payload[0], payload[1], payload[2]));
|
led_color[id][1] = limit(payload[0]);
|
||||||
pixels.show();
|
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"))
|
if(!strcmp(topic + topic_len - buzzer_len, "/buzzer"))
|
||||||
@ -82,6 +202,14 @@ void callback(char* topic, byte* payload, unsigned int length)
|
|||||||
{
|
{
|
||||||
pixels.clear();
|
pixels.clear();
|
||||||
pixels.show();
|
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)
|
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);
|
client.subscribe(topic_recv);
|
||||||
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/buzzer", FABPELID);
|
snprintf (topic_recv, TOPIC_BUFFER_SIZE, "fabpel/%05d/buzzer", FABPELID);
|
||||||
client.subscribe(topic_recv);
|
client.subscribe(topic_recv);
|
||||||
@ -124,8 +260,6 @@ void reconnect()
|
|||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
@ -141,11 +275,142 @@ void setup()
|
|||||||
pinMode(PIN_BUZZER, OUTPUT);
|
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()
|
void loop()
|
||||||
{
|
{
|
||||||
|
int i, e;
|
||||||
|
|
||||||
if (!client.connected())
|
if (!client.connected())
|
||||||
{
|
{
|
||||||
reconnect();
|
reconnect();
|
||||||
}
|
}
|
||||||
client.loop();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user