Интернет Термометър=Arduino + Ethernet Shield + DHT22

Идеята е да наблюдавам температурата в конкретно помещение и температурата на вън. Това обаче трябва да става през интернет.

За целта ще използвам Arduino Uno + Ethernet Shield + Два броя Термометъра DHT 22(позволяват работа с по дълъг кабел).

Прилагам проста схема за свързване на Arduino + Ethernet Shield + DHT 22:


Това се изпълнява два пъти като единствената разлика е, че се слагат на различни пинове.

Ето приложение с което да се тества схемата до тук:

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 4     // 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);

void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");

dht.begin();
}

void loop() {
// 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();

// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
}
}

Тук се вижда, че се изисква библиотеката DHT(dht.h,dht.cpp)

Сега след като всичко работи и сме включили Ethernet Shield-а е време да приключваме, че изгубихме много време :))).

Ето го и кода(използва се ethernet библиотеката която може да се вкл от приложението Arduino 0.23):

#include <SPI.h>
#include <Client.h>
#include <Ethernet.h>
#include <Server.h>
#include <Udp.h>

#include "DHT.h"
#define DHTPIN1 2     // IN
#define DHTPIN2 4     // OUT
#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address (amri)
byte ip[] = { 192, 168, 1, 252 };           // ip in lan dhstudio.bg
byte gateway[] = { 192, 168, 1, 1 };            // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                   //subnet mask
Server server(80);                                      //server port
byte sampledata=50;            //some sample data -- outputs 2 (ascii = 50 DEC)
int ledPin = 4;  // LED pin`
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //LED status flag
void setup(){
//start Ethernet
Ethernet.begin(mac, ip, gateway, subnet);
//Set pin 4 to output
pinMode(ledPin, OUTPUT);
//enable serial datada print
Serial.begin(9600);
}
void loop(){
// Create a client connection
Client client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 100)
{
//store characters to string
readString += c; //replaces readString.append(c);
}
//output chars to serial port
Serial.print(c);
//if HTTP request has ended
if (c == '\n') {
//dirty skip of "GET /favicon.ico HTTP/1.1"
if (readString.indexOf("?") <0)
{
//skip everything
}
else
// now output HTML data starting with standart header
client.println("HTTP/1.1 200 OK");

float t1 = dht1.readTemperature();
float h1 = dht1.readHumidity();
float t2 = dht2.readTemperature();
float h2 = dht2.readHumidity();
client.print(t1);client.print(",");
client.print(h1);client.print(",");
client.print(t2);client.print(",");
client.print(h2);
//clearing string for next read
readString="";
//stopping client
client.stop();
}
}
}
}
}

Аз съм си го направил да ми извежда температурата и влажността на двата сензора разделени със запетая понеже ги парсвам по друг начин, но информацията може да се изведе по всякакъв HTML начин :)

Ето и малко снимки на завършения проект:

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: +1 (from 1 vote)
Интернет Термометър=Arduino + Ethernet Shield + DHT22, 5.0 out of 5 based on 1 rating

14 thoughts on “Интернет Термометър=Arduino + Ethernet Shield + DHT22”

  1. Имам подобен случай. Аз меря температурата и влажността на около 20 места в работните ни помещения (индустриални условия). Всичко е по http => xml => apache => php => mysql . Записвам данните през 10 минути от около година. Ето например как се движи в последните дни температурата на водата в плувния ни басейн:

    http://dl.dropbox.com/u/35090259/poolTemp.png

    Първоначално използвах контролери на HW Group -- Чехия, обаче са скъпи -- над 100 евро комплекта сензори + контролер + датчици. Сега намерих от една русенска фирма -- Тераком, които предлагат контролер с входове за Т и rH, че и два цифрови входа и цва цифрови релейни изхода, + аналогов вход и всичкото е под 100 лв. Първия котролер от русенската фирма го ползвам от около 6 месеца и не е правил проблем. Смятам да пусна софтуера с който записваме данните под GPL лиценз.

    Нямам представа колко струва това решение (Arduino Uno + Ethernet Shield + Два броя Термометъра DHT 22), но ако е изгодно и надеждно, и може да изкара XML/JSON по http, можем да му напишем и на него PHP драйвери.

    Според мен, правилния начин да се наблюдават някакви климатични параметри този, през уеб. Аз виждам всичко през телефона си. В момента правим SMS известяване, ако параметрите минат определени граници, да праща SMS на дежурния.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. Здрасти,

    Прилагам цени на компоненти които съм използвал:
    Ардуино (Arduino Uno) SMD с ATmega328 -- 51 лв.
    Ардуино шийлд -- Ethernet със SD слот -- 79 лв.
    Общо: 130 лв.

    Доста по изгоден вариант е(Ако целта е такава е добре да се купи това направо):
    Ардуино Етернет (Arduino Ethernet) без PoE -- 96 лв.

    Сензор за температура и влажност DHT22 -- 17.90 лв.

    Моят вариант излезе: 130 лв + 2 бр.x 17.90 лв.= 165.80 лв.
    Аз препоръчвам по- логичния вариант (при задание), 96 лв. + 2бр.x 17.90 лв. = 131 лв.

    Цените са взети от http://www.robotev.com

    Всичко може да се направи през web т.е. може да си го направиш по secure с GET аргументи т.е. да очаква конкретен GET аргумент за да изведе конкретно нещо(така няма някои случайно да го отвори и да види резултата). За мен най- добрия вариант си е изхода от сензорите да се извежда в WEB ,няма значение xml,json,csv или нещо друго защото може да се парсне по 100 начина. Това което мислиш да го правиш се прави за относително време :)

    Имаш да направиш следните неща:
    1. Да вържеш ардуино Ethernet + сензорите
    2. Да си напишеш код които да ги управлява и показва през WEB
    3. Да си напишеш на някои език които можеш: c,perl,php(bash дори ще ти свърши работа) които да събира тези данни в база(MySQL или PostgreSQL или друга).
    4. След като вече си събрал данните в базата с rrdtool можеш да им генерираш графики или с нещо друго : open swf или open graph.
    5. Базирайки се на данните и зависимостите които зададеш може да правиш каквото си искаш: Да праща имейл, sms, да говори, да влиза във facebook, irc или каквото се сетиш :)

    Извод: Може да се направи всичко (Просто е въпрос на време и умения) :)

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  3. Всъщност, както написах в предишния постинг, аз правя измервания през web от около година. Решението на русенската фирма обаче е по-изгодно, защото цените им са (без отстъпката за количество):

    -- контролер TCW121B + захранване + термодатчик -- TST100 -- излиза под 110 лв. без ДДС.

    Освен това имам 2 цифрови входа, аналогов вход (1-10V), 2 релейни изхода. Всичко излиза на XML, а контролера в прилична пластмасова кутийка.

    Системата ни която логва записите (на LAMP) работи от около година, но тя е така направена, че може лесно да и се добави нов PHP драйвер, за ново устройство.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  4. За хората които искат да си правят такива неща ще бъде полезно да видят кое е по- евтино. Незнам какво разбирате под php driver, но много лесно изходите от arduino може да ги вкарате във вашата системка.

    Разгледах устройството и определено е готино.

    PS: Използвам Arduino не защото излиза по- скъпо :), а защото това имах налично и с Arduino можеш да правиш един куп неща без да имаш ограничения в това, а аз не обичам ограниченията.

    Хубаво ще бъде да пуснете системката която сте писали под GPL за да се доразвие (най- вероятно ще се намерят хора харесващи идеята) до по- голям проект и да се ползва от повече хора по света. Успех Миленски :)

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  5. Евтин вариант:

    PicoIP ~ 40 лв от http://lan.neomontana-bg.com/picoip.php

    За датчик можете да ползвате нещо такова (струва 1-2 лв):
    http://home.comet.bg/datasheets/Microchip/21498C.pdf
    http://home.comet.bg/datasheets/Microchip/21498C.pdf
    в категорията "специализирани ИС" има и датчици за влажност
    (http://www.comet.bg/shop/statements.html?Type=IC&Subtype=MSCI&Block=25&smd=0&Valuta=%EE%F0%E8%E3.%20%E2%E0%EB%F3%F2%E0%20%ED%E0%20%E4%EE%F1%F2%E0%E2%F7%E8%EA%E0)

    Хубаво е да се сложи и един RC филтър -- не повече от 10-20 стотинки

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  6. Добър вариант. Даже пикото може да се намери с по- добра цена. Тази животинка съм я ползвал преди време и мога да кажа, че работи жестоко нямал съм проблеми с нея(а за мониторинг на мрежа с много пинговалки (picoIP) е супер).

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  7. Здрасти,
    Благодаря ти за поста -- запали ме по Arduino.
    Много отдавна търсех нещо подобно за хоби, но нямах идея дали съществува, а не ми се занимаваше да го правя от нулата.

    Конкретно за мрежов термометър -- съгласен съм с другите, че има по-евтини варианти, но Arduino-то дава доста повече свобода да се развие и разкраси идеята.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  8. В снимките виждам, че единия температурен датчик си го опаковал като "за навън" :)
    Ако е така -- имаш ли наблюдения дали тази кутийка не влияе на отразяването на температурата и влажността ? Напълно ли си я херметизирал или има някакви микроотвори по нея ?
    Поздрави

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  9. Ардуино от Роботев идва скъпичко. Може да се направи ценова оптимизация -- Ардуино 2009 или Nano от Китай по eBay (идва към 23-28 лв с доставката), Ethernet shield с ENC28J60 за около 23-25 лв и другото са сензорите, тук вече зависи от класа точност и влагозащитеност и отдалеченост от контролера. Има дори вариант да се вземе и AtMega328P програмиран с буутлоадер-а за 8-9 лв и да се нареждат на макетна платка -- идва още по-евтино. За TCP/IP връзки като че ли е по-добре Ethernet shield с W5100, но е по-скъп (40-50 лв), за сметка на това по-лесно се управлява (повече неща поема W5100 спрямо 28J60). Хубавото на Ардуиното е, че става и за други неща и че има форуми и общности, които да попиташ за съвет, иначе ако е за най-евтино решение за масово производство -- не е той (или поне не е с готови Ардуино платка и Ethernet shield). PIC16 или MSP430 са по-евтини и по-малко мощност изискват (важно при батерийно или със соларна клетка захранване, макар че при Ethernet POE осигурява предостатъчно).

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  10. Покривката най-много ми хареса! :)

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  11. Всъщност с новата версия на IDE-то са сменени и библиотеките описани по-горе в кода, а именно:
    Server.h -> EthernetServer.h
    Client.h -> EthernetClient.h
    За да проработи горепосоченият код би следвало да се смени:
    от Server server(80); да стане: EthernetServer server(80);
    от Client client = server.available(); да стане EthernetClient client = server.available();

    Също така хедърите Client.h и Server.h вече не би следвало да бъдат извиквани в началото, Ethernet.h е достатъчно.
    т.е моят файл започва така:
    #include
    #include
    #include
    #include "DHT.h"
    #define …….. и т.н

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  12. @Ради Дочев
    Нещо не искаха да се "paste-нат" библиотеките, това е втори опит :)
    #include
    #include
    #include
    #include "DHT.h"

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  13. @ MilenG -- Извинявам се че използвам тук да попитам, но контакт дали има възможност да дадете предвид, че съм се спрял точно на решението на база: http => xml => apache => php => mysql и това на един LAMP сървър, който да ми съхранява и визуализира данните от няколко контролера. Определено GPL лиценз би улеснило в бъдеще оптимизирането на кода, а защо не и donationware ;)
    Много се заинтригувах от възможността да се добавя SMS известяване в случай на преминаване на определени стойности към дежурния!
    Благодаря предварително

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  14. Здравей! Прочетох с голям интерес цялата статия и имам въпрос -- би ли казал какъв кабел използваш, за да вържеш сензора, тъй като никъде не намерих информация и също откъде може да се закупи кабела. Виждам, че е г/д дебеличък. Благодаря!

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *