#include #include #include #include #include #define status_topic "Sonar/status" //публикуемый топик статус #define value_topic "Sonar/value" //публикуемый топик расстоянме const long utcOffsetInSeconds = 10800; //тайм зона const byte pinRX = 3; // = Echo const byte pinTX = 2; // = Trig const char* ssid = "-----"; const char* password = "-----"; const char* mqtt_server = "-----"; const int mqtt_port = 1883; WiFiClient espClient; // Определение WiFi-клиента PubSubClient client(espClient); SoftwareSerial US100(pinRX, pinTX); WiFiUDP ntpUDP; // Определение NTP-клиента для получения времени NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds); long lastSonic_mls = millis(); //функция времени в милисекундах проверки сонара long lastMessag_mls = millis(); //функция времени в милисекундах публикации сообщения что жив unsigned int distans_cm = 1100; //минимальное расстояние до объекта в мм. unsigned int dist_cm; //растояние до препятствия boolean onOff = false; //статус int hourRestart = 1; //в котором часу делать рестарт void(* resetFunc) (void) = 0; // объявляем функцию reset void ultra_son() //функция чтения с датчика расстояния { US100.write(0x55); // Подаём команду измерения расстояния while (US100.available() < 2); // Ожидаем готовности данных dist_cm = US100.read(); // Считываем старший байт dist_cm = (dist_cm << 8) + US100.read(); // Считываем мдадший байт if (dist_cm < distans_cm && !onOff) //если растояние меньше указанного { onOff = true; MQTT(); } else if (dist_cm > distans_cm && onOff) { onOff = false; MQTT(); } Serial.print(onOff); // Выводим результат в Serial Serial.print(" "); Serial.println(dist_cm, DEC); } void MQTT() //публикуем топикщв { client.publish(status_topic, String(onOff).c_str()); client.publish(value_topic, String(dist_cm).c_str()); lastMessag_mls = millis(); } void setup() { Serial.begin(9600); US100.begin(9600); timeClient.begin(); } void loop() { if (WiFi.status() != WL_CONNECTED) //если нет подключения с сети { Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } if (WiFi.status() == WL_CONNECTED) { if (!client.connected()) //если нет подключения с mqtt { client.setServer(mqtt_server, mqtt_port); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266")) { Serial.println("connected"); client.subscribe(status_topic); //подписываемся на топик статус client.subscribe(value_topic); //подписываемся на топик сантиметры } else { Serial.print("failed with state "); Serial.println(client.state()); delay(1000); } } } else { client.loop(); } } if (millis() - lastSonic_mls > 500) //периодичность проверки сонара { lastSonic_mls = millis(); ultra_son(); timeClient.update(); } if (millis() - lastMessag_mls > 3000000) //периодичность отправки сообщения alive сонара { Serial.println("online..."); MQTT(); } if (timeClient.getHours() == hourRestart && timeClient.getMinutes() == 0 && (timeClient.getSeconds() > 1 && timeClient.getSeconds() < 5)) //периодичность рестарта { Serial.println("Перезагрузка..."); resetFunc(); //вызываем reset } }