Идеята е да наблюдавам температурата в конкретно помещение и температурата на вън. Това обаче трябва да става през интернет.
За целта ще използвам 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"
@ MilenG -- Извинявам се че използвам тук да попитам, но контакт дали има възможност да дадете предвид, че съм се спрял точно на решението на база: http => xml => apache => php => mysql и това на един LAMP сървър, който да ми съхранява и визуализира данните от няколко контролера. Определено GPL лиценз би улеснило в бъдеще оптимизирането на кода, а защо не и donationware ;)
Много се заинтригувах от възможността да се добавя SMS известяване в случай на преминаване на определени стойности към дежурния!
Благодаря предварително
Здравей! Прочетох с голям интерес цялата статия и имам въпрос -- би ли казал какъв кабел използваш, за да вържеш сензора, тъй като никъде не намерих информация и също откъде може да се закупи кабела. Виждам, че е г/д дебеличък. Благодаря!