Termometru cu senzor DS18B20 și afișaj 16x2

 Autor:   Publicat pe:   Actualizat pe:  2017-12-17T16:06:31Z

Un termometru ușor de construit cu o placă de dezvoltare Arduino, un senzor digital DS18B20 și un LCD.

Folosind o placă de dezvoltare cu microcontroller ATmega, un LCD cu 2 rânduri de 16 caractere și un senzor digital de temperatură de tipul DS18B20 se poate construi cu ușurință un termometru. Senzorul utilizat este unul digital, ce poate măsura temperaturi cuprinse între -55 și +125 grade Celsius, cu o rezoluție maximă de 0,044 grade (12 biți). În ciuda rezoluției ridicate, acuratețea senzorului este de +/-0,5 grade. Temperatura măsurată este comunicată procesorului digital, prin protocolul 1-Wire.

DS18B20 este un integrat programabil ce include memorie EEPROM. Această memorie poate fi utilizată pentru programarea unor praguri de alarmă. La fiecare citire a temperaturii, DS18B20 compară valoarea cu pragul de alarmă, și dacă este cazul setează un bit ce poate fi citit de procesor.
Termometru cu senzor DS18B20 și afișaj 16x2

Montajul prezentat nu utilizează memoria integratului. Temperatura citiă este afișată pe un ecran LCD 16x2. Temperatura minimă și cea maximă, înregistrate de la începutul execuției programului sunt afișate de asemenea, pe al doilea rând al ecranului LCD. Aceste temperaturi sunt resetate o dată cu resetarea procesorului.

Termometru cu senzor DS18B20 și afișaj 16x2
Termometru cu senzor DS18B20 și afișaj 16x2
Schema de conectare este simplă. Senzorul de temperatură arată la fel ca un tranzistor obișnuit. Folosește un singur pin pentru a transmite temperaturile către procesor. Acest pin trebuie conectat la linia de alimentare de 5V printr-un rezistor de 4.7k. Un rezistor de 220 ohmi este necesar pentru alimentarea LED-ului care iluminează LCD-ul, iar un semireglabil este folosit pentru ajustarea contrastului LCD-ului.

LCD-ul este conectat la placa de dezvoltare urmând conexiunile shield-ului cu keypad pe care l-am folosit (a se vedea poza de sus). Acest shield nu este necesar pentru realizarea montajului, LCD-ul putând fi conectat direct la placa de dezvoltare, așa cum se vede în schema realizată cu Fritzing. De asemenea, eu am folosit un senzor montat pe o plăcuță, ce face parte dintr-un kit de senzori.

Codul sursă este următorul.
#include <LiquidCrystal.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define SIMBOL_GRAD (char)223

float minTemp = 200, maxTemp = 0; // memoreaza minima, respectiv maxima
// minima si maxima sunt resetate o data cu procesorul

// LCD conectat conform schemei shield-ului LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Senzorul de temperatura este conectat la pinul 2
OneWire w1(2);
DallasTemperature sensor(&w1);

void setup() {
  pinMode(10, INPUT); // necesar doar pentru shield-ul LCD

  lcd.begin(16, 2); // initializeaza LCD-ul cu 2 randuri de 16 caractere
  lcd.print("Actual: ");

  sensor.begin(); // initializeaza senzorul
}

void loop() {
  // citire temperatura
  sensor.requestTemperatures();
  float tempActual = sensor.getTempCByIndex(0);

  lcd.setCursor(8, 0);
  if ((tempActual < 100) && (tempActual > 0)) lcd.print(' '); // pentru temperaturi de 2 cifre
  lcd.print(tempActual, 2); // se afizeaza, cu 2 zecimale
  lcd.print(SIMBOL_GRAD);
  lcd.print('C');

  if (tempActual < minTemp) { // am citit o minima
    minTemp = tempActual; // se memoreaza
    lcd.setCursor(0, 1); // si se afizeaza
    if ((minTemp < 100) && (minTemp > 0)) lcd.print(' ');
    lcd.print(minTemp, 2);
    lcd.print(SIMBOL_GRAD);
  }

  if (tempActual > maxTemp) { // am citit o maxima
    maxTemp = tempActual; // se memoreaza
    lcd.setCursor(8, 1);
    if ((maxTemp < 100) && (maxTemp > 0)) lcd.print(' ');
    lcd.print(maxTemp, 2);
    lcd.print(SIMBOL_GRAD);
  }

  delay(1000);
}
Temperatura este citită o dată pe secundă. În funcție de temperatura citită, codul sursă poate fi adaptat și montajul extins astfel încât să acționeze diverse dispozitive.

Niciun comentariu :

Trimiteți un comentariu

Vă recomandăm să citiți regulamentul comentariilor înainte de a scrie un comentariu.