DHT11 sensor + IO Shield

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем WildChild, 15 авг 2011.

  1. WildChild

    WildChild Нуб

    У датчика кабель для подключения не подходит для IO Shield. GND и VCC нужно менять местами. Такие дела :( Руками чтоли переделать этот провод?
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Уверены, что ничего не путаете? Не пытаетесь ли вы случаем его подключить к digital-тройке контактов? Вам нужна analog-тройка, там штырьки идут в другом порядке. Да, датчик цифровой, но он работает на аналоговых входах Arduino A0-A5.

    На самом деле деление ролей входов/выходов на микроконтроллере Atmega328p не такое прямолинейное как цифровой/аналоговый, просто для простоты или от незнания всюду в интернете используют эту формулировку. В случае с DHT11 вы наверняка будете использовать стороннюю библиотеку — она скроет от вас low-level детали взаимодействия с датчиком, просто подключите его к A0.
     
  3. WildChild

    WildChild Нуб

    Так точно, хотя он и на цифровом работал. Юзаю библиотеку. На аналоговом постоянно получал таймаут, но это наверное потому что было очень поздно и я устал.
     
  4. bvv

    bvv Нерд

    Вот кстати да. Постоянно дает "read timeout". Сделал делэй побольше, пошли показания, но таймауты выскакивают вперемешку с данными. Как лечить то?
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    Игнорировать считывания с таймаутами: использовать при этом значение с предыдущей итерации. Либо тут же переспрашивать.
     
  6. Eone

    Eone Нуб

    а можно пример такого игнорирования? у меня сейчас time out выскакивает примерно каждые 15 секунд. Вот мой код
    вместо светодиодов будет в будущем реле

    Код (C):
    #include <dht.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    #define MIN_HUM 0
    #define MAX_HUM 0
    #define MIN_TEMP 27
    #define MAX_TEMP 28


    DHT sensor = DHT();

    int curHum, curTemp;

    int ledA = 11;
    int ledB = 10;
    int ledC = 13;
    LiquidCrystal_I2C lcd(0x20,20,4);

    void setup()
    {
        pinMode(ledA, OUTPUT);
        pinMode(ledB, OUTPUT);
        pinMode(ledC, OUTPUT);
       
        lcd.init();                  
        lcd.backlight();
       
        sensor.attach(A0);
       
        delay(1000);
    }
     
    void loop()
    {
     
        lcd.clear();
        lcd.setCursor(0,0);
        sensor.update();

        switch (sensor.getLastError())
        {
            case DHT_ERROR_OK:
                char msg[128];
                curHum = sensor.getHumidityInt();
                curTemp = sensor.getTemperatureInt();
               
                sprintf(msg, "Current humidity = %d%% temperature = %dC",
                        sensor.getHumidityInt(), sensor.getTemperatureInt());
                lcd.setCursor(0, 1);
                lcd.print("HUM");
                lcd.setCursor(5, 1);
                lcd.print(sensor.getHumidityInt());
                lcd.setCursor(10, 1);
                lcd.print("%");
                lcd.setCursor(0, 2);
                lcd.print("TEMP");
                lcd.setCursor(5, 2);
                lcd.print(sensor.getTemperatureInt());
                lcd.setCursor(10, 2);
                lcd.print("C");
                      if (curHum > MAX_HUM)
                      {
                      //
                      }
                      if (curHum < MIN_HUM)
                      {
                      //
                      }
                      if (curTemp > MAX_TEMP)
                      {
                      digitalWrite(ledA, HIGH);
                      digitalWrite(ledB, LOW);
                      }
                      if (curTemp < MIN_TEMP)
                      {
                      digitalWrite(ledB, HIGH);
                      digitalWrite(ledA, LOW);
                      }
                 break;
               case DHT_ERROR_START_FAILED_1:
                lcd.print("Error:");
                lcd.setCursor(0, 1);
                lcd.print("Stage 1 failed");
                break;
            case DHT_ERROR_START_FAILED_2:
                lcd.print("Error:");
                lcd.setCursor(0, 1);
                lcd.print("Stage 2 failed");
                break;
            case DHT_ERROR_READ_TIMEOUT:
                lcd.print("Error:");
                lcd.setCursor(0, 1);
                lcd.print("Read timeout");
                break;
            case DHT_ERROR_CHECKSUM_FAILURE:
                lcd.print("Error:");
                lcd.setCursor(0, 1);
                lcd.print("Checksum error");
                break;
        }
     
        delay(3000);
    }
     
  7. Eone

    Eone Нуб

    отвечаю на свой вопрос сам :)
    Код (C):
    case DHT_ERROR_READ_TIMEOUT:
            lcd.setCursor(0, 1);
                lcd.print("HUM");
                lcd.setCursor(5, 1);
                lcd.print(curHum);
                lcd.setCursor(10, 1);
                lcd.print("%");
                lcd.setCursor(0, 2);
                lcd.print("TEMP");
                lcd.setCursor(5, 2);
                lcd.print(curTemp);
                lcd.setCursor(10, 2);
                lcd.print("C");
                break;
    так можно делать?
    мы ввели в setup переменные curHum и curTemp, при выполнении скетча они постоянно перезаписываются на новые данные о температуре и влажности посредством определений
    Код (C):
    curHum = sensor.getHumidityInt();
                    curTemp = sensor.getTemperatureInt();
    и при попытке выдать error мы получаем последние данные из буфера.
    я правильно рассуждаю?
     
  8. nailxx

    nailxx Официальный Нерд Администратор

    Да, в общем можно и так, но в этом случае вы повторяетесь с кодом. Проще вообще ничего не делать в случае `DHT_ERROR_READ_TIMEOUT`. Просто `break` и всё
     
  9. Eone

    Eone Нуб

    ну тогда получается что во время error'a у меня на дисплее просто пустой экран в добавку к тому что он и так мерцает при каждом опросе :) а они бывают и 3-4 раза подряд, тоесть у меня с некоторой периодичностью пропадают показания на 4-5 секунд с ЖК
     
  10. nailxx

    nailxx Официальный Нерд Администратор

    Ещё раз взглянул на ваш код и всё же не понимаю, что приводит к очистке дисплея? Что в него записали остаётся на нём навсегда, до перезагрузки. Ведь так?!
     
  11. Mitrandir

    Mitrandir Гуру

    там первой строкой clear() она раз в 3 сек чистит на каждой итерации.

    если упадет ошибка не отлавливаемая кейсом, на 3-6 секунд пропадет инфа с экрана.
    Надо добавить кейс, который будет все неуказанные ошибки собирать и выводить на экран

    Код (C):

    // ...........
    default: lcd.print("Unknown error!");
    break;
    // ...............

     
     
    nailxx нравится это.
  12. nailxx

    nailxx Официальный Нерд Администратор

    Точно. Слона не приметил. Тогда можно `clear` снести непосредственно под `case`
     
  13. Mitrandir

    Mitrandir Гуру

    я бы не стал.. придется тиражировать на каждую ветку. Разрастется код, его станет трудно поддерживать, увеличится размер скетча в бинарнике.
    лучше просмотреть внимательно ветви управления, и добиться, чтобы не было ветви не выводящей ничего на экран