Интернет Термометър=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 sensorDHT 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 начин
Ето и малко снимки на завършения проект:













Имам подобен случай. Аз меря температурата и влажността на около 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 на дежурния.
Здрасти,
Прилагам цени на компоненти които съм използвал:
Ардуино (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 или каквото се сетиш
Извод: Може да се направи всичко (Просто е въпрос на време и умения)
Всъщност, както написах в предишния постинг, аз правя измервания през web от около година. Решението на русенската фирма обаче е по-изгодно, защото цените им са (без отстъпката за количество):
-- контролер TCW121B + захранване + термодатчик -- TST100 -- излиза под 110 лв. без ДДС.
Освен това имам 2 цифрови входа, аналогов вход (1-10V), 2 релейни изхода. Всичко излиза на XML, а контролера в прилична пластмасова кутийка.
Системата ни която логва записите (на LAMP) работи от около година, но тя е така направена, че може лесно да и се добави нов PHP драйвер, за ново устройство.
За хората които искат да си правят такива неща ще бъде полезно да видят кое е по- евтино. Незнам какво разбирате под php driver, но много лесно изходите от arduino може да ги вкарате във вашата системка.
Разгледах устройството и определено е готино.
PS: Използвам Arduino не защото излиза по- скъпо
, а защото това имах налично и с Arduino можеш да правиш един куп неща без да имаш ограничения в това, а аз не обичам ограниченията.
Хубаво ще бъде да пуснете системката която сте писали под GPL за да се доразвие (най- вероятно ще се намерят хора харесващи идеята) до по- голям проект и да се ползва от повече хора по света. Успех Миленски
Евтин вариант:
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 стотинки
Добър вариант. Даже пикото може да се намери с по- добра цена. Тази животинка съм я ползвал преди време и мога да кажа, че работи жестоко нямал съм проблеми с нея(а за мониторинг на мрежа с много пинговалки (picoIP) е супер).
Здрасти,
Благодаря ти за поста -- запали ме по Arduino.
Много отдавна търсех нещо подобно за хоби, но нямах идея дали съществува, а не ми се занимаваше да го правя от нулата.
Конкретно за мрежов термометър -- съгласен съм с другите, че има по-евтини варианти, но Arduino-то дава доста повече свобода да се развие и разкраси идеята.
В снимките виждам, че единия температурен датчик си го опаковал като "за навън"
Ако е така -- имаш ли наблюдения дали тази кутийка не влияе на отразяването на температурата и влажността ? Напълно ли си я херметизирал или има някакви микроотвори по нея ?
Поздрави
Ардуино от Роботев идва скъпичко. Може да се направи ценова оптимизация -- Ардуино 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 осигурява предостатъчно).
Покривката най-много ми хареса!
Всъщност с новата версия на 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 …….. и т.н
@Ради Дочев
Нещо не искаха да се "paste-нат" библиотеките, това е втори опит
#include
#include
#include
#include "DHT.h"