Documente Academic
Documente Profesional
Documente Cultură
Sistem de monitorizare a
plantei
2021-2022
CUPRINS
1. Obiectivele lucrării..............................................................................1
4. Descrierea lucrării............................................................................... 5
6. Desfășurarea lucrării..........................................................................10
7. Rezolvarea lucrării..............................................................................17
1. Obiectivele lucrării
Lucrarea de laborator are ca scop crearea unui sistem de monitorizare a plantelor care va
măsura umiditatea solului, temperatura și luminozitatea din mediul în care planta se află.
Studenții vor începe familiarizarea cu mediul de dezvoltare Arduino, modul în care se
programează mediul de dezvoltarea, cum se va lucra cu datele colectate de la senzori, cum vor
fi afișate datele pe LCD și realizarea conversiei datelor de la analog la digital.
1
Descriere modulului intern de pe placa Arduino
Porturile de pe placă:
• B (pini digital de la 8 la 13)
• C (pini analogici de intrare)
• D (pini digitali de la 0 la 7)
Fiecare port este controlat de 3 regiștrii (aceștia sunt cei definiți în limbajul Arduino): DDR,
PORT și PIN.
Registrul DDR determină tipul pinului: intrare/ ieșire
Registrul PORT controlează starea pinului: high sau low și citește, totodată, starea de input
setată pinului (echivalentul din Arduino pentru pinMode() ).
Regiștrii DDR și PORT pot fi amândoi scriși și citiți.
Regiștrii PIN corespund stării de input, pot fi doar citiți.
Fiecare bit din acești regiștrii corespunde unui singur pin.
2
Există 3 porturi:
• PORTD (DDRD, PORTD, PIND)
• PORTB (DDRB, PORTB, PINB)
• PORTC (DDRC, PORTC, PINC)
Mircrocontroller-ul ATMega328p
Caracteristici tehnice:
Tensiune de alimentare: 1.8V - 5.5V;
Capsula: 28DIP;
Frecvență de funcționare: până la 20MHz;
Flash: 32kB;
23 pini I/O;
1 UART, 2 SPI și 1 I2C;
6 canale de PWM;
8 x 10 bit ADC-uri.
3
b) Modul cu sensor umiditate sol
Caracteristici tehnice:
Nivele de sensibilitate reglabilă (afișată în controlul potențiometrului digital albastru);
Tensiuni de lucru între 3,3 V - 5 V;
Mod de ieșire dublu, ieșirea digitală este simplă, ieșirea analogică mai exactă;
e) Potențiometru
Potențiometru cu diferite valori: 10KΩ, 1KΩ, 2KΩ, 5KΩ, 20KΩ, 50KΩ, 100KΩ, 250KΩ, 500KΩ, 1MΩ.
f) Condensator
4
Condensator cu diferite valori: 2P, 3P,5P, 10P, 15P, 22P, 30P, 33P, 47P, 68P, 75P, 82P, 101(100P),
151, 221, 331, 471(470pf), 102(1nf), 152, 222, 332, 472, 681, 682, 103(10nf), 153, 333, 473, 683,
104(100nf).
4. Descrierea lucrării
Proiectul se bazează pe aflarea datelor necesare în ajutorul creșterii unei plante, cum ar fi
umiditatea pământului, temperatura mediului în care este și emisia razelor solare asupra sa;
aceste date vor fi afișate pe un ecran LCD. Sistemul va conține un Arduino UNO care va fi legat
la un breadboard pe care va fi atașat un senzor de temperatură, un senzor de umiditate și o
fotorezistentă.
Datele colectate de la senzori și rezistență vor fi afișate pe ecranul LCD aflat pe breadboard.
În momentul de funcționare a sistemului se disting două stări de funcționare: o stare de
colectare a datelor din mediu, apoi o stare de transmitere și afișare de date. Când sistemul este
pornit, senzorii colectează date pe care le transmit către LCD unde le afișează.
În urma realizări acestei lucrări de laborator, am ajuns la următoarele rezultate. Lumina ca
să fie potrivită ar trebui să aibă valori între 500 și 800 , peste 800 lumina este foarte puternică,
iar sub 500 apare semiîntuneric și 200 chiar întuneric. Temperatura pentru o plantă este optimă
în intervalul 15 și 28, valorile înafara acestui interval reprezintă temperaturi prea mari sau prea
mici. Pentru umiditatea solului, valorile peste 800 ne indică faptul că senzorul nu este în
pământ, între 300 și 800 solul este benefic unei plante, iar sub 300 este mult prea umed.
5
Schemă electrică
Schema montajului
6
5. Montajul propriu-zis
Pașii necesari pentru crearea montajului:
a) Placuța Arduino la breadboard:
c) Fotorezistenta:
La pinul de GND al fotorezistentei se conectează o rezistență de 10KΩ, capatul rezistenței se
conectează pe breadboard la GND, iar capatul cu fotorezistența se leagă un fir la Arduino la
pinul A2;
Pinul ramas liber se conectează la breadboard la +5V.
d) DHT11:
Senzorul DHT11 are patru pini, dar doar trei dintre ei se pot folosi;
Pinul din partea sângă se conectează la tensiunea de +5V de pe breadboard;
7
La prinul al doilea, se conectează o rezistență de 10KΩ care este legată la tensiunea de pe
breadboard, iar între rezintență și pinul senzorului se conectează un fir care se leagă la
pinul 2 de pe partea digitală;
Ultimul sensor se conectează la GND de pe breadboard.
e) LCD:
f) Potențiometrul:
Pinul din mijloc se leagă la pinul al treilea al LCD-ului;
Cei doi pini rămași se leagă unul la GND și unul la +5V;
g) Condensatorul:
Un pin se leagă la pinul AREF de pe placuța Arduino;
Celalalt pin se leagă la GND de lângă pinul AREF de pe placuța Arduino.
h) Montajul realizat:
8
6. Desfășurarea lucrării
9
Se instalează următorele biblioteci: „DHT.h”, „LiquidCrystal.h”;
10
DHT:
11
Pentru sensorul de umiditate al solului se va realiză o rutină de conversie a
datelor din analogic în digital realizând următoarele etape:
Configurarea Timer1 cu prescalar 1024 și activarea întreruperi de overflow:
Biții 4, 5, 6, 7 – COM1, COM1, COM1, COM1 : Compara modul de ieșire pentru canal
12
Bit 7, Bit 6, Bit 4, Bit3 – nu se folosesc
Bit 2, Bit 1, Bit 0 - se folosesc pentru a seta prescalarul
14
Bit 6, Bit 4 – nu se folosesc;
Bit 7 – Activarea convertorului ADC;
Bit 5 – Activarea citiri automate a ADC;
Bit 3 - Activează întreruperea de la finalul conversiei ADC;
Bit 2, Bit 1, Bit 0 – Activarea prescalarului pentru ADC.
Bit 6 – nu se folosește;
Bit 2, Bit 1, Bit 0 - ADTSn: ADC Auto Trigger Source [n = 2:0]
Semnalul analogic se citește de fiecare data când se ajunge la overflow
15
Preluarea datelor din ADC:
16
Citire și afișarea mesajelor în loop:
7. Rezolvarea lucrării
Codul senzorului de umiditate al solului
Configurarea Timer1 cu prescalar 1024 și activarea întreruperi de overflow:
- Pentru registrul TCCR1A se setează valoarea 0x00, doarece nu dorim să comparam cu
ieșirile de pe canale;
- Pentru registrul TCCR1B, pentru siguranță am setat valoarea 0x00 pentru a nu avea
valori default;
- Pentru registru TCCR1B se selectează prescalarul 1024 din table, bitul 2 și bitul 0 se
setează cu valoarea 1;
- Pentru TIMSK1 bitul 0 se setează cu valoarea 1pentru a active intreruperea de overflow;
- Pentru TCNT1 se setează valoarea de 0 pentru numărare.
17
Configurarea ADC ca să funcționeze când Timer1 ajunge la overflow și
activarea întreruperi ADC:
- Pentru registrul ADMUX , din table am selectat tensiunea externă de 5V, am setat 1 bitul
6;
- Pentru registrul ADCSRA, am selectat din table prescalarul 128 pentru ADC punând pe
bitul 0, 1, 2 valoarea 1, am activat întrerupere la finalul conversiei ADC prin setarea
bitului 3 cu valoarea 1 , am selectat pornirea automata a conversiei print setarea bitului
5 cu valaorea 1 și am activat convertorul ADC prin setarea valori 1 pe bitul7;
- Pentru registrul ADCSRB s-a selectat timer-ul 1 din tabel prin setarea biților 2 și 1 cu
valoarea 1.
Codul functional:
//setarea bibliotecilor pentru senzorul DHT11 și LCD
#include "DHT.h"
#include<LiquidCrystal.h>
//definirea pinului 2 ca intrare pentru senzorul DHT11
#define DHTPIN 2
#define DHTTYPE DHT11 //definirea tipului de senzor
DHT dht(DHTPIN, DHTTYPE);
//setarea pinilor pentru insirile LCD-ului
LiquidCrystal lcd(8,9,10,11,12,13);
18
const byte adcPin = 0;
void setup()
{
dht.begin();//initializarea functiei dht
setup_timer1();
setup_adc();
//afisarea titlului lucrari
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Plant monitoring");
lcd.setCursor(5,1);
lcd.print("system");
delay(2000);
lcd.clear();
}
void setup_timer1()
{
TCCR1A = 0x00;
TCCR1B = 0x00; //seteaza valoarea bitilor din registru cu 0
TCCR1B |= (1<<CS12) | (1<<CS10);//selectez valoarea 1024 pentru prescaler
TIMSK1 |= (1<<TOIE1);//activez intreruperea de overflow
TCNT1 =0x0000; //counter
}
void setup_adc()
{
ADMUX |= (1<<REFS0);//activez tensiunea interna de 5 volti ca prag superior pentru
procesarea semnalului analogic
ADCSRA |= (1<<3); //activez intreruperea de la finalul conversiei ADC
ADCSRA |= 0b00000111;//setez valoarea prescalerului la 128
ADCSRA |= (1<<5);//activez pornirea automata a citirii semnalului analogic
ADCSRB |= (1<<2) | (1<<1);//citirea semnalului analogic va fi efectuata de fiecare data
cand numaratorul 1 se da peste cap
ADCSRA |= (1<<7);//activez convertorul ADC
}
void loop(){
lightValue = analogRead(A2);//citeste data de la fotorezistentă
//afisarea valori lumini și a mesajului corespunzator
19
lcd.setCursor(0,0);
lcd.print("Light: ");
lcd.print(lightValue);
lcd.setCursor(0,1);
if (lightValue < 200) {
lcd.print(" Dark");
} else if (lightValue >200 && lightValue < 500) {
lcd.print(" Light");
} else if (lightValue >500 && lightValue < 800) {
lcd.print(" Bright");
} else {
lcd.print(" Very bright");
}
delay(2000);
lcd.clear();
20
moisturePercentage= ((soilValue/1023)*100);//calcularea valori de umiditate
//afisarea valori si procentului de umiditate al solului
lcd.setCursor(0,0);
lcd.print("Soil Moisture");
lcd.setCursor(0,1);
lcd.print(soilValue);
lcd.setCursor(6,1);
lcd.print("&");
lcd.setCursor(8,1);
lcd.print(moisturePercentage);
lcd.print(" %");
delay(2000);
lcd.clear();
//afisarea mesajului corespunzator valori de umiditate al solului
if(soilValue < 300){
lcd.setCursor(0,0);
lcd.print("Too much water!");
}
else if(soilValue> 300 && soilValue < 800){
lcd.setCursor(0,0);
lcd.print("The soil is ok!");
}
if(soilValue > 800){
lcd.setCursor(0,0);
lcd.print("The sensor is ");
lcd.setCursor(0,1);
lcd.print("not in the soil!");
}
delay(2000);
lcd.clear();
}
ISR(ADC_vect)
{ soilValue = ADC;//adaugarea valori senzorului după conversie
}
21
Proiect realizat de studenții următori, de la Facultatea de Inginerie Electrică și Știința
Calculatoarelor, Profilul Calculatoare, anul IV, an universitare 2021-2022:
.
.
.
.
.
.
22