// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <BME280I2C.h>
#include <Wire.h>
// END Блок [Подключение библиотек] ********************************************
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "ХХХХХХХХ"; // Имя WI-FI сети
const char* password = "ХХХХХХХХХХХХ"; // Пароль WI-FI сети
const char* mqtt_server = "192.168.2.3"; // IP адрес MQTT сервер
// END Блок [Подключение к сети WI-FI] *****************************************
#define motionSensorD6 D6 // пин, к которому подключен датчик Движения
#define openSensorD3 D3 // пин, к которому подключен датчик Окна 1
#define openSensorD4 D4 // пин, к которому подключен датчик Окна 2
#define smokeSensorD5 D5 // пин, к которому подключен датчик Дыма
#define Temp_topic "ESP/Temp" // Топик Температуры
#define Humidity_topic "ESP/Humidity" // Топик Влажности
#define Pressure_topic "ESP/Pressure" // Топик Давления
#define motionSensor_topic "ESP/Motion" // Топик датчика движения
#define openSensor_topic1 "ESP/WINDOWS_1" // Топик датчика окна 1
#define openSensor_topic2 "ESP/WINDOWS_2" // Топик датчика окна 2
#define smokeSensor_topic "ESP/SMOKE" // Топик датчика Дыма
WiFiClient espClient;
PubSubClient client(espClient);
BME280I2C bme280;
long last_mls = millis();
long last_mls_temp = millis();
long last_mls_move = millis();
long last_mls_moveOff = millis();
boolean moveOn = false;
boolean Win1On = false;
boolean Win2On = false;
boolean SmokeOn = false;
int Win1Old;
int Win2Old;
int SmokeOld;
char msg[50];
void IRAM_ATTR detectsMovementD6() { // Функция при обнаружении движения на D6
if(int val = digitalRead(motionSensorD6)){
delay(10);
if(int val = digitalRead(motionSensorD6)){
client.publish(motionSensor_topic, String(val).c_str(), false); // Публикуем состояние датчика движения
Serial.println("Движение D6!!!");
moveOn = true;
}
}
}
void IRAM_ATTR detectsOpenD3() { // Функция при обнаружении Открытия окна D3
Win1On = true;
Win1Old = digitalRead(openSensorD3);
}
void IRAM_ATTR detectsOpenD4() { // Функция при обнаружении Открытия окна D4
Win2On = true;
Win2Old = digitalRead(openSensorD4);
}
void IRAM_ATTR detectsSmokeD5() { // Функция при обнаружении движения на D6
SmokeOn = true;
SmokeOld = digitalRead(smokeSensorD5);
}
void setup() {
Serial.begin(115200);
client.setServer(mqtt_server, 1883);
delay(100);
WiFi.begin(ssid, password);
delay(6000);
client.connect("ESP8266Client");
pinMode(motionSensorD6, INPUT_PULLUP); // уставливаем пин D6 на прием и включаем внутренний подтягивающий резистор
// Первоначальные данные по датчику движения
if(int val = digitalRead(motionSensorD6)){
client.publish(motionSensor_topic, String(val).c_str(), true); // Публикуем состояние датчика движения
Serial.println("Движение D6!!!");
}else{
client.publish(motionSensor_topic, String(val).c_str(), true); // Публикуем состояние датчика движения
Serial.println("Все тихо D6!!!");
}
pinMode(openSensorD3, INPUT_PULLUP); // уставливаем пин D3 на прием и включаем внутренний подтягивающий резистор
attachInterrupt(openSensorD3, detectsOpenD3, CHANGE); // Прерывание для датчика окна запуск функции detectsOpenD3
// Первоначальные данные по датчику окна 1
if(int val = digitalRead(openSensorD3)){
client.publish(openSensor_topic1, String(val).c_str(), false); // Публикуем состояние окна 1
Serial.println("Открыто окно D3!!!");
}else{
client.publish(openSensor_topic1, String(val).c_str(), false); // Публикуем состояние окна 1
Serial.println("Закрыто окно D3!!!");
}
pinMode(openSensorD4, INPUT_PULLUP); // уставливаем пин D4 на прием и включаем внутренний подтягивающий резистор
attachInterrupt(openSensorD4, detectsOpenD4, CHANGE); // Прерывание для датчика окна запуск функции detectsOpenD4
// Первоначальные данные по датчику окна 2
if(int val = digitalRead(openSensorD4)){
client.publish(openSensor_topic2, String(val).c_str(), false); // Публикуем состояние окна 2
Serial.println("Открыто окно D4!!!");
}else{
client.publish(openSensor_topic2, String(val).c_str(), false); // Публикуем состояние окна 2
Serial.println("Закрыто окно D4!!!");
}
pinMode(smokeSensorD5, INPUT_PULLUP); // уставливаем пин D6 на прием и включаем внутренний подтягивающий резистор
attachInterrupt(smokeSensorD5, detectsSmokeD5, CHANGE); // Прерывание для датчика движения запуск функции detectsMovementD6
// Первоначальные данные по датчика дыма
if(int val = digitalRead(smokeSensorD5)){
client.publish(smokeSensor_topic, String(val).c_str(), false); // Публикуем состояние датчика дыма
Serial.println("Пожар D5!!!");
}else{
client.publish(smokeSensor_topic, String(val).c_str(), false); // Публикуем состояние датчика дыма
Serial.println("Дыма нет D5!!!");
}
Wire.begin();
while(!bme280.begin())
{
Serial.println("Could not find BME280 sensor 76!");
delay(1000);
}
}
void reconnect_server() {
if (WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("WiFi connect...");
} else {
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("");
}
if(!client.connected() && WiFi.status() == WL_CONNECTED){
if (client.connect("ESP8266Client")) {
Serial.println("Mosquitto connect...");
client.subscribe(motionSensor_topic);
client.subscribe(openSensor_topic1);
client.subscribe(openSensor_topic2);
} else {
Serial.print("failed connect Mosquitto, rc=");
Serial.print(client.state());
Serial.println("");
}
}
}
void IRAM_ATTR ChangeTemp() { // Функция считывания и публикации данных о температуре
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280:
resUnit presUnit(BME280:
resUnit_Pa);
// Датчик температуры на адресе 0х76
float temp76(NAN), hum76(NAN), pres76(NAN);
bme280.read(pres76,temp76,hum76,tempUnit,presUnit);
Serial.print("Temp76: ");
Serial.print(temp76);
Serial.println("°C");
Serial.print("Humidity76: ");
Serial.print(hum76);
Serial.println("% RH");
Serial.print("Pressure76: ");
Serial.print(pres76*0.00750062,2);
Serial.println(" mmHg");
client.publish(Temp_topic, String(temp76).c_str(), false); // Публикуем температуру
client.publish(Humidity_topic, String(hum76).c_str(), false); // Публикуем влажность
client.publish(Pressure_topic, String(pres76*0.00750062,2).c_str(), false); // Публикуем давление
}
void loop(){
client.loop();
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проверка подключения к сети (раз в 60 сек.)
last_mls = millis();
reconnect_server();
}
// END Блок [Проверка подключения] ******************************************
// Блок [Проверка температуры ] **********************************************
if (millis() - last_mls_temp > 60000) { // Проверка температуры (раз в 60 сек.)
last_mls_temp = millis();
ChangeTemp();
}
// END Блок [Проверка температуры] ******************************************
// Блок [Проверка движения ] **********************************************
if (moveOn = false) { // будем проверять если не зафиксировано сработки датчика
if (millis() - last_mls_move > 3000) { // Проверка датчика движения (раз в 3 сек.)
last_mls_move = millis();
detectsMovementD6();
}
}
if (moveOn = true) { // будем проверять если Зафиксировано сработка датчика
if (millis() - last_mls_moveOff > 15000) { // Проверка (раз в 15 сек.)
last_mls_moveOff = millis();
moveOn=false; // Обнуляем сработку датчика
}
}
// END Блок [Проверка движения] ******************************************
if (Win1On = true) {
delay(10);
if (Win1Old = digitalRead(openSensorD3)){
if(int val = digitalRead(openSensorD3)){
client.publish(openSensor_topic1, String(val).c_str(), false); // Публикуем состояние окна 1
Serial.println("Открыто окно D3!!!");
}else{
client.publish(openSensor_topic1, String(val).c_str(), false); // Публикуем состояние окна 1
Serial.println("Закрыто окно D3!!!");
}
Win1Old = digitalRead(openSensorD3);
}
Win1On = false;
}
if (Win2On = true) {
delay(10);
if (Win2Old = digitalRead(openSensorD4)){
if(int val = digitalRead(openSensorD4)){
client.publish(openSensor_topic2, String(val).c_str(), false); // Публикуем состояние окна 2
Serial.println("Открыто окно D4!!!");
}else{
client.publish(openSensor_topic2, String(val).c_str(), false); // Публикуем состояние окна 2
Serial.println("Закрыто окно D4!!!");
}
Win2Old = digitalRead(openSensorD4);
}
Win2On = false;
}
if (SmokeOn = true) {
delay(10);
if (SmokeOld = digitalRead(smokeSensorD5)){
if(int val = digitalRead(smokeSensorD5)){
client.publish(smokeSensor_topic, String(val).c_str(), false); // Публикуем состояние датчика дыма
Serial.println("Пожар D5!!!");
}else{
client.publish(smokeSensor_topic, String(val).c_str(), false); // Публикуем состояние датчика дыма
Serial.println("Дыма нет D5!!!");
}
SmokeOld = digitalRead(smokeSensorD5);
}
SmokeOn = false;
}