Files
AHome/Sw_Koridor/src/main.cpp
2020-11-28 20:07:10 +03:00

232 lines
7.3 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 <OneButton.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;
//bool rcv;
#define B_LED (1)
#define R_LED (12)
#define BUTT (5)
//bool led = false;
OneButton button(BUTT);
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 ICACHE_RAM_ATTR sw_func()
// {
// lStat1 = !lStat1;
// }
void oneClick()
{
switchLight(R_LED, !digitalRead(R_LED), true);
//lStat1 = !lStat1;
}
void longPress()
{
//lStat1 = false;
switchLight(R_LED, 0, true);
mqttClient.publish("/home/bigroom/lamp1_set", 0, false, "false");
mqttClient.publish("/home/bigroom/lamp2_set", 0, false, "false");
mqttClient.publish("/home/midroom/lamp1_set", 0, false, "false");
mqttClient.publish("/home/midroom/lamp2_set", 0, false, "false");
mqttClient.publish("/home/smallroom/lamp1_set", 0, false, "false");
mqttClient.publish("/home/smallroom/lamp2_set", 0, false, "false");
mqttClient.publish("/home/kuh/lighttbl", 0, false, "false");
}
void setup() {
// Serial.begin(9600);
// Serial.println("Booting"); // "Загрузка"
WiFi.mode(WIFI_STA);
WiFi.hostname("SW-Koridor");
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_LED, OUTPUT);
pinMode(BUTT, INPUT_PULLUP);
EEPROM.begin(16);
uint8_t lstat = 0;
EEPROM.get(0, lstat);
//oldLStat1 = lStat1;
// Serial.print("Lamp1: ");
// Serial.println(lStat1);
digitalWrite(R_LED, lstat);
//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);
mqttClient.setClientId("SW_Koridor");
button.attachClick(oneClick);
button.attachLongPressStart(longPress);
button.setPressTicks(2000);
//attachInterrupt(digitalPinToInterrupt(BUTT), sw_func, RISING);
connectToWifi();
cRun = millis();
}
void loop() {
ArduinoOTA.handle();
button.tick();
// if(lStat1 != oldLStat1){
// digitalWrite(R_LED, lStat1);
// oldLStat1 = lStat1;
// if(!rcv)
// mqttClient.publish("/home/kor/lamp1", 0, false, lStat1 ? "1" : "0");
// else
// rcv = false;
// EEPROM.put(0, lStat1);
// EEPROM.commit();
// }
if (cRun + 9999 < millis()){
cRun = millis();
char v[11];
ultoa(cRun, v, 10);
mqttClient.publish("/home/kor/millislamp", 0, false, v);
}
}
bool switchLight(uint8_t nLamp, int state, bool pub)
{
digitalWrite(nLamp, state);
EEPROM.put(0, state);
EEPROM.commit();
//if (pub)
mqttClient.publish("/home/kor/lamp1", 1, false, state ? "true" : "false");
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.publish("/home/kor/lamp1", 0, false, digitalRead(R_LED) == 1 ? "true" : "false");
mqttClient.publish("/home/kor/lamp1_set", 0, false, digitalRead(R_LED) == 1 ? "true" : "false");
mqttClient.subscribe("/home/kor/lamp1_set", 1);
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/kor/lamp1_set") == 0){
if (strncmp("true", payload, 4) == 0) switchLight(R_LED, 1, false);//lStat1 = true;
else switchLight(R_LED, 0, false);//lStat1 = false;
//rcv = true;
}
}
void onMqttPublish(uint16_t packetId) {
// Serial.println("Publish acknowledged.");
// Serial.print(" packetId: ");
// Serial.println(packetId);
}