diff --git a/README.md b/README.md index 0847023..4176ffa 100644 --- a/README.md +++ b/README.md @@ -33,4 +33,5 @@ Le projet est actuellement fonctionnel. Il reste des tweaks à faire pour que les effets marchent comme je le désire mais ça fonctionne. TODO: changer le mqtt light par un mqtt_json, cela permettrais d'avoir un truc un peu "normal". Il existe de nombreux exemples sur le net pour esp qu'il devrait être très simple d'intégrer. TODO: Utiliser ArduinoOTA pour gérer les mises à jours sans fil. -TODO: Si le strip est démarré avant HA, HA n'arrive pas à trouver son état. Surement une question de persistance sur le topic +TODO: passer sur mqtt_json : l'envoi de l'état ne prends qu'un appel tout comme la réception, bien plus rapide +TODO: firep => l'esp se mets en affichage error ?! diff --git a/arduino/mqttfastledmenu/mqttfastledmenu.cpp b/arduino/mqttfastledmenu/mqttfastledmenu.cpp index c4a2d05..dc2e2f5 100644 --- a/arduino/mqttfastledmenu/mqttfastledmenu.cpp +++ b/arduino/mqttfastledmenu/mqttfastledmenu.cpp @@ -10,6 +10,7 @@ #include "mqttfastledmenu.h" // LED +// En déplaçant ces vars dans le .h + init dans le setup, cylon crash au moment du premier retour ?! int brightness = LED_BRIGHTNESS_DEFAULT; int color = LED_COLOR_DEFAULT; int speed = LED_SPEED_DEFAULT; @@ -24,7 +25,6 @@ WiFiClient espClient; char message_buff[100]; PubSubClient client(espClient); - void setup() { Serial.begin(SERIAL_SPEED); @@ -33,32 +33,42 @@ void setup() // WIFI setupWifi(); + // LED + /* + brightness = LED_BRIGHTNESS_DEFAULT; + color = LED_COLOR_DEFAULT; + speed = LED_SPEED_DEFAULT; + ledEffect = LED_EFFECT_ERROR; + ledState = false; + */ + + LEDS.addLeds(leds, LED_NUM).setCorrection(TypicalSMD5050); + ledBlackAll(); + FastLED.setBrightness(brightness); + + //////////////////////////////// ColorPalette /////////////////////////////// + currentPalette = RainbowColors_p; + currentBlending = LINEARBLEND; + //////////////////////////////// ColorPalette /////////////////////////////// + // MQTT client.setServer(MQTT_SERVER, MQTT_PORT); client.setCallback(callbackMQTT); testConnectMQTT(); - // LED - LEDS.addLeds(leds, LED_NUM).setCorrection(TypicalSMD5050); - ledBlackAll(); - FastLED.setBrightness(brightness); Serial.println("Ready"); /* MQTT * Il est important de faire un loop avant toute chose, * afin de récupérer les valeurs provenant du broker mqtt * et pas démarrer avec de vieilles infos. + * Il faut un certains nombres de tentative pour tout récuperer. */ for (short int i = 0; i < 10; i++) { delay(200); client.loop(); } - //////////////////////////////// ColorPalette /////////////////////////////// - currentPalette = RainbowColors_p; - currentBlending = LINEARBLEND; - //////////////////////////////// ColorPalette /////////////////////////////// - Serial.println("End of setup"); } @@ -85,12 +95,20 @@ void testConnectMQTT() while (!client.connected()) { Serial.print("Connexion au serveur MQTT... "); if (client.connect("ESP8266Client", MQTT_USER, MQTT_PASS)) { + Serial.print("OK\nSend Current State"); + mqttSendState(); + mqttSendSpeedState(); + mqttSendBrightnessState(); + mqttSendEffectState(); + mqttSendColorState(); + Serial.print("OK\nSubscribe"); client.subscribe(MQTT_LED_COMMAND); client.subscribe(MQTT_LED_EFFECT_COMMAND); client.subscribe(MQTT_LED_BRIGHTNESS_COMMAND); client.subscribe(MQTT_LED_SPEED_COMMAND); client.subscribe(MQTT_LED_COLOR_COMMAND); + Serial.println(" OK"); } else { Serial.print("KO, erreur : "); @@ -119,21 +137,20 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) if (stopic == MQTT_LED_COMMAND) { if (msgString == "ON") { ledState = true; - client.publish(MQTT_LED_STATE, message_buff, true); } else { ledState = false; ledBlackAll(); - client.publish(MQTT_LED_STATE, message_buff, true); } + mqttSendState(); } else if (stopic == MQTT_LED_EFFECT_COMMAND) { // Si on ne repasse pas tout à noir, cela peut faire des effets surprenants ledBlackAll(); ledEffect = msgString; - client.publish(MQTT_LED_EFFECT_STATE, message_buff, true); + mqttSendEffectState(); } else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) { brightness = msgString.toInt(); FastLED.setBrightness(brightness); - client.publish(MQTT_LED_BRIGHTNESS_STATE, message_buff, true); + mqttSendBrightnessState(); } else if (stopic == MQTT_LED_COLOR_COMMAND) { // Sample : 134,168,255 int red = msgString.substring(0, msgString.indexOf(',')).toInt(); @@ -141,13 +158,50 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) int blue = msgString.substring(msgString.lastIndexOf(',') + 1).toInt(); color=((red <<16)|(green <<8)|blue); - client.publish(MQTT_LED_COLOR_STATE, message_buff, true); + mqttSendColorState(); } else if (stopic == MQTT_LED_SPEED_COMMAND) { speed = msgString.toInt(); - client.publish(MQTT_LED_SPEED_STATE, message_buff, true); + mqttSendSpeedState(); } } +void mqttSendState() +{ + client.publish(MQTT_LED_STATE, (ledState) ? "ON": "OFF", true); +} + +void mqttSendEffectState() +{ + char buff[ledEffect.length() + 1]; + ledEffect.toCharArray(buff, ledEffect.length() + 1); + client.publish(MQTT_LED_EFFECT_STATE, buff, true); +} + +void mqttSendBrightnessState() +{ + char buff[4]; + itoa(brightness, buff, 10); + client.publish(MQTT_LED_BRIGHTNESS_STATE, buff, true); +} + +void mqttSendSpeedState() +{ + char buff[4]; + itoa(speed, buff, 10); + client.publish(MQTT_LED_SPEED_STATE, buff, true); +} + +void mqttSendColorState() +{ + int red = color>>16 & 0xFF; + int green = color>>8 & 0xFF; + int blue = color & 0xFF; + char buff[12]; + + sprintf(buff, "%i,%i,%i", red, green, blue); + client.publish(MQTT_LED_COLOR_STATE, buff, true); +} + // LED /** * Coupe tout le strip de led. @@ -164,13 +218,13 @@ void ledBlackAll() */ void ledCylon() { - for(int i = 0; i < LED_NUM; i++) { + for (int i = 0; i < LED_NUM; i++) { client.loop(); if (ledEffect != LED_EFFECT_CYLON) { return; } - + if ((i - 3) >= 0) { leds[i - 3] = CRGB::Black; } @@ -198,25 +252,22 @@ void ledCylon() FastLED.delay(1000 / speed); } - // Il faut nettoyer certaines cases avant la prochaine loop -if ((LED_NUM - 2) >= 0) { - leds[LED_NUM - 2] = color; - leds[LED_NUM - 2].fadeLightBy(220); - } + if ((LED_NUM - 2) >= 0) { + leds[LED_NUM - 2] = color; + leds[LED_NUM - 2].fadeLightBy(220); + } if ((LED_NUM - 1) >= 0 ) { leds[LED_NUM - 1] = CRGB::Black; } FastLED.show(); // led[0] et led[255] sont gérées par la loop précédante - for(int i = LED_NUM - 1; i >= 0; i--) { + for (int i = LED_NUM - 1; i >= 0; i--) { client.loop(); - if (ledEffect != LED_EFFECT_CYLON) { return; } - if ((i - 1) >= 0) { leds[i - 1] = color; leds[i - 1].fadeLightBy(249); @@ -228,14 +279,15 @@ if ((LED_NUM - 2) >= 0) { leds[i + 1] = color; leds[i + 1].fadeLightBy(200); } + if ((i + 2) <= LED_NUM) { leds[i + 2] = color; leds[i + 2].fadeLightBy(220); } + if ((i + 3) <= LED_NUM) { leds[i + 3] = CRGB::Black; } - FastLED.delay(1000 / speed); } // Il faut nettoyer certaines cases avant la prochaine loop @@ -279,8 +331,8 @@ void ledFullColor() // 0.36787944 ?? censé correspondre au minimum // 108.4 ?? censé correspondre au maximum int breath = (exp(sin(millis() / 2000.0 * PI)) - 0.3678794) * 108.4; - Serial.print(breath); - Serial.println(" / 255"); + //Serial.print(breath); + //Serial.println(" / 255"); FastLED.setBrightness(breath); FastLED.delay(100 / speed); } diff --git a/arduino/mqttfastledmenu/mqttfastledmenu.example.h b/arduino/mqttfastledmenu/mqttfastledmenu.example.h index 2ee2ea4..28dfc89 100644 --- a/arduino/mqttfastledmenu/mqttfastledmenu.example.h +++ b/arduino/mqttfastledmenu/mqttfastledmenu.example.h @@ -4,6 +4,7 @@ #define LED_NUM 300 #define LED_PIN 5 // = D1 #define LED_CHIPSET WS2812B +// TODO: https://github.com/bruhautomation/ESP-MQTT-JSON-Digital-LEDs/blob/master/ESP_MQTT_Digital_LEDs/ESP_MQTT_Digital_LEDs.ino#L175 essayer BGR #define LED_COLOR_ORDER GRB #define LED_BRIGHTNESS_DEFAULT 96 #define LED_SPEED_DEFAULT 120 @@ -37,9 +38,15 @@ #define MQTT_LED_COLOR_COMMAND "strip1/color/switch" #define MQTT_LED_COLOR_STATE "strip1/color/status" + void setupWifi(); void testConnectMQTT(); void callbackMQTT(char* topic, byte* payload, unsigned int length); +void mqttSendState(); +void mqttSendEffectState(); +void mqttSendBrightnessState(); +void mqttSendSpeedState(); +void mqttSendColorState(); void ledBlackAll(); void ledCylon(); void ledError();