Files
AHome/Sw_SmallRoom/src/main.cpp
2020-08-01 13:47:02 +03:00

224 lines
6.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*********
Руи Сантос (Rui Santos)
Более подробно о проекте на: http://randomnerdtutorials.com
Пример в IDE Arduino: File > Examples > Arduino OTA > BasicOTA.ino
(Файл > Примеры > Arduino OTA > BasicOTA.ino)
*********/
#include <Arduino.h>
#include <ArduinoOTA.h>
#include <Ticker.h>
#include <AsyncMqttClient.h>
#include <ESP_EEPROM.h>
#include <Bounce2.h>
const char* ssid = "wf-home";
const char* password = "0ndthnrf";
const char* mqtt_server = "192.168.1.250";
AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
bool lStat1, oldLStat1;
bool lStat2, oldLStat2;
unsigned long cRun;
#define B_LED (1)
#define R_LED1 (14)
#define R_LED2 (13)
#define BUTT1 (4)
#define BUTT2 (3)
bool led = false;
Bounce l1 = Bounce();
Bounce l2 = Bounce();
void connectToWifi() {
//Serial.println("Connecting to Wi-Fi...");
WiFi.begin(ssid, password);
}
void connectToMqtt() {
//Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
void onWifiConnect(const WiFiEventStationModeGotIP& event) {
//Serial.println("Connected to Wi-Fi.");
//Serial.print("IP: ");
//Serial.println(WiFi.localIP());
connectToMqtt();
}
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
//Serial.println("Disconnected from Wi-Fi.");
mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
wifiReconnectTimer.once(2, connectToWifi);
}
void onMqttConnect(bool sessionPresent) {
// Serial.println("Connected to MQTT.");
// Serial.print("Session present: ");
// Serial.println(sessionPresent);
//uint16_t packetIdSub =
mqttClient.subscribe("/home/smallroom/lamp1_set", 1);
mqttClient.subscribe("/home/smallroom/lamp2_set", 1);
// Serial.print("Subscribing Lamp1, packetId: ");
// Serial.println(packetIdSub);
//packetIdSub = mqttClient.subscribe("/home/kor/lamp2_set", 1);
//Serial.print("Subscribing Lamp2, packetId: ");
//Serial.println(packetIdSub);
mqttClient.publish("/home/smallroom/lamp1", 1, false, lStat1 ? "1" : "0");
mqttClient.publish("/home/smallroom/lamp2", 1, false, lStat2 ? "1" : "0");
//Serial.println("Publishing at Lamp 1");
//mqttClient.publish("/home/kor/lamp2", 1, false, lStat2 ? "1" : "0");
//Serial.println("Publishing at Lamp 2");
digitalWrite(B_LED, LOW);
}
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
//Serial.println("Disconnected from MQTT.");
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
digitalWrite(B_LED, HIGH);
}
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) {
if(strcmp(topic, "/home/smallroom/lamp1_set") == 0){
if ((char)payload[0] == '1') lStat1 = true;
else lStat1 = false;
}
if(strcmp(topic, "/home/smallroom/lamp2_set") == 0){
if ((char)payload[0] == '1') lStat2 = true;
else lStat2 = false;
}
}
void onMqttPublish(uint16_t packetId) {
// Serial.println("Publish acknowledged.");
// Serial.print(" packetId: ");
// Serial.println(packetId);
}
void setup() {
//Serial.begin(9600);
//Serial.println("Booting"); // "Загрузка"
WiFi.mode(WIFI_STA);
WiFi.hostname("SW-SmallRoom1");
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(B_LED, FUNCTION_3);
pinMode(B_LED, OUTPUT);
digitalWrite(B_LED, HIGH);
pinMode(R_LED1, OUTPUT);
pinMode(BUTT1, INPUT_PULLUP);
pinMode(R_LED2, OUTPUT);
pinMode(BUTT2, FUNCTION_3);
pinMode(BUTT2, INPUT_PULLUP);
l1.attach(BUTT1);
l2.attach(BUTT2);
EEPROM.begin(16);
EEPROM.get(0, lStat1);
EEPROM.get(1, lStat2);
oldLStat1 = lStat1;
oldLStat2 = lStat2;
// Serial.print("Lamp1: ");
// Serial.println(lStat1);
digitalWrite(R_LED1, lStat1);
digitalWrite(R_LED2, lStat2);
//oldLStat2 = lStat2;
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
mqttClient.onSubscribe(onMqttSubscribe);
mqttClient.onUnsubscribe(onMqttUnsubscribe);
mqttClient.onMessage(onMqttMessage);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(mqtt_server, 1883);
connectToWifi();
cRun = millis();
}
void loop() {
ArduinoOTA.handle();
l1.update();
l2.update();
if(l1.fell()){
lStat1 = !lStat1;
}
if(l2.fell()){
lStat2 = !lStat2;
}
if(lStat1 != oldLStat1){
digitalWrite(R_LED1, lStat1);
oldLStat1 = lStat1;
mqttClient.publish("/home/smallroom/lamp1", 1, false, lStat1 ? "1" : "0");
// Serial.println("Publishing at Lamp 1");
EEPROM.put(0, lStat1);
EEPROM.commit();
// Serial.print("Lamp 1: ");
// Serial.println(lStat1);
}
if(lStat2 != oldLStat2){
digitalWrite(R_LED2, lStat2);
oldLStat2 = lStat2;
mqttClient.publish("/home/smallroom/lamp2", 1, false, lStat2 ? "1" : "0");
// Serial.println("Publishing at Lamp 1");
EEPROM.put(1, lStat2);
EEPROM.commit();
// Serial.print("Lamp 1: ");
// Serial.println(lStat1);
}
}