Реле, кнопка, DHT11

Тема в разделе "Arduino & Shields", создана пользователем Antoshka64, 14 май 2017.

  1. Antoshka64

    Antoshka64 Нуб

    Всем привет, сразу к делу.


    Вот делаю такой проект. Такая проблема, когда дышу на датчик - лампа выключается, нажимаю на кнопку - она включается НО сразу опять выключается, а у автора после нажатия кнопки остаётся включенной. Наверное датчик в это время ещё улавливает порог влажности ,при которой выключается лампа. Может какую-то задержку надо сделать? Вот код
    Код (C++):

    #include "DHT.h"


    #define DHTPIN A0  

    #define BUTTON 8

    #define LIGHT 4


    // Uncomment whatever type you're using!

    #define DHTTYPE DHT11   // DHT 11

    //#define DHTTYPE DHT22   // DHT 22  (AM2302)

    //#define DHTTYPE DHT21   // DHT 21 (AM2301)


    // Connect pin 1 (on the left) of the sensor to +5V

    // Connect pin 2 of the sensor to whatever your DHTPIN is

    // Connect pin 4 (on the right) of the sensor to GROUND

    // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor


    DHT dht(DHTPIN, DHTTYPE);

    int threshold = 70; //выставляемая влажность в помещении.

    int state = 1;


    void setup()

    {

        Serial.begin(9600);

        Serial.println("DHTxx test!");

        pinMode(BUTTON, INPUT);

        pinMode(LIGHT, OUTPUT);

        dht.begin();

    }


    void loop()

    {

        // Reading temperature or humidity takes about 250 milliseconds!

        // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

        float h = dht.readHumidity();

       


        // check if returns are valid, if they are NaN (not a number) then something went wrong!

        if (isnan(h))

        {

            Serial.println("Failed to read from DHT");

        }

        else

        {

            Serial.print("Humidity: ");

            Serial.print(h);

            Serial.print(" %\t");

            if(h>threshold){

              digitalWrite(LIGHT, LOW);

              state = 0;

              }

            if(!digitalRead(BUTTON) && !state){

              digitalWrite(LIGHT, HIGH);

              delay(50);

              state = 1;

              }

        }

    }
     
     
  2. smile

    smile Нерд

    конечно!
    Выведи показания датчика в сериал порт и оттуда на комп и подыши на датчик и ты удивишься...
    Влажность снижается десятки секунд, а вот температура от выдоха заметно быстрее снижается, чем влажность.
     
  3. Slaiterx

    Slaiterx Гик

    попробуй увеличить время задержки
    Код (C++):
    delay(3000);
     
  4. smile

    smile Нерд

    А может просто мониторить показания датчика и "отваливать" реле только после достижения определенного низкого значения?
     
  5. Antoshka64

    Antoshka64 Нуб

    можно по подробнее?
    P.S
    С другого форума человек мне помог добавить пару строк, только я их чёт не понял, т.к не профессионал в ардуино. Я выделил эти строчки
    Код (C++):
    #include "DHT.h"

    #define DHTPIN A0
    #define BUTTON 8
    #define LIGHT 4

    // Uncomment whatever type you're using!
    #define DHTTYPE DHT11   // DHT 11
    //#define DHTTYPE DHT22   // DHT 22  (AM2302)
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)

    DHT dht(DHTPIN, DHTTYPE);
    int threshold = 62;
    int state = 1;
    добавлена 1 - unsigned long lastButtonPressedTime = 0; // сюда будем запоминать время (значение millis()) последнего нажатия кнопки.

    void setup()
    {
          Serial.begin(9600);
          Serial.println("DHTxx test!");
          pinMode(BUTTON, INPUT);
          pinMode(LIGHT, OUTPUT);
          dht.begin();
    }

    void loop()
    {
          // Reading temperature or humidity takes about 250 milliseconds!
          // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
          float h = dht.readHumidity();


          // check if returns are valid, if they are NaN (not a number) then something went wrong!
          if (isnan(h))
          {
            Serial.println("Failed to read from DHT");
          }
          else
          {
                    Serial.print("Humidity: ");
                    Serial.print(h);
                    Serial.print(" %\t");
                    if(h>threshold){
                добавлена 2       if(millis() - lastButtonPressedTime > 5000){ // если после последнего нажатия кнопки прошло более пяти (или сколько захотите) секунд  
                         digitalWrite(LIGHT, LOW);
                        state = 0;
                       }
                    }
                   if(!digitalRead(BUTTON) && !state){
                   digitalWrite(LIGHT, HIGH);
                   delay(1000);
                   state = 1;
          добавлена 3         lastButtonPressedTime = millis(); // запоминаем  время (значение millis()) последнего нажатия кнопки
                   }
          }
    }
     
  6. qwone

    qwone Гик

    Код (C++):
    /*to_Anton64.ino
      1 лампа  -> 4
      2 кнопка -> 8
      3 датчик -> A0
    */

    // 1 лампа
    class Cl_lamp {
        byte pin;
      public:
        Cl_lamp(byte _pin): pin(_pin) {};
        setup() {
          pinMode(pin, OUTPUT);
          digitalWrite(pin, LOW);
        };
        ON() { // вкл лампу
          digitalWrite(pin, HIGH);
        };
        OFF() { // выкл лампу
          digitalWrite(pin, LOW);
        };
    };
    Cl_lamp Lamp(4);// подключить лампу на выв 4
    // 2 кнопка
    class Cl_btn {
        byte pin;
        void (* Do)();
        bool btn, btn_old;
        bool bounce = 0; // антидребезговый флаг
        uint32_t past = 0 ;
      public:
        Cl_btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {};
        setup() { // вставить в setup()
          pinMode(pin, INPUT_PULLUP);
          btn = digitalRead(pin);
        };
        loop() {// вставить в loop()
          if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
            bounce = 1;                                 // выставить флаг
            past = millis();                         // сделать временую засветку
          }
          else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
            bounce = 0;      // то снять флаг
            btn_old = btn ;
            btn = digitalRead(pin)  ; // прочитать реальное значение на выводе
            if (btn_old && ! btn)  Do();
          }
        };
    };
    void Do_btn() {
      Lamp.OFF();
    }
    Cl_btn btn(8, Do_btn); // подключить кнопку на выв 8
    // 3 датчик
    #include "DHT.h"
    class Cl_Sens {
        byte pin;
        DHT * dht;
        float h;
        const float h_ON ;//<--- напиши нужное число влажности для срабатывания датчика
        void (* Do)();
        uint32_t past = 0 ;
      public:
        Cl_Sens(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {};
        void setup() {
          dht = new DHT(pin, DHT11);
          dht->begin();
        };
        void loop() {
          if (millis() - past >= 2000) {
            past = millis();
            h = dht->readHumidity();
            if (h > h_ON) Do();
          }
        };
    };
    void Do_Sens() {
      Lamp.ON();
    }
    Cl_Sens Sens(A0, Do_Sens); // подключить датчик влажности на пин А0

    void setup() {
      // 1 лампа
      Lamp.setup();
      // 2 кнопка
      btn.setup();
      // 3 датчик
      Sens.setup();
    }

    void loop() {
      // 1 лампа
      // 2 кнопка
      btn.loop();
      // 3 датчик
      Sens.loop();
    }
    Компилируется, в работе не проверял
     
  7. DetSimen

    DetSimen Guest

    Для начала надо последовательно и внятно описать, что должно делаца и при каких условиях.
     
    smile и Tomasina нравится это.