ZyaK писал(а): ↑Сб май 30, 2020 7:03 am
Проверяли, работает нормально?
я бы избавился от цикла вайл
Wire.begin();
while(!bme280.begin())
{
Serial.println("Could not find BME280 sensor 76!");
delay(1000);
}
потому, что если отвалится датчик, он будет постоянно крутиться в этом цикле и дальше не пойдет.
так же по датчикам температуры нет смысла отправлять данные если они не изменились ну и усреднение тоже не помешает
Код: Выделить всё
if (isnan(t1) || isnan(h1)) {
Serial.println("Failed to read from DHT #1");
}
else
{
if (old_t1 == t1)
{
Serial.println("dannie ne izmenilis");
}
else
{
client.publish(DHT_Temp_spalna, String(t1, 1).c_str());
client.loop();
client.publish(DHT_Hum_spalna, String(h1, 1).c_str());
client.loop();
old_t1 = t1;
old_h1 = h1;
}
}
Спасибо.
Нет не проверял, железка не собрана до конца.
Но сам нашел несколько ошибок.
По проверке датчика я с вами согласен, все верно, так и происходит изменил в коде на простую проверку без цикла, учел ваши замечания.
Единственное пока я не понимаю верно ли назначено функциям прерывания значение "CHANGE".
Идея была такая, отловить момент когда на пине что то поменялось поставить флаг события и потом в loop уже это обработать.
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#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;
void IRAM_ATTR detectsMovementD6() { // Функция при обнаружении движения на D6
if(digitalRead(motionSensorD6)){
delay(10);
if(digitalRead(motionSensorD6)){
client.publish(motionSensor_topic, "1" , 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(digitalRead(motionSensorD6)){
client.publish(motionSensor_topic, "1", true); // Публикуем состояние датчика движения
Serial.println("Движение D6!!!");
}else{
client.publish(motionSensor_topic, "0", true); // Публикуем состояние датчика движения
Serial.println("Все тихо D6!!!");
}
pinMode(openSensorD3, INPUT_PULLUP); // уставливаем пин D3 на прием и включаем внутренний подтягивающий резистор
attachInterrupt(openSensorD3, detectsOpenD3, CHANGE); // Прерывание для датчика окна запуск функции detectsOpenD3
// Первоначальные данные по датчику окна 1
if(digitalRead(openSensorD3)){
client.publish(openSensor_topic1, "1", false); // Публикуем состояние окна 1
Serial.println("Открыто окно D3!!!");
}else{
client.publish(openSensor_topic1, "0", false); // Публикуем состояние окна 1
Serial.println("Закрыто окно D3!!!");
}
pinMode(openSensorD4, INPUT_PULLUP); // уставливаем пин D4 на прием и включаем внутренний подтягивающий резистор
attachInterrupt(openSensorD4, detectsOpenD4, CHANGE); // Прерывание для датчика окна запуск функции detectsOpenD4
// Первоначальные данные по датчику окна 2
if(digitalRead(openSensorD4)){
client.publish(openSensor_topic2, "1", false); // Публикуем состояние окна 2
Serial.println("Открыто окно D4!!!");
}else{
client.publish(openSensor_topic2, "0", false); // Публикуем состояние окна 2
Serial.println("Закрыто окно D4!!!");
}
pinMode(smokeSensorD5, INPUT_PULLUP); // уставливаем пин D6 на прием и включаем внутренний подтягивающий резистор
attachInterrupt(smokeSensorD5, detectsSmokeD5, CHANGE); // Прерывание для датчика движения запуск функции detectsMovementD6
// Первоначальные данные по датчика дыма
if(digitalRead(smokeSensorD5)){
client.publish(smokeSensor_topic, "1", false); // Публикуем состояние датчика дыма
Serial.println("Пожар D5!!!");
}else{
client.publish(smokeSensor_topic, "0", false); // Публикуем состояние датчика дыма
Serial.println("Дыма нет D5!!!");
}
Wire.begin();
if (!bme280.begin()){Serial.println("Could not find BME280 sensor 76!");}
}
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::PresUnit presUnit(BME280::PresUnit_Pa);
// Датчик температуры на адресе 0х76
float temp76(NAN), hum76(NAN), pres76(NAN);
float old_temp(NAN), old_hum(NAN), old_pres(NAN);
bme280.read(pres76,temp76,hum76,tempUnit,presUnit);
if (isnan(temp76) || isnan(hum76) || isnan(pres76) ) {
Serial.println("Ошибка чтения датчика BME280");
}
else
{
if (old_temp == temp76)
{
Serial.println("Данные температуры не изменились !");
}
else
{
Serial.print("Temp76: ");
Serial.print(temp76);
Serial.println("°C");
client.publish(Temp_topic, String(temp76,1).c_str(), false); // Публикуем температуру
client.loop();
old_temp == temp76;
}
if (old_hum == hum76)
{
Serial.println("Данные влажности не изменились !");
}
else
{
Serial.print("Humidity76: ");
Serial.print(hum76);
Serial.println("% RH");
client.publish(Humidity_topic, String(hum76,1).c_str(), false); // Публикуем влажность
client.loop();
old_hum = hum76;
}
if (old_pres == pres76)
{
Serial.println("Данные давления не изменились !");
}
else
{
Serial.print("Pressure76: ");
Serial.print(pres76*0.00750062,2);
Serial.println(" mmHg");
client.publish(Pressure_topic, String(pres76*0.00750062,2).c_str(), false); // Публикуем давление
client.loop();
old_pres = pres76;
}
}
}
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(digitalRead(openSensorD3)){
client.publish(openSensor_topic1, "1", false); // Публикуем состояние окна 1
Serial.println("Открыто окно D3!!!");
}else{
client.publish(openSensor_topic1, "0", false); // Публикуем состояние окна 1
Serial.println("Закрыто окно D3!!!");
}
Win1Old = digitalRead(openSensorD3);
}
Win1On = false;
}
if (Win2On == true) {
delay(10);
if (Win2Old == digitalRead(openSensorD4)){
if(digitalRead(openSensorD4)){
client.publish(openSensor_topic2, "1", false); // Публикуем состояние окна 2
Serial.println("Открыто окно D4!!!");
}else{
client.publish(openSensor_topic2, "0", false); // Публикуем состояние окна 2
Serial.println("Закрыто окно D4!!!");
}
Win2Old = digitalRead(openSensorD4);
}
Win2On = false;
}
if (SmokeOn == true) {
delay(10);
if (SmokeOld == digitalRead(smokeSensorD5)){
if(digitalRead(smokeSensorD5)){
client.publish(smokeSensor_topic, "1", false); // Публикуем состояние датчика дыма
Serial.println("Пожар D5!!!");
}else{
client.publish(smokeSensor_topic, "0", false); // Публикуем состояние датчика дыма
Serial.println("Дыма нет D5!!!");
}
SmokeOld = digitalRead(smokeSensorD5);
}
SmokeOn = false;
}
}