Temperaturni senzor na Arduino ploči
Merenje temperature i vlažnosti pomoću Arduino-a: DHT11 vs LM35
Temperatura i vlažnost su dva najčešće merena parametra životne sredine. Bilo da pravite meteorološku stanicu, monitor unutrašnje klime ili automatizovani plastenik, senzori poput DHT11 i LM35 nude jednostavan i pristupačan način za prikupljanje ovih podataka pomoću Arduino ploče.
U ovom vodiču istražićemo kako ovi senzori funkcionišu, razumeti njihove razlike i pripremiti se za praktičnu vežbu u kojoj ćete ih koristiti za merenje i prikaz vrednosti temperature i vlažnosti.
Video lekcija: Vodič za Arduino temperaturni senzor – LM35 i DHT11 sa serijskim podacima i izazovom obrade
Uvod – Merenje temperature pomoću Arduino ploče
U ovoj vežbi naučićemo kako da očitamo podatke o temperaturi koristeći analogni temperaturni senzor (LM35) i prikažemo rezultat putem Serial Monitor-a. Ovaj projekat pokazuje kako se LM35 senzor povezuje sa Arduino pločom i kako se njegov analogni naponski signal pretvara u čitljivu vrednost temperature izraženu u stepenima Celzijusa.
Praćenje temperature je od velikog značaja u mnogim ugrađenim i ekološkim primenama, kao što su:
- Sistemi za kontrolu klime
- Praćenje vlažnosti i temperature zemljišta
- Meteorološke stanice
- Industrijska automatizacija
U ove svrhe najčešće se koriste temperaturni senzori kao što su:
- LM35 – analogni temperaturni senzor koji daje linearni izlazni napon direktno proporcionalan temperaturi u stepenima Celzijusa (10 mV po °C).
- DHT11 / DHT22 – digitalni senzori temperature i vlažnosti koji komuniciraju putem jednog digitalnog pina i daju podatke u digitalnom formatu.
Povezivanje sa Arduino pločom
Vcc (Pin 1)→ povezati na +5V na Arduino pločiGND (Pin 2)→ povezati na GND na Arduino pločiVout (Pin 3)→ povezati na analogni pin A2 (ili bilo koji analogni ulaz)
⚠️ Napomena: Uvek proverite raspored pinova (pinout) vašeg konkretnog modela LM35 senzora. Pre nego što sastavite realno kolo, možete koristiti simulacioni alat (npr. ThinkerCad) za kreiranje šeme i testiranje koda. Pogledajte šemu povezivanja na Slici 1.
Šta radi program?
Arduino očitava analogni napon sa LM35 senzora pomoću funkcije analogRead(),
zatim taj napon pretvara u temperaturu koristeći faktor skaliranja (10 mV/°C)
i ispisuje i sirovu vrednost napona i izračunatu temperaturu u Serial Monitor-u
na svakih 250 milisekundi.
U kodu se nalaze komentari koji objašnjavaju ulogu svake linije i promenljive.
// C++ kod
int read_pin = A2; // Analogni pin A2 koristi se za očitavanje napona senzora
float readValue; // Promenljiva za čuvanje sirove analogne vrednosti (0-1023)
float calcValue; // Promenljiva za izračunati napon
float TempC = 0; // Promenljiva za temperaturu u stepenima Celzijusa
float scale_f = 0.01; // Faktor skaliranja: 10mV po °C → 0.01 V/°C
void setup()
{
pinMode(read_pin, INPUT); // Postavljanje analognog pina kao ulaz
Serial.begin(9600); // Pokretanje serijske komunikacije (9600 baud)
}
void loop()
{
readValue = analogRead(read_pin); // Očitavanje sirove analogne vrednosti (0-1023)
calcValue = readValue * 5.0 / 1023; // Pretvaranje u napon (0–5V)
TempC = calcValue / scale_f; // Pretvaranje napona u temperaturu (°C)
Serial.println("Calc value: ");
Serial.println(calcValue);
Serial.println("T[C]: ");
Serial.println(TempC);
delay(250); // Pauza 250 ms pre sledećeg očitavanja
}
Šta je faktor skaliranja?
Faktor skaliranja je množilac koji se koristi da sirovu vrednost (npr. napon ili vrednost senzora) pretvori u realnu fizičku jedinicu — u ovom slučaju, stepene Celzijusa (°C).
Kod LM35 senzora faktor skaliranja iznosi 10 mV po 1°C.
- Ako je izlazni napon 100 mV → temperatura je 10°C
- Ako je izlazni napon 250 mV → temperatura je 25°C
Kako faktor skaliranja funkcioniše u ovom primeru?
readValue = analogRead(read_pin);
calcValue = readValue * 5.0 / 1023;
TempC = calcValue / scale_f;
analogRead()vraća vrednost od 0 do 1023, što predstavlja napon od 0V do 5V.calcValue = readValue * 5.0 / 1023pretvara analognu vrednost u napon.scale_f = 0.01zato što LM35 daje 0.01 V (10 mV) po 1°C.- Temperaturu dobijamo deljenjem napona sa 0.01.
Dakle:
Temperatura (°C) = Napon / 0.01
Primer proračuna
analogRead() = 512- Napon = 512 × 5.0 / 1023 ≈ 2.5 V
- Temperatura = 2.5 / 0.01 = 250°C
⚠️ Napomena: Ako biste zaista izmerili 2.5V na LM35 senzoru,
to bi značilo 250°C — što je nerealno za sobnu temperaturu.
Tipična sobna temperatura (~25°C) daje napon oko 0.25V,
što odgovara vrednosti analogRead() od približno 51.
DHT11 – Digitalni senzor temperature i vlažnosti
Pregled senzora
DHT11 je jednostavan i pristupačan digitalni senzor koji može da meri i temperaturu i relativnu vlažnost vazduha. U sebi integriše:
- Termistor za merenje temperature
- Kapacitivni senzor za merenje vlažnosti
- Integrisani čip za obradu signala koji daje čist digitalni izlaz
Glavne karakteristike DHT11 senzora
- Merenje temperature od 0°C do 50°C sa tačnošću ±2°C
- Merenje vlažnosti od 20% do 90% RH sa tačnošću ±5% RH
- Digitalni izlaz preko jednog pina
- Zahteva minimalan broj dodatnih komponenti
- Radi na naponu od 3V do 5V
LM35 – Analogni temperaturni senzor
LM35 je precizan analogni temperaturni senzor. Za razliku od DHT11 senzora, meri samo temperaturu, ali u mnogo širem opsegu i sa većom preciznošću.
Glavne karakteristike LM35 senzora
- Opseg merenja od –55°C do +150°C
- Tipična tačnost ±0.5°C
- Analogni izlazni napon: 10 mV po °C (npr. 250 mV = 25°C)
- Zahteva pretvaranje napona u temperaturu putem programskog koda
Naziv zadatka
Očitavanje i prikaz temperature i vlažnosti okoline pomoću DHT11 senzora i Arduino ploče.
Cilj zadatka
- Naučiti kako se DHT11 senzor povezuje sa Arduino pločom
- Napisati program za očitavanje digitalnih podataka sa senzora
- Prikazati vrednosti temperature i vlažnosti u Serial Monitor-u
Potrebne komponente
| Komponenta | Količina |
|---|---|
| Arduino Uno (ili kompatibilna ploča) | 1 |
| DHT11 senzor | 1 |
| Prototipska ploča (Breadboard) | 1 |
| Jumper kablovi | 3 |
| USB kabl | 1 |
Povezivanje DHT11 senzora
Da biste pravilno povezali DHT11 senzor sa Arduino pločom, potrebno je napraviti samo nekoliko jednostavnih veza. Obično su pinovi na originalnom DHT senzoru označeni kao VCC, Signal i GND. Pin VCC senzora treba povezati na 5V izlaz na Arduinu kako bi se obezbedilo napajanje. Pin GND se povezuje sa GND na Arduinu kako bi se zatvorio električni krug. Na kraju, DATA pin se povezuje sa digitalnim pinom 3, koji se koristi za komunikaciju između senzora i mikrokontrolera. Ako koristite DHT11 modul (često sa 3 pina), nisu potrebni dodatni elementi jer modul već sadrži pull-up otpornik. Međutim, ako imate “sirovi” 4-pinski DHT11 senzor, potrebno je postaviti 10 kΩ pull-up otpornik između VCC i DATA pinova kako bi prenos podataka bio stabilan. Ovakvo jednostavno povezivanje omogućava vašem Arduinu da precizno očitava vrednosti temperature i vlažnosti pomoću digitalnog signala.
Kako koristiti DHT11 senzor sa Arduinom
Da biste očitali temperaturu i vlažnost okoline pomoću DHT11 senzora, počnite tako što ćete senzor povezati sa Arduino pločom kao što je prethodno opisano. Kada su veze postavljene, otvorite Arduino IDE na svom računaru da pripremite kod. Ako još niste instalirali potrebnu biblioteku, idite na Sketch > Include Library > Manage Libraries, potražite “DHT sensor library” autora Adafruit i instalirajte je. Ova biblioteka pojednostavljuje komunikaciju sa DHT11 senzorom. Nakon instalacije biblioteke, otvorite novi sketch i napišite Arduino kod za očitavanje temperature i vlažnosti. Povežite Arduino putem USB-a i učitajte sketch. Zatim otvorite Serial Monitor (prečica: Ctrl+Shift+M) i postavite brzinu komunikacije na 9600 baud. Trebalo bi da vidite prikazane vrednosti temperature (u °C) i vlažnosti (% RH), koje se ažuriraju na svake 2 sekunde.
Izazov: Vizualizacija podataka u Processing-u
Da biste proširili projekat, možete slati podatke sa Arduina u Processing sketch preko serijske komunikacije. U Processing-u koristite jednostavne oblike da vizualizujete očitavanja senzora u realnom vremenu. Na primer:
- Prikaz kruga koji postaje crven ako temperatura pređe 30 °C.
- Korišćenje pravougaonika čija visina odražava trenutnu vlažnost.
- Promena boje pozadine u zavisnosti od vlažnosti — na primer, plava kada vlažnost padne ispod 30 %.
Kod napisan pomoću Arduino IDE
Primer Arduino koda: Očitavanje podataka sa DHT11 senzora
Sledeći kod prikazuje kako očitati temperaturu i vlažnost koristeći DHT11 senzor povezan na digitalni pin 3 na Arduino ploči. Koristi se Adafruit DHT biblioteka i vrednosti se prikazuju u Serial Monitor-u pri brzini od 115200.
// Uključivanje DHT biblioteke
#include "DHT.h"
// Definisanje pina na koji je povezan DHT senzor
#define DHTPIN 3
// Definisanje tipa DHT senzora (DHT11 ili DHT22)
#define DHTTYPE DHT11
// Kreiranje DHT objekta
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// Inicijalizacija serijske komunikacije na 115200 baud
Serial.begin(115200);
// Inicijalizacija DHT senzora
dht.begin();
Serial.println("DHT senzor inicijalizovan");
}
void loop() {
// Čekanje 1 sekunde između očitavanja (DHT11 zahteva najmanje 1s)
delay(1000);
// Očitavanje vlažnosti
Serial.println("Pre očitavanja vlažnosti...");
float h = dht.readHumidity();
Serial.println("Posle očitavanja vlažnosti...");
delay(1000); // Opcioni dodatni delay
// Očitavanje temperature
float t = dht.readTemperature();
Serial.println("Posle očitavanja temperature...");
Serial.println("Pokušano očitavanje senzora");
// Provera da li su očitavanja neuspešna (NaN znači grešku)
if (isnan(h) || isnan(t)) {
Serial.println("Greška pri očitavanju sa DHT senzora!");
} else {
Serial.print("Vlažnost: ");
Serial.print(h);
Serial.print(" %\tTemperatura: ");
Serial.print(t);
Serial.println(" °C");
}
}
Napomena: DHT11 senzor zahteva minimalno 1 sekundu između uzastopnih očitavanja. Uvek proverite NaN vrednosti da biste otkrili moguće greške u očitavanju.
Primer izlaza na Serial Monitor-u
Nakon što se DHT11 senzor poveže i kod učita, u Serial Monitor-u (baud 115200) možete videti rezultate očitavanja temperature i vlažnosti. Vrednosti se ažuriraju otprilike svakih 2 sekunde zbog kašnjenja u kodu.
DHT senzor inicijalizovan
Pre očitavanja vlažnosti...
Posle očitavanja vlažnosti...
Posle očitavanja temperature...
Pokušano očitavanje senzora
Vlažnost: 48.0 % Temperatura: 24.5 °C
Pre očitavanja vlažnosti...
Posle očitavanja vlažnosti...
Posle očitavanja temperature...
Pokušano očitavanje senzora
Vlažnost: 49.0 % Temperatura: 24.7 °C
Pre očitavanja vlažnosti...
Posle očitavanja vlažnosti...
Posle očitavanja temperature...
Pokušano očitavanje senzora
Vlažnost: 48.5 % Temperatura: 24.6 °C
Napomena: Vrednosti će se razlikovati u zavisnosti od uslova u prostoriji. Ako senzor ne očitava ispravno, biće prikazana poruka Error reading from DHT sensor!.
1. Uključivanje biblioteke i definisanje pinova
// Uključivanje DHT biblioteke
#include "DHT.h"
// Definišemo pin na kojem je DHT senzor
#define DHTPIN 3
// Definišemo tip DHT senzora (DHT11 ili DHT22)
#define DHTTYPE DHT11
#include "DHT.h" – Učitava DHT biblioteku.
#define DHTPIN 3 – Dodeljuje digitalni pin 3 za DATA pin senzora.
#define DHTTYPE DHT11 – Specifikuje model senzora koji koristimo.
2. Kreiranje objekta senzora
// Kreiramo DHT objekat
DHT dht(DHTPIN, DHTTYPE);
Kreira se objekat pod imenom dht koji omogućava interakciju sa senzorom.
3. setup() – Inicijalizacija
void setup() {
// Pokrećemo serijsku komunikaciju na 115200 bauda
Serial.begin(115200);
// Inicijalizujemo DHT senzor
dht.begin();
Serial.println("DHT senzor inicijalizovan");
}
Serial.begin(115200);– Pokreće serijsku komunikaciju sa monitorom.dht.begin();– Inicijalizuje senzor.- Štampa poruku potvrde na Serial Monitor-u.
4. loop() – Čitanje podataka sa senzora
void loop() {
// Čekamo 1 sekundu između očitavanja (DHT11 zahteva najmanje 1s)
delay(1000);
// Čitanje vlažnosti
Serial.println("Pre očitavanja vlažnosti...");
float h = dht.readHumidity();
Serial.println("Posle očitavanja vlažnosti...");
delay(1000); // Opcioni dodatni delay
// Čitanje temperature
float t = dht.readTemperature();
Serial.println("Posle očitavanja temperature...");
Serial.println("Pokušano očitavanje senzora");
...
}
delay(1000); – Obezbeđuje dovoljno vremena između očitavanja senzora.
Vlažnost i temperatura se čitaju, dok se debug poruke prikazuju pre i posle očitavanja.
5. Provera grešaka i ispis
// Proveravamo da li je očitavanje neuspešno (vraća NaN u slučaju greške)
if (isnan(h) || isnan(t)) {
Serial.println("Greška pri očitavanju DHT senzora!");
} else {
Serial.print("Vlažnost: ");
Serial.print(h);
Serial.print(" %\tTemperatura: ");
Serial.print(t);
Serial.println(" °C");
}
}
isnan(h) || isnan(t) – Proverava da li je bilo koje očitavanje nevalidno.
Ako jeste, prikazuje se poruka o grešci. U suprotnom, štampa se vlažnost i temperatura.
Zaključak
• Serijska komunikacija i inicijalizacija senzora se obavljaju u setup().
• U loop(): delay, očitavanje senzora, provera grešaka i ispis na monitor.
• Kod je jednostavan, pregledan i efikasan za korišćenje DHT11 senzora sa Arduinom.
Čitanje temperature u Processing-u
U ovoj vežbi ćemo prikazati kako da očitamo temperaturu sa DHT11 senzora preko serijskog porta i prikažemo je u Processing okruženju. Ovo omogućava vizuelizaciju temperature u realnom vremenu.
Primer koda u Processing-u
import processing.serial.*; // Uvoz biblioteke za serijsku komunikaciju
Serial myPort; // Objekat serijskog porta za komunikaciju
float temperature = 0; // Promenljiva za primljenu temperaturu
void setup() {
size(400, 400); // Dimenzije prozora 400x400 px
// Inicijalizacija serijske komunikacije
// Serial.list()[0] uzima prvi raspoloživi port (po potrebi promeniti indeks)
// 115200 je baud rate i mora biti isti kao na Arduinu
myPort = new Serial(this, Serial.list()[0], 115200);
}
void draw() {
background(200); // Svetlosiva pozadina
// Provera da li ima bajtova za čitanje sa serijskog porta
int availableBytes = myPort.available();
if (availableBytes > 0) {
byte[] bytes = new byte[availableBytes]; // Niz bajtova za primljene podatke
myPort.readBytes(bytes); // Čitanje bajtova u niz
String str = new String(bytes); // Konverzija bajtova u string
// Pokušaj konverzije stringa u broj (temperaturu)
try {
temperature = Float.parseFloat(str.trim()); // Uklanjanje viška praznih mesta i parsiranje
println("Primljena temperatura: " + temperature);
} catch (NumberFormatException ex) {
// Ako konverzija ne uspe, ispisuje se poruka o grešci
println("Greška pri konverziji: " + ex.getMessage());
}
}
}
Objašnjenje koda:
1. import processing.serial.*; – Uvoz biblioteke za serijsku komunikaciju.
2. float temperature = 0; – Deklaracija promenljive za primljenu temperaturu.
3. U setup() se podešava veličina prozora i inicijalizuje serijska komunikacija.
4. U draw() se stalno proverava da li stižu podaci sa Arduino-a i konvertuju u decimalni broj.
5. Ispisuje se primljena temperatura u Processing konzolu.
6. Ako konverzija ne uspe, ispisuje se poruka o grešci.
Vizuelizacija temperature u Processing-u
Ova dodatna vežba prikazuje primljenu temperaturu sa DHT11 senzora koristeći grafiku u realnom vremenu. Krug menja boju zavisno od temperature: hladno je plavo, toplo crveno.
Processing kod za vizuelizaciju
import processing.serial.*;
Serial myPort;
float temperature = 0;
void setup() {
size(400, 400);
myPort = new Serial(this, Serial.list()[0], 115200);
}
void draw() {
background(200);
// Čitanje podataka sa serijskog porta
int availableBytes = myPort.available();
if (availableBytes > 0) {
byte[] bytes = new byte[availableBytes];
myPort.readBytes(bytes);
String str = new String(bytes);
try {
temperature = Float.parseFloat(str.trim());
println("Primljena temperatura: " + temperature);
} catch (NumberFormatException ex) {
println("Greška pri konverziji: " + ex.getMessage());
}
}
// Mapiranje temperature u opseg boje (0°C = plavo, 40°C = crveno)
float tColor = map(temperature, 0, 40, 0, 255);
fill(tColor, 0, 255 - tColor); // RGB boja kruga
noStroke();
// Crtanje kruga u sredini ekrana
ellipse(width/2, height/2, 200, 200);
// Prikaz broja temperature na ekranu
fill(0);
textSize(24);
textAlign(CENTER, CENTER);
text(nf(temperature, 1, 1) + " °C", width/2, height/2);
}
Objašnjenje vizualizacije:
1. Koristimo map() da prebacimo temperaturu (0–40°C) u opseg boja (0–255).
2. Krug menja boju: hladna temperatura je plava, topla crvena.
3. Na krugu prikazujemo brojčanu vrednost temperature.
4. Svaka promena temperature sa Arduino-a se odmah vidi u boji i broju na ekranu.
Kalibracija temperaturnog senzora – Kako poboljšati tačnost merenja
Iako senzori poput LM35 ili DHT11 dolaze fabrički kalibrisani, u praksi može doći do manjih odstupanja u očitanoj temperaturi. Razlike mogu nastati zbog tolerancije komponenti, napajanja, dužine kablova ili uticaja okoline. Zbog toga je poželjno izvršiti jednostavnu kalibraciju kako bi merenje bilo preciznije.
Kako izvršiti kalibraciju
- Uporedite očitanu temperaturu sa proverenim digitalnim termometrom.
- Ako postoji razlika (npr. Arduino pokazuje 23°C, a stvarna temperatura je 25°C), izračunajte korekciju.
- U kod dodajte korekcionu vrednost (offset).
Primer korekcije u kodu (LM35)
float temperatura = analogRead(A0) * 5.0 / 1023.0 * 100.0;
float korekcija = 2.0; // Korekcija od +2°C
temperatura = temperatura + korekcija;
U ovom primeru dodajemo +2°C kako bi očitana vrednost odgovarala realnoj temperaturi.
Ako senzor pokazuje veću vrednost od stvarne, korekcija može biti negativna.
Napomena
Za preciznije projekte preporučuje se:
- Višestruko merenje i računanje prosečne vrednosti.
- Korišćenje kvalitetnog napajanja.
- Izbegavanje postavljanja senzora blizu izvora toplote (npr. samog Arduino regulatora napona).
|
Prethodno
|< Arduino LDR Vežba-Prikaz osvetljenja |