Есть ли ошибки в коде?

Mestniy96
Offline
Зарегистрирован: 31.08.2015
#include "DHT.h"                            // Подключение библиотеки датчика влажности и температуры
#define DHTPIN 5           // Cигнальный выход датчика подключен к 6 пину
// выбор используемого датчика
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);                  //инициализация датчика DHT

int sens = 2;//устанавливаем датчик света на 2 пин...
int relepin = 6; //Определяем для вентилятора пин 6...
int dhtmax=53;
int dhtminim=50;
unsigned long currentTime;//переменные для времени
unsigned long loopTime;
//Блок настроек, выполняется однократно
void setup() 
{ // Начало инициализации блока
  Serial.begin(9600);
  currentTime = millis(); // считываем время
  loopTime = currentTime; 
  pinMode(sens, INPUT);//устанавливаем значение нашего датчика света, как вход
  pinMode(relepin, OUTPUT);//устанавливаем значение нашего датчика вентиляции, как выход                        // Запускаем ход чаов
}
// Основной блок программы, выполняется бесконечно, циклично
void loop() {   // Начало инициализации блока
  int h = digitalRead(5);
  int dsens = digitalRead(sens); //переменная для считывания показаний с датчика света  
  Serial.print(h);
  if (dsens==1 && h>=dhtmax)//если свет выключен, то проверяем состояние датчика влажности и если оно превышает 53%
 {
  digitalWrite(relepin, HIGH); //включаем вентилятор
 }
 if (dsens==0 && h>=dhtmax)//если включили свет и влажность по прежнему > 53%, то...
 {
  currentTime = millis(); // считываем время
  if(currentTime >= (loopTime + 60000*3) && dsens==0)//ставим условие: если через 3 мин свет включен то...
  {
   digitalWrite(relepin, LOW);//выключаем реле. 
     }
     else if (currentTime < (loopTime + 60000*3) && dsens==1)//в противном случае если свет выключили раньше 3 мин то...
       {
        digitalWrite(relepin, HIGH);//включить реле 
       } 
 }
else if (h<=dhtminim)//если влажность меньше 50%, то...
{
 digitalWrite(relepin, LOW);//выключаем реле.  
}  
}

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

У меня проблема не срабатывают реле!

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

digitalRead возвращает HIGH или LOW, а Вы его с чем сравнивает?

Araris
Offline
Зарегистрирован: 09.11.2012

Вы влажность не измеряете.

В сетапе должно стоять DHT.begin();

Измерение: Влажность = DHT.readHumidity();

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Понял спасибо...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
24   int h = digitalRead(5);
25   ...
26   ...
27   if (dsens==1 && h>=dhtmax)//если свет 

Вы серьёзно считаете, что h хоть когда-нибудь может оказаться больше или равным 53? Условие в строке 27 не сработает НИКОГДА.

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

А почему?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что почему? Условие не выполнится? Вам же kisoft уже писал и Вы сказали, что поняли.

h получает значение функции digitalRead. Что эта функция возвращает? Она может хоть при каких-нибудь условиях вернтуь нечто >= 53? Нет, не может. Значит h>=dhtmax всегда будет false, а значит и всё условие dsens==1 && h>=dhtmax тоже всегда будет false. т.е. строка 29 не выпполнится НИКОГДА.

Зато в другом месте

43 else if (h<=dhtminim)//если влажность меньше 50%, то...

условие ВСЕГДА инстинно (по тем же причинам - потому, что h никогда не может быть ничем кроме 0 и 1, т.е. h всегда заедомо меньше 50). Значит строка 45

45  digitalWrite(relepin, LOW);//выключаем реле.

будет выполняться ВСЕГДА.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

А все доехало! Спасибо Вам огромное...