Sunteți pe pagina 1din 24

Lucrare de laborator

Sistem de monitorizare a
plantei

2021-2022
CUPRINS

1. Obiectivele lucrării..............................................................................1

2. Scurtă descriere Arduino.....................................................................1

3. Descrierea componentelor necesare ................................................. 3

4. Descrierea lucrării............................................................................... 5

5. Montajul propriu-zis ........................................................................... 7

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.

2. Scurtă descriere a Arduino


Arduino este o platformă open-source utilizată pentru construirea de proiecte electronice.
Arduino constă atât într-o placă de circuite programabile fizic (microcontroler), cât și într-o
parte de software sau pe scurt IDE (Integrated Development Environment) care rulează pe
computerul dvs. Acesta este folosit pentru a scrie și încărca codul computerului pe un board
fizic.
IDE-ul Arduino utilizează o versiune simplificată a C++, facilitând învățarea programării. În
cele din urmă, Arduino oferă un factor de formă standard care elimină funcțiile
microcontrolerului într-un pachet mai accesibil. UNO este una dintre cele mai populare plăci din
familia Arduino și reprezintă o alegere excelentă pentru începători.

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)

3. Descrierea componentelor necesare

a) Placă de dezvoltare Arduino UNO + cablu USB de tip A-B

În cadrul laboratorului se va folosi placa de dezvoltare Arduino UNO cu microcontroller-


ul Atmega 328p.

Placă de dezvoltare Arduino UNO


Caracteristici tehnice:
 Tensiune de funcționare: 5V;
 Tensiune de alimentare Jack: 7V - 12V;
 Pini de I/O: 14;
 Pini PWM: 6 (din cei 14 de I/O);
 Pini ADC: 8;
 Memorie flash: 32kB (8 ocupați de bootloader);
 Comunicație TWI, SPI și UART;
 Frecvență de funcționare: 16 MHz.

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

 Are o gaură fixă de șurub, ce permite o instalare convenabilă;


 Dimensiune: 30mm x 16mm;
 Ledul indicator de alimentare (roșu) și luminile de ieșire ale comutatorului digital (verde);
 Comparator cip LM393.

c) Senzor digital de temperature și umiditate DHT11


Caracteristici tehnice:
 Consum redus de energie;
 Umiditatea relativă și măsurarea temperaturii;
 Total calibrat, ieșire digital;
 Stabilitate excelentă pe termen lung;
 Nu există componente suplimentare;
 Transmisia semnalului la distanță mare;
 Putere ultra-scăzută;
 Pachet cu 4 pini;
 Complet schimbabile.

d) Fotorezistor 5528 LDR


Caracteristici tehnice:

 Voltaj maxim (V-dc): 150;


 Consum maxim de putere (mW): 100;
 Temperatură: - 30°C - +70°C;
 Valoare Spectrală (nm): 540;
 Rezistență la lumină (10Lux) (KΩ): 10-20.

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:

 Pinul de +5V și GND se leagă la breadboard;


 La pinul AREF și GND se leagă un condensator.

b) Senzorul de umiditate al pământului:


 Vcc se conectează pe breadboard la tensiunea de +5V de la Arduino;
 GND se conectează pe breadboard la GND de la Arduino;
 Pinul AO se concetează la portul A0 de pe placuta Arduino.

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:

 Pinul VSS se leagă la GND la breadboard;


 Pinul VDD se leagă la +5V la breadboard;
 Pinul VO se leagă la pinul din mijloc al potențiometrului;
 Pinul RS se leagă la pinul 8 al placuței Arduino;
 Pinul RW se leagă la pinul GND la breadboard;
 Pinul E se leagă la pinul 9 al plăcuței Arduino;
 Pinul D4 se leagă la pinul 10 al plăcuței Arduino;
 Pinul D5 se leagă la pinul 11 al plăcuței Arduino;
 Pinul D6 se leagă la pinul 12 al plăcuței Arduino;
 Pinul D7 se leagă la pinul 13 al plăcuței Arduino;
 Pinul A se leagă la +5V la breadboard;
 Pinul K se leaga la GND la breadboard;

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

 Se definesc și initializază pini de intrare pentru componentele circuitului;

 Definirea funcțiilor din setup;

 În funcția loop se realizează comenzile de citire a senzorilor și afișarea lor cu mesajele


corespunzatoare;
 Fotorezistență:

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

! Acest registru se setează pe zero, deoarece nu dorim să comparăm ieșirile.

12
Bit 7, Bit 6, Bit 4, Bit3 – nu se folosesc
Bit 2, Bit 1, Bit 0 - se folosesc pentru a seta prescalarul

Bit 5, Bit 2, Bit 1 – nu se folosesc;


Bit 0 – TOIE : intreruperea de overflow
Când bitul este setat ”1” se activează întreruperea de overflow.
13
 Configurarea ADC ca să funcționeze când Timer1 ajunge la overflow și
activarea întreruperi ADC:

Bit 7, Bit 5, Bit 3, Bit 2, Bit 1, Bit 0 – nu se folosesc;


Bit 6 – REFSn: Reference Selection [n = 1:0]
Selectează tipul de tensiune pentru ADC

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:

 Adăugarea funcțiilor setup_timer1 și setup_adc în funcția setup:

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

int lightValue =0;//initializarea variabilei pentru fotorezistentă


volatile float soilValue; //initializarea variabilei pentru senzorul de umiditate al solului
float temp = 0;//initializarea variabilei pentru senzorul de temperatură
float moisturePercentage;//initializarea variabilei pentru procentajul de umiditate

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();

temp = dht.readTemperature(); //citirea senzorului dht


// verificare daca s-a reusit citirea
if ( isnan(temp)) {
lcd.setCursor(0, 0);
lcd.print("Failed");
} else {
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print((char)223);
lcd.print("C");}
//afisarea mesajului corespunzator temperaturi citite
if (temp < 15) {
lcd.setCursor(0,1);
lcd.print("Too cold!");
} else if (temp >15 && temp < 28) {
lcd.setCursor(0,1);
lcd.print("Temp is ok!");
} else if (temp >28) {
lcd.setCursor(0,1);
lcd.print("Too hot!");
}
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

S-ar putea să vă placă și