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.