Files
AHome/Sw_SmallRoom/src/main.cpp
2020-10-22 16:08:38 +03:00

181 lines
5.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;
// bool rcv;
//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();
bool switchLight(uint8_t nLamp, int state, bool pub);
void connectToWifi();
void connectToMqtt();
void onWifiConnect(const WiFiEventStationModeGotIP& event);
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event);
void onMqttConnect(bool sessionPresent);
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason);
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total);
void setup() {
//Serial.begin(9600);
//Serial.println("Booting"); // "Загрузка"
WiFi.mode(WIFI_STA);
WiFi.hostname("SW-SmallRoom");
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);
uint8_t stat = 0;
EEPROM.get(0, stat);
digitalWrite(R_LED1, stat);
EEPROM.get(1, stat);
digitalWrite(R_LED2, stat);
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
mqttClient.onMessage(onMqttMessage);
mqttClient.setServer(mqtt_server, 1883);
mqttClient.setClientId("SmallRoomSW");
connectToWifi();
// cRun = millis();
}
void loop() {
ArduinoOTA.handle();
l1.update();
l2.update();
if(l1.fell()){
switchLight(R_LED1, !digitalRead(R_LED1), true);
}
if(l2.fell()){
switchLight(R_LED2, !digitalRead(R_LED2), true);
}
}
bool switchLight(uint8_t nLamp, int state, bool pub)
{
digitalWrite(nLamp, state);
EEPROM.put(nLamp == R_LED1 ? 0 : 1, state);
EEPROM.commit();
String topic = "/home/smallroom/lamp";
char n = nLamp == R_LED1 ? '1' : '2';
if (pub) mqttClient.publish(String(topic + n).c_str(), 1, false, state ? "1" : "0");
return state;
}
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) {
mqttClient.subscribe("/home/smallroom/lamp1", 1);
mqttClient.subscribe("/home/smallroom/lamp2", 1);
mqttClient.publish("/home/smallroom/lamp1", 1, false, digitalRead(R_LED1) == 1 ? "1" : "0");
mqttClient.publish("/home/smallroom/lamp2", 1, false, digitalRead(R_LED2) == 1 ? "1" : "0");
digitalWrite(B_LED, LOW);
}
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
digitalWrite(B_LED, HIGH);
}
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
if(strcmp(topic, "/home/smallroom/lamp1") == 0){
if (atoi(payload) == 1) switchLight(R_LED1, 1, false);//lStat1 = true;
else switchLight(R_LED1, 0, false);//lStat1 = false;
}
if(strcmp(topic, "/home/smallroom/lamp2") == 0){
if (atoi(payload) == 1) switchLight(R_LED2, 1, false);//lStat2 = true;
else switchLight(R_LED2, 0, false);//lStat2 = false;
}
}