Датчик температуры передает снимать показания

Тема в разделе "Arduino & Shields", создана пользователем Vir, 27 фев 2013.

  1. Vir

    Vir Гик

    Всем привет.

    Есть такой датчик температуры и влажности. Есть ещё и такой, но его мне вообще завести не удалось (если у кого получилось, дайте знать).

    Так вот. Проблема следующая, датчик какое-то время снимает показания, всё ок. Но спустя некоторое время (так же за это время происходит понижение температуры градусов на 5-7, т.е. с 28 до 23, например) он просто перестает снимать показания, не может пройти инициализацию.

    Код следующий:
    Код (Text):
    // Импорт необходимых библиотек
    #include <dht.h>
     
    // Распиновка
    #define DHT_SENSOR_PIN 24
     
    DHT DHTLib;
    int _indoorTemperature;
    int _indoorHumidity;
     
    void indoorTempInit()
    {
      DHTLib.attach(DHT_SENSOR_PIN);
    }
     
    void indoorTempHandler()
    {
      DHTLib.update();
     
      if (DHTLib.getLastError() == DHT_ERROR_OK)
      {
        _indoorTemperature = constrain(DHTLib.getTemperatureInt(), 0, 40);
        _indoorHumidity = constrain(DHTLib.getHumidityInt(), 0, 100);
      }
    }
     
    int getIndoorTemperature()
    {
      return _indoorTemperature;
    }
     
    int getIndoorHumidity()
    {
      return _indoorHumidity;
    }
     
    Может кто-нибудь сталкивался с таким? В чём может быть причина?

    P.S. indoorTempInit вызывается в setup(), а indoorTempHandler соответственно в loop()
     
  2. nailxx

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

    Хмммм… странно. А вот если температура с 28 до 23 упала, датчик затупил и в этот момент нажать Reset, ситуация нормализуется?
     
  3. Vir

    Vir Гик

    Нет. Ситуация нормализуется после выключения ардуино, подождать минут 5 и включить снова.

    А вообще интересно по второму датчику узнать, вы пробовали его подключать?
     
  4. ertr

    ertr Нуб

    Есть такая же ситуация. Такое ощущение что после определенного количества запросов виснет.
    Пробовал и ставить опросы раз в минуту. Все равно надолго не хватает. Может ошибки в библиотеке с переполнением стека что-то...

    Код (Text):

    #include "etherShield.h"
    #include "ETHER_28J60.h"
    #include <dht.h>
     
    int s_temp;
    int s_hum;
    unsigned long prevMeasureTime = 0;
    static int MeasureInterval = 1000; // раз в минуту
    static uint8_t MaxTries = 4; // количество попыток получения данных с датчика
     
    static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};                                                          
    static uint8_t ip[4] = {192, 168, 0, 99};                    
    static uint16_t port = 80;                                   
     
    ETHER_28J60 e;
    DHT t_sensor = DHT();
     
    void setup()
    {
        e.setup(mac, ip, port);
        t_sensor.attach(A0);
        delay(MeasureInterval);
        MeasureData();
    }
     
    void loop()
    {
      char* params;
     
      if (params = e.serviceRequest())
      {  
        e.print("<H2>Temperatue: ");
        e.print(s_temp);
        e.print("C<br>");
        e.print("Humidity: ");
        e.print(s_hum);
        e.print("%</H2>");
        e.respond();
      }
     
      MeasureData();
    }
     
    void MeasureData()
    {
      if (abs(millis() - prevMeasureTime) > MeasureInterval)
      {
        prevMeasureTime = millis();
       
        for (uint8_t tries = 0; tries < MaxTries; tries++)
        {
          t_sensor.update();
          if (t_sensor.getLastError() == DHT_ERROR_OK)   
          {
            s_temp = t_sensor.getTemperatureInt();
            s_hum = t_sensor.getHumidityInt();
           
            break;
          }
          else
            delay(100);
        }
      }
    }
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Попробуйте поставить отладочные выводы в разных местах программы - поймете, в каком месте и в какой момент программа спотыкается.
    Попробуйте убрать часть кода, отвечающую за работу с сетью и посмотрите, не изменится ли поведение.
    Посчитайте количество успешных запросов перед зависанием - всегда ли оно одинаково?
     
  6. serge

    serge Нерд

    У меня была похожая проблема. В какой-то момент датчик стал выдавать только ошибки.
    это было с библиотекой https://github.com/amperka/dht (с ней ошибки и так вылезают время от времени)
    я нашел другую - https://github.com/adafruit/DHT-sensor-library/ - ошибок больше не видел вообще.
     
    eugene и Dmitriy Kunin нравится это.
  7. ertr

    ertr Нуб

    Годная библиотека. Достал из нее самое нужное. Перенес в код только читалку с сенсора.
    В библиотеке ограничивается чтение разом на 2 секунды. Может поэтому не виснет.

    Код (Text):
    #include "etherShield.h"
    #include "ETHER_28J60.h"
     
    // how many timing transitions we need to keep track of. 2 * number bits + extra
    #define MAXTIMINGS 85
    #define MeasureInterval 30000 // раз в 30 секунд
    #define SENSOR_PIN A0
     
    uint8_t s_temp;
    uint8_t s_hum;
     
    unsigned long prevMeasureAttemptTime = 0;
     
    static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};                                                          
    static uint8_t ip[4] = {192, 168, 0, 99};                    
    static uint16_t port = 80;
     
    ETHER_28J60 e;
     
    void setup()
    {
        e.setup(mac, ip, port);
        pinMode(SENSOR_PIN, INPUT);
        digitalWrite(SENSOR_PIN, HIGH);
    }
     
    void loop()
    {
      char* params;
      char out[128];
     
      if (params = e.serviceRequest())
      {  
        e.print("<style>body {font-family:Verdana;backgroung-color:#aaa;} h2 {font-size:16pt;color:red;} h4 {text-size:12pt;color:navy;}</style>");
        sprintf(out, "<h2>Temperatue: %uC<br>Humidity: %u</h2><h4>Last Attempt: %u</h4>", s_temp, s_hum, prevMeasureAttemptTime);
        e.print(out);
        e.respond();
      }
     
      MeasureData();
    }
     
    void MeasureData()
    {
      unsigned long _time = millis();
     
      if (_time < prevMeasureAttemptTime ) prevMeasureAttemptTime = 0;
     
      if (_time - prevMeasureAttemptTime > MeasureInterval)
      {
        prevMeasureAttemptTime = _time;
       
        uint8_t data[6], laststate = HIGH, counter = 0, j = 0;
       
        data[0] = data[1] = data[2] = data[3] = data[4] = 0;
       
        // pull the pin high and wait 250 milliseconds
        digitalWrite(SENSOR_PIN, HIGH);
        delay(250);
        // now pull it low for ~20 milliseconds
        pinMode(SENSOR_PIN, OUTPUT);
        digitalWrite(SENSOR_PIN, LOW);
        delay(20);
     
        cli();
        digitalWrite(SENSOR_PIN, HIGH);
        delayMicroseconds(40);
        pinMode(SENSOR_PIN, INPUT);
     
        // read in timings
        for (uint8_t i = 0; i < MAXTIMINGS; i++) {
          counter = 0;
          while (digitalRead(SENSOR_PIN) == laststate) {
            counter++;
            delayMicroseconds(1);
            if (counter == 255) break;
          }
          laststate = digitalRead(SENSOR_PIN);
     
          if (counter == 255) break;
     
          // ignore first 3 transitions
          if ((i >= 4) && (i%2 == 0)) {
            // shove each bit into the storage bytes
            data[j/8] <<= 1;
            if (counter > 6)
              data[j/8] |= 1;
            j++;
          }
     
        }
        sei();
     
        // check we read 40 bits and that the checksum matches
        if ((j >= 40) &&
            (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
         
          s_hum  = data[0];
          s_temp = data[2];
        }
      }
    }
     
  8. serge

    serge Нерд

    Может. Но в первой либой у меня и при наличии задержки были проблемы.
     
  9. Dmitriy Kunin

    Dmitriy Kunin Гик

    Спасибо за библиотеку, обязательно поиграюсь.