• Sat. Oct 18th, 2025

MIKROELECTRONICA

Blog pentru pasionații de electronică și nu numai

Monitorizare temperatură cu Arduino si ENC28J60

arduino-enc28J60-ds18b20Conectare modul ENC28J60 si DS18B20 la Arduino

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.

Conectare modul ENC28J60 si DS18B20 la Arduino
Conectare modul ENC28J60 si DS18B20 la Arduino

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;
}

By Stefan

2 thoughts on “Monitorizare temperatură cu Arduino si ENC28J60”
    1. 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.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.