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

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

  1. Qiwida

    Qiwida Нуб

    Блин! а не может это быть из-за использования библиотеки #include "stDHT.h"?????
    может она "пашет" только на delay? или имеет какие-то особенности?
     
  2. serg_admin

    serg_admin Гик

    Попробуй
    Код (C++):
    Serial.print(h);
    Заменить на
    Код (C++):
    Serial.print(sens.readHumidity(dht1));
     
  3. serg_admin

    serg_admin Гик

    Возможно оптимизатор компилятора.
     
  4. serg_admin

    serg_admin Гик

    Вообще судя по тому, что температура и влажность на единицу изменились все работает. Просто надо воздействовать на датчики.
     
  5. Qiwida

    Qiwida Нуб

    upload_2017-5-6_0-9-38.png
    Serg, я и так "воздействую" ... на ОДИН датчик.... но вот что происходит... Воздействуя на первый, второй тоже показывает увеличение влажности причем показания равны! Воздействуя на Второй датчик - тоже САМОЕ)))

    Код (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(sens.readHumidity(dht1));
      Serial.print(" %");
      Serial.print("Темпер датчика №1: ");
      Serial.print(sens.readTemperature(dht1));
      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(sens.readHumidity(dht2));
      Serial.print(" %");
      Serial.print("Темпер датчика №2: ");
      Serial.print(sens.readTemperature(dht2));
      Serial.println(" C ");
      }

    }
     
  6. Qiwida

    Qiwida Нуб

    попробовал первый раз сделать на "миллис"
    Код (C++):

    #include "stDHT.h"
    DHT sens(DHT22);

    int flag1=0;
    int flag2=0;
    long previosMillis = 0;
    long interval = 2000;
    long interval2 = 2000;

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


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

    if (currentMillis-previosMillis>interval2 && flag2 == 0) {
      previosMillis=currentMillis;
      flag2 = 1;
      if  (flag2 == 1)
      {
      flag1 = 0;
      int t2 = sens.readTemperature(4); // чтение датчика на пине 4
      int h2 = sens.readHumidity(4);    // чтение датчика на пине 4
      Serial.print("Влага датчика №2: ");
      Serial.print(sens.readHumidity(4));
      Serial.print(" %");
      Serial.print("Темпер датчика №2: ");
      Serial.print(sens.readTemperature(4));
      Serial.println(" C ");
       }
    }
    }
     
    Получилось изощеренно))) но работает.... если уменьшаю интервал происходит тоже уравнение показаний...
    и из-за флажков... показания выдаются ступенчато, т.е. сначала показания первого, через 2 секунды второго и т.д.
     
  7. Qiwida

    Qiwida Нуб

    Что это значит?
     
  8. DetSimen

    DetSimen Guest

    volatile uint8_t flag1=0;
    volatile uint8_t flag2=0;
     
  9. serg_admin

    serg_admin Гик

    С флагами я думаю все нормально. В порт выводится ведь.

    Код (C++):
     volatile int t2 = sens.readTemperature(4); // чтение датчика на пине 4
     volatile int h2 = sens.readHumidity(4);
    Компилятор видит, что при инициализации переменной ей всегда присваивается одинаковое выражения, ну и не присваивает его второй раз, хотя в Вашем случае не должен бы. Еще попробуйте вынести объявления переменных t1, h1, t2, h2 в начало функции loop тогда у вас инициализация и присваение будут отдельно и компилятор не будет Вам голову морочить.
     
  10. Richard

    Richard Нерд

    Вообще советую такие штуки выводить вместе со временеми показывать со временем вывода. Лично я здесь без бутылки (а то и трех) не смогу разобраться, какие были внешние условия, какие внутренние, что там был за код и прочее и прочее. Пиши время, когда такие штуки выкладываешь. А еще лучше с фотками. И приятней смотреть было бы

    По поводу delay: это бич-вариант, когда вообще дргих вариантов нет. Ардуинка тупо простаивает две секунды (а могла бы и правда что-то делать, например, скажем, вычислять среднее значение, уже круто) и ничегошечки не делает. Это не круто. Это как... Ну, попробую провести аналогию, представь, что ты ардуинка и тебя поместили в машину времени на 10 секунд. Для тебя это время прошло незаметно, а во всем мире за 10 секунд столько всегопроизошло... Короче, мой совет: избавляйся в своих программах от delay по максимуму. Он нужен только на этапе изучения платформы, при серьезных проектах он только вредит.