Всем привет, никак не разберусь - как только температура падает ниже нуля, 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); }
Я не знаю может я что не так сделал, но в библиотеке 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, ну да кому это нужно если верно температуру кажет
Ну и вдруг кому будет интересно, полностью рабочий код (выше были ошибки)- снимаем показания с двух датчиков и отправляем их на вебсервер. Код (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(); // Завершаем соединение } }
Почему то не работает 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); }}