Глючат показания 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А. Не хочется городить второй блок питания.