#include <Bounce.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
// =======================================================================
// Конфигурация устройства:
const char* ssid = "****"; // SSID
const char* password = "*****"; // пароль
const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "****"; // Логи от сервер
const char *mqtt_pass = "*******"; // Пароль от сервера
WiFiClient wclient;
PubSubClient client(wclient);
boolean buttonState = false; //состояние выключателя
boolean flag_button1 = false; //флаг кнопка 1
boolean mqtt_light_kux = false; //флаг включения свет раковина по mqtt
//выходы нагрузки
const byte outPin1 = D1; // реле
//кнопки
const byte inButton1 = D4; //вход кнопка1
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer1 = Bounce(inButton1, 500);
//подсчет времени
//mqtt
long previousMillis_mqtt = 0; // храним время последнего подключения
long interval_mqtt = 10000; //интервал 3 сек
//wifi
long previousMillis_wifi = 0; // храним время последнего подключения
long interval_wifi = 10000; //интервал
unsigned long currentMillis_wifi = 0;
// =======================================================================
// Функция получения данных от сервера
void callback(char* topic, byte* payload, unsigned int length)
{
//--------------------------------------------------------------------------------------
if (String(topic) == "ihouse/svet/kux")
{
if ((char)payload[0] == '1') flag_button1 = true;
if ((char)payload[0] == '0') flag_button1 = false;
digitalWrite(outPin1, flag_button1);
//Serial.println(flag_button1);
}
}
// =======================================================================
void reconnect()
{
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED)
{
if (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect("esp_kux",mqtt_user, mqtt_pass))
{
Serial.println("connected");
//подписываемся по топики
client.subscribe("ihouse/svet/kux");
}
}
}
}
// =======================================================================
void setup_wifi()
{
if (currentMillis_wifi - previousMillis_wifi > interval_wifi)
{
WiFi.begin(ssid, password); //конектимся
previousMillis_wifi = currentMillis_wifi;
}
}
// =======================================================================
void setup()
{
// Удаляем предыдущие конфигурации WIFI сети
WiFi.disconnect(); // обрываем WIFI соединения
WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
WiFi.mode(WIFI_OFF); // отключаем WIFI
delay(500);
// присваиваем статичесий IP адрес
WiFi.mode(WIFI_STA); // режим клиента
WiFi.config(IPAddress(192, 168, 1, 75), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));
Serial.begin(115200);
WiFi.begin(ssid, password);
delay(10);
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
//для выключателя
pinMode(inButton1, INPUT);
//для релюшек
//свет мойка
pinMode(outPin1, OUTPUT);
digitalWrite(outPin1, LOW);
}
// =======================================================================
void loop()
{
unsigned long currentMillis_wifi = millis();
//--------------------------------------------------------------------------------------
if (WiFi.status() != WL_CONNECTED) //если нет подключения к вифи
{
setup_wifi();
}
//--------------------------------------------------------------------------------------
if (!client.connected())
{
reconnect();
}
//--------------------------------------------------------------------------------------
//проверка состояния кнопки1 - предбанник
if ( bouncer1.update() )
{
//если считано значение 1
if (bouncer1.read() == !buttonState)
{
buttonState = bouncer1.read();
flag_button1 = !flag_button1;
digitalWrite(outPin1, flag_button1);
client.publish("ihouse/svet/kux", String(flag_button1).c_str());
}
}
client.loop();
MQTT_Send();
}
// =======================================================================
// Функция отправки в топик
void MQTT_Send()
{
unsigned long currentMillis_mqtt = millis();
if (currentMillis_mqtt - previousMillis_mqtt >= interval_mqtt)
{
previousMillis_mqtt = currentMillis_mqtt;
client.publish("ihouse/work/kux", String(random(100)).c_str());
}
delay(10);
}