Monitorizare temperatură cu Arduino si ENC28J60
Dispozitivul are rolul de a achiziţiona date de la un senzor de temperatura, DS18B20, şi de a le trimite mai departe către un webserver extern. Server-ul înregistrează datele şi le returnează sub forma unui grafic, putând fi analizate sau stocate pentru o perioadă foarte lungă de timp. De ce un server pentru atâta lucru? Pentru ca un microcontroler are un spaţiu şi o putere de procesare restrânse, costurile de găzduirea au ajuns foarte mici si pentru că se poate 🙂 .
Descrierea dispozitivului
Hardware-ul este realizat în jurul microcontrolerului ATMEGA328 (Arduino Duemilanove), acesta fiind “creierul” sistemului, cu următoarele roluri funcţionale:
- preluarea şi prelucrarea datelor de la senzorul de temperatura DS18B20;
- controlul modulului ethernet (ENC28J20) prin protocol SPI;
- comunicaţie seriala cu programul “monitor” şi debugging;
La pornirea sistemului, clientul (Arduino + ENC28J60), trimite o cerere broadcast în reţea şi implicit în server-ul DHCP (serviciu ce rulează pe router). Router-ul atribuie clientului o adresa IP, masca de subreţea şi adresa gateway (calea de ieşire spre internet). Următoarea etapă este interogarea domeniului (webserver-ul extern) şi “extragerea” IP-ului din server.

Exemplu cod Arduino pentru “client”:
// Exemplu cod client web cu alocare IP prin DHCP si DNS // 2011-06-08 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php #include <EtherCard.h> // adresa MAC a interfetei de retea, trebuie sa fie unica in LAN static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31}; byte Ethernet::buffer[700]; static uint32_t timer; char website[] PROGMEM = "www.domeniul-tau.tld; // called when the client request is complete static void my_callback (byte status, word off, word len) { Serial.println(">>>"); Ethernet::buffer[off+300] = 0; Serial.print((const char*) Ethernet::buffer + off); Serial.println("..."); } void setup () { Serial.begin(57600); //util doar in depanare (se pot comenta dupa finalizarea codului) Serial.println("n[webClient]"); if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println( "Failed to access Ethernet controller"); if (!ether.dhcpSetup()) Serial.println("DHCP failed"); // adresele alocate se pot vedea in consola seriala ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip); if (!ether.dnsLookup(website)) Serial.println("DNS failed"); ether.printIp("SRV: ", ether.hisip); } void loop () { ether.packetLoop(ether.packetReceive()); if (millis() > timer) { timer = millis() + 5000; //clientul trimite o cerere catre server din 5 in 5 sec Serial.println(); Serial.print("<<< REQ "); ether.browseUrl(PSTR("/folder_path/?paramatru="), variabila, website, my_callback); } }
Exemplu cod Arduino pentru citirea senzorului de temperatura DS18B20:
#include <OneWire.h> int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 //Temperature chip i/o OneWire ds(DS18S20_Pin); // on digital pin 2 void setup(void) { Serial.begin(9600); } void loop(void) { float temperature = getTemp(); Serial.println(temperature); delay(10000); delay(100); //just here to slow down the output so it is easier to read } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; }
Rezista Arduino sa alimenteze modulul ENC?
In documentatia Arduino – DC Current for 3.3V Pin 50 mA, iar consumul tipic al ENC este 160mA.
Deci rezista?
Al meu a rezistat cateva zile dar nu pot garanta pentru altii ca nu se intampla nimic. Initial l-am alimentat la 5V, ENC-ul nu a patit nimic dar se incalzea ceva mai tare. Am pun ENC-ul pe 3,3V si am masurat tensiunea pe Arduino si nu scazuse sub 3,2V.
Pentru siguranta va recomand un stabilizator de 3,3V, mai ales daca montajul o sa fie ceva final si nu doar penru teste.