Контроллер вентилятора для ванной

Тема в разделе "Глядите, что я сделал", создана пользователем fixedip, 22 фев 2016.

  1. fixedip

    fixedip Гик

    Мой первый проект на ардуино.
    Включаем вентилятор от фоторезистора и DTH11 (по влажности).
    Сподвигло меня "создать" сее устройство не совершенство вентиляции в моей ванной (которая работала с точностью до наоборот).
    Спустя полгода работы моего устройства могу сказать что я доволен его работой.

    Видео о "устройстве"



    Код:
    Код (C++):


    // Контроллер вентилятора на Arduino
    //
    #include <dht11.h>
    dht11 DHT;
    #define DHT11_PIN 2
    int Fan_PIN =3;
    int sense_PIN =0;

    void setup(){
      Serial.begin(9600);
      pinMode(Fan_PIN,OUTPUT);
      digitalWrite(Fan_PIN, LOW);
    }
    void loop(){
      int valsense = analogRead(sense_PIN);
      DHT.read(DHT11_PIN);
      Serial.println("sense");// вывод в монитор порта АЦП фоторезистора
      Serial.println(valsense);
      Serial.println("humidity");// вывод в монитор порта влажности в %
      Serial.println(DHT.humidity);
      Serial.println("temperature");// вывод в монитор порта температуры гр.
      Serial.println(DHT.temperature);
      int a = DHT.humidity;// присваиваем переменной "а" значение влажности с DHT11
      delay(2000);// задержка для опроса DHT11
      if(valsense>350){// проверяем если включен свет то переходим дальше иначе пропускаем до проверки влажности
        if(digitalRead(Fan_PIN)==LOW){// проверяем включен ли вентелятор если нет то включаем задержку на 2 минуты иначе пропускаем
          Serial.println("time1");// вывод в монитор порта о вкл. задержки
          uint32_t start_time = millis();// делаем задержку на 2(60000) мин.
          while ((millis() - start_time) < 60000);//
        }
        int valsense1 = analogRead(sense_PIN);// повторно считываем АЦП с фотодатчика
        if(valsense1>350){// проверяем...если болшьше то вкл. вентелятор иначе пропускаем
          digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор
        }
        if(valsense1<350){// проверяем если меньше то переходим дальше иначе пропускаем
          if(digitalRead(Fan_PIN)==HIGH){// проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем
            Serial.println("time2");// вывод в монитор порта о вкл. задержки
            uint32_t start_time = millis();//Время работы вентилятора после выключения света 3(180000) мин.
            while ((millis() - start_time) < 180000);//
            digitalWrite(Fan_PIN,LOW );//выкл. вентилятор
          }
        }
      }
      else{// проверка влажности
        if(a>60){// проверяем если влажность больше то
          digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор
        }
        else digitalWrite(Fan_PIN,LOW );// иначе выкл.

      }
    }


    }
    Плата:
    https://www.dropbox.com/s/bbpx5ig85s4igyz/Контроллер вентилятора.lay6?dl=0
     
    Последнее редактирование: 22 фев 2016
    ИгорьК нравится это.
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    во время выполнения этого кода:
    Код (C++):
    while ((millis() - start_time) < 180000);//
    вся система не реагирует ни на что, это не очень удобно.
    Плюс потом вентилятор безусловно выключается. Есть ли ситуация, когда он снова тут же включается? Ну там свет еще горит, или влажность недостаточно понизилась.

    все "магические числа" лучше вынести из кода в самое начало.
    P.S. Использовать int для задания номеров пинов - не слишком рационально. Лучше const byte или #define
     
    Последнее редактирование: 22 фев 2016
  3. fixedip

    fixedip Гик

    Спасибо за совет.
    Первый проект. Учту на будущие.
     
  4. fixedip

    fixedip Гик

    Я так понимаю Вы про этот участок кода ?
    Код (C++):
    if(valsense1<350){// проверяем если меньше то переходим дальше иначе пропускаем
          if(digitalRead(Fan_PIN)==HIGH){// проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем
            Serial.println("time2");// вывод в монитор порта о вкл. задержки
            uint32_t start_time = millis();//Время работы вентилятора после выключения света 3(180000) мин.
            while ((millis() - start_time) < 180000);//
            digitalWrite(Fan_PIN,LOW );//выкл. вентилятор
          }
     
  5. fixedip

    fixedip Гик

    Да, он (вентилятор) может включится сразу, по влажности после отработки основного кода
     
  6. fixedip

    fixedip Гик

    Под редактированный код
    Код (C++):
    // Контроллер вентилятора на Arduino
    //
    #include <dht11.h>
    dht11 DHT;
    #define DHT11_PIN 2// пин 2 для подключения датчика DHT11
    #define Fan_PIN 3// пин 3 для подключения реле
    #define sense_PIN 0// пин А0 для подключения фоторезистора
    int time1 = 60000; //Задержка  перед повторной проверкой  на включение света
    int time2 = 180000;//Время работы вентилятора после выключения света
    int hum;// Переменная для хранящая значение влажности
    int humMax = 60;// Максимальное значение влажности при которой включится вентелятор
    void setup(){
      Serial.begin(9600);
      pinMode(Fan_PIN,OUTPUT);
      digitalWrite(Fan_PIN, LOW);
    }
    void loop(){
      int valsense = analogRead(sense_PIN);
      DHT.read(DHT11_PIN);
      Serial.println("sense");// вывод в монитор порта АЦП фоторезистора
      Serial.println(valsense);
      Serial.println("humidity");// вывод в монитор порта влажности в %
      Serial.println(DHT.humidity);
      Serial.println("temperature");// вывод в монитор порта температуры гр.
      Serial.println(DHT.temperature);
      int hum = DHT.humidity;// присваиваем переменной "hum" значение влажности с DHT11
      delay(2000);// задержка для опроса DHT11
      if(valsense>350){// проверяем если включен свет то переходим дальше иначе пропускаем до проверки влажности
        if(digitalRead(Fan_PIN)==LOW){// проверяем включен ли вентелятор если нет то включаем задержку на 2 минуты иначе пропускаем
          Serial.println("time1");// вывод в монитор порта о вкл. задержки
          uint32_t start_time = millis();// делаем задержку на 2(60000) мин.
          while ((millis() - start_time) < time1);//
        }
        int valsense1 = analogRead(sense_PIN);// повторно считываем АЦП с фотодатчика
        if(valsense1>350){// проверяем...если болшьше то вкл. вентелятор иначе пропускаем
          digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор
        }
        if(valsense1<350){// проверяем если меньше то переходим дальше иначе пропускаем
          if(digitalRead(Fan_PIN)==HIGH){// проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем
            Serial.println("time2");// вывод в монитор порта о вкл. задержки
            uint32_t start_time = millis();//Время работы вентилятора после выключения света 3(180000) мин.
            while ((millis() - start_time) < time2);//
            digitalWrite(Fan_PIN,LOW );//выкл. вентилятор
          }
        }
      }
      else{// проверка влажности
        if(hum>humMax){// проверяем если влажность больше то
          digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор
        }
        else digitalWrite(Fan_PIN,LOW );// иначе выкл.

      }
    }
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    int time1 = 60000; //Задержка  перед повторной проверкой  на включение света
    int time2 = 180000;//Время работы вентилятора после выключения света
    int не может быть больше 65535, поэтому вторая переменная равна 48930, а первая - на грани, захочется чуть увеличить - и произойдет переполнение.
    лучше так:
    Код (C++):
    const unsigned long time1 = 60000UL; //Задержка  перед повторной проверкой  на включение света
    const unsigned long  time2 = 180000UL;//Время работы вентилятора после выключения света
    или так:
    Код (C++):
    #define time1  60000UL //Задержка  перед повторной проверкой  на включение света
    #define time2  180000UL //Время работы вентилятора после выключения света
     
  8. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Что означает UL?
     
  9. fixedip

    fixedip Гик

    Хорошо что дает UL ?
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    это для подстраховки - принудительное указание компилятору, что число может быть больше 65535.
     
  11. fixedip

    fixedip Гик

    Редакция кода
    Код (C++):

    // Контроллер вентилятора на Arduino
    //
    #include <dht11.h>
    dht11 DHT;
    #define DHT11_PIN 2// пин 2 для подключения датчика DHT11
    #define Fan_PIN 3// пин 3 для подключения реле
    #define sense_PIN 0// пин А0 для подключения фоторезистора
    const unsigned long time1 = 3; //Задержка  перед повторной проверкой  на включение света в минутах
    const unsigned long time2 = 5;//Время работы вентилятора после выключения света в минутах
    byte hum;// Переменная для хранящая значение влажности
    byte humMax = 60;// Максимальное значение влажности при которой включится вентелятор 0-256
    int sensWork = 350;// свет включен
    void setup() {
      Serial.begin(9600);
      pinMode(Fan_PIN, OUTPUT);
      digitalWrite(Fan_PIN, LOW);

    }
    void loop() {

      int valsense = analogRead(sense_PIN);
      DHT.read(DHT11_PIN);
      Serial.println("sense");// вывод в монитор порта АЦП фоторезистора
      Serial.println(valsense);
      Serial.println("humidity");// вывод в монитор порта влажности в %
      Serial.println(DHT.humidity);
      Serial.println("temperature");// вывод в монитор порта температуры гр.
      Serial.println(DHT.temperature);
      hum = DHT.humidity;// присваиваем переменной "hum" значение влажности с DHT11
      delay(2000);// задержка для опроса DHT11
      if (valsense > sensWork) { // проверяем если включен свет то переходим дальше иначе пропускаем до проверки влажности
        if (digitalRead(Fan_PIN) == LOW) { // проверяем включен ли вентелятор если нет то включаем задержку на 2 минуты иначе пропускаем
          Serial.println("time1");// вывод в монитор порта о вкл. задержки
          uint32_t start_time = millis();// делаем задержку на time1 мин.
          while ((millis() - start_time) < (time1 * 60000)); //
        }
        int valsense1 = analogRead(sense_PIN);// повторно считываем АЦП с фотодатчика
        if (valsense1 > sensWork) { // проверяем...если болшьше то вкл. вентелятор иначе пропускаем
          digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор
        }
        if (valsense1 < sensWork) { // проверяем если меньше то переходим дальше иначе пропускаем
          if (digitalRead(Fan_PIN) == HIGH) { // проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем
            Serial.println("time2");// вывод в монитор порта о вкл. задержки
            uint32_t start_time = millis();//Время работы вентилятора после выключения света time2 мин.
            while ((millis() - start_time) < (time2 * 60000)); //
            digitalWrite(Fan_PIN, LOW ); //выкл. вентилятор
          }
        }
      }
      else { // проверка влажности
        if (hum > humMax) { // проверяем если влажность больше то
          digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор
        }
        else digitalWrite(Fan_PIN, LOW ); // иначе выкл.
      }
    }
    }
     
    Последнее редактирование: 23 фев 2016