dht-22 не показывает минусовую температуру

Тема в разделе "Arduino & Shields", создана пользователем diews, 10 ноя 2012.

  1. diews

    diews Нерд

    Всем привет, никак не разберусь - как только температура падает ниже нуля, dht-22 показывает 6552 %(

    Причем вношу его в дом - и все ок! Стоит вытащить на улицу и понеслась...
    Код ниже, сори наверно там куча ошибок или косяков:


    Код (Text):
    #include <DHT.h>
     
    #define DHT_1_PIN 2
     
    #define DHT_2_PIN 3
     
     
     
    #include <SPI.h>
     
    #include <Dhcp.h>
     
    #include <Dns.h>
     
    #include <Ethernet.h>
     
    #include <EthernetClient.h>
     
    #include <EthernetServer.h>
     
    #include <EthernetUdp.h>
     
    #include <util.h>
     
     
     
    dht DHT;
     
     
     
     
     
    byte mac[] = { 0xxx, 0xxx, 0xF1, 0x19, 0x69, 0xFC };
     
    byte ip[] = { 192, 168, 0, 230 };
     
    byte gateway[] = { 192, 168, 0, 1 };
     
    byte subnet[] = { 255, 255, 255, 0 };
     
    byte server[] = { 178, 111, 211, 111 };
     
    char temp[6];
     
    char temp_out[6];
     
    byte isdata=0;
     
     
     
    EthernetClient client;
     
     
     
    void setup() {
     
      Serial.begin(9600);
     
      Ethernet.begin(mac, ip, dns, gateway, subnet);
     
    }
     
     
     
    void loop() {
     
     
     
      Serial.println("starting loop>>>");
     
     
     
      if (client.connect(server, 80)) {
     
        Serial.println("connecting...");
     
        char buf[80];
     
     
     
        int chk = DHT.read22(DHT_1_PIN);
     
     
     
        float h = DHT.humidity;
     
        float t = DHT.temperature;
     
     
     
        chk = DHT.read22(DHT_2_PIN);
     
     
     
        float h_out = DHT.humidity;
     
        float t_out = DHT.temperature;
     
     
     
     
     
        int temp = (t - (int)t) * 100;
     
        int hum = (h - (int)h) * 100;
     
     
     
        int temp_out = (temp_out - (int)temp_out) * 100;
     
        int hum_out = (hum_out - (int)hum_out) * 100;
     
     
     
        sprintf(buf, "GET /meteo.php?temp=%0d.%d&temp_out=%0d.%d&hum=%0d.%d&&hum_out=%0d.%d&secret=secret HTTP/1.0", int(t), abs(temp), int(t_out), abs(temp_out), int(h), abs(hum), int(h_out), abs(hum_out));
     
     
     
        Serial.println(buf);
     
        client.println(buf); // Отправляем GET запрос
     
        client.println("Host: host.ru"); // Указываем, какой конкретно host на данном ip нас интересует.
     
        client.println();
     
     
     
         
     
        Serial.print("Humidity1: ");
     
        Serial.print(h);
     
        Serial.print(" %\t");
     
        Serial.print("Temperature1: ");
     
        Serial.print(t);
     
        Serial.println(" *C");
     
     
     
        Serial.print("Humidity2: ");
     
        Serial.print(h_out);
     
        Serial.print(" %\t");
     
        Serial.print("Temperature2: ");
     
        Serial.print(t_out);
     
        Serial.println(" *C");
     
     
     
      } else {
     
      Serial.println("connection failed");
     
      }
     
     
     
        while (client.available()) {
     
          isdata=1;
     
          char c = client.read(); // Читаем, что нам ответил Web-сервер
     
          Serial.print(c);
     
        }
     
     
     
        if (!client.connected()) {
     
          isdata=0;
     
          Serial.println();
     
          Serial.println("disconnecting.");
     
          client.stop(); // Завершаем соединение
     
        }
     
     
     
     
     
     
     
      delay(60000);
     
     
     
    }
     
  2. diews

    diews Нерд

    Я не знаю может я что не так сделал, но в библиотеке dht22 (http://arduino.cc/playground/Main/DHTLib) поменял

    Код (Text):
            if (bits[2] & 0x80) // negative temperature
            {
                    bits[2] = bits[2] & 0x7F;
                    sign = -1;
            }
            temperature = sign * word(bits[2], bits[3]) * 0.1;
    на
    Код (Text):
            if (bits[2] & 0x80) // negative temperature
            {
                    bits[2] = bits[2] & 0x7F;
                    sign = -1;
            temperature =  word(bits[2], bits[3]) * -0.1;
     
            } else {
            temperature = sign * word(bits[2], bits[3]) * 0.1;
        }
    и все срослось. Правда при проверке пишет checksum error, ну да кому это нужно если верно температуру кажет
     
  3. diews

    diews Нерд

    Ну и вдруг кому будет интересно, полностью рабочий код (выше были ошибки)- снимаем показания с двух датчиков и отправляем их на вебсервер.

    Код (Text):

    #include <DHT.h>
    #define DHT_1_PIN 2
    #define DHT_2_PIN 3
     
    #include <SPI.h>
    #include <Dhcp.h>
    #include <Dns.h>
    #include <Ethernet.h>
    #include <EthernetClient.h>
    #include <EthernetServer.h>
    #include <EthernetUdp.h>
    #include <util.h>
     
    dht DHT;
     
     
    byte mac[] = {
      0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC };
    byte ip[] = {
      192, 168, 0, 230 };
    byte gateway[] = {
      192, 168, 0, 1 };
    byte subnet[] = {
      255, 255, 255, 0 };
    byte server[] = {
      178, 111, 111, 11 };
    char temp[6];
    char temp_out[6];
    byte isdata=0;
     
    EthernetClient client;
     
    void setup() {
      Serial.begin(9600);
      Ethernet.begin(mac, ip, dns, gateway, subnet);
    }
     
    void loop() {
     
      delay(1000);
     
      Serial.println("starting loop>>>");
     
      int chk = DHT.read22(DHT_1_PIN);
     
      float h = DHT.humidity;
      float t = DHT.temperature;
     
      chk = DHT.read22(DHT_2_PIN);
     
      float h_out = DHT.humidity;
      float t_out = DHT.temperature;
     
      int temp = (t - (int)t) * 100;
      int hum = (h - (int)h) * 100;
     
      int temp_out = (t_out - (int)t_out) * 100;
      int hum_out = (h_out - (int)h_out) * 100;
     
      Serial.print("Humidity1: ");
      Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temperature1: ");
      Serial.print(t);
      Serial.println(" *C");
     
      Serial.print("Humidity2: ");
      Serial.print(h_out);
      Serial.print(" %\t");
      Serial.print("Temperature2: ");
      Serial.print(t_out);
      Serial.println(" *C");
     
      char buf[80];
      sprintf(buf, "GET /meteo.php?temp=%0d.%d&temp_out=%0d.%d&hum=%0d.%d&&hum_out=%0d.%d&secret=secret HTTP/1.0", int(t), abs(temp), int(t_out), abs(temp_out), int(h), abs(hum), int(h_out), abs(hum_out));
      Serial.println(buf);
     
      if (client.connect(server, 80)) {
        Serial.println("connecting...");
     
        client.println(buf); // Отправляем GET запрос
        client.println("Host: host.ru"); // Указываем, какой конкретно host на данном ip нас интересует.
        client.println();
     
        delay(29000);
     
      }
      else {
        Serial.println("connection failed");
      }
     
      while (client.available()) {
        isdata=1;
        char c = client.read(); // Читаем, что нам ответил Web-сервер
        Serial.print(c);
      }
     
      if (!client.connected()) {
        isdata=0;
        Serial.println();
        Serial.println("disconnecting.");
        client.stop(); // Завершаем соединение
      }
     
     
     
    }
     
     
  4. nailxx

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

    Спасибо за инфу. С отрицательными значениями явно подвох был с приведением типов данных.
     
  5. Mixal59

    Mixal59 Нуб

    Почему то не работает DHT 22 и ик приемник в паре. как только включается приемник показаний с дотчика DHT 22 нет.
    //DFRobot.com
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include "DHT.h"
    #include <IRremote.h>
    #define DHTPIN 2 // what pin we're connected to
    // 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);
    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
    int RECV_PIN = 11; //вход ИК приемника
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    int a=0; // переменная переключения режима, при нажатии кнопки она принимает значение +1
    void setup()
    {
    irrecv.enableIRIn(); // включить приемниk
    pinMode(13, OUTPUT);
    lcd.init(); // initialize the lcd

    // Print a message to the LCD.
    lcd.backlight();
    // lcd.print("Hello, world!");
    dht.begin();
    }
    void loop()
    { if (irrecv.decode(&results))
    {
    delay(300); // задержка перед выполнением определения кнопок, чтобы избежать быстрое двойное нажатие
    if (results.value == 0xFFA25D) {a=a+1;} // обработка нажитя клавиши, здесь переменная принимает значение +1
    if (a==1){digitalWrite(13, HIGH);} else {digitalWrite(13, LOW); a=0;} // действие после нажатия кнопки, если переменная стала равна 1 то
    { //
    delay(50); //пауза между повторами //
    } //
    irrecv.resume(); //
    // 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();
    float t = dht.readTemperature();
    lcd.begin(20, 4);
    lcd.print("Humidity: ");
    lcd.setCursor(11, 0);
    lcd.print(h);
    lcd.setCursor(0, 1);
    lcd.print("Temp: ");
    lcd.setCursor(11, 1);
    lcd.print(t);
    }}