Глючат показания DHT11 при включении 4х реле
- Войдите на сайт для отправки комментариев
Чт, 10/08/2017 - 14:25
Всем привет.
Контроллер Wemos D1 R2 управляет выляжкой санузла и освещением следующим скетчем. На макетной схеме реле "щелкают" отлично, показания тоже без проблем отображаются. Когда подключаешь в санузле (реле под напругой), при вылюченном свете все ОК, но когда включаешь например одно реле света и реле вытяжки показания начинают прыгать, второй свет иногда вылазиет ошибка. Как я понял какие-то помехи. Моих знаний хватает лишь предположить запитать реле от отдельнго, внешнего питания.
#include <ESP8266WiFi.h> #include "DHT.h" #include <Average.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2); unsigned long previousMillis = 0; // начало времени для опроса датчика температуры unsigned long previousMillis2 = 0; // начало отсчета для вытяжки const long interval = 3000; // пауза между опросами датчика температуры const long interval2 = 300000; // время непрерывной работы вытяжки 5 минут (300000 ) const long interval3 = 120000; // время остывания мотора вытяжки если влыжность не понижена работой вытяжки 2 минуты (120000 ) int timeTostop; int hummCount = 70; // влажность для включения вытяжки #define DHTPIN D2 // номер пина, к которому подсоединен датчик температуры // Инициируем датчик //DHT dht(DHTPIN, DHT22); DHT dht(DHTPIN, DHT11); Average<float> ave(20); // создаем массив на 20 значений const char* ssid = "bathroom"; const char* password = "14041984"; int ledPin = D7; //пин выключателя у раковины int ledPin2 = D8; //пин выключателя туалет комод int ledPin3 = D5; //пин выключателя над ванной int ledPin4 = D6; //пин выключателя вытяжки int value = LOW; int value2 = LOW; int value3 = LOW; int value4 = LOW; boolean value5 = false; WiFiServer server(80); void setup() { Serial.begin(115200); dht.begin(); delay(10); // initialize the LCD lcd.begin(4,5); // sda=0 | D3, scl=2 | D4 // Turn on the blacklight and print a message. lcd.backlight(); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); pinMode(ledPin2, OUTPUT); digitalWrite(ledPin2, HIGH); pinMode(ledPin3, OUTPUT); digitalWrite(ledPin3, HIGH); pinMode(ledPin4, OUTPUT); digitalWrite(ledPin4, HIGH); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Creating AP"); Serial.println(ssid); lcd.home(); lcd.print("Creating AP - "); lcd.setCursor(0, 1); lcd.print(ssid); delay(2000); lcd.clear(); lcd.home(); WiFi.mode(WIFI_AP); while (!WiFi.softAP(ssid, password)) { lcd.print("."); return; } lcd.print("Created OK"); delay(500); // для режима клиента точки доступа // while (WiFi.status() != WL_CONNECTED) { // delay(500); // lcd.print("."); // } Serial.println(""); Serial.println("Creating WiFi AP bathroom OK"); delay(2000); // Start the server server.begin(); lcd.setCursor(0, 1); lcd.print(WiFi.softAPIP()); Serial.println("Server started"); // Print the IP address Serial.print("Use this URL : "); Serial.print("http://"); Serial.print(WiFi.softAPIP()); Serial.println("/"); delay(2000); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // опросить датчик температуры и влажности и положить значение в массив Serial.println(previousMillis); // сохраняем время последнего опроса датчика previousMillis = currentMillis; Serial.println(currentMillis); float humm = dht.readHumidity(); ave.push(humm); // получаем значение влажности Serial.println(ave.mean()); } if (ave.mean() > hummCount && currentMillis - previousMillis2 >= interval3 && !value5) { previousMillis2 = currentMillis; digitalWrite(ledPin4, LOW); value4 = HIGH; value5 = true; } // дописать условие ИЛИ время работы более 5 минут // дописать присваивание значение value4 для отображение на веб статуса работы вытяжки if (currentMillis - previousMillis2 >= interval2 && value5) { digitalWrite(ledPin4, HIGH); previousMillis2 = currentMillis; value4 = LOW; value5 = false; } float h = dht.readHumidity(); float t = dht.readTemperature(); float hic = dht.computeHeatIndex(t, h, false); if (isnan(h) || isnan(t)) { lcd.clear(); lcd.print("Sensor ERROR"); delay (500); } lcd.home(); lcd.print("TEMP:"); lcd.print(round(t)); lcd.print("*C "); lcd.setCursor(10, 0); lcd.print("VT:"); if (value5) { timeTostop = currentMillis - previousMillis2; timeTostop = timeTostop / 1000; timeTostop = 300 - timeTostop; // timeTostop = timeTostop / 60; lcd.print(timeTostop); } else {lcd.print("0FF");} lcd.setCursor(0, 1); lcd.print("HUMM:"); lcd.print(round(ave.mean())); lcd.print("% ("); lcd.print(hummCount); lcd.print("%)"); // lcd.setCursor(0, 1); // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Match the request для реле 1 if (request.indexOf("/LED=ON") != -1) { digitalWrite(ledPin, LOW); value = HIGH; } if (request.indexOf("/LED=OFF") != -1){ digitalWrite(ledPin, HIGH); value = LOW; } // Match the request для реле 2 if (request.indexOf("/LED2=ON") != -1) { digitalWrite(ledPin2, LOW); value2 = HIGH; } if (request.indexOf("/LED2=OFF") != -1){ digitalWrite(ledPin2, HIGH); value2 = LOW; } // Match the request для реле 3 if (request.indexOf("/LED3=ON") != -1) { digitalWrite(ledPin3, LOW); value3 = HIGH; } if (request.indexOf("/LED3=OFF") != -1){ digitalWrite(ledPin3, HIGH); value3 = LOW; } // Match the request для реле 4 (вытяжка if (request.indexOf("/LED4=ON") != -1) { digitalWrite(ledPin4, LOW); value4 = HIGH; value5 = true; previousMillis2 = currentMillis; } if (request.indexOf("/LED4=OFF") != -1){ digitalWrite(ledPin4, HIGH); value4 = LOW; value5 = false; previousMillis2 = currentMillis; } // Парсим заданное значение влажности для включения вытяжки if (request.indexOf("/HUM=40") != -1) { hummCount = 40; } if (request.indexOf("/HUM=50") != -1) { hummCount = 50; } if (request.indexOf("/HUM=60") != -1){ hummCount = 60; } if (request.indexOf("/HUM=70") != -1){ hummCount = 70; } // Return the response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); // do not forget this one client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head><meta charset=\"utf-8\"> <title>ЯСанузел</title></head>"); if (isnan(h) || isnan(t)) { client.println("Не удается считать показания темпеатуры и влажности"); client.println("<br><br>"); } else { client.print("<center><font size=\"15\" color=\"blue\">Влажность "); client.print(h); client.println( "%</font></center>"); client.print("<center><font size=\"15\" color=\"blue\">Средняя влажность: "); client.println(ave.mean()); client.println(" %</font></center>"); client.print("<center><font size=\"15\" color=\"green\">Температура "); client.print(t); client.println(" *C</font></center>"); client.print("<center><font size=\"15\" color=\"green\">Ощущается как "); client.print(hic); client.println(" *C</font></center>"); client.println("<br><br>"); } client.print("<center><font size=\"15\">Свет у раковины чейчас: </font>"); if(value == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"brown\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Свет у туалета сейчас: </font>"); if(value2 == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED2=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"brown\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED2=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Свет над ванной сейчас: </font>"); if(value3 == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED3=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"brown\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED3=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Вытяжка сейчас: </font>"); if(value4 == HIGH) { client.print("<font size=\"15\" color=\"green\">Вкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED4=OFF\">Выключить</a></font></center><br>"); } else { client.print("<font size=\"15\" color=\"brown\">Выкл / </font></center>"); client.println("<center><font size=\"15\"><a href=\"/LED4=ON\">Включить</a></font></center><br>"); } client.println("<br><br>"); client.print("<center><font size=\"15\">Влажность для включения вытяжки: "); client.print(hummCount); client.println("</font></center>"); client.print ("<center><br><font size=\"15\"><a href=\"/HUM=40\">40</a>"); client.print(" "); client.print("<a href=\"/HUM=50\">50</a>"); client.print(" "); client.print("<a href=\"/HUM=60\">60</a>"); client.print(" "); client.print("<a href=\"/HUM=70\">70</a></font></center><br><br>"); client.print ("<center><br><font size=\"15\"><a href=\"http://"); client.print (WiFi.softAPIP()); client.print ("/\">ОБНОВИТЬ</a>"); client.println("</html>"); delay(1); Serial.println("Client disconnected"); Serial.println(""); }
... но когда включаешь например одно реле света и реле вытяжки показания начинают прыгать, второй свет иногда вылазиет ошибка. Как я понял какие-то помехи....
если на макетке было все норм , то возможно помехи от ламп + плохое питание контроллера. мож еще провода DHT11 удлинили не уменьшив подтягивающий резистор.
если у вас хреновое питалово (неизвестно нам какое), то повесьте для реле отдельный стаб.
БП 8-9в -> контроллер (стаб 5в , стаб 3в) -> esp8266
|
-> стаб 5в. -> реле
1. Если лампы (хоть все) замкнуть вручную без реле прямо у коннектора все гуд. Глюки начинаются при включении больше кол-ва лам с реле: первая не дает глюков, вторая возможно, третья точно переодически, а если вытяжка включается точно сбой. Но включение всего этого вручную к с боям не приводят.
2. Провод до датчика действительно удлиннил, но длинный провод без реле и на макетнике тоже норм. работает.
Подскажите как уменьшить подлтягивающий резистор?
3. Питание контроллера по витой паре, длина кабеля около 6 метровю
...а реле, поди, питаются от ардуины и по мере включения роняют напругу до того уровня, что DHT перестает соображать по причине недостатка питания? Измеряйте напряжение на сенсоре в момент щелканья релюшками.
Впрочем, без схемы это всё гадание на кофейной гуще.
после того ка я выпил чашечку кофе, моя схема ( которая нарисовалась в этой чашечке) говорит что надо по питанию конденсатор в 1000 мкф поставить
Вы праы просадки давали реле. На датчике при выключенных реле 4,9 при все включенных прыгает 4,6 - 4,5В.
Посадил реле на отдельное питание и все норм.
Посоветуйте стабилизатор напряжения, блок питания использую 9В 1А. Не хочется городить второй блок питания.