From 84f731312312b482f5682d7bf60dcbe5ba66557c Mon Sep 17 00:00:00 2001 From: lexa Date: Mon, 4 Sep 2023 10:09:30 +0300 Subject: [PATCH] Bigroom PubSubClient, RGB LED --- ESP_BigRoom/include/main.h | 32 +- ESP_BigRoom/platformio.ini | 3 + ESP_BigRoom/src/main.cpp | 712 ++++++++++++++++++++++++++----------- 3 files changed, 538 insertions(+), 209 deletions(-) diff --git a/ESP_BigRoom/include/main.h b/ESP_BigRoom/include/main.h index 6de23a8..ba17133 100644 --- a/ESP_BigRoom/include/main.h +++ b/ESP_BigRoom/include/main.h @@ -11,7 +11,7 @@ extern "C" { #include "freertos/FreeRTOS.h" #include "freertos/timers.h" } -#include +//#include #include #include "MHZ19.h" #include @@ -23,6 +23,9 @@ extern "C" { #include #include #include +#include +#include +#include #define BAUDRATE 9600 @@ -43,6 +46,7 @@ extern "C" { #define RECIVER 18 #define TOPIC "home/bigroom/" +#define HNAME "BigRoom" //WiFiMulti wifiMulti; //const uint32_t connectTimeoutMs = 5000; @@ -59,5 +63,31 @@ uint8_t statLamp; AsyncWebServer server(80); +struct I2cTxStruct { + //byte mode, hue, saturation, bright; + byte mode, r, g, b; +}; + +#define SSRX 26 +#define SSTX 25 + +I2cTxStruct txData = {0, 0x0F, 0x0F, 0x0F}; +I2cTxStruct txDataN; +I2cTxStruct txDataF; +uint8_t mode = 0; +bool forceNight = false; + +bool newTxData; +void transmitData(); + +EspSoftwareSerial::UART lampSerial; +SerialTransfer myTransfer; + +long lastReconnectAttempt = 0; +WiFiClient espClient; +PubSubClient client(espClient); + +boolean reconnect(); +void callback(char* topic, byte* payload, unsigned int length); #endif // __MAIN__ diff --git a/ESP_BigRoom/platformio.ini b/ESP_BigRoom/platformio.ini index 1a667b0..35b0a6f 100644 --- a/ESP_BigRoom/platformio.ini +++ b/ESP_BigRoom/platformio.ini @@ -26,6 +26,9 @@ lib_deps = ottowinter/ESPAsyncWebServer-esphome @ ^2.1.0 ayushsharma82/AsyncElegantOTA @ ^2.2.6 ayushsharma82/WebSerial @ ^1.3.0 + plerup/EspSoftwareSerial @ ^8.1.0 + powerbroker2/SerialTransfer @ ^3.1.3 + knolleary/PubSubClient @ ^2.8 ;upload_protocol = espota ;upload_port = 192.168.1.138 diff --git a/ESP_BigRoom/src/main.cpp b/ESP_BigRoom/src/main.cpp index 2641b38..98027ce 100644 --- a/ESP_BigRoom/src/main.cpp +++ b/ESP_BigRoom/src/main.cpp @@ -4,7 +4,7 @@ MHZ19 myMHZ19; Adafruit_HTU21DF htu = Adafruit_HTU21DF(); RunningMedian samples = RunningMedian(5 * sizeof(int)); -AsyncMqttClient mqttClient; +//AsyncMqttClient mqttClient; TimerHandle_t mqttReconnectTimer; TimerHandle_t wifiReconnectTimer; @@ -17,24 +17,26 @@ const char* password2 = "499727479o"; const char* mqtt_server = "192.168.1.111"; void connectToWifi(); -void connectToMqtt(); +//void connectToMqtt(); void WiFiEvent(WiFiEvent_t event); -void onMqttConnect(bool sessionPresent); -void onMqttDisconnect(AsyncMqttClientDisconnectReason reason); -void onMqttSubscribe(uint16_t packetId, uint8_t qos); -void onMqttUnsubscribe(uint16_t packetId); -void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total); -void onMqttPublish(uint16_t packetId); +// void onMqttConnect(bool sessionPresent); +// void onMqttDisconnect(AsyncMqttClientDisconnectReason reason); +// void onMqttSubscribe(uint16_t packetId, uint8_t qos); +// void onMqttUnsubscribe(uint16_t packetId); +// void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total); +// void onMqttPublish(uint16_t packetId); void trim(char *s); leds bled(LED_B, 300, true); +TwoWire MyI2C = TwoWire(8); + void setup() { Serial.begin(115200); Serial.println("Booting"); // "Загрузка" WiFi.mode(WIFI_STA); //WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE); - WiFi.setHostname("BigRoom"); + WiFi.setHostname(HNAME); //wifiMulti.addAP(ssid1, password1); //wifiMulti.addAP(ssid2, password2); // ArduinoOTA.onStart([]() { @@ -62,19 +64,21 @@ void setup() { // ArduinoOTA.begin(); - mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast(connectToMqtt)); + //mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast(connectToMqtt)); wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast(connectToWifi)); WiFi.onEvent(WiFiEvent); - mqttClient.onConnect(onMqttConnect); - mqttClient.onDisconnect(onMqttDisconnect); - mqttClient.onSubscribe(onMqttSubscribe); - mqttClient.onUnsubscribe(onMqttUnsubscribe); - mqttClient.onMessage(onMqttMessage); - mqttClient.onPublish(onMqttPublish); - mqttClient.setServer(mqtt_server, 1883); - mqttClient.setClientId("BigRoom"); + // mqttClient.onConnect(onMqttConnect); + // mqttClient.onDisconnect(onMqttDisconnect); + // mqttClient.onSubscribe(onMqttSubscribe); + // mqttClient.onUnsubscribe(onMqttUnsubscribe); + // mqttClient.onMessage(onMqttMessage); + // mqttClient.onPublish(onMqttPublish); + // mqttClient.setServer(mqtt_server, 1883); + // mqttClient.setClientId("BigRoom"); + client.setServer(mqtt_server, 1883); + pinMode(MOVE_SENS, INPUT_PULLUP); pinMode(LED_R, OUTPUT); @@ -83,15 +87,16 @@ void setup() { pinMode(POWER, OUTPUT); pinMode(RECIVER, OUTPUT); - ledcSetup(PWM_WHITE, 5000, 8); - ledcSetup(PWM_BLUE, 5000, 8); - ledcAttachPin(LED_WHITE, PWM_WHITE); - ledcAttachPin(LED_BLUE, PWM_BLUE); + // ledcSetup(PWM_WHITE, 5000, 8); + // ledcSetup(PWM_BLUE, 5000, 8); + // ledcAttachPin(LED_WHITE, PWM_WHITE); + // ledcAttachPin(LED_BLUE, PWM_BLUE); delay(200); digitalWrite(LED_R, LOW); digitalWrite(LED_G, HIGH); digitalWrite(LED_B, HIGH); + digitalWrite(POWER, HIGH); Serial2.begin(9600); myMHZ19.begin(Serial2); myMHZ19.setRange(); // *Important, Pass your Stream reference here @@ -127,46 +132,51 @@ void setup() { } Serial.println("Sensor found!"); - char s[7]; - EEPROM.begin(10); + //char s[8]; + EEPROM.begin(20); EEPROM.get(0, periodMotion); - itoa(periodMotion, s, 10); - mqttClient.publish(TOPIC"", 1, false, s); //publish period EEPROM.get(1, spLight); - itoa(spLight, s, 10); - mqttClient.publish(TOPIC"", 1, false, s); //publish splight EEPROM.get(3, dbLight); - itoa(dbLight, s, 10); - mqttClient.publish(TOPIC"", 1, false, s); EEPROM.get(5, levelBlue); - itoa(levelBlue, s, 10); - mqttClient.publish(TOPIC"", 1, false, s); EEPROM.get(6, levelWhite); - itoa(levelWhite, s, 10); - mqttClient.publish(TOPIC"", 1, false, s); + EEPROM.get(8, txDataF.r); + EEPROM.get(9, txDataF.g); + EEPROM.get(10, txDataF.b); + EEPROM.get(11, txDataN.r); + EEPROM.get(12, txDataN.g); + EEPROM.get(13, txDataN.b); + //EEPROM.get(16, mode); + + bool w = false; if(spLight == 65535) { spLight = 1000; EEPROM.writeShort(1, spLight); + w = true; } if(dbLight == 65535) { dbLight = 1000; EEPROM.writeShort(3, dbLight); + w = true; } if(levelBlue == 255) { levelBlue = 100; EEPROM.writeShort(5, levelBlue); + w = true; } if(levelWhite == 255) { levelWhite = 100; EEPROM.writeByte(6, levelWhite); + w = true; } if(periodMotion == 255) { periodMotion = 60; EEPROM.writeByte(0, periodMotion); + w = true; } - EEPROM.commit(); + if(w) EEPROM.commit(); + Serial.print(F("PeriodMove:"));Serial.println(periodMotion); Serial.print(F("SPLight:"));Serial.println(spLight); Serial.print(F("DBLight:"));Serial.println(dbLight); @@ -178,14 +188,18 @@ void setup() { statLamp = 0; server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { - request->send(200, "text/plain", "Hi! I am ESP32."); + request->send(200, "text/plain", "Hi! I am ESP BIGROOM. Update - update, Webserial - webserial"); }); AsyncElegantOTA.setID("BigRoom"); AsyncElegantOTA.begin(&server); // Start ElegantOTA WebSerial.begin(&server); + lampSerial.begin(19200, SWSERIAL_8N1, SSRX, SSTX); + myTransfer.begin(lampSerial); + connectToWifi(); + Serial.println("Setup completed"); } void loop() { @@ -195,14 +209,30 @@ void loop() { static uint32_t levBlue = 0, levWhite = 0; static unsigned long levRunB = 0, levRunW = 0; char s[7]; - //ArduinoOTA.handle(); bled.tick(); + + if (!client.connected()) { + long now = millis(); + if (now - lastReconnectAttempt > 5000) { + lastReconnectAttempt = now; + // Attempt to reconnect + if (reconnect()) { + lastReconnectAttempt = 0; + } + } + } else { + // Client connected + client.loop(); + } + if(digitalRead(MOVE_SENS) > 0){ if(curDelay == -1){ bled.start(); - mqttClient.publish(TOPIC"move", 1, false, "1"); - //Serial.println("move"); + client.publish(TOPIC"move", "1"); + //mqttClient.publish(TOPIC"move", 1, false, "1"); + Serial.println("move"); + WebSerial.println("move"); } move = true; curDelay = periodMotion; @@ -210,60 +240,86 @@ void loop() { uint16_t LightLev = analogRead(LIGHT_SENS); samples.add(LightLev); LightLev = samples.getMedian(); - if ((LightLev < spLight) && move && !bLamp){ - levBlue = levelBlue * 2.55; - ledcWrite(PWM_BLUE, levBlue); - statLamp |= 0x01; +//---------Night Mode + if ((LightLev < spLight) && move && mode == 0){ + mode = 1; + newTxData = true; + //Switch On Night Lamp + + // levBlue = levelBlue * 2.55; + // ledcWrite(PWM_BLUE, levBlue); + // statLamp |= 0x01; bLamp = true; - //Serial.println(F("BLamp On")); - //WebSerial.println(F("Blue Lamp On")); + + Serial.println(F("BlueLamp On")); + WebSerial.println(F("Blue Lamp On")); } - else if((LightLev > (spLight + dbLight)) || (move == 0)){ - if((levRunB + 50 <= millis() && levBlue > 0)){ - levRunB = millis(); - levBlue--; + else if((LightLev > (spLight + dbLight)) || (move == 0)){ + // if((levRunB + 50 <= millis() && levBlue > 0)){ + // levRunB = millis(); + // levBlue--; + // } + // ledcWrite(PWM_BLUE, levBlue); + // statLamp &= 0xFE; + + // Switch Off Night Lamp + //WebSerial.println(F("Blue Lamp Off")); + if(mode == 1 && !forceNight){ + Serial.println(F("BlueLamp Off")); + mode = 0; + newTxData = true; + bLamp = false; } - ledcWrite(PWM_BLUE, levBlue); - statLamp &= 0xFE; - bLamp = false; } - if(lightWhite && !wLamp){ - levWhite = levelWhite * 2.55; - ledcWrite(PWM_WHITE, levWhite); - statLamp |= 0x02; - wLamp = true; - Serial.println(F("WLamp On")); - WebSerial.println(F("White Lamp On")); - } - else if (!lightWhite){ - if((levRunW + 30 <= millis() && levWhite > 0)){ - //WebSerial.println(levWhite); - levRunW = millis(); - levWhite--; - } - ledcWrite(PWM_WHITE, levWhite); - statLamp &= 0xFD; - wLamp = false; - } - if(statLamp > 0) digitalWrite(POWER, HIGH); - else if((levBlue == 0) && (levWhite == 0)) digitalWrite(POWER, LOW); +//---------Night mode end + // if(lightWhite && !wLamp){ + // //Switch On Normal Lamp + + // // levWhite = levelWhite * 2.55; + // // ledcWrite(PWM_WHITE, levWhite); + // // statLamp |= 0x02; + // mode = 2; + // //newTxData = true; + // wLamp = true; + // Serial.println(F("WhiteLamp On")); + // WebSerial.println(F("White Lamp On")); + // } + // else if (!lightWhite && !bLamp && mode != 3 && mode != 0){ + // // if((levRunW + 30 <= millis() && levWhite > 0)){ + // // //WebSerial.println(levWhite); + // // levRunW = millis(); + // // levWhite--; + // // } + // // ledcWrite(PWM_WHITE, levWhite); + // // statLamp &= 0xFD; + // //Switch Off Normal Lamp + // mode = 0; + // //newTxData = true; + // wLamp = false; + // } + transmitData(); + // if(statLamp > 0) digitalWrite(POWER, HIGH); + // else if((levBlue == 0) && (levWhite == 0)) digitalWrite(POWER, LOW); if((cRun + 1000) <= millis()){ //Once per second cRun = millis(); if(abs(LightLev - prevLLevel) > 100){ itoa(LightLev, s, 10); - mqttClient.publish(TOPIC"lightlev", 1, false, s); + client.publish(TOPIC"lightlev", s); + // mqttClient.publish(TOPIC"lightlev", 1, false, s); } prevLLevel = LightLev; if(curDelay > -1){ - Serial.println("ADC: " + String(LightLev) + " MV:" + String(move) + " TMv:" + curDelay + " SL:" + String(statLamp) + " PS:" + digitalRead(POWER)); + Serial.println("ADC: " + String(LightLev) + " MV:" + String(move) + " TMv:" + curDelay + " SL:" + String(statLamp) + " blamp:" + bLamp + " mode:" + mode); Serial.println("SPL: " + String(spLight) + " DBL:" + String(dbLight)+ " BL:" + String(bLamp)); } sec++; if(curDelay > 0) curDelay--; if(curDelay == 0){ - mqttClient.publish(TOPIC"move", 1, false, "0"); + client.publish(TOPIC"move", "0"); + // mqttClient.publish(TOPIC"move", 1, false, "0"); bled.start(); Serial.println("no move"); + WebSerial.println("no move"); move = false; curDelay = -1; } @@ -272,8 +328,13 @@ void loop() { hum = htu.readHumidity(); Serial.println("Temp: " + String(temp)); Serial.println("Hum: " + String(hum)); + WebSerial.println("Temp: " + String(temp)); + WebSerial.println("Hum: " + String(hum)); Serial.println(sec); } + itoa(WiFi.RSSI(), s, 10); + client.publish(TOPIC"RSSI", s); + // mqttClient.publish(TOPIC"RSSI", 1, false, s); if(sec == 59){ //minuts++; sec = 0; @@ -287,7 +348,8 @@ void loop() { Serial.println(CO2); itoa(CO2, s, 10); bled.start(); - mqttClient.publish(TOPIC"co2", 1, false, s); + client.publish(TOPIC"co2", s); + // mqttClient.publish(TOPIC"co2", 1, false, s); } else{ Serial.println("CO2err:" + String(myMHZ19.errorCode)); @@ -300,23 +362,25 @@ void loop() { dtostrf(temp, 6, 1, s); trim(s); bled.start(); - mqttClient.publish(TOPIC"temp", 1, false, s); + client.publish(TOPIC"temp", s); + // mqttClient.publish(TOPIC"temp", 1, false, s); } if(hum != 0.0f){ dtostrf(hum, 6, 1, s); trim(s); - mqttClient.publish(TOPIC"hum", 1, false, s); + client.publish(TOPIC"hum", s); + // mqttClient.publish(TOPIC"hum", 1, false, s); //sendDataI(msgLight, LightLev); //minuts = 0; } bled.start(); dtostrf(cRun / 60000.0, 6, 1, s); trim(s); - mqttClient.publish(TOPIC"mins", 1, false, s); - itoa(WiFi.RSSI(), s, 10); - mqttClient.publish(TOPIC"RSSI", 1, false, s); + client.publish(TOPIC"mins", s); + // mqttClient.publish(TOPIC"mins", 1, false, s); itoa(LightLev, s, 10); - mqttClient.publish(TOPIC"lightlev", 1, false, s); + client.publish(TOPIC"lightlev", s); + // mqttClient.publish(TOPIC"lightlev", 1, false, s); } } } @@ -327,10 +391,10 @@ void connectToWifi() { WiFi.begin(ssid, password); } -void connectToMqtt() { - Serial.println("Connecting to MQTT..."); - mqttClient.connect(); -} +// void connectToMqtt() { +// Serial.println("Connecting to MQTT..."); +// mqttClient.connect(); +// } void WiFiEvent(WiFiEvent_t event) { @@ -343,11 +407,11 @@ void WiFiEvent(WiFiEvent_t event) { digitalWrite(LED_R, HIGH); server.begin(); Serial.println("HTTP server started"); - connectToMqtt(); + //connectToMqtt(); break; case SYSTEM_EVENT_STA_DISCONNECTED: Serial.println("WiFi lost connection"); - xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi + // xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi xTimerStart(wifiReconnectTimer, 0); server.end(); digitalWrite(LED_R, LOW); @@ -358,138 +422,176 @@ void WiFiEvent(WiFiEvent_t event) { } void onMqttConnect(bool sessionPresent) { - Serial.println("Connected to MQTT."); - Serial.print("Session present: "); - Serial.println(sessionPresent); - //uint16_t packetIdSub = - // Serial.print("Subscribing Lamp1, packetId: "); - // Serial.println(packetIdSub); - //packetIdSub = +// Serial.println("Connected to MQTT."); +// Serial.print("Session present: "); +// Serial.println(sessionPresent); +// //uint16_t packetIdSub = +// // Serial.print("Subscribing Lamp1, packetId: "); +// // Serial.println(packetIdSub); +// //packetIdSub = - char s[7]; - itoa(periodMotion, s, 10); - mqttClient.publish(TOPIC"moveperiod", 1, false, s); - itoa(levelBlue, s, 10); - mqttClient.publish(TOPIC"lampblevel", 1, false, s); - itoa(levelWhite, s, 10); - mqttClient.publish(TOPIC"lampwlevel", 1, false, s); - itoa(spLight, s, 10); - mqttClient.publish(TOPIC"spLevel", 1, false, s); - itoa(dbLight, s, 10); - mqttClient.publish(TOPIC"dbLevel", 1, false, s); - mqttClient.publish(TOPIC"reciever", 1, false, "0"); - mqttClient.publish(TOPIC"lampw", 1, false, lightWhite ? "1" : "0"); - mqttClient.publish(TOPIC"lampw_set", 1, false, lightWhite ? "1" : "0"); +// char s[20]; +// itoa(periodMotion, s, 10); +// mqttClient.publish(TOPIC"moveperiod", 1, false, s); +// itoa(levelBlue, s, 10); +// mqttClient.publish(TOPIC"lampblevel", 1, false, s); +// itoa(levelWhite, s, 10); +// mqttClient.publish(TOPIC"lampwlevel", 1, false, s); +// itoa(spLight, s, 10); +// mqttClient.publish(TOPIC"spLevel", 1, false, s); +// itoa(dbLight, s, 10); +// mqttClient.publish(TOPIC"dbLevel", 1, false, s); +// mqttClient.publish(TOPIC"reciever", 1, false, "0"); +// mqttClient.publish(TOPIC"lampw", 1, false, lightWhite ? "1" : "0"); +// mqttClient.publish(TOPIC"lampw_set", 1, false, lightWhite ? "1" : "0"); - mqttClient.subscribe(TOPIC"lampblevel", 1); - mqttClient.subscribe(TOPIC"lampwlevel", 1); - //mqttClient.subscribe(TOPIC"lampw", 1); - mqttClient.subscribe(TOPIC"lampw_set", 1); - mqttClient.subscribe(TOPIC"moveperiod", 1); - mqttClient.subscribe(TOPIC"spLevel", 1); - mqttClient.subscribe(TOPIC"dbLevel", 1); - mqttClient.subscribe(TOPIC"reciever", 1); - Serial.print(F("PeriodMove:"));Serial.println(periodMotion); - Serial.print(F("SPLight:"));Serial.println(spLight); - Serial.print(F("DBLight:"));Serial.println(dbLight); - Serial.print(F("BLevel:"));Serial.println(levelBlue); - Serial.print(F("WLevel:"));Serial.println(levelWhite); -//Serial.print("Subscribing Lamp2, packetId: "); - //Serial.println(packetIdSub); - //Serial.println("Publishing at Lamp 1"); - //mqttClient.publish("/home/kor/lamp2", 1, false, lStat2 ? "1" : "0"); - //Serial.println("Publishing at Lamp 2"); - digitalWrite(LED_G, LOW); +// mqttClient.subscribe(TOPIC"lampblevel", 1); +// mqttClient.subscribe(TOPIC"lampwlevel", 1); +// //mqttClient.subscribe(TOPIC"lampw", 1); +// mqttClient.subscribe(TOPIC"lampw_set", 1); +// mqttClient.subscribe(TOPIC"moveperiod", 1); +// mqttClient.subscribe(TOPIC"spLevel", 1); +// mqttClient.subscribe(TOPIC"dbLevel", 1); +// mqttClient.subscribe(TOPIC"reciever", 1); + +// sprintf(s, "#%02X%02X%02X", txDataN.r, txDataN.g, txDataN.b); +// mqttClient.publish(TOPIC"lamp/RGBN", 1, false, s); +// sprintf(s, "#%02X%02X%02X", txDataF.r, txDataF.g, txDataF.b); +// mqttClient.publish(TOPIC"lamp/RGBF", 1, false, s); +// itoa(mode, s, 10); +// mqttClient.publish(TOPIC"lamp/mode", 1, false, s); + +// mqttClient.subscribe(TOPIC"lamp/RGBN", 1); +// mqttClient.subscribe(TOPIC"lamp/RGBF", 1); +// mqttClient.subscribe(TOPIC"lamp/mode", 1); + +// Serial.print(F("PeriodMove:"));Serial.println(periodMotion); +// Serial.print(F("SPLight:"));Serial.println(spLight); +// Serial.print(F("DBLight:"));Serial.println(dbLight); +// Serial.print(F("BLevel:"));Serial.println(levelBlue); +// Serial.print(F("WLevel:"));Serial.println(levelWhite); +// //Serial.print("Subscribing Lamp2, packetId: "); +// //Serial.println(packetIdSub); +// //Serial.println("Publishing at Lamp 1"); +// //mqttClient.publish("/home/kor/lamp2", 1, false, lStat2 ? "1" : "0"); +// //Serial.println("Publishing at Lamp 2"); +// digitalWrite(LED_G, LOW); } -void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { - Serial.println("Disconnected from MQTT."); - digitalWrite(LED_R, HIGH); - if (WiFi.isConnected()) { - xTimerStart(mqttReconnectTimer, 0); - } -} +//void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { + // Serial.println("Disconnected from MQTT."); + // digitalWrite(LED_R, HIGH); + // if (WiFi.isConnected()) { + // xTimerStart(mqttReconnectTimer, 0); + // } +//} void onMqttSubscribe(uint16_t packetId, uint8_t qos) { - // Serial.println("Subscribe acknowledged."); - // Serial.print(" packetId: "); - // Serial.println(packetId); - // Serial.print(" qos: "); - // Serial.println(qos); } void onMqttUnsubscribe(uint16_t packetId) { - // Serial.println("Unsubscribe acknowledged."); - // Serial.print(" packetId: "); - // Serial.println(packetId); } -void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { - bool w = false; - char pl[20]; - strncpy(pl, payload, len); - pl[len] = 0; - Serial.printf("New message - topic %s, payload %s\n", topic, pl); - WebSerial.print("New message - topic ");WebSerial.print(topic);WebSerial.print(", payload ");WebSerial.println(pl); - if(strcmp(topic, TOPIC"lampblevel") == 0){ - levelBlue = atoi(pl); - EEPROM.writeByte(5, levelBlue); - Serial.printf("New LevelBlue: %d\n", levelBlue); - WebSerial.print("New LevelBlue: ");WebSerial.println(levelBlue); - w = true; - if(bLamp) - ledcWrite(PWM_BLUE, (levelBlue) * 2.55); - } - if(strcmp(topic, TOPIC"lampwlevel") == 0){ - levelWhite = atoi(pl); - Serial.printf("New LevelWite: %d\n", levelWhite); - WebSerial.print("New LevelWhite: ");WebSerial.println(levelWhite); - EEPROM.writeByte(6, levelWhite); - w = true; - if(lightWhite) - ledcWrite(PWM_WHITE, (levelWhite) * 2.55); - } - if(strcmp(topic, TOPIC"lampw_set") == 0){ - lightWhite = atoi(pl); - Serial.printf("New LampWhite: %d\n", lightWhite); - WebSerial.print("New LampWhite: ");WebSerial.println(lightWhite); - mqttClient.publish(TOPIC"lampw", 1, false, lightWhite ? "1" : "0"); - //EEPROM.put(0, levelBlue); - //w = true; - } - if(strcmp(topic, TOPIC"reciever") == 0){ - reciever = atoi(pl); - digitalWrite(RECIVER, reciever); - Serial.printf("New Reciever: %d\n", lightWhite); - WebSerial.print("New Reciever: ");WebSerial.println(lightWhite); - //mqttClient.publish(TOPIC"reciever", 1, false, reciever ? "1" : "0"); - //EEPROM.put(0, levelBlue); - //w = true; - } - if(strcmp(topic, TOPIC"moveperiod") == 0){ - periodMotion = atoi(pl); - Serial.printf("New MovePeriod: %d\n", periodMotion); - WebSerial.print("New MovePeriod: ");WebSerial.println(periodMotion); - EEPROM.writeByte(0, periodMotion); - w = true; - } - if(strcmp(topic, TOPIC"spLevel") == 0){ - spLight = atoi(pl); - Serial.printf("New SPLevel: %d\n", spLight); - WebSerial.print("New SPLevel: ");WebSerial.println(spLight); - EEPROM.writeShort(1, spLight); - w = true; - } - if(strcmp(topic, TOPIC"dbLevel") == 0){ - dbLight = atoi(pl); - Serial.printf("New DBLevel: %d\n", dbLight); - WebSerial.print("New DBLevel: ");WebSerial.println(dbLight); - EEPROM.writeShort(3, dbLight); - w = true; - } - if(w) EEPROM.commit(); -} +//void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { + // bool w = false; + // char pl[20]; + // strncpy(pl, payload, len); + // pl[len] = 0; + // Serial.printf("New message - topic %s, payload %s\n", topic, pl); + // WebSerial.print("New message - topic ");WebSerial.print(topic);WebSerial.print(", payload ");WebSerial.println(pl); + // if(strcmp(topic, TOPIC"lampblevel") == 0){ + // levelBlue = atoi(pl); + // EEPROM.writeByte(5, levelBlue); + // Serial.printf("New LevelBlue: %d\n", levelBlue); + // WebSerial.print("New LevelBlue: ");WebSerial.println(levelBlue); + // w = true; + // if(bLamp) + // ledcWrite(PWM_BLUE, (levelBlue) * 2.55); + // } + // if(strcmp(topic, TOPIC"lampwlevel") == 0){ + // levelWhite = atoi(pl); + // Serial.printf("New LevelWite: %d\n", levelWhite); + // WebSerial.print("New LevelWhite: ");WebSerial.println(levelWhite); + // EEPROM.writeByte(6, levelWhite); + // w = true; + // if(lightWhite) + // ledcWrite(PWM_WHITE, (levelWhite) * 2.55); + // } + // if(strcmp(topic, TOPIC"lampw_set") == 0){ + // mode = 1; + // //lightWhite = atoi(pl); + // Serial.printf("New LampWhite: %d\n", mode); + // WebSerial.print("New LampWhite: ");WebSerial.println(mode); + // mqttClient.publish(TOPIC"lampw", 1, false, lightWhite ? "1" : "0"); + // //EEPROM.put(0, levelBlue); + // //w = true; + // } + // if(strcmp(topic, TOPIC"reciever") == 0){ + // reciever = atoi(pl); + // digitalWrite(RECIVER, reciever); + // Serial.printf("New Reciever: %d\n", lightWhite); + // WebSerial.print("New Reciever: ");WebSerial.println(lightWhite); + // //mqttClient.publish(TOPIC"reciever", 1, false, reciever ? "1" : "0"); + // //EEPROM.put(0, levelBlue); + // //w = true; + // } + // if(strcmp(topic, TOPIC"moveperiod") == 0){ + // periodMotion = atoi(pl); + // Serial.printf("New MovePeriod: %d\n", periodMotion); + // WebSerial.print("New MovePeriod: ");WebSerial.println(periodMotion); + // EEPROM.writeByte(0, periodMotion); + // w = true; + // } + // if(strcmp(topic, TOPIC"spLevel") == 0){ + // spLight = atoi(pl); + // Serial.printf("New SPLevel: %d\n", spLight); + // WebSerial.print("New SPLevel: ");WebSerial.println(spLight); + // EEPROM.writeShort(1, spLight); + // w = true; + // } + // if(strcmp(topic, TOPIC"dbLevel") == 0){ + // dbLight = atoi(pl); + // Serial.printf("New DBLevel: %d\n", dbLight); + // WebSerial.print("New DBLevel: ");WebSerial.println(dbLight); + // EEPROM.writeShort(3, dbLight); + // w = true; + // } + + // if(strcmp(topic, TOPIC"lamp/mode") == 0){ + // mode = atoi(pl); + // if(mode == 1) forceNight = true; + // else forceNight = false; + // newTxData = true; + // Serial.printf("Mode %d\n", mode); + // //EEPROM.writeShort(16, mode); + // //w = true; + // } + // if(strcmp(topic, TOPIC"lamp/RGBF") == 0){ + // String inRGB = pl; + // Serial.printf("Proc Light %s\n", inRGB.c_str()); + // sscanf(inRGB.substring(1).c_str(), "%02x%02x%02x", &txDataF.r, &txDataF.g, &txDataF.b); + // Serial.printf("#%02X%02X%02X\n", txDataF.r, txDataF.g, txDataF.b); + // EEPROM.writeByte(8, txDataF.r); + // EEPROM.writeByte(9, txDataF.g); + // EEPROM.writeByte(10, txDataF.b); + // w = true; + // newTxData = true; + // } + // if(strcmp(topic, TOPIC"lamp/RGBN") == 0){ + // String inRGB = pl; + // Serial.printf("Proc Night %s\n", inRGB.c_str()); + // sscanf(inRGB.substring(1).c_str(), "%02x%02x%02x", &txDataN.r, &txDataN.g, &txDataN.b); + // Serial.printf("#%02X%02X%02X\n", txDataN.r, txDataN.g, txDataN.b); + // newTxData = true; + // EEPROM.writeByte(11, txDataN.r); + // EEPROM.writeByte(12, txDataN.g); + // EEPROM.writeByte(13, txDataN.b); + // w = true; + // } + + // if(w) EEPROM.commit(); +//} void onMqttPublish(uint16_t packetId) { // Serial.println("Publish acknowledged."); @@ -525,4 +627,198 @@ void trim(char *s) { s[i+1]='\0'; } +} + +void transmitData() { + if (newTxData == true) { + switch (mode) + { + case 0: + txData.mode = 0; + Serial.println("Send OFF"); + break; + case 1: + Serial.println("Send ON Night"); + txData.mode = 1; + txData.r = txDataN.r; + txData.g = txDataN.g; + txData.b = txDataN.b; + break; + case 2: + Serial.println("Send ON Light"); + txData.mode = 1; + txData.r = txDataF.r; + txData.g = txDataF.g; + txData.b = txDataF.b; + break; + case 3: + txData.mode = 2; + break; + default: + break; + } + Serial.printf("Send mode %d, R:0x%02X, G:0x%02X, B:0x%02X\n", txData.mode, txData.r, txData.g, txData.b); + myTransfer.sendDatum(txData); + Serial.println("Sent"); + newTxData = false; + } +} + +boolean reconnect() { + if (client.connect(HNAME)) { + Serial.println("Connected to MQTT."); + + char s[20]; + itoa(periodMotion, s, 10); + client.publish(TOPIC"moveperiod", s); + itoa(levelBlue, s, 10); + client.publish(TOPIC"lampblevel", s); + itoa(levelWhite, s, 10); + client.publish(TOPIC"lampwlevel", s); + itoa(spLight, s, 10); + client.publish(TOPIC"splevel", s); + itoa(dbLight, s, 10); + client.publish(TOPIC"splevel", s); + client.publish(TOPIC"dbLevel", s); + client.publish(TOPIC"reciever", s); + client.publish(TOPIC"lampw", lightWhite ? "1" : "0"); + client.publish(TOPIC"lampw_set", lightWhite ? "1" : "0"); + + client.subscribe(TOPIC"lampblevel", 1); + client.subscribe(TOPIC"lampblevel", 1); + client.subscribe(TOPIC"lampwlevel", 1); + //mqttClient.subscribe(TOPIC"lampw", 1); + client.subscribe(TOPIC"lampw_set", 1); + client.subscribe(TOPIC"moveperiod", 1); + client.subscribe(TOPIC"spLevel", 1); + client.subscribe(TOPIC"dbLevel", 1); + client.subscribe(TOPIC"reciever", 1); + + sprintf(s, "#%02X%02X%02X", txDataN.r, txDataN.g, txDataN.b); + client.publish(TOPIC"lamp/RGBN", s); + sprintf(s, "#%02X%02X%02X", txDataF.r, txDataF.g, txDataF.b); + client.publish(TOPIC"lamp/RGBF", s); + itoa(mode, s, 10); + client.publish(TOPIC"lamp/mode", s); + + client.subscribe(TOPIC"lamp/RGBN", 1); + client.subscribe(TOPIC"lamp/RGBF", 1); + client.subscribe(TOPIC"lamp/mode", 1); + + Serial.print(F("PeriodMove:"));Serial.println(periodMotion); + Serial.print(F("SPLight:"));Serial.println(spLight); + Serial.print(F("DBLight:"));Serial.println(dbLight); + Serial.print(F("BLevel:"));Serial.println(levelBlue); + Serial.print(F("WLevel:"));Serial.println(levelWhite); + digitalWrite(LED_G, LOW); + } + else + digitalWrite(LED_G, HIGH); + return client.connected(); +} + +void callback(char* topic, byte* payload, unsigned int length) { + bool w = false; + char pl[20]; + + Serial.print("Message arrived ["); + Serial.print(topic); + Serial.print("] "); + strncpy(pl, (char*)payload, length); + pl[length] = 0; + + Serial.printf("New message - topic %s, payload %s\n", topic, pl); + WebSerial.print("New message - topic ");WebSerial.print(topic);WebSerial.print(", payload ");WebSerial.println(pl); + if(strcmp(topic, TOPIC"lampblevel") == 0){ + levelBlue = atoi(pl); + EEPROM.writeByte(5, levelBlue); + Serial.printf("New LevelBlue: %d\n", levelBlue); + WebSerial.print("New LevelBlue: ");WebSerial.println(levelBlue); + w = true; + if(bLamp) + ledcWrite(PWM_BLUE, (levelBlue) * 2.55); + } + if(strcmp(topic, TOPIC"lampwlevel") == 0){ + levelWhite = atoi(pl); + Serial.printf("New LevelWite: %d\n", levelWhite); + WebSerial.print("New LevelWhite: ");WebSerial.println(levelWhite); + EEPROM.writeByte(6, levelWhite); + w = true; + if(lightWhite) + ledcWrite(PWM_WHITE, (levelWhite) * 2.55); + } + if(strcmp(topic, TOPIC"lampw_set") == 0){ + mode = 1; + //lightWhite = atoi(pl); + Serial.printf("New LampWhite: %d\n", mode); + WebSerial.print("New LampWhite: ");WebSerial.println(mode); + //mqttClient.publish(TOPIC"lampw", 1, false, lightWhite ? "1" : "0"); + //EEPROM.put(0, levelBlue); + //w = true; + } + if(strcmp(topic, TOPIC"reciever") == 0){ + reciever = atoi(pl); + digitalWrite(RECIVER, reciever); + Serial.printf("New Reciever: %d\n", lightWhite); + WebSerial.print("New Reciever: ");WebSerial.println(lightWhite); + //mqttClient.publish(TOPIC"reciever", 1, false, reciever ? "1" : "0"); + //EEPROM.put(0, levelBlue); + //w = true; + } + if(strcmp(topic, TOPIC"moveperiod") == 0){ + periodMotion = atoi(pl); + Serial.printf("New MovePeriod: %d\n", periodMotion); + WebSerial.print("New MovePeriod: ");WebSerial.println(periodMotion); + EEPROM.writeByte(0, periodMotion); + w = true; + } + if(strcmp(topic, TOPIC"spLevel") == 0){ + spLight = atoi(pl); + Serial.printf("New SPLevel: %d\n", spLight); + WebSerial.print("New SPLevel: ");WebSerial.println(spLight); + EEPROM.writeShort(1, spLight); + w = true; + } + if(strcmp(topic, TOPIC"dbLevel") == 0){ + dbLight = atoi(pl); + Serial.printf("New DBLevel: %d\n", dbLight); + WebSerial.print("New DBLevel: ");WebSerial.println(dbLight); + EEPROM.writeShort(3, dbLight); + w = true; + } + + if(strcmp(topic, TOPIC"lamp/mode") == 0){ + mode = atoi(pl); + if(mode == 1) forceNight = true; + else forceNight = false; + newTxData = true; + Serial.printf("Mode %d\n", mode); + //EEPROM.writeShort(16, mode); + //w = true; + } + if(strcmp(topic, TOPIC"lamp/RGBF") == 0){ + String inRGB = pl; + Serial.printf("Proc Light %s\n", inRGB.c_str()); + sscanf(inRGB.substring(1).c_str(), "%02x%02x%02x", &txDataF.r, &txDataF.g, &txDataF.b); + Serial.printf("#%02X%02X%02X\n", txDataF.r, txDataF.g, txDataF.b); + EEPROM.writeByte(8, txDataF.r); + EEPROM.writeByte(9, txDataF.g); + EEPROM.writeByte(10, txDataF.b); + w = true; + newTxData = true; + } + if(strcmp(topic, TOPIC"lamp/RGBN") == 0){ + String inRGB = pl; + Serial.printf("Proc Night %s\n", inRGB.c_str()); + sscanf(inRGB.substring(1).c_str(), "%02x%02x%02x", &txDataN.r, &txDataN.g, &txDataN.b); + Serial.printf("#%02X%02X%02X\n", txDataN.r, txDataN.g, txDataN.b); + newTxData = true; + EEPROM.writeByte(11, txDataN.r); + EEPROM.writeByte(12, txDataN.g); + EEPROM.writeByte(13, txDataN.b); + w = true; + } + + if(w) EEPROM.commit(); + } \ No newline at end of file