#include #include #include #include #include #include #include #include #include #include #define LED_BLUE D5 //GPIO14 #define LED_GREEN D6 //GPIO12 #define LED_RED D7 //GPIO13 #define PWR_SENS D8 //GPIO15 #define MOVE_SENS D0 //GPIO16 Adafruit_HTU21DF htu = Adafruit_HTU21DF(); WiFiClient espClient; PubSubClient client(espClient); leds lGreen(LED_GREEN, 200); leds lRed(LED_RED, 200); leds lBlue(LED_BLUE, 200); const char* ssid = "wf-home"; const char* password = "0ndthnrf"; const char* mqtt_server = "192.168.1.250"; float temp, rel_hum; bool izm = false; unsigned long cRun; int minCnt = 0; int measCnt = 1; uint8_t mv, oldmv; uint16_t adc, oldadc, delta; void reconnect(); void publishMin(); void publishSec(); void callback(char* topic, byte* payload, unsigned int length); void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); WiFi.mode(WIFI_STA); WiFi.setOutputPower(20.5f); WiFi.hostname("ESP-SmallRoom"); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { //Serial.println("Connection Failed! Rebooting..."); // "Соединиться не удалось! Перезагрузка..." delay(5000); ESP.restart(); } digitalWrite(LED_BUILTIN, !WiFi.isConnected()); ArduinoOTA.onStart([]() { /*Serial.println("Start");*/}); // "Начало OTA-апдейта" ArduinoOTA.onEnd([]() { /*Serial.println("\nEnd");*/}); // "Завершение OTA-апдейта" ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { /*Serial.printf("Progress: %u%%\r", (progress / (total / 100)));*/ }); ArduinoOTA.onError([](ota_error_t error) { /*Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); // "Ошибка при аутентификации" else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); // "Ошибка при начале OTA-апдейта" else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); // "Ошибка при подключении" else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); // "Ошибка при получении данных" else if (error == OTA_END_ERROR) Serial.println("End Failed"); // "Ошибка при завершении OTA-апдейта"*/ }); ArduinoOTA.begin(); pinMode(LED_GREEN, OUTPUT); pinMode(LED_BLUE, OUTPUT); pinMode(LED_RED, OUTPUT); pinMode(PWR_SENS, OUTPUT); pinMode(MOVE_SENS, INPUT); digitalWrite(LED_GREEN, LOW); digitalWrite(LED_BLUE, LOW); digitalWrite(LED_RED, LOW); // Serial.begin(115200); Serial.println("HTU21D-F"); digitalWrite(PWR_SENS, HIGH); delay(200); if (!htu.begin()) { Serial.println("Couldn't find sensor!"); while (1); } temp = htu.readTemperature(); rel_hum = htu.readHumidity(); //digitalWrite(PWR_SENS, LOW); client.setServer(mqtt_server, 1883); client.setCallback(callback); EEPROM.begin(8); EEPROM.get(0, delta); adc = analogRead(A0); cRun = millis(); } void loop() { static bool lsSent = false, lbSent = false; ArduinoOTA.handle(); lGreen.tick(); lRed.tick(); lBlue.tick(); if (!client.connected()) { reconnect(); } client.loop(); if(cRun + 99 < millis()){ cRun = millis(); adc += int((analogRead(A0) - adc) / 10.0f); mv = digitalRead(MOVE_SENS); if(mv != oldmv){ oldmv = mv; client.publish("/home/smallroom/move", mv == 0 ? "0" : "1"); }; //if(abs(adc - oldadc) > delta){ if(((adc < delta) && !lsSent) || ((adc >= (delta + 5)) && !lbSent)){ char strFVal[6]; itoa(adc, strFVal, 10); client.publish("/home/smallroom/light", strFVal); oldadc = adc; if(adc < delta) {lsSent = true; lbSent = false;} else {lbSent = true; lsSent = false;} } if(measCnt == 0){ temp += (htu.readTemperature() - temp) / 6.0f; rel_hum += (htu.readHumidity() - rel_hum) / 6.0f; digitalWrite(PWR_SENS, LOW); } if(++measCnt == 299){ digitalWrite(PWR_SENS, HIGH); measCnt = 0; } //Serial.print("T: ");Serial.print(temp);Serial.print("\tH: ");Serial.println(rel_hum); if(++minCnt == 599){ publishMin(); minCnt = 0; } if(minCnt % 100 == 0) publishSec(); } } void reconnect() { lRed.start(); //digitalWrite(LED_RED, HIGH); //Serial.print("Attempting MQTT connection..."); // "Попытка подключиться к MQTT-брокеру... " // Пытаемся подключиться: if (client.connect("ESPSmallRoom")) { //Serial.println("connected"); // "подключен" // подписываемся или переподписываемся на топик; // можно подписаться не только на один, а на несколько топиков char v[6]; itoa(delta, v, 10); client.publish("/home/smallroom/ldelta", v); client.subscribe("/home/smallroom/ldelta"); } else { //Serial.print("failed, rc="); // "подключение не удалось" //Serial.print(client.state()); //Serial.println(" try again in 5 seconds"); } //delay(100); //digitalWrite(LED_RED, LOW); } void publishMin() { char strFVal[11]; if (client.connected()) { lGreen.start(); //digitalWrite(LED_BLUE, HIGH); if(!isnan(temp)){ dtostrf(temp, 6, 1, strFVal); client.publish("/home/smallroom/temp", strFVal); } if(!isnan(rel_hum)){ dtostrf(rel_hum, 6, 1, strFVal); client.publish("/home/smallroom/rel_hum", strFVal); } ultoa(adc, strFVal, 10); client.publish("/home/smallroom/light", strFVal); ultoa(cRun, strFVal, 10); client.publish("/home/smallroom/millis", strFVal); itoa(delta, strFVal, 10); client.publish("/home/smallroom/ldelta", strFVal); //digitalWrite(LED_BLUE, LOW); } } void publishSec() { char strFVal[11]; if (client.connected()) { lBlue.start(); //digitalWrite(LED_GREEN, HIGH); if(!isnan(temp)){ dtostrf(temp, 7, 3, strFVal); client.publish("/hometest/smallroom/temp", strFVal); } if(!isnan(rel_hum)){ dtostrf(rel_hum, 7, 3, strFVal); client.publish("/hometest/smallroom/rel_hum", strFVal); } itoa(WiFi.RSSI(), strFVal, 10); client.publish("/hometest/smallroom/RSSI", strFVal); ultoa(cRun, strFVal, 10); client.publish("/hometest/smallroom/millis", strFVal); ltoa(adc, strFVal, 10); client.publish("/hometest/smallroom/light", strFVal); itoa(delta, strFVal, 10); client.publish("/hometest/smallroom/ldelta", strFVal); //digitalWrite(LED_GREEN, LOW); } } void callback(char* topic, byte* payload, unsigned int length) { if(strcmp(topic,"/home/smallroom/ldelta") == 0){ payload[length] = '\0'; String pl = String((char*)payload); delta = pl.toInt();// atoi((char*)payload); EEPROM.put(0, delta); EEPROM.commit(); } }