diff --git a/README.md b/README.md new file mode 100644 index 0000000..8563497 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# MQTT Lampe ADN # +Programme ESP8266 permettant de faire réagire une double colonne de leds (leds strip) en fonction d'un message MQTT envoyé par un brocker. + +Le nombre de leds est paramétrable. + +La partie brocker n'est pas inclus dans le présent programme. + + +# Fonctionnement # +## Connection Wifi ## +La connection wifi est gérée par l'extension **WIFI manager**. + +Si la connexion échoue, on lance un Access Point (AP) qui est visible dans les réseaux WIFI +Il faut alors se connecter avec un smarthpone sur l'AP pour configurer le Wifi en lui saisissant son SSID et le Mot de passe, +le NodeMCU reboot et se connecte avec le SSID et mot de passe saisie. Une fois, ces identifiants saisies, l'ESP8266 est déclaré sur le réseau et il ne sera plus nécessaire de les saisir. + +Peux importe l'adresse IP de l'ESP8266, elle n'est pas utile pour recevoir des messages MQTT (sauf si un filtrage est mis en place au niveau du brocker, mais cette documentation ne couvre pas cette partie). + +## MQTT ## +L'adresse IP du brocker MQTT doit être définie dans le fichier MQTT.h + +Les messages MQTT interprétés doivent être dans les topics: + +- lumiere/lampeADN [ON|OFF] : Allumage de la barre de LEDS. +- lumiere/color/lampeADN (R,V,B) : Changement de couleur des LEDS. +- lumiere/brightness/lampeADN value : luminosité [0-255] +- lumiere/animation/lampeADN value : ID de l'animation [0-6] +- lumiere/allume/lampeADN value : Allummage des leds du bas vers le haut (en %) 0 = aucune, 100 = toutes + + + +# Mise à jour OTA # +TODO + +Bien que cela soit possible il n'est pas nécessaire de brancher l'ESP8266 sur un port USB pour le mettre à jour, une simple connexion wifi suffi. +La mise à jour se fait un uploadant le firmware compilé dans l'ESP via son URL OTA. + + + + + + + + + +--- +title: MQTT Lampe ADN +subtitle: Changeur de couleur LEDS dans la lampe ADN en fonction de messages MQTT +lang: fre +author: Alexandre PERETJATKO +language: C (Arduino) +hardware: Node MCU ESP8266 +website: https://git.alex-design.fr/Alex/MQTT-leds-color.git +... \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index e0a3365..20dd2e5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,4 +17,7 @@ framework = arduino lib_deps = adafruit/Adafruit NeoPixel@^1.10.4 knolleary/PubSubClient@^2.8 - tzapu/WiFiManager@^0.16.0 + tzapu/WiFiManager @ ^0.16.0 + me-no-dev/ESPAsyncTCP @ ^1.2.2 + me-no-dev/ESP Async WebServer @ ^1.2.3 + ayushsharma82/AsyncElegantOTA @ ^2.2.7 diff --git a/src/main.cpp b/src/main.cpp index 57b8361..a564fef 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,16 +6,16 @@ // - de lancer une animation des LEDS. // // Le programme se branche en WIFI sur un broker MQTT et réagi au topics : -// lumiere/ [ON|OFF] : Allumage de la barre de LEDS. -// lumiere/color/ (R,V,B) : Changement de couleur des LEDS. -// lumiere/animation/[1/2/3/4/5/6] : Animation des LEDS. +// lumiere/lampeADN [ON|OFF] : Allumage de la barre de LEDS. +// lumiere/color/lampeADN (R,V,B) : Changement de couleur des LEDS. +// lumiere/brightness/lampeADN value : luminosité [0-255] +// lumiere/animation/lampeADN value : ID de l'animation [0-6] +// lumiere/allume/lampeADN value : Allummage des leds du bas vers le haut (en %) 0= aucune, 100 =) toutes // --------------------------------------------------------------------------------------- #include -#define ModeDebug +//#define ModeDebug -// Pour une mise en prod, ne pas oublier de mettre writeToEEPROM = false -const String firmwareActualVersion = "1.2.20"; -const boolean writeToEEPROM = false; // Si = true, écrit en EEPROM et affiche les traces de debug de wifimanager (default = false) +const String firmwareActualVersion = "1.0.0"; #ifdef ModeDebug #define DEBUG(message) \ @@ -30,32 +30,22 @@ const boolean writeToEEPROM = false; // Si = true, écrit en EEPROM et affiche l #endif -#include -#include -WiFiManager wifiManager; -// Define memory size we want to define (1 bytes / caract) for EPPROM storage -#define EEPROM_LEDS_SIZE 3 -#define EEPROM_DEVICEID_SIZE 15 +#include //https://github.com/tzapu/WiFiManager +WiFiManager wifiManager; // Customisation du nom du module ESP -#define HOSTNAME "ESP8266-" // Pour la connection Wifi (doit être unique) +#define HOSTNAME "LampeADN-" char HostName[16]; -// Pour répondre au topic MQTT [portal|barreverticale] -char DeviceID[EEPROM_DEVICEID_SIZE] = "portal"; // N'est pris en compte que si writeToEEPROM = true (car sinon on lit la valeur provenant de l'EEPROM) +// Pour répondre au topic MQTT [portal|barreverticale|lampeADN] +#define DEVICEID_SIZE 15 +char DeviceID[DEVICEID_SIZE] = "lampeADN"; -// EEPROM ( pour stockage du nombre de leds ) -// ESP 2C:F4:32:77:3C:3B -> 125 leds (chemin de table) -// ESP 2C:F4:32:77:5F:07 -> 64 leds (barre verticale) -// ESP 2C:F4:32:77:31:8B -> 63 leds -// ESP 30:83:98:82:6A:6F -> 10 leds (portal) -// ESP 192.168.1.71 -> 50 leds (Sapin de noel) -int LED_COUNT = 66; // N'est pris en compte que si writeToEEPROM = true (car sinon on lit la valeur provenant de l'EEPROM) -#include "my_EEPROM.h" +int LED_COUNT = 66; // LEDS @@ -67,11 +57,6 @@ boolean g_BOO_AnimationSeconde = true; #include "my_MQTT.h" -// Over The Air -#include "my_OTA.h" - - - @@ -92,35 +77,32 @@ void setup() { DEBUG("Version firmware :" + String( firmwareActualVersion )); - // Lecture du nombre de leds dans l'EEPROM ........................................ - // si writeToEEPROM = true, on sauve la valeur lue dans la globale LED_COUNT - EEPROM_Start(); - - // initialisation de la liaison WIFI .............................................. /* Si la connexion échoue, on lance un Access Point (AP) qui est visible dans les réseaux WIFI Il faut alors se connecter avec un smarthpone sur l'AP pour configurer le Wifi, le NodeMCU reboot et se connect avec le SSID et mot de passe saisie. */ snprintf(HostName, 16, HOSTNAME"%06X", (uint32_t)ESP.getChipId()); // Concaténation du HOSTNAME avec la fin de l'adresse MAC - wifiManager.setDebugOutput(writeToEEPROM); // false ->Pour ne plus avoir le mot de passe WIFI qui s'affiche. + wifiManager.setDebugOutput(false); // false ->Pour ne plus avoir le mot de passe WIFI qui s'affiche. wifiManager.autoConnect(HostName, "123456789"); - DEBUG("IP address: "); Serial.println(WiFi.localIP()); - DEBUG("HOSTNAME: "); Serial.println(HostName); + + #ifdef ModeDebug + DEBUG("IP address: "); Serial.println(WiFi.localIP()); + DEBUG("HOSTNAME: " + String(HostName) ); + #endif - // Connection Wifi pour l'OTA .................................................... - OTA_setup(); - // Create a MQTT client .......................................................... + DEBUG("Create a MQTT client"); MQTT_setup(); // Initialisation des leds ..................................................... + DEBUG("Initialisation des leds"); strip.begin(); // INITIALIZE NeoPixel strip object strip.show(); // Turn OFF all pixels ASAP - strip.setBrightness(BRIGHTNESS); + strip.setBrightness(255); LED_Animation(5); g_BOO_AnimationSeconde = true; @@ -171,20 +153,13 @@ void loop() { // Allumage d'une led if ( g_BOO_AnimationSeconde ) { if ( numled >= LED_COUNT /2 ) { - LED_AllumeLedNum( numled -1, 0,0,0 ); // Noir - LED_AllumeLedNum( LED_COUNT - numled, 0,0,0 ); // Noir - LED_AllumeLedNum( numled -2, 0,0,0 ); // Noir - LED_AllumeLedNum( LED_COUNT - numled +1, 0,0,0 ); // Noir + LED_AllumeBaton( numled -1, 0,0,0 ); // Noir + LED_AllumeBaton( numled -2, 0,0,0 ); // Noir numled = 0; } - LED_AllumeLedNum( numled, 255,0,100 ); // Rouge - LED_AllumeLedNum( LED_COUNT - numled -1, 255,0,100 ); // Rouge - - LED_AllumeLedNum( numled -1, 50,0,70 ); // Noir - LED_AllumeLedNum( LED_COUNT - numled, 50,0,70 ); // Noir - - LED_AllumeLedNum( numled -2, 0,0,0 ); // Noir - LED_AllumeLedNum( LED_COUNT - numled +1, 0,0,0 ); // Noir + LED_AllumeBaton( numled, 255,0,100 ); // Rouge + LED_AllumeBaton( numled -1, 50,0,70 ); // Noir + LED_AllumeBaton( numled -2, 0,0,0 ); // Noir numled++; } diff --git a/src/my_EEPROM.h b/src/my_EEPROM.h deleted file mode 100644 index 5509c35..0000000 --- a/src/my_EEPROM.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - Bibliothèque permettant de stocker 2 valeurs en EEPROM - @see : https://projetsdiy.fr/esp8266-comment-lire-ecrire-effacer-eeprom/ -*/ -#include - - -/*---------------------------------------------------------------------------- - Permet d'écrire une chaine de caractère en EEPROM à une adresse donnée. -*/ -void EEPROM_writeString(char add, String data) { - int _size = data.length(); - int i; - for (i = 0; i < _size; i++) - { - EEPROM.write(add + i, data[i]); - } - EEPROM.write(add + _size, '\0'); //Add termination null character for String Data - EEPROM.commit(); -} - - -/*---------------------------------------------------------------------------- - Permet de lire une chaine de caractère en EEPROM à une adresse donnée. -*/ -String EEPROM_read_String(char add){ - char data[100]; //Max 100 Bytes - int len=0; - unsigned char k; - k=EEPROM.read(add); - while(k != '\0' && len<500) //Read until null character - { - k=EEPROM.read(add+len); - data[len]=k; - len++; - } - data[len]='\0'; - return String(data); -} - -/*---------------------------------------------------------------------------- - Permet de mettre en place la gestion du nombre de leds en EEPROM. -*/ -void EEPROM_Start() { - EEPROM.begin(EEPROM_LEDS_SIZE + EEPROM_DEVICEID_SIZE + 2); - if ( writeToEEPROM == true ) { - Serial.println("* * * * * * * * * * * * * Stockage des valeurs en EEPROM * * * * * * * * * * * * * * "); - - // Ecriture des valeurs dans l'EEPROM - EEPROM.put(0, LED_COUNT); // on a un entier, on peut utiliser put - EEPROM_writeString(sizeof(LED_COUNT), DeviceID); // on a une chaine de caractère, on doit utiliser une fonction custom - } - - // Relecture de la valeur stockée dans l'EEPROM - EEPROM.get(0, LED_COUNT); - Serial.print("Nb leds (from EEPROM) LED_COUNT: "); Serial.println(LED_COUNT); - - String data = EEPROM_read_String(sizeof(LED_COUNT)); // Lecture dans une string - data.toCharArray(DeviceID, EEPROM_DEVICEID_SIZE); // Convertion de String en char - Serial.print("DeviceID (from EEPROM) : "); Serial.println(DeviceID); -} diff --git a/src/my_MQTT.h b/src/my_MQTT.h index e623ff7..c724a9e 100644 --- a/src/my_MQTT.h +++ b/src/my_MQTT.h @@ -1,8 +1,7 @@ // MQTT client #include -#define mqtt_broker "192.168.0.11" -#define topic_temperature "sensor/temperature" //Topic température -#define topic_batterie "sensor/batterie" //Topic batterie +#define MQTT_broker "192.168.0.11" +#define MQTT_port 1883 #define MQTT_user "" #define MQTT_password "" @@ -10,10 +9,11 @@ // DEFINITION DES TOPICS POUR CE MODULE ------------------------------------------- -char topic_lumiere[8 + EEPROM_DEVICEID_SIZE]; -char topic_lumiere_color[8 + 6 + EEPROM_DEVICEID_SIZE]; -char topic_lumiere_bright[8 + 11 + EEPROM_DEVICEID_SIZE]; -char topic_lumiere_anim[8 + 10 + EEPROM_DEVICEID_SIZE]; +char topic_lumiere[8 + DEVICEID_SIZE]; +char topic_lumiere_color[8 + 6 + DEVICEID_SIZE]; +char topic_lumiere_bright[8 + 11 + DEVICEID_SIZE]; +char topic_lumiere_anim[8 + 10 + DEVICEID_SIZE]; +char topic_lumiere_rempli[8 + 7 + DEVICEID_SIZE]; @@ -26,45 +26,6 @@ char g_CHAR_messageBuff[100]; -// -------------------------------------------------------------------------------- -// Envoie un message sur le canal de debug MQTT. -// -void MQTT_publishDebug(String message){ - strcpy( g_CHAR_messageBuff, "/hardware/debug/MQTT-leds-color/"); // Initialisation de avec lce topic - strcat( g_CHAR_messageBuff, HostName); // Concatenation de l'ID du hostname - - // Publicaiton du message - clientMQTT.publish(g_CHAR_messageBuff,message.c_str() ); -} - - -// -------------------------------------------------------------------------------- -// Envoi les mesures ("data") passées en paramètre au brocker MQTT. -// L'envoie se fait sous la forme : -// sensor/temperature// -// avec "sensor/temperature qui est dans le parametre p_CHAR_topic -// -// @param moduleID : L'identifiant du thermometre défini dans FIBARO -// @param data : la valeur de la mesure. -// @p_CHAR_topic : un char pointant sur la chaine contenant le nom du topic dans lequel on veut publier -// -void MQTT_publishDataToMQTT(String moduleID, String value, char *p_CHAR_topic) { - // Creation du topic (on rajoute un / suivi de l'ID du sensor) - String topic = "/" + moduleID; - char buff[20]; - topic.toCharArray(buff, 20); // On met le topic dans la variable char buff - - // Construction du char contenant le topic pour ce module - strcpy( g_CHAR_messageBuff, p_CHAR_topic); // Initialisation de avec ler topic qui est passé en paramètre - strcat( g_CHAR_messageBuff, buff); // Concatenation de temperature_topic + buff - - // Publication de la temperature dans le topic - DEBUG("Publication d'un message sur le topic :"); - DEBUG(g_CHAR_messageBuff); - - clientMQTT.publish(g_CHAR_messageBuff, String(value).c_str() ); -} - @@ -72,29 +33,27 @@ void MQTT_publishDataToMQTT(String moduleID, String value, char *p_CHAR_topic) { // Reconnexion au serveur MQTT // void MQTT_connect() { - //Boucle jusqu'à obtenir une reconnexion + + DEBUG("Boucle jusqu'à obtenir une connexion"); + //Boucle jusqu'à obtenir une connexion while (!clientMQTT.connected()) { - Serial.print("Connexion au serveur MQTT..."); - MQTT_publishDebug(" Connexion au serveur MQTT..."); + DEBUG("Connexion au serveur MQTT..."); // ON arrive à se conecter au brocker MQTT if (clientMQTT.connect(HostName, MQTT_user, MQTT_password)) { DEBUG("OK"); - MQTT_publishDebug(" OK"); // Connection au brocker MQTT ratée } else { - Serial.print("KO, erreur : "); - Serial.println(clientMQTT.state()); + DEBUG("KO, erreur : "); + DEBUG(clientMQTT.state()); DEBUG(" On attend 5 secondes avant de recommencer"); - MQTT_publishDebug( "... Connection impossible. On attend 5 secondes avant de recommencer\nErreur connection = " + String(clientMQTT.state()) ); delay(5000); } } // Souscription aux topics clientMQTT.subscribe("lumiere/#"); - MQTT_publishDebug("Abonnement au topic MQTT lumiere/#"); } @@ -121,25 +80,23 @@ void MQTT_callback(char* topic, byte* payload, unsigned int length) { // Traitement des topics - // ................................................................................ + // ..................................................................................... if ( strcmp( topic, topic_lumiere ) ==0 ) { DEBUG("Detection du topics :" + String( topic_lumiere )); if ( String( message ) == "ON") { DEBUG("Allumage les leds"); - MQTT_publishDebug("MQTT_callback> Allumage les leds "); LED_colorWipe(strip.Color(0, 0, 255), 20); } else if ( String( message ) == "OFF") { DEBUG("Extinction des leds"); - MQTT_publishDebug("MQTT_callback> Extinction les leds "); LED_colorWipe(strip.Color(0, 0, 0), 20); } g_BOO_AnimationSeconde = false; - // ................................................................................ + // ..................................................................................... } else if ( strcmp( topic, topic_lumiere_color) == 0) { DEBUG("Detection du topics :" + String( topic_lumiere_color )); @@ -149,32 +106,39 @@ void MQTT_callback(char* topic, byte* payload, unsigned int length) { Couleur c; c = LED_ExtractRVB( message ); DEBUG("Affichage de la couleur : " + String(c.R) + " " + String(c.V) + " " + String(c.B)); - MQTT_publishDebug("MQTT_callback> Affichage de la couleur : " + String(c.R) + " " + String(c.V) + " " + String(c.B)); // Changemnt des LEDS avec la couleur LED_colorWipe(strip.Color(c.R, c.V, c.B), 20); } - // ................................................................................ + + + // ..................................................................................... } else if ( strcmp( topic, topic_lumiere_bright) == 0 ) { DEBUG("Detection du topics :" + String( topic_lumiere_bright )); // Test si on a bien une valeur numérique if ( LED_isADigit( message ) ) { DEBUG("Luminosite : " + String( message )); - MQTT_publishDebug("MQTT_callback> Luminosite : " + String( message )); strip.setBrightness( String( message ).toInt() % 255 ); strip.show(); } - // ................................................................................ + + // ..................................................................................... } else if ( strcmp( topic, topic_lumiere_anim) ==0 ) { DEBUG("Detection du topics :" + String( topic_lumiere_anim )); DEBUG("Lancement de l'Animation avec le parametre :" + String( message )); - MQTT_publishDebug("MQTT_callback> Lancement de l'Animation avec le parametre :" + String( message )); LED_Animation(String( message ).toInt()); + + + // ..................................................................................... + } else if ( strcmp( topic, topic_lumiere_rempli) ==0 ) { + DEBUG("Detection du topics :" + String( topic_lumiere_rempli )); + DEBUG("Lancement du remplissage à :" + String( message )); + LED_Remplissage(String( message ).toInt()); } } @@ -185,17 +149,23 @@ void MQTT_callback(char* topic, byte* payload, unsigned int length) { // void MQTT_setup(){ // Création du client MQTT - clientMQTT.setServer(mqtt_broker, 1883); // Configuration de la connexion au serveur MQTT + DEBUG("Création du client MQTT"); + clientMQTT.setServer(MQTT_broker, MQTT_port); // Configuration de la connexion au serveur MQTT + + DEBUG("fonction de callback"); clientMQTT.setCallback(MQTT_callback); // La fonction de callback qui est executée à chaque réception de message // Connection au Brocker MQTT + DEBUG("Connection au Brocker MQTT"); MQTT_connect(); // Construction des topcs auxquels s'abonner. + DEBUG("Construction des topcs auxquels s'abonner."); sprintf( topic_lumiere, "lumiere/%s", DeviceID); sprintf( topic_lumiere_color, "lumiere/color/%s", DeviceID); sprintf( topic_lumiere_bright, "lumiere/brightness/%s", DeviceID); sprintf( topic_lumiere_anim, "lumiere/animation/%s", DeviceID); -} + sprintf( topic_lumiere_rempli, "lumiere/allume/%s", DeviceID); +} \ No newline at end of file diff --git a/src/my_OTA.h b/src/my_OTA.h deleted file mode 100644 index e57e773..0000000 --- a/src/my_OTA.h +++ /dev/null @@ -1,273 +0,0 @@ -/** - Bibliothèque pour avoir une mise à jour Over The Air d'un code source. - Utilisation : - Dans le setup, rajouter OTA_setup(); - Dans la loop, rajouter OTA_doUpdate(); - Fonctionnement : - Toutes les OTA_TimerInSecond secondes, le programme va vérifier qu'il y a une mise à jour sur le serveur. - Si une mise à jour existe, elle est téléchargée et installé et l'ESP reboot. - S'il n'y a pas de mise à jour, le serveur le dit et on ne fait rien. - - Avant toutes upload de ce script dans un Arduino, il faut executer un script Python de récupération de certificats qui - se trouve sur le repot https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/BearSSL_CertStore/certs-from-mozilla.py -*/ - -#include -#include - -#include -#include -char outputBuffer[100]; // Pour les messages à afficher -char macAdresse[12]; - -// Fait un serveur de mise à jour local dans l'ESP -#include -#include -ESP8266WebServer OTA_HttpServer(80); -ESP8266HTTPUpdateServer OTA_httpUpdater; -const char* OTA_update_username = "ESPadmin"; -const char* OTA_update_password = "admin"; -const char* OTA_update_path = "/firmware"; -boolean g_BOO_UpdateFirmware = true; - - -const String firmwareUrlMiseAJour = "https://update.alex-design.fr/MQTT-leds-color/update.php"; -const String fileSystemUrlMiseAJour = "https://update.alex-design.fr/MQTT-leds-color/updateFS.php"; -//const String firmwareUrlMiseAJour = "http://192.168.0.32:9090/MQTT-leds-color/update.php"; <- Ne peut pas fonctionner car il est en http, et on veut du https -// Define global variable to know if upate is available -long OTA_UpdateTimer; -const int OTA_TimerInSecond = 60 * 10; // every 10 minute - - -// Utilisation d'un certificat ------------------------------------------ -// Pour mettre à jour l'heure (obligatoire avec un certificat https) -#include -// A single, global CertStore which can be used by all -// connections. Needs to stay live the entire time any of -// the WiFiClientBearSSLs are present. -#include -BearSSL::CertStore certStore; -#include -#include -char versionLitteFS[10] = "0.0.0"; - - -// Define a wifi client -ESP8266WiFiMulti WiFiMulti; - -/** - ---------------------------------------------------------------------------------------------------------------- - Callback lorsque la maj OTA démarre -*/ -void _update_started() { - DEBUG("CALLBACK: HTTPS update process started"); -} - -/** - ---------------------------------------------------------------------------------------------------------------- - Callback lorsque la maj OTA est terminée -*/ -void _update_finished() { - DEBUG("CALLBACK: HTTPS update process finished. Reboot"); -} - -/** - ---------------------------------------------------------------------------------------------------------------- - Callback lorsque la maj OTA est en cours -*/ -void _update_progress(int cur, int total) { - sprintf(outputBuffer, "CALLBACK: HTTPS update process at %d of %d bytes...", cur, total); - DEBUG( outputBuffer ); -} - - -/** - ---------------------------------------------------------------------------------------------------------------- - Callback lorsque la maj OTA a plantée -*/ -void _update_error(int err) { - sprintf(outputBuffer, "CALLBACK: HTTPS update fatal error code %d\n", err); - DEBUG( outputBuffer ); - - if (err == -103) { - DEBUG(" Please allow me, I am "); - DEBUG(WiFi.macAddress()); - DEBUG(WiFi.localIP()); - } - - if ( err == 0 ) { - DEBUG("La mise à jour du firmware via OTA n'a pas marché, on stop !!!!!!!!!!!!"); - g_BOO_UpdateFirmware = false; - } -} - - - - -/** - ---------------------------------------------------------------------------------------------------------------- - Set time via NTP, as required for x.509 validation - ---------------------------------------------------------------------------------------------------------------- -*/ -void OTA_setClock() { - configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC - DEBUG("OTA Waiting for NTP time sync: "); - time_t now = time(nullptr); - while (now < 8 * 3600 * 2) { - yield(); - delay(500); - Serial.print(F(".")); - now = time(nullptr); - } - struct tm timeinfo; - gmtime_r(&now, &timeinfo); - - DEBUG("Current time: "); - DEBUG(asctime(&timeinfo)); -} - - - -/** - ---------------------------------------------------------------------------------------------------------------- - Initialisation d'une connexion wifi à l'aide des settings de wifimanager en eeprom. - ---------------------------------------------------------------------------------------------------------------- -*/ -void OTA_setup() { - - /* Mise en place d'un serveur pour uploader directement un binaire */ - OTA_httpUpdater.setup(&OTA_HttpServer, OTA_update_path, OTA_update_username, OTA_update_password); - OTA_HttpServer.begin(); - sprintf(outputBuffer, "OTA HTTPUpdateServer ready! Open http://%d.%d.%d.%d%s in your browser and login with username '%s' and password '%s'\n", - WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3], OTA_update_path, OTA_update_username, OTA_update_password); - DEBUG(outputBuffer); - MQTT_publishDebug(String(outputBuffer)); - - - - - // Test la version du file system littleFS en place - if ( !LittleFS.begin()) { - DEBUG("Il n'y a pas de file system little FS installé, lecture impossible !"); - - } else { - // Get version of the certificat in LittleFS (frome file version.txt - File file = LittleFS.open("/version.txt", "r"); - if ( file ) { - while (file.available()) { - strcpy(versionLitteFS, file.readString().c_str() ); - } - file.close(); - } - - // Récupération des CA stockés dans LittleFS pour les certificats SSL - int numCerts = certStore.initCertStore(LittleFS, PSTR("/certs.idx"), PSTR("/certs.ar")); - DEBUG("Number of CA certs read: "); - DEBUG(numCerts); - if (numCerts == 0) { - DEBUG(F("No certs found. Did you run certs-from-mozill.py and upload the LittleFS directory before running?")); - } - } - DEBUG("Numéro de version de littleFS : " + String(versionLitteFS) ); - - - // Création de la connection Wifi à partir du SSID et PWD sauvé par wifimanager - /* - WiFi.mode(WIFI_STA); - WiFiMulti.addAP(wifiManager.getWiFiSSID(true).c_str(), wifiManager.getWiFiPass(true).c_str()); -*/ - - // We will request a firmware update in OTA_TimerInSecond secondes - OTA_UpdateTimer = (OTA_TimerInSecond * 1000); -} - - - - - -/** - ---------------------------------------------------------------------------------------------------------------- - Va voir sur l'URL si une mise à jour du firmware est disponible. Si c'est le cas, - la télécharge et met à jour le firmeware. - ---------------------------------------------------------------------------------------------------------------- -*/ -boolean OTA_doUpdate() { - // Si on a pas besoin de faire de mise à jour (ou ça c'est planté la dernière fois) - if ( !g_BOO_UpdateFirmware ) { - return false; - } - - // Fait tourner le serveur http sur l'ESP - // Lorsqu'on se connect à ce serveur, il est possible d'uploader un firmware ou un filesystem - OTA_HttpServer.handleClient(); - - // Check is this is the time to check a new update - delay( 1 ); // Wait 1 milliseconde - if (OTA_UpdateTimer > 0 ) { - OTA_UpdateTimer--; - return false; - } - - if (WiFiMulti.run() == WL_CONNECTED) { - // WiFiClient client; // Client simple (incompatioble en https ) - - // Mise à jour de l'heure via un serveur NTP - OTA_setClock(); - - // Récupération du certificat SSL pour la connexion https - BearSSL::WiFiClientSecure client; // Client securise - bool mfln = client.probeMaxFragmentLength(fileSystemUrlMiseAJour, 443, 1024); // server must be the same as in ESPhttpUpdate.update() - if (mfln) { - client.setBufferSizes(1024, 1024); - } - client.setCertStore(&certStore); - - // Add optional callback notifiers - ESPhttpUpdate.onStart(_update_started); - ESPhttpUpdate.onEnd(_update_finished); - ESPhttpUpdate.onProgress(_update_progress); - ESPhttpUpdate.onError(_update_error); - ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW); - - - // Get the mac adresse in a char - snprintf(macAdresse, 12, "%06X", (uint32_t)ESP.getChipId() ); - - - // Try to update the filesystem - DEBUG(fileSystemUrlMiseAJour + "?chipID=" + String(macAdresse) ); - t_httpUpdate_return ret = ESPhttpUpdate.updateFS(client, fileSystemUrlMiseAJour + "?chipID=" + String(macAdresse), versionLitteFS); - if (ret == HTTP_UPDATE_OK) { - DEBUG("Update FileSystem Successfully"); - } - - - // Try to update the firmware - DEBUG(firmwareUrlMiseAJour + "?chipID=" + String(macAdresse) ); - DEBUG("Version firmware :" + firmwareActualVersion ); - - ret = ESPhttpUpdate.update(client, firmwareUrlMiseAJour + "?chipID=" + String(macAdresse), firmwareActualVersion); - switch (ret) { - case HTTP_UPDATE_FAILED: - - sprintf(outputBuffer, "HTTP_UPDATE_FAILED Error (%d): %s\n", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()); - DEBUG( outputBuffer ); - - OTA_UpdateTimer = (OTA_TimerInSecond * 1000); - break; - - - case HTTP_UPDATE_NO_UPDATES: - DEBUG("No new update available"); - - OTA_UpdateTimer = (OTA_TimerInSecond * 1000); - break; - - default: - break; - } - - return true; - } - return false; -} diff --git a/src/my_leds.h b/src/my_leds.h index 24378a5..94b06d8 100644 --- a/src/my_leds.h +++ b/src/my_leds.h @@ -6,10 +6,6 @@ #define PIN_LED D1 -// NeoPixel brightness, 0 (min) to 255 (max) -#define BRIGHTNESS 255 // Set BRIGHTNESS to about 1/5 (max = 255) - - // Le nombre de pixels déclaré ici n'est pas important @FIXME // Le nombre de pixels utilisé est celui qui est stocké en EEPROM, à savoir LED_COUNT @@ -22,6 +18,33 @@ struct Couleur { int B = 0; }; + + + +/** + * @brief Permet d'allumer un baton de colle en lui passant son ID et la couleur + * + * @param num le numéro du baton (0 en bas) + * @param color la couleur RVB à utiliser + */ +void LED_AllumeBaton(unsigned int num, Couleur color){ + // ALLUMAGE LEDS MONTANTE + strip.setPixelColor(num, strip.Color( color.R, color.V, color.B )); + + // ALLUMAGE LEDS DESCENDENTE + strip.setPixelColor(LED_COUNT-1 - num, strip.Color( color.R, color.V, color.B )); +} +void LED_AllumeBaton(unsigned int num, unsigned int R, unsigned int V, unsigned int B){ + // ALLUMAGE LEDS MONTANTE + strip.setPixelColor(num, strip.Color( R, V, B )); + + // ALLUMAGE LEDS DESCENDENTE + strip.setPixelColor(LED_COUNT-1 - num, strip.Color( R, V, B )); +} + + + + // Fill strip pixels one after another with a color. Strip is NOT cleared // first; anything there will be covered pixel by pixel. Pass in color // (as a single 'packed' 32-bit value, which you can get by calling @@ -207,6 +230,41 @@ void theaterChaseRainbow(uint8_t wait) { } +/** + * @brief Permet d'allumer des leds en partant du bas vers le haut + * + * @param value le % du taux de remplissage. + */ +void LED_Remplissage(unsigned int value){ + unsigned int numLed; + + // ON PASSE TOUTES LES LEDS EN NOIR + for (int i = 0; i < LED_COUNT; i++) { + strip.setPixelColor(i, strip.Color(0,0,0)); // Noir + } + strip.show(); + + + // ALLUMAGE DES LEDS + Couleur color; + for (int i = 0; i <= (int) ((LED_COUNT/2) * value / 100); i++) { + // DEFINITION DE LA COULEUR + int value = 255 - i * 255/(LED_COUNT/2); + color.R = value; + color.V = 0; + color.B = 255 - value; + + + // ALLUMAGE DU BATON DE LEDS + LED_AllumeBaton(i, color ); + + // MISE À JOUR DU LED STRIP + strip.show(); + } +} + + + // -------------------------------------------------------------------------------- // Fait une animation sur les leds en fonction du numéro passé en paramètre.