MQTT-LampeADN/src/main.cpp

198 lines
6.3 KiB
C++

// ---------------------------------------------------------------------------------------
// Programme permettant :
// - d'allumer/éteindre une barre de LEDS (branchée sur la PIN D1 ).
// - de changer la couleur des LEDS.
// - de modifier l'intensité des LEDS.
// - de lancer une animation des LEDS.
//
// Le programme se branche en WIFI sur un broker MQTT et réagi au topics :
// lumiere/<DeviceID> [ON|OFF] : Allumage de la barre de LEDS.
// lumiere/color/<DeviceID> (R,V,B) : Changement de couleur des LEDS.
// lumiere/animation/<DeviceID>[1/2/3/4/5/6] : Animation des LEDS.
// ---------------------------------------------------------------------------------------
#include <Arduino.h>
#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)
#ifdef ModeDebug
#define DEBUG(message) \
Serial.print("[DEBUG:"); \
Serial.print(__func__); \
Serial.print("("); \
Serial.print(__LINE__); \
Serial.print(")]-> "); \
Serial.println(message);
#else
#define DEBUG(message);
#endif
#include <ESP8266HTTPClient.h>
#include <WiFiManager.h>
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
// Customisation du nom du module ESP
#define HOSTNAME "ESP8266-" // Pour la connection Wifi (doit être unique)
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)
// 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"
// LEDS
boolean g_BOO_AnimationSeconde = true;
#include "my_leds.h"
// Définition d'une structure pouvant stocker le message provenant de MQTT
#include "my_MQTT.h"
// Over The Air
#include "my_OTA.h"
// ***************************************************************************************
void setup() {
#ifdef ModeDebug
// initialisation de la liaison série (pour le moniteur) .........................
Serial.begin(115200);
delay(5000); // On attend que le port serie soit initialisé
Serial.println();
Serial.flush();
#endif
DEBUG("OK, let's go **********************************************************************");
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.autoConnect(HostName, "123456789");
DEBUG("IP address: "); Serial.println(WiFi.localIP());
DEBUG("HOSTNAME: "); Serial.println(HostName);
// Connection Wifi pour l'OTA ....................................................
OTA_setup();
// Create a MQTT client ..........................................................
MQTT_setup();
// Initialisation des leds .....................................................
strip.begin(); // INITIALIZE NeoPixel strip object
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(BRIGHTNESS);
LED_Animation(5);
g_BOO_AnimationSeconde = true;
DEBUG("************************** Tout est initialise");
}
// **********************************************************************************************************
// **********************************************************************************************************
unsigned long lastRecu = 0;
int numled = 0;
void loop() {
// On écoute le serveur OTA
// OTA_doUpdate();
// Test si la connection Wifi existe toujours ...................................
if (WiFi.status() != WL_CONNECTED) {
// Si on est déconnecté on tente de se reconnecter automatiquement avec les anciens settings.
wifiManager.autoConnect();
}
// Test si la connection MQTT est toujours valide ..............................
if (!clientMQTT.connected()) {
Serial.println("OUPS, on est plus connecté au server MQTT--------------------------");
//MQTT_connect();
// On reboot
ESP.restart();
}
clientMQTT.loop();
// Animation des LEDS toutes les secondes .........................................
if (millis() - lastRecu > 1000 ) {
lastRecu = millis();
// 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
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
numled++;
}
}
// Traitement des Messages MQTT ...................................................
// Tout est fait dans MQTT_callback()
}