Как прикрутить кнопку?

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

  1. Qiwida

    Qiwida Нуб

    Здравствуйте! Всем!

    Долго мучился... пытался... но нет, мне не поддалось.

    И вот обращаюсь к ВАМ. Написал скетч по управлению рэле по сравнению двух датчиков влажности. Но есть необходимость прикрутить кнопку вкл/выкл... Вот вопрос: Как прописать кнопку включения данного в скетче сравнения показаний датчиков на 5 дней (но без delay), с возможностью отключения этого кнопкой... пытался поместить в case'ы, возникла проблема с delay в чтении датчиков...

    Код (C++):
    #include "stDHT.h"
    DHT sens(DHT22);
    const int relPin1 = 3; //реле 1
    const int relPin2 = 5; //реле 2


    void setup()
    {
      Serial.begin(57600);
      pinMode(2, INPUT);
      digitalWrite(2, HIGH);
      pinMode(4, INPUT);
      digitalWrite(4, HIGH);
      pinMode(relPin1, OUTPUT);
      pinMode(relPin2, OUTPUT);


      pinMode(11, INPUT);
    }


    void loop()
    {
      int t = sens.readTemperature(2); // чтение датчика на пине 2
      int h = sens.readHumidity(2);    // чтение датчика на пине 2
      delay(2000);
      int t2 = sens.readTemperature(4); // чтение датчика на пине 4
      int h2 = sens.readHumidity(4);    // чтение датчика на пине 4
      delay(2000);

      if( t >= (t2+5)){
      digitalWrite(relPin1, LOW); // при достижении температуры датчика 1 более 5 градусов включаем реле 2, отключаем реле 1
      digitalWrite(relPin2, HIGH); //
      }
      else if( h >= (h2+5)){
      digitalWrite(relPin1, LOW); //при влажности датчика 1 более 5 градусов включаем реле 2, реле 1 выключен
      digitalWrite(relPin2, HIGH); //
      }
      else {
      digitalWrite(relPin1, HIGH); // в других случаях реле 1 включено, реле 2 выключено
      digitalWrite(relPin2, LOW);
      }

      Serial.print("Влага датчика №1: ");
      Serial.print(h);
      Serial.print(" %");
      Serial.print("Темпер датчика №1: ");
      Serial.print(t);
      Serial.println(" C ");

      Serial.print("Влага датчика №2: ");
      Serial.print(h2);
      Serial.print(" %");
      Serial.print("Темпер датчика №2: ");
      Serial.print(t2);
      Serial.println(" C ");

    }
    За любую помощь БОЛЬШАЯ БЛАГОДАРНОСТЬ)))
     
    Последнее редактирование: 5 май 2017
  2. DetSimen

    DetSimen Guest

    Для начала вставь код как положено
     
  3. serg_admin

    serg_admin Гик

    Заведите переменную
    Код (C++):
    uint32_t t = 432000;
    Каждую секунду отнимайте от нее 1;

    Код (C++):
     t--;
    Когда станет равно 0 прошло 5 дней
    Код (C++):
    if (t == 0)
    {
      ...
    }
     
    Qiwida нравится это.
  4. serg_admin

    serg_admin Гик

  5. DetSimen

    DetSimen Guest

    Еслишто, я помогу с таймерами. :)
    Только, к сожалению, после праздников.
     
    Qiwida нравится это.
  6. Qiwida

    Qiwida Нуб

    Буду пробовать!!!
    я так понимаю в мой код надо вставить сравнение t > 0
     
  7. serg_admin

    serg_admin Гик

    Код (C++):

    if (digitalRead(pin)) { //Нажата кнопка
      if (t > 0)
        t = 0 ; // Если таймер идет - останавливаем
      else
        t = 432000; // если таймер остановлен - запускаем
    }
    if (t == 0)
    {
      // Здесь выключаете, то что нужно было выключить через пять дней
    }
    И где - то надо повесить функцию которая будет уменьшать t каждую секунду (если оно больше 0).

    Еще конечно нужна защита от дребезга, но это другой вопрос, и может быть решен аппаратно.
     
  8. serg_admin

    serg_admin Гик

    Если вариант t > 0 Вам понятней делайте. Будет рабочий, что то более менее рабочее выкладывайте.
     
  9. Qiwida

    Qiwida Нуб

    ААааааааааааааааааааа... блин что не так?


    Код (C++):

    #include <uTimerList.h>
    #include "stDHT.h"
    DHT sens(DHT22);
    #define     MAXTIMERSCOUNT    8

    //const int relPin1 = 3; //реле нагрева
    //const int relPin2 = 5; //реле продувки

    extern TTimerList TimerList;

    THandle hnd_dht1;          // хэндл для DHT 1
    THandle hnd_dht2;          // хэндл для DHT 2

    byte dht1 = 2; //пины датчиков
    byte dht2 = 4;

    void setup()
    {
      Serial.begin(57600);
      pinMode(dht1, INPUT);
      digitalWrite(dht1, HIGH);
      pinMode(dht2, INPUT);
      digitalWrite(dht2, HIGH);
    // pinMode(relPin1, OUTPUT);
    // pinMode(relPin2, OUTPUT);
    //  pinMode(11, INPUT);

    THandle hnd_dht1 = TimerList.AddSeconds(readDHT1,3); // добавляем таймер, задержка между морганиями 3сек
    THandle hnd_dht2 = TimerList.AddSeconds(readDHT2,3); //
    }

    void readDHT1(void)    // функция вызывается раз в секунду
    {

     int t = sens.readTemperature(dht1); // чтение датчика на пине 2
     int h = sens.readHumidity(dht1);    // чтение датчика на пине 2
      Serial.print("Влага датчика №1: ");
      Serial.print(h);
      Serial.print(" %");
      Serial.print("Темпер датчика №1: ");
      Serial.print(t);
      Serial.println(" C ");
    }

    void readDHT2(void)    // функция вызывается раз в секунду
    {

     int t2 = sens.readTemperature(dht2); // чтение датчика на пине 4
     int h2 = sens.readHumidity(dht2);    // чтение датчика на пине 4
      Serial.print("Влага датчика №2: ");
      Serial.print(h2);
      Serial.print(" %");
      Serial.print("Темпер датчика №2: ");
      Serial.print(t2);
      Serial.println(" C ");

    }

    void loop()
    {
    }

     
    upload_2017-5-5_16-9-59.png
     
    Последнее редактирование: 5 май 2017
  10. Qiwida

    Qiwida Нуб

    один датчик ваще не читает???
     
  11. serg_admin

    serg_admin Гик

    Есть вариант, что проблема с датчиком. Или плохой контакт.
    Но на самом деле не самая удачная компоновка программы.
    Нельзя внутри таймера выполнять длинный код. Можно в таймере выставить флажок, а функцию вызвать в loop после выставления флажка.

    Читаются ведь оба датчика - просто неустойчиво.
     
  12. Qiwida

    Qiwida Нуб

    я в этом ноль..честно... но с контактами норм... в другом скетче через delay читает
    буду изучать flag
     
  13. DetSimen

    DetSimen Guest

    Чтение DHT НЕ работает внутри функции таймера, она выполняется при запрещенных прерываниях. А чтение DHT внутри использует функцию micros(), которая при запрещенных прерываниях врёть.
    Нужно, да, в функции таймера взводить флаг чтения, а в loop его проверять и читать DHT.
     
  14. serg_admin

    serg_admin Гик

    Флажок имеется ввиду переменная

    Код (C++):

    uint8_t fl1 = 0;
    void readDHT1(void)    // функция вызывается раз в секунду
    {
      fl1 = 1;
    }

    void loop()
    {
      if (fl1 == 1)
      {
       fl1 = 0;
       int t = sens.readTemperature(dht1); // чтение датчика на пине 2
       int h = sens.readHumidity(dht1);    // чтение датчика на пине 2
       Serial.print("Влага датчика №1: ");
       Serial.print(h);
       Serial.print(" %");
       Serial.print("Темпер датчика №1: ");
       Serial.print(t);
       Serial.println(" C ");
      }
    }
     
    Конечно содержимое loop тоже желательно разбивать на процедуры. Тогда читать легче.
     
    Последнее редактирование: 5 май 2017
  15. serg_admin

    serg_admin Гик

    Вообщем-то на мой взгляд у Вас неплохо получается. Для начала.
     
    Tomasina нравится это.
  16. DetSimen

    DetSimen Guest

    у меня значения были вапще 200 C и 136% влажность. И само чтение DHT не очень устойчиво, нужно проверять возвращаемое значение. Примерно так
    int state = dht.read(2);

    if (state == DHTLIB_OK)
    {
     
  17. DetSimen

    DetSimen Guest

    у меня, правда, библиотека dht11.h Примерно так читается:
    Код (C++):
    void ReadTemp(void)
    {

        int state = dht.read(2);

        if (state == DHTLIB_OK)
        {
           
            int t = dht.temperature;
            int h = dht.humidity;

            if ((tem != t) OR (hum != h))
            {
                hum = h;
                tem = t;
                lcdOut();
            }
        }
        else Serial << hour << ':' << min << ' ' << "Error\n";

    }
     
    Последнее редактирование модератором: 5 май 2017
  18. Qiwida

    Qiwida Нуб

    upload_2017-5-5_23-20-32.png

    Такое ощущение что в порт пишется среднее значение)))
    Код (C++):
    #include <uTimerList.h>
    #include "stDHT.h"
    DHT sens(DHT22);
    #define     MAXTIMERSCOUNT    8

    //const int relPin1 = 3; //реле нагрева
    //const int relPin2 = 5; //реле продувки
    extern TTimerList TimerList;
    THandle hnd_dht1;          // хэндл для DHT 1
    THandle hnd_dht2;          // хэндл для DHT 2
    byte dht1 = 2; //пины датчиков
    byte dht2 = 4;

    uint8_t flag1=0;
    uint8_t flag2=0;

    void setup()
    {
      Serial.begin(57600);
      pinMode(dht1, INPUT);
      digitalWrite(dht1, HIGH);
      pinMode(dht2, INPUT);
      digitalWrite(dht2, HIGH);
     
    // pinMode(relPin1, OUTPUT);
    // pinMode(relPin2, OUTPUT);
    //  pinMode(11, INPUT);

    THandle hnd_dht1 = TimerList.AddSeconds(readDHT1,3); // добавляем таймер, задержка между морганиями 3сек
    THandle hnd_dht2 = TimerList.AddSeconds(readDHT2,3); //
    }

    void readDHT1(void)    // функция вызывается раз в секунду
    {  flag1 = 1; }

    void readDHT2(void)    // функция вызывается раз в секунду
    {  flag2 = 1; }

    void loop()
    {
    if (flag1 == 1)
    {
      flag1 = 0;
      int t = sens.readTemperature(dht1); // чтение датчика на пине 2
      int h = sens.readHumidity(dht1);    // чтение датчика на пине 2
     
      Serial.print("Влага датчика №1: ");
      Serial.print(h);
      Serial.print(" %");
      Serial.print("Темпер датчика №1: ");
      Serial.print(t);
      Serial.println(" C ");
      }

    if (flag2 == 1)
    {
      flag2 = 0;
      int t2 = sens.readTemperature(dht2); // чтение датчика на пине 4
      int h2 = sens.readHumidity(dht2);    // чтение датчика на пине 4
      Serial.print("Влага датчика №2: ");
      Serial.print(h2);
      Serial.print(" %");
      Serial.print("Темпер датчика №2: ");
      Serial.print(t2);
      Serial.println(" C ");
      }

    }
     
  19. serg_admin

    serg_admin Гик

    А должна меняться?
    Скетч вроде нормальный
     
  20. Qiwida

    Qiwida Нуб

    upload_2017-5-5_23-50-50.png
    Вот что происходит при работе другого скетча... здесь видно, что показания разные у датчиков... например если на него просто подуть)