Глючат показания DHT11 при включении 4х реле

YaSerg
Offline
Зарегистрирован: 02.03.2017

Всем привет.

Контроллер 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("");
 
}

 

slider
Offline
Зарегистрирован: 17.06.2014

YaSerg пишет:

... но когда включаешь например одно реле света и реле вытяжки показания начинают прыгать, второй свет иногда вылазиет ошибка. Как я понял какие-то помехи....

если на макетке было все норм , то возможно помехи от ламп + плохое питание контроллера. мож еще провода DHT11 удлинили не уменьшив подтягивающий резистор. 

 

 

если у вас хреновое питалово (неизвестно нам какое), то повесьте для реле отдельный стаб. 

БП 8-9в  -> контроллер (стаб 5в , стаб 3в) -> esp8266

             |

              -> стаб 5в. -> реле

 

YaSerg
Offline
Зарегистрирован: 02.03.2017

1. Если лампы (хоть все) замкнуть вручную без реле прямо у коннектора все гуд. Глюки начинаются при включении больше кол-ва лам с реле: первая не дает глюков, вторая возможно, третья точно переодически, а если вытяжка включается точно сбой. Но включение всего этого вручную к с боям не приводят.

2. Провод до датчика действительно удлиннил, но длинный провод без реле и на макетнике тоже норм. работает.
Подскажите как уменьшить подлтягивающий резистор?

3. Питание контроллера по витой паре, длина кабеля около 6 метровю

sadman41
Offline
Зарегистрирован: 19.10.2016

...а реле, поди, питаются от ардуины и по мере включения роняют напругу до того уровня, что DHT перестает соображать по причине недостатка питания? Измеряйте напряжение на сенсоре в момент щелканья релюшками.

Впрочем, без схемы это всё гадание на кофейной гуще. 

Penumbra
Offline
Зарегистрирован: 06.08.2017

после того ка я выпил чашечку кофе, моя схема ( которая нарисовалась в этой чашечке) говорит что надо по питанию конденсатор в 1000 мкф поставить 

YaSerg
Offline
Зарегистрирован: 02.03.2017

Вы праы просадки давали реле. На датчике при выключенных реле 4,9 при все включенных прыгает 4,6 - 4,5В.
Посадил реле на отдельное питание и все норм.

Посоветуйте стабилизатор напряжения, блок питания использую 9В 1А. Не хочется городить второй блок питания.