PROGRAMUL DE STUDII UNIVERSITARE DE LICENȚĂ ________________________________________________________________________ [308013]

[anonimizat], CALCULATOARE ȘI INGINERIE ELECTRICĂ

PROGRAMUL DE STUDII UNIVERSITARE DE LICENȚĂ ________________________________________________________________________

PROIECT DE DIPLOMĂ

STAȚIE METEO CU ARDUINO

Absolvent: [anonimizat], Bostan Ionel

Pitești

Sesiunea iulie 2018

LISTĂ FIGURI

Figura 1.1. Schemă generală a unei stații meteo clasice 9

Figura 2.1. Structura unui sistem de achiziție de date 11

Figura 2.2. Procesul de cuantificare 12

Figura 2.3. Reprezentarea erorii de cuantificare pentru domeniul de intrare

dat 13

Figura 2.4. Structura unui sistem de achiziție de date cu multiplexarea semnalelor analogice de intrare 13

Figura 3.1. Clasificarea senzorilor generatori 17

Figura 3.2. Principiile fizice folosite în proiectarea senzorilor generatori 18

Figura 3.3. Domeniile de aplicabilitate ale senzorilor chimici 19

Figura 3.4. Variația rezistenței cu temperatura pentru metale și materiale semiconductoare 20

Figura 3.5. Senzor piezorezistiv 22

Figura 3.6. Clasificarea traductoarelor 24

Figura 3.7. Schema bloc a unui traductor 25

Figura 3.8. Schemă bloc a unui traductor cu elemente auxiliare 25

Figura 3.9. Caracteristică statică liniară unidirecțională (a) și proporțională bidirecțională (b) a traductoarelor 26

Figura 3.10. Schema unui traductor în regim dinamic 27

Figura 3.11. Senzorul DHT11 și pinii săi 29

Figura 3.12. Proces general de comunicare 31

Figura 3.13. Senzorul BMP180 31

Figura 3.14. Schemă generală BMP180 32

Figura 3.15. Organigrama de lucru senzorului BMP180 33

Figura 3.16. Pornirea măsurării presiunii 35

Figura 3.17. Diagrama de timp a rezultatelor conversiei A/D pe 16 biți 35

Figura 4.1. Schema bloc a stației meteo 36

Figura 4.2. Afișaj LCD 2.4” 37

Figura 4.3. Conectarea afișajului la placa de dezvoltare Arduino MEGA 38

Figura 4.4. Ceas în timp real RTC DS1307 40

Figura 4.5. Circuit tipic de conectare a modului DS1307 la microcontrolere 40

Figura 4.6. Transferul datelor pe magistrala I2C 42

Figura 4.7. Schema electrică de conectare a modulului RTC la Arduino MEGA 44

Figura 4.8. Modul cu buzzer activ 46

Figura 4.9. Schemă electrică buzzer 46

Figura 4.10. Conectarea buzzerului la Arduino MEGA 48

Figura 4.11. Prezentare Arduino MEGA 49

Figura 4.12. Definirea condițiilor de Start și Stop 52

Figura 4.13. Interfața electrică de bază la magistrala I2C 53

Figura 4.14. Nivelul fizic I2C 53

Figura 4.15. Conectarea senzorului DHT11 la Arduino MEGA 55

Figura 4.16. [anonimizat]11 56

Figura 4.17. Dimensiunile senzorului DHT11 57

Figura 4.18. Conectarea senzorului BMP180 la Arduino MEGA 59

Figura 4.19. Dimensiunile senzorului BMP180 60

Figura 4.20. Schema electrică în programul EasyEDA 61

Figura 4.21. Interfața programului Mach3 65

Figura 4.22. Procesul de găurire al cablajului 65

Figura 4.23. Realizarea traseelor 66

Figura 4.24. Amprentă cablaj 66

Figura 4.25. Cablaj final cu senzorii specifici stației meteo

(vedere spate și față) 67

Figura 4.26. Conectarea cablajului final senzorii stației meteo la Arduino 67

Figura 4.27. Stație meteo cu Arduino 68

Figura 5.1. Interfața mediului de dezvoltare Arduino IDE 69

Figura 5.2. Organigrama de lucru a programului principal 81

Figura 6.1. Conectarea DHT11 la Arduino Mega 83

Figura 6.2. Testarea senzorului DHT11 84

Figura 6.3. Senzorul DHT11 încălzit 85

Figura 6.4. Conectare BMP180 la placa de dezvoltare 86

Figura 6.5. Testare BMP180 88

Figura 6.6. Conectare DS1307 88

Figura 6.7. Afișarea timpului și a dăți în timp real 89

Figura 6.8. Conectarea buzzerului 90

Figura 6.9. Stație meteo cu Arduino 91

Figura 6.10. Afișarea parametrilor stației meteo în consolă 91

Figura 6.11. Realizare practică (placă de test) 92

Figura 6.12. Stație digitală de afișare a temperaturii vs. stație meteo Arduino 92

Figura 6.13. Afișarea parametrilor din mediul extern 93

Figura 6.14. Date privind starea vremii furnizate furnizate de AccuWeather 93

Figura 6.15. Date privind starea vremii furnizate de ANM 94

Figura 7.1. Kit senzori stație meteo 97

LISTĂ TABELE

Tabel 3.1. Coeficienții de presiune pentru diferite metale 23

Tabel 4.1. Conectarea pinilor afișajului LCD la Arduino Mega 39

Tabel 4.2. Conectarea ceasului în timp real la Arduino Mega 44

Tabel 4.3. Conectarea pinilor buzzerului la Arduino MEGA 47

Tabel 4.4. Descriere pini Arduino Mega 51

Tabel 4.5. Descriere termeni utilizați de magistrale 52

Tabel 4.6. Pinii interfeței SPI pentru Arduino UNO și MEGA 54

Tabel 4.7. Conectare pinilor senzorului DHT11 la pinii Arduino MEGA 55

Tabel 4.8. Modul de conectare al senzorului DHT11 58

Tabel 4.9. Alocarea pinilor plăcuței din punct de vedere hardware 62

Tabel 5.1. Alocarea pinilor plăcuței din punct de vedere software 82

ACRONIME

ADC: Analog Digital Convertor – convertor analog digital

CEM: Circuit Eșantionare – Memorare

CNC: Computering Numeric Controll – control numeric computerizat

EEPROM: Electrically Erasable Programmable Read-Only Memory – memorie programabilă cu ștergere electrică

GPS: Global Positioning System – sistem de poziționare globală

I2C : Inter-Integrated Circuit – intefață serială integrată

LCD: Liquid Crystal Display – afișaj cu cristale lichide

OTPM: One-Time Programmable – memorie programabilă o singură dată

PDA: Personal Digital Assistant – asistent digital personal

RTC: Real Time Clock – ceas în timp real

SAD: Sistem de Achiziții de Date

SCL: Serial Clock Line – linie de ceas serială

SDA: Serial Data Line – line de date serială

SPI: Serial Peripherical Interface – intefață serială periferică

UR: Umiditate Relativă

UP: Unitate Presiune

USB: Universal Serial Bus – magistrală serială universală

UT: Unitate Temperatură

ANM: Administrația Națională de Meteorologie

CAPITOLUL 1. INTRODUCERE

Prezenta lucrare vizează prelucrarea informațiilor din mediul înconjurător, aspect destul de important în tehnologie și industria din prezent, și asta pentru că orice proces necesită achiziția datelor.

Evoluția continuă a materialelor, senzorilor, a sistemelor de măsurat, a tehnologiilor hardware și software transformă idea unei stații meteo perfomantă și precisă într-una usor de realizat.

Această lucrare se axează pe studiul circuitelor cu microcontrolere și dezvoltarea montajului practice care să corespundă cerințelor.

Mi-am propus să realizez un dispozitiv care să fie capabil să citească, la intervale egale de timp, temperatura, umiditatea, presiunea atmosferică dintr-o încăpere/mediu (exterior sau interior), ceasul și data în timp real, după care să transmită datele pe un afișaj LCD.

ASPECTE GENERALE PRIVIND STAȚIILE METEO

Prognoza meteo reprezintă punerea în practică a tehnologiilor avansate cu scopul emiterii unor ipoteze în legătură cu starea vremii. Datele sunt obținute în urma studierii parametrilor specifici domeniului numiți și condiții atmosferice.

Stațiile meteo sunt dispozitive capabile să ofere date cât mai precise despre fenomenele meteorologice și climatice pe o perioadă de timp îndelungată. Stațiile meteo pot fi prevăzute cu o mulțime de senzori, ca de exemplu: senzor pentru măsurarea temperaturii aerului atmosferic (termometru), senzor pentru măsurarea presiunii atmosferice (barometru), senzor pentru măsurarea umidității (higrometru), girueta, instrument ce precizează intensitatea și direcția vântului, anemometru ce măsoară viteza vântului.

Există stații mult mai complexe folosite în agricultură ce măsoară anumiți parametrii cum ar fi: umiditatea solului și a vegetației, temperatura solului, a apei in lacuri, baraje, mări, oceane, etc., radiația solară, radiația razelor ultraviolete, dar și stații meteo folosite în aeroporturi (aici putem întâlni senzori capabili să identifice precipitațiile, dar și senzori care măsoară vizibilitatea).

O schemă bloc generală a unei stații meteo clasice poate arată ca în figura de mai jos sau poate fi mai complexă, depinzând de domeniul unde este utilizată.

Figura 1.1 . Schemă generală a unei stații meteo clasice

Schema bloc cuprinde: senzori pentru măsurarea temperaturii, presiunii atmosferice și a umidității relative a aerului, capabili să transmită date către microcontroler, acesta transmițând mai departe valorile rezultate din măsuratori ce vor fi afișate pe un ecran.

CAPITOLUL 2. ACHIZIȚII DE DATE

2.1. GENERALITĂȚI PRIVIND ACHIZIȚIA DATELOR

Pentru controlul unui proces fizic este necesară extragerea informațiilor privind desfășurarea procesului, prin folosirea traductoarelor. Semnalele de la ieșirea acestora sunt transformate în semnale analogice (tensiuni electrice) cu ajutorul circuitelor de condiționare. Pentru controlul numeric al procesului fizic se realizează conversia semnalelor analogice în semnale digitale acceptate de sistemul

de prelucrare numerică (calculator / microcalculator, sistem cu microcontroler/ microprocessor ).

Semnalelele digitale se obțin prin extragerea la momente de timp stabilite, a valorilor semnalelor analogice și conversia acestor valori în semnale digitale cu ajutorul sistemelor de achiție de date (SAD). Semnalele digitale obținute din prelucrare se folosesc pentru comanda elementelor de execuție de control ( dispozitive de afișare numerică și alfanumerică, relee, etc.).

2.2. STRUCTURA UNUI SISTEM DE ACHIZIȚIE DE DATE

Un sistem de achiziție de date este alcătuit din circuite analogice cu funcții de prelucrare necesare realizării conversiei datelor, circuite pentru conversia analog-numerică și circuite de interfață pentru transferul semnalului numeric obținut din achiziție la sistemul de prelucrare numerică; prin circuitele de prelucrare numerică se poate realiza controlul funcționării sistemului de achiziție de date de către sistemul de prelucrare numerică.

În general, un sistem de achiziție de date trebuie să poată îndeplini următoarele funcții de bază, și anume:

Conversia fenomenului fizic într-un semnal ce poate fi măsurat;

Măsurarea semnalelor generate de senzori/traductori cu scopul extragerii informațiilor utile;

Analizarea și prezentarea datelor într-o formă utilizabilă.

Structura unui sistem de achiziție de date este prezentată în figura 2.1.

Figura 2.1. Structura unui sistem de achiziție de date

După cum se observă, în figura de mai sus este prezentată structura sistemului de achiziție de date cu un semnal analogic de intrare. Această structură cuprinde:

filtru de intrare trece jos = realizează funcția de eliminare a erorilor care pot rezulta în urma reprezentării numerice a semnalelor analogice;

amplificator cu câștig programabil = permite mărirea gamei dinamice corespunzătoare semnalului analogic de intrare, pentre care se poate utiliza un SAD (sistem de achiziție de date). Gama dinamică a semnalului de intrare a semnalui de intrare ui se exprimă în funcție de valoarea maximă a semnalului de intrare și de valoarea minimica impusă a se detecta. Se poate exprima analitic sub forma:

(2.1)

circuit de eșationare memorare (CEM) = menține semnalul constant la intrarea convertorului analog- digital pe durata realizării conversiei.

convertor analog-digital ADC (sau analog-numeric-CAN) = circuit care primește la intrare o mărime analogică și furnizează la ieșire un număr (combinație de biți) care constituie o aproximare a mărimii de intrare.

Cuantificarea se realizează prin împărțirea domeniului de intrare, care conține o infinitate de valori, într-un număr finit de intervale egale (cuante), cărora li se atribuie un număr, conform figurii 2.2.

Figura 2.2 . Procesul de cuantificare

Mărimea cuantei este stabilită de mărimea domeniului analogic de intrare și de numărul de intervale în care se împarte acest domeniu, de unde rezultă că informația sub formă numerică se face cu introducere erorii de cuatificare. Pentru un domeniu de intrare stabilit, eroarea de cuantificare devine din ce în e mai mică, pe măsură ce crește numărul de biți pe care se face codificarea semnalului. În figura 2.3 avem reprezentarea erorii de cuantificare pentru o tensiune analogică de intrare de până la 7,5V.

Figura 2.3 . Reprezentarea erorii de cuantificare pentru domeniul de intrare dat.

Pentru achiziția cu un sistem prevăzut cu mai multe semnale analogice de intrare se folosește un multiplexor. Structura unui sistem de achiziție de date cu multiplexor este prezentată în figura 2.4 și cuprinde un ansamblu format din circuitul de eșantionare-memorare și convertorul ADC, la intrările căruia se conectează succesiv semnalele analogice de intrare u1, u2,…, um, prin multiplexarea în timp.

Achiziția datelor corespunzătoare celor m semnale analogice de intrare se realizează prin controlul sistemului de achiziție de date comandat de sistemul de prelucrare numerică. Perioada de achiziție minimă a sistemului de achiziție cu multiplexarea a m semnale analogice de intrare se obține prin multiplicarea cu m a perioadei de achiziție minime caracteristice ansamblului CEM-ADC.

Figura 2.4. Structura unui sistem de achiziție de date cu multiplexarea semnalelor analogice de intrare

CAPITOLUL 3. SENZORI TIPICI UTILIZAȚI ÎN STAȚIILE METEO

3.1. NOȚIUNI ELEMENTARE PRIVIND SENZORII ȘI TRADUCTOARELE

SENZORI

Ca o scurtă istorie, cuvântul senzor provine din latinescul sensus care înseamnă simț, cu sensul de a simți, a percepe și a distinge cu ajutorul simțurilor umane.

Dezvoltarea automatizării sistemelor de producție implică folosirea unor dispozitive care să primească și să transmită informații cu privire la procesele de producție. Îndeplinind aceste funcții, importanța senzorilor în procese de măsurare și control a crescut în ultima perioadă. Datorită evoluției electronicii, informaticii, senzorii sunt din ce în ce mai variați și complecși, prezentând performanțe foarte bune dar și forme fizice cât mai mici.

Senzorul reprezintă componenta care convertește o mărime fizică (exemplu: temperatură, presiune, distanță) într-o mărime ușor de analizat. Senzorii pot opera cu ajutorul unui contact ( de exemplu un comutator) sau fără contact (de exemplu un senzor magnetic).

O clasificarea generală a senzorilor ar fi următoarea:

senzori parametrici rezistivi: reprezintă senzorii la care mărimea de măsurat produce o variație a rezistenței electrice R a senzorului iar rezistența electrică a acestui tip de senzori este dată de relația (3.1). Variația rezistenței electrice rezultă prin variația unuia din parametrii prezenți în relația următoare.

(3.1)

unde:

R – rezinstența conductorului;

l – lungimea conductorului;

S – secțiunea;

ρ – rezistivitatea materialului.

Senzorii rezistivi se clasifică în funcție de variația unuia din parametrii din relația 3.1 după cum urmează:

senzori rezistivi la care variația rezistenței rezultă prin variația lungimii conductorului:

senzori tensometrici;

senzori potențiometrici;

senzori rezistivi cu contacte.

senzori rezistivi la care variația rezistenței rezultă prin variația rezistivității materialului:

senzori fotorezistivi;

senzori de umiditate;

senzori termorezistivi, etc.

senzori rezistivi la care variația rezistenței rezultă prin variația secțiunii transversale a unui conductor sau semiconductor:

senzori cu electrolit (element rezistent).

senzori parametrici inductivi: convertește mărimea de măsurat(neelectrică) într-o mărime electrică, și anume inductivitatea. Inductivatea unei bobine este dată de relația (3.2).

(3.2)

unde:

L reprezintă inductivitatea bobinei;

N este numărul de spire;

ℜm reprezintă reluctanța magnetică și are formula , unde A este aria secțiunii transversale și l este lungimea medie a liniilor de câmp prin circuitul magnetic;

lk reprezintă lungimea unei secțiuni k a circuitului magnetic;

μk reprezintă permeabilitatea magnetică a secțiunii k;

Sk reprezintă aria secțiunii k.

Mărimea neeelectrică poate fi: lungimea întrefierului sau aria secțiunii întrefierului, în ambele cazuri producându-se o variație a reluctanței magnetice, adică mărimea neeelectrică care determină poziția armăturii este transformată în variație de inductivitate.

Acest tip de senzori se clasifică în senzori inductivi la care:

este influențată o singură inductivitate. Aici avem senzorii:

senzori inductivi cu armătură mobilă;

senzori inductivi cu miez mobil.

este influențată permeabilitatea magnetică:

senzori inductivi de tip presductor.

sunt influențate două inductivităti:

senzori inductivi cu bobine diferențiale.

sunt influențate inductivități mutuale. Aici întalnim următoarele tipuri de traductoare inductive:

traductor inductiv de tip transformator diferențial;

traductor inductiv de tip resolver;

traductor inductiv de tip inductosin.

senzori parametrici capacitivi: convertește mărimea de măsurat(neelectrică) într-o variație de capacitate electrică. Aceștia pot fi:

cilindrici;

plani.

Senzorii capacitivi cilindrici sunt caracterizați de relația (3.3) iar cei plani de relația (3.4).

(3.3)

(3.4)

unde:

ε=ε0∙εr reprezintă permitivitatea electrică iar ε0 și εr este permitivitatea vidului, respectiv a mediului;

h reprezintă înălțimea de suprapunere a armăturilor;

D reprezintă diametrul armăturii exterioare;

d reprezintă diametrul armăturii interioare;

S reprezintă aria suprafeței de suprapunere a celor două armături.

Aici întâlnim senzorii:

senzori capacitivi cu variația distanței dintre armături;

senzori capacitivi cu variația suprafeței de suprapunere a celor două armături;

senzori capacitivi cu variația permeativității mediului.

senzori cu fibre optice;

senzori biologici: acet tip de senzori este utilizat în domeniul medical și al biotehnologiei.

senzori pentru roboți;

senzori generatori: reprezintă acei senzori la care mărimea de măsurat este transformată direct în tensiune electrică. Clasificarea acestor senzori este prezentată în figura 3.1.

Figura 3.1. Clasificarea senzorilor generatori

În figura 3.2 avem prezentate principiile fizice ale senzorilor generatori, precum și mărimile ce se doresc a fi măsurate.

Figura 3.2. Principiile fizice folosite în proiectarea senzorilor generatori

senzori chimici: sunt utilizați în detecția gazelor, ionilor, dar și în măsurarea umidității; acestea fiind și cele trei tipuri principale de mărimi detectate de acest tip de senzori. Mărimile chimice măsurate cu ajutorul senzorilor chimici sunt transformate de obicei în mărimi electrice.

În figura 3.3. avem sectoare și domeniile de aplicabilitate specifice senzorilor chimici, precum și câteva exemple.

Figura 3.3 . Domeniile de aplicabilitate ale senzorilor chimici

Aceștia la rândul lor clasificându-se într-o varietate de senzori utilizați în diverse domenii industriale sau de cercetare așa cum se poate observa în schema de mai jos.

Semnale de ieșire caracteristice ale senzorilor

Cunoașterea semnalelor de ieșire ale senzorilor este esențială în utilizarea corectă a acestor componente. Se întâlnesc următoarele tipuri de semnale:

semnal de ieșie binar – semnal de tip A. Aici întâlnim senzorii de temperatură, de proximitate, de presiune, de nivel și pot fi conectați direct la un controler logic programabil (PLC-programmable logical controller).

semnal pulsatoriu – semnal de tip B. Exemplu: senzori de creștere a lungimii și a unghiului de rotație.

semnal analogic – semnal de tip C: semnal care nu trebuie evaluate imediat. Aici întâlnim senzorii piezoelectrici(piezorezistivi) și senzorii magnetici.

semnal de tip D – semnal analogic care trebuie evaluat imediat. Valorile tipice ale acestui semnal sunt cuprinse între 0 si 10V.

semnal de tip E. Acest tip de semnal este dat de senzori și de sistemele de senzori care furnizează semnale de ieșire standardizate (exemplu: RS-232-C).

Exemple de senzori care dă la ieșire semnale electrice binare: senzori de temperatură, senzori de proximitate, senzori de nivel, senzori de presiune.

Exemple de senzori analogici care dă la ieșire semnale electrice analogice (tensiuni sau curenți): senzori pentru mișcare lineară sau de rotație, senzori pentru lungime sau distanță, senzori de deplasare, senzori de forță, senzori de temperatură, senzori de presiune, senzori de nivel, senzori optici, etc.

SENZORI TERMOREZISTIVI

Acești senzori se bazează pe propietatea materialelor semiconductoare și a materialelor conductoare de a-și modifica rezistivitatea electrică la variația temperaturii. Rezistivitatea materialelor semiconductoare scade odată cu creșterea temperaturii iar rezistivitatea materialelor conductoare crește odată cu creșterea temperaturii. Reprezentarea grafică este prezentată în figura 3.4.

Figura 3.4 . Variația rezistenței cu temperatura pentru metale și materiale semiconductoare

Întâlnim două tipuri de senzori termorezistivi și anume: termorezistoarele și termistoarele. Termorezistoarele sunt rezistoare realizate din metale pure cum ar: Platina, Cupru, Nichel și au caracteristici de conversie liniare pe intervale mari de temperatură.

Rezistența senzorului este funcție de temperatură (R=R(θ)) iar dezvoltată în serie Taylor devine:

(3.5)

unde:

R – rezistența electrică la temperatura θ

R0 – rezistența electrică la temperatura θ0 (temperatură de referință)

α, β – coeficienții de variație ai rezistenței cu temperatura și au valori constante pentru anumite intervale de temperatura.

Astfel, pentru un interval mai mare de temperatură se folosește utilizarea relației dezvoltată în serie Taylor până la termenii de ordin doi iar pentru un interval de temperatură restrâns, coeficientul α se consideră constant iar relația (3.5) devine:

(3.6)

dar în practică corespondența rezinstență-temperatură se face pe baza unor tabele standardizate care arată această corespondență din zece în zece grade ci nu nu pe baza relației matematice.

Termistoarele sunt realizate din materiale semiconductoare care prezintă modificării ale rezistenței cu temperatura.

Dependența rezistenței de temperatură este dată de relația (3.7).

(3.7)

R0 – rezistența electrică la T0 (temperatura absolută)

b – constanta de material și are o valoare cuprinsă între (3000÷5000)K

Relația sensibilității unui termistor este următoarea și se observă că scade cu pătratul temperaturii iar intervalul de utilizare (sensibilitate ridicată) este intervalul temperaturilor relativ mici.

(3.8)

Termistoarele sunt destul de utilizate în instalații de măsurare dar și în instalațiile de reglaj automat. Ele permit măsurarea temperaturii în intervalul (-70÷250)℃ cu condiția liniarizării caracteristicii de conversie.

Avantajele termistoarelor:

pot fi realizate cu o rezistență foarte mare(până la 200kΩ) la o temperatură de 20℃;

sunt realizate din sfere cu diametrul sub 1mm de unde rezultă un timp de măsurare foarte mic și nu produce perturbații câmpului de temperaturi.

SENZORI PIEZOREZISTIVI

Senzorii piezorestivi fac parte din senzorii parametrici rezistivi și au la bază efectul piezoelectric ce constă în variația rezistivității unui material dacă este supus unei presiuni exterioare. Variația rezistivității cu presiunea este datorată deformărilor retelelor cristaline ale materialului produse de presiunea aplicată (figura 3.5), schimbările de rezistență producându-se pentru variații statice și dinamice.

Figura 3.5 . Senzor piezorezistiv

Pentru majoritatea metalelor și a intervalelor limitate de variație ale presiunii, rezistența electrică, R variază liniar cu presiunea. Acest lucru se poate observa în relația (3.9).

(3.9)

unde:

R0 – rezistența la presiunea de 1atm (atmosferă)

b – coeficient de presiune.

În tabelul următor avem prezentați coeficienți de presiune pentru diferite materiale.

Tabel 3.1. Coeficienții de presiune pentru diferite metale

Utilizarea acestui tip de senzori în traductoarele pentru măsurarea presiunii se face diferențiat, constructiv sau tehnologic, în funcție de tipul de presiune masurată, absolută sau diferențială.

Pe plan mondial se utilizează două tipuri de elemente piezorezistive:

elemente obținute prin siliciu difuzat;

elemente obținute prin depuneri în vid de pastile de siliciu pe un suport.

Avantaje ale senzorilor piezorezistivi:

senzorii piezorezistivi sunt simpli și robuști;

au timp de răspuns mic;

histerezis neglijabil;

Dezavantaj în utilizarea senzorilor piezorezistivi:

prezintă dificultăți la realizarea legăturilor electrice prin pereții camerei de presiune.

Senzorii piezorestivi sunt utilizați pentru măsurarea presiunilor mari și foarte mari (1000÷100000 atm).

TRADUCTOARE

Traductorul reprezintă elementul care transformă mărimea de măsurat de la intrare într-o mărime electrică. Acesta poate avea în componența sa unul sau mai mulți senzori. Clasificarea traductoarelor este prezentată în figura 3.6. Transformarea mărimii de la intrare se face prin două metode și anume:

prin transformare directă într-un singur element;

prin transformare indirectă (în caz că sunt necesare mai multe transformări succesive ale mărimii de la intrare).

Figura 3.6. Clasificarea traductoarelor

Schema bloc specifică traductoarelor este prezentată în figura 3.7, unde: X reprezintă o mărime de intrare, adică mărimea de măsurat( exemplu: temperatură, umiditate, presiune, distanță, nivel, etc) siY reprezintă mărimea de ieșire, și anume un semnal electric.

Figura 3.7. Schema bloc a unui traductor

Senzorul reprezintă elementul sensibil specific fiecărui traductor pentru detectarea mărimii fizice de măsurat. El detecteaza doar mărimea X, reducând sau chiar eliminând la minim influențele celorlalte mărimi fizice prezente în mediul respectiv. Sub acțiunea mărimii X se produce o modificare a senzorului, la ieșirea lui obtinându-se informația utilă sub formă de semnal electric pentru determinarea valorii acestor mărimi.

Adaptorul electronic are rolul de a prelua informația obținută la ieșirea senzorului și de a o adapta conform cerințelor impuse de aparatura care o utilizează.

Pentru măsurarea temperaturilor foarte mari este necesar să avem elemente auxiliare deoarece senzorul nu poate fi lângă adaptor. Sunt utile elementele de legătură și transmisie în astfel de situații; aceste elemente transmit semnalul de la senzor la adaptor. Un alt element auxiliar este și sursa de energie. O schemă bloc în care sunt incluse elementele de legatură și transmie este prezentată în figura 3.8.

Figura 3.8. Schemă bloc a unui traductor cu elemente auxiliare

Traductorul poate fi definit cu ajutorul a două tipuri de caraceristici de transfer . Acestea sunt:

Caracteristica statică dată de relația y=f(x), unde x și y sunt mărimile de intrare, respectiv

ieșire și care îndeplinesc cerințele măsurării statice.

Caracteristica statică liniară unidirecțională și caracteristica statică proporțională bidirecțională sunt reprezentate în figura următoare și au expresiile (3.9) și, respectiv (3.10).

cu (3.9)

(3.10)

Figura 3.9. Caracteristică statică liniară unidirecțională (a) și proporțională bidirecțională (b) a traductoarelor

În afară de cele prezentate, există mai multe tipuri de caracteristici statice pe care doar le vom enumera:

Caracteristică statică liniară pe porțiuni cu zona de insensibilitate și saturație;

Caracteristică statică liniară pe porțiuni cu zona de insensibilitate, histerezis și saturație;

Caracteristica dinamică: mărimea de intrare și mărimea de ieșire variază în timp. Considerând traductorul un element liniar ( ca în figura 3.10 ), cu o intrare și o ieșire, funcționarea sa în regim dinamic este descrisă de expresia (ecuație diferențială) următoare:

(3.11 )

unde,

, reprezintă derivatele în raport cu timpul de ordinul q și k ale x(t) și y(t);

ak și bq – coeficienți, fiind invariant, dacă nu apar modificări în timp ale comportării dinamice.

Figura 3.10. Schema unui traductor în regim dinamic

Traductorul ideal are fi acela la care nu avem componente tranzitorii, rezultând la ieșire variații corespunzătoare caracteristicii statice. În regim dinamic, traductorul conține o componentă permanentă și una tranzitorie.

Mai există o clasificarea a traductoarelor, și anume clasificarea în funcție de ordinul ecuației diferențiale. Aici întâlnim:

Senzori și traductoare de ordin 0;

Senzori și traductoare de ordin I;

Senzori și traductoare de ordin II.

3.2. SENZORI UTILIZAȚI PENTRU REALIZAREA STAȚIEI METEO

Pentru realizarea practică a stației meteo cu Arduino am folosit următoarele tipuri de senzori: senzor de temperatură și umiditate DHT11 și senzor de presiune atmosferică BMP180.

SENZORUL DE TEMPERATURĂ ȘI UMIDITATE DHT11

Aspecte generale

Senzorul de temperatură și umiditate DHT11 prezintă un senzor de temperatură și umiditate complex cu o ieșire calibrată a semnalului. Folosind tehnica exclusivă de achiziție a semnalului digital și tehnologia de detecție a temperaturii și a umidității, senzorul asigură o fiabilitate ridicată și o stabilitatea excelentă pe termen lung. Acest tip de senzor include o componentă de măsurare a umidității și o componentă de măsurare a temperaturii (termistor) și se conectează la un microcontroler pe 8 biți de înaltă performanță, oferind o calitate excelentă, un răspuns rapid, capacitatea de combatere a interferențelor și costuri reduse.

Senzorul DHT11 și pinii săi sunt prezentați în figura 3.11.

Figura 3.11. Senzorul DHT11 și pinii săi

Fiecare senzor de temperatură și umiditate este strict calibrat în laborator, ceea ce rezultă că este destul de precis la calibrarea umidității. Coeficienții calibrării sunt stocați ca programe în memoria OTP, care sunt folosite de procesul de detectare a semnalui intern al senzorului.

Interfața serială cu un singur fir face integrarea sistemului mai ușoară și rapidă. Dimensiunile mici, consumul de energie mic și transmisia semnalului pînă la 20 de metri fac din acest senzor cea mai bună alegere privind utiliarea lui în diverse aplicații, inclusiv cele mai solicitante.

Componenta prezintă patru pini dispuși pe un singur rând. Este convenabil să se conecteze și pot fi furnizate pachete speciale în funcție de cerințele clienților.

Acest tip de senzori măsoară umiditatea relativă analizând vaporii de apă din aer prin măsurarea rezistenței electrice dintre doi electrozi. Schimbarea rezistenței electrice dintre cei doi electrozi este proporțională cu umiditatea relativă. Când umiditatea relativă este mai mică crește rezistența electrică dintre cei doi electrozi, când umiditatea relativă este mai mare scade rezistența electrică dintre cei doi electrozi.

Umiditatea relativă reprezintă cantitatea vaporilor de apă față de punctul de saturație al vaporilor de apă. La saturație, vaporii de apă încep să se condenseze. Înainte ca aerul rece să devină saturat, el poate să mențină mai puțini vapori de apă și mai multi cînd acesta începe să se satureze.

Umiditatea relativă se exprimă în procente și se calculează după formula :

UR= ( 3.12)

unde:

ρw – densitatea vaporilor de apă

ρs – densitatea vaporilor de apă la saturație

UR – umiditatea relativă

Dacă umiditatea relativă este maximă (100%) atunci are loc condensarea iar dacă umiditatea relativă este minimă (0%) atunci aerul este complet uscat.

Interfața serială

Formatul de date single bus (o singură magistrală) este utilizat pentru sincronizarea și comunicarea dintre microcontroler și senzorul de temperatură și umiditatea DHT11. Un proces de comunicare este în jur de 4 milisecunde.

Datele sunt alcătuite din părți integrale și părși zecimale. O transmisie completă a datelor este de 40 biți iar senzorul DHT11 trimite primul bit de date mai mare.

Formatul datelor este:

date integrale UR pe 8b+date zecimale UR pe 8b+date integrale T pe 8b+date zecimale T pe 8b+suma de verificare pe 8b,

iar dacă transmiterea datelor se face corect, atunci suma de verificare ar trebui să fie ultimul 8 bit din:

date integrale UR pe 8b+date zecimale UR pe 8b+date integrale T pe 8b+date zecimale T pe 8b.

Proces general de comunicare

Procesul este reprezentat în figura ( ) iar explicația este următoarea: când microcontrolerul trimite un semnal de start (pornire), senzorul DHT11 trece din modul de consum redus de energie la modul de funcționare, așteptînd ca microcontrolerul să completeze semnal de start. Odată ce s-a terminat, senzorul trimite un semnal de răspuns de date pe 40 de biți care include informațiile microcontrolerului privind umiditatea relativă și temperatura. Utilizatorii pot alege să citeasca anumite date. Fără semnalul de start de la microcontroler, senzorul nu va da răspuns către microcontroler. Odată ce datele sunt colectate, senzorul DHT11 se va schimba din modul de consum redus de energie până când primește din nou semnal de start de la microcontroler.

Figura 3.12 . Proces general de comunicare

SENZORUL PRESIUNE ATMOSFERICĂ BMP180

Aspecte generale

Robert Bosch este lider pe piața mondială a senzorile de presiune în aplicațiile auto. Bazându-se pe experiența a patru sute de milioane de senzori de presiune în domeniu, senzorul BMP180 continuă o nouă generație a senzorilor de presiune microprelucrați

Senzorul BMP180 reprezintă o nouă generație de senzori de presiune digitali de înaltă precizie și se bazează pe efectul piezorezistiv.

Figura 3.13. Senzorul BMP180

Electronica de joasă tensiune a senzorului BMP180 este optimizată pentru utilizarea în telefoane mobile, dispozitive de navigație GPS (Global Positioning System – Sistem de Poziționare Globală), PDA-uri ( Personal Digital Assistant) și echipamente exterioare. Cu un zgomot redus de altitudine de doar 0,25m la un timp de conversie rapid, senzorul BMP180 oferă o performantă superioară. Interfața I2C (sau IIC- INTER INTEGRATED CIRCUIT) permite o integrare usoară a sistemului cu microcontrolerul.

Descrierea generală a modului de funcționare

Senzorul BMP180 este proiectat pentru a putea fi conectat direct la un microcontroler a unui dispozitiv mobil prin intermediul magistralei I2C. Datele privind presiunea și temperatura trebuie să fie compensate de datele de calibrare ale memoriei EEPROM ( E2PROM) din senzorul BMP180.

Funcțiile generale ale senzorului

BMP180 este compus dintr-un senzor piezorezistiv, un convertor analog-digital și o unitate de control cu memorie EEPROM și interfața seriala I2C (figura ). Senzorul BMP180 oferă valoarea necompensată a temperaturii și a presiuni. Memoria EEPROM are stocați 176 de biti de date individuale de calibrare. Aceasta este folosită pentru a compensa offsetul, dependența de temperatură și alți parametrii ai senzorului. Date de presiune: 16-19biți și de temperatură: 16 biți

Figura 3.14. Schemă generală BMP180

Măsurarea presiunii și a temperaturii

Microcontrolerul trimite secvență de start pentru a începe măsurarea presiunii și a temperaturii. După timpul de conversie, valorile rezultate (presiunea sau temperatura) pot fi citite prin intermediul interfeței I2C. Pentru calcularea temperaturii în grade Celsius și a presiunii în hectoPascali (hPa), trebuie utilizate datele de calibrare. Aceste constante pot fi citite din memoria EEPROM a senzorului BMP180 prin intermediul interfeței I2C la inițializarea software-ului.

Rata de eșantionare poate fi crescută până la 128 eșantioane pe secundă (modul standard) pentru măsurare dinamică. În acest caz, este suficientă măsurarea temperaturii o singură dată pe secundă și să folosirea acestei valori pentru toate măsurătorile de presiune în aceeași perioadă.

Figura 3.15. Organigrama de lucru senzorului BMP180

Există patru moduri: ultra low power, standard, high resolution și ultra high resolution. Fiecărui mod îi corespunde un anumit timp de conversie ( se poate observa în foaia de date a senzorului).

Toate modurile pot fi efectuate la viteză maximă, până la 128 ori pe secundă pentru modul standard, cu consumul de curent crescând proporțional cu rata de eșantionare.

Calculul presiunii la nivelul mării și al altitudinii se face cu următoarele formule internaționale:

Calculul altitudinii

(3.13)

Calculul presiunii la nivelul mării

(3.14)

Interfața I2C este utilizată pentru controlul senzorului, pentru citirea datelor de calibrare din memoria EEPROM și pentru citirea datelor de măsurare atunci când conversia A/D este terminată.

Diagramele de timp specifice măsurării valorii de temperatură UT și a măsurării valorii de presiune UP sunt prezentate în figura ( ). După condiția de start, masterul trimite adresa de scriere a dispozitivului adresa registrului și datele din registru de control. Senzorul BMP180 trimite o confirmare (ACKS-acknowledge by slave) după fiecare 8 biți de date când sunt primite datele. Master trimite o condiție de stop (P) dupa fiecare ultim ACKS.

Figura 3.16. Pornirea măsurării presiunii

Pentru citirea cuvântului de date de temperatura UT (16 biți), cuvântul de date de presiune UP și citirea datelor EEPROM se face după cum urmează: după condiția de start(S)master trimite comanda de scriere a adresei modulului și adresa registrului. Adresa registrului selectează registrul de citire. Apoi master trimite o condiție de reporrnire, urmată de citirea adresei modului care va fi confirmată de BMP180 (ACKS). BMP180 trimite prima dată cei mai semnificativi 8 biți (8MSB), confirmați de master (ACKM-acknowledge by master) , apoi trimite cei 8 LSB ( 8 biți mai puțin semnificativi). Master trimite un mesaj ”not acknowledge” (NACKM-not acknowledge by master) și în cele din urmă o condiție de stop.

Figura 3.17. Diagrama de timp a rezultatelor conversiei A/D pe 16 biți

Toate informațiile se transmit cu ajutorul magistralei I2C, mai exact cu ajutorul conexiunilor SDA (serial data line) și SCL (serial clock line) dar și conexiunea de masă.

CAPITOLUL 4. PROIECTAREA HARDWARE

4.1. PROIECTAREA SCHEMEI BLOC

Schema bloc corespunzătoare stației meteo cu Arduino este prezentată în figura 4.1 și cuprinde următoarele componente:

Senzorul DHT11 pentru măsurarea temperaturii și a umidității relative;

Senzorul BMP180 pentru măsurarea presiunii atmosferice, a temperaturii și a altitudinii;

RTC – ceas în timp real pentru memorarea și incrementarea automata a timpului și a dății;

Buzzer pentru generarea de sunete în momentu depășirii valorile critice stabilite;

Afișaj LCD pentru afișarea valorilor măsurate, dar și a timpului și a dății;

Blocul de alimentare.

Figura 4.1. Schema bloc a stației meteo

4.2. PĂRȚI COMPONENTE

Pe lângă senzorul de temperatură și umiditate DHT11 și senzorul pentru măsurarea presiunii atmosferice BMP180 prezentați în capitolul anterior, în realizarea acestui proiect am mai adaugat și următoarele componente:

afișaj LCD;

modul RTC DS1307 – ceas în timp real;

buzzer;

AFIȘAJUL LCD

Afișajul LCD (figura 4.2) este util pentru a afișa datele primite de la senzorii care măsoară temperatura, umiditatea și presiunea atmosferică, pentru afișarea textului dorit, dar și pentru a afișa timpul și data .

Figura 4.2. Afișaj LCD 2.4”

Conectarea acestuia este ușoară, modulul înfingându-se pur și simplu în placa de dezvoltare, acest lucru putând fi observat în figura 4.3.

Figura 4.3. Conectarea afișajului la placa de dezvoltare Arduino MEGA

Caracteristici tehnice:

Diagonală display 2,4” (aproximativ 6,1 cm);

Rezoluție 240×320 (Qvga);

Număr de culori 65.000;

Interfață de 8bit cu 4bit de control;

Driver: ILI9325D.

Conectarea pinilor afișajului LCD 2.4” la placa de dezvoltare Arduino Mega se face ca în tabelul 4.1.

Tabel 4.1. Conectarea pinilor afișajului LCD la Arduino Mega

MODUL CEAS ÎN TIMP REAL

Ceasul serial în timp real DS1307 (RTC) – figura 4.4 este un ceas /calendar zecimal cu codificare binară completă. Adresa și datele sunt transferate în serie prin magistrala bidirecțională I2C.

Ceasul /calendarul oferă informații despre secunde, minute, ore, zi, dată, lună și an. Data de sfârșit a lunii este ajustată automat pentru luni cu mai puțin de 31 de zile, inclusiv corecțiile pentru anul bisect. Ceasul funcționează în formatul de 24 de ore sau 12 ore cu indicatorul AM / PM.

Dispozitivul DS1307, prezentat în figura 4.4 are un circuit integrat, care detectează defecțiunile de alimentare și trece automat la sursa de rezervă. Operația de menținere a timpului continuă în timp ce piesa funcționează din sursa de rezervă.

Figura 4.4. Ceas în timp real RTC DS1307

În figura 4.5 este prezentat un circuit tipic de conectare a modulelor RTC DS1307 la microcontrolere.

Figura 4.5. Circuit tipic de conectare a modului DS1307 la microcontrolere

DESCRIERE DETALIATĂ A MODULUI RTC DS1307

CIRCUITUL OSCILATOR

DS1307 utilizează un cristal extern de 32.768kHz.

Precizia ceasului depinde de precizia cristalului.

Zgomotul circuitului extern cuplat în circuitul oscilatorului poate duce la o funcționare rapidă a ceasului.

CEAS ȘI CALENDAR

Informațiile despre timp și calendar sunt obținute prin citirea biților de registru corespunzători.

Timpul și calendarul sunt setate sau inițializate prin scrierea biților de înregistrare corespunzători.

Conținutul înregistrărilor de timp și calendar este în format BCD.

Creșterea înregistrărilor zilei de săptămână la miezul nopții.

Valorile care corespund zilei din săptămână sunt definite de utilizator, dar trebuie să fie secvențiale (adică, dacă 1 este egal cu duminica, atunci 2 este egal cu luni și așa mai departe).

MAGISTRALA DE DATE I2C

DS1307 acceptă protocolul I2C. Un dispozitiv care trimite date pe magistrală este definit ca un transmițător și un dispozitiv care primește date ca receptor. Dispozitivul care controlează mesajul se numește master. Dispozitivele controlate de comandant sunt numite slave. Magistrala trebuie să fie controlată de un dispozitiv principal care generează ceasul serial (SCL), controlează accesul la magistrală și generează condiții de START și STOP. DS1307 funcționează ca un slave pe magistrala I2C. Figura 4.6 detaliază modul în care sunt transferate datele pe magistrala I2C.

Transferul de date poate fi inițiat numai atunci când magistrala nu este ocupată. În timpul transferului de date, linia de date trebuie să rămână stabilă ori de câte ori linia ceasului este HIGH. Modificările din linia de date în timp ce linia de ceas este mare vor fi interpretate ca semnale de control. În consecință, au fost definite următoarele condiții de transport:

Magistrala nu este ocupată: ambele linii de date și de ceas rămân HIGH.

Transferul de date START: O schimbare a stării liniei de date, de la HIGH la LOW, în timp ce ceasul este HIGH, definește o condiție START.

Transferul de date STOP: o modificare a stării liniei de date, de la LOW la HIGH, în timp ce linia ceasului este HIGH, definește starea STOP.

Starea liniei de date reprezintă date valide atunci când, după o condiție START, linia de date este stabilă pe durata perioadei HIGH a semnalului de ceas. Datele de pe linie trebuie schimbate în perioada LOW a semnalului de ceas. Există un impuls de ceas pe un octet de date.

Fiecare transfer de date este inițiat cu o condiție START și terminat cu o condiție STOP. Numărul de biți de date transferați între condițiile START și STOP nu este limitat și este determinat de dispozitivul principal. Fiecare dispozitiv de recepție, atunci când este adresat, este obligat să genereze o confirmare după recepția fiecărui octet. Dispozitivul master trebuie să genereze un impuls ceas suplimentar care este asociat cu acest octet de confirmare. Un master trebuie să semnaleze un sfârșit de date către slave. În acest caz, slave-ul trebuie să părăsească linia de date HIGH pentru a permite masterului să genereze starea STOP.

Figura 4.6. Transferul datelor pe magistrala I2C

În funcție de starea octetului R /W (read/write), sunt posibile două tipuri de transfer de date:

Transferul datelor de la master la slave. Primul octet transmis de master este adresa slave. Apoi urmează un număr de octeți de date. Slave-ul returnează un bit de confirmare după fiecare octet primit. Datele sunt transferate mai întâi cu cel mai semnificativ bit (MSB).

Transferul de date de la un transmițător slave la un receptor principal. Primul octet (adresa slave) este transmis de master. Slave returnează apoi un bit de confirmare. Aceasta este urmată de slave care transmite un număr de octeți de date. Master returnează un octet de confirmare după toate octeții recepționați, alții decât ultimul octet. La sfârșitul ultimului octet recepționat, este returnat un "non acknowledgment".

Dispozitivul master generează toate impulsurile de ceas serial și condițiile START și STOP; un transfer este încheiat cu o condiție STOP sau cu o condiție START repetată.

DS1307 poate funcționa în următoarele două moduri:

Modul Receptor Slave (Mod scriere): datele serial și ceasul sunt recepționate prin SDA și SCL. După fiecare octet este recepționat un bit de confirmare. START și STOP sunt recunoscute ca începutul și sfârșitul unui transfer serial. Master va genera o condiție STOP pentru a termina scrierea datelor.

Modul Transmițător Slave (modul de citire): Primul octet este recepționat și manipulat ca în modul receptor slave. Cu toate acestea, în acest mod, bitul de direcție va indica faptul că direcția de transfer este inversată. DS1307 transmite date seriale pe SDA în timp ce ceasul serial este introdus pe SCL. START și STOP sunt recunoscute ca începutul și sfârșitul unui transfer serial. Octetul de adresă slave este primul octet primit după ce starea START este generată de master. DS1307 trebuie să primească o notă de acknowledgment pentru a încheia o citire.

UTILIZARE ÎMPREUNĂ CU ARDUINO MEGA

Pe scurt, modulul RTC este dispozitiv ce reține ora. Circuitul integrat DS1307 este un modul ideal pentru memorarea și incrementarea automata a dății, anului, zilei săptămânii și orei, atât în format AM, cât și PM. Chiar dacă i se întrerupe alimentarea, acesta trece pe modul de back-up, consumând maxim 500 µA din bateria atașată. Acesta poate funcționa pe baterie până la 1 an. Circuitul comunică pe interfață I2C cu plăcii de dezvoltare Arduino sau microcontrollere.

Conectarea modului RTC DS1307 la placa de dezoltare Arduino MEGA se face conform tabelului 4.2 , iar schema electrică de conectare se poate observa în figura 4.7.

Tabel 4.2. Conectarea ceasului în timp real la Arduino Mega

Figura 4.7 . Schema electrică de conectare a modulului RTC la Arduino MEGA

Caracteristici tehnice:

Interfață serială I2C;

Tensiune alimentare DS1307: 4.5V – 5.5V;

Tensiune alimentare AT24C32: 2.7V – 5.5V;

Consum curent DS1307: 1.5mA;

Consum curent AT24C32: 3mA;

Baterie CR2032 de backup.

Caracteristici și avantaje:

Gestionează complet toate funcțiile de menținere a timpului;

RTC contorizează secunde, minute, ore, data lunii, zilei săptămânii și anului cu compensare de la jumătate de an (valabil până la 2100);

Memorie RAM cu 56 de octeți, bazată pe baterii cu scriere nelimitate;

Funcționarea cu consum redus de energie extinde timpul de funcționare a bateriei de rezervă;

Consumă mai puțin de 500nA în modul de rezervă a bateriei cu funcționarea oscilatorului;

Circuit automat de detecție și întrerupere a alimentării cu energie electrică;

Interval opțional de temperatură industrială: -40 ° C până la + 85 ° C;

Suportă funcționarea într-o gamă largă de aplicații.

MODUL BUZZER

Modulul cu buzzer activ (figura 4.8 ) este ideal pentru a testa aplicațiile și poate fi conectat pe breadboard/cablaj. El conține un tranzistor pnp ce controlează buzzerul, deci nu trebuie să ne mai facem griji privind microcontrolerul.

Buzzerul este elementul care supus unei tensiuni generează un semnal sonor de o anumită frecvență. Comanda buzzerului se face prin generarea unui semnal dreptunghiular de comandă. Se utilizează un pin oarecare de ieșire digitală care va genera un semna de 1 logic pentru o anumită durată de timp, influențând astfel frecvența semnalului sonor emis de buzzer. Schema electrică este prezentată în figura 4.9 .

Figura 4.8. Modul cu buzzer activ

Figura 4.9 . Schemă electrică buzzer

Caracteristici tehnici:

Tensiunea de alimentare: 3,3V÷5V;

Curent maxim:30mA;

Tranzistor pnp: 9012.

Modulul cu buzzer activ are următoarele dimensiuni: 1,3cm x 3,3cm. Plăcuța este prevazută cu trei pini de conexiune și anume, VCC, GND și I/O. Pinul I/O se conectează la microcontroler sau la o sursă de semnal dreptunghiular pentru a genera alarma. Plăcuța conține în baza tranzistorului o rezistență, astfel putând fi conectat la microcontroler.

În tabelul următor este prezentată conexiunea pinilor modului cu buzzer la placa Arduino Mega.

Tabel 4.3. Conectarea pinilor buzzerului la Arduino MEGA

Conectarea modului cu buzzer activ pe plăcuța Arduino se face ca în figura următoare.

Figura 4.10. Conectarea buzzerului la Arduino MEGA

ARDUINO

După cum bine știm, Arduino s-a lansat în Italia ( în anul 2005) și este o companie care produce plăci de dezvoltare cum ar fi :

Arduino UNO;

Arduino MEGA;

Arduino Leonardo:

Arduino Nano,etc:

Placa de dezvoltare Arduino este compusă dintr-un microcontroler Atmel AVR de 8/16/32-biți și reprezintă o soluție simplă pentru dezvoltarea diverselor aplicații electronice, fiind ușor de utilizat ( este ușor de programat și de integrat în aplicații. Programarea plăcuțelor se face cu ajutorul unui mediu de programare numit Arduino IDE.

Cu ajutorul plăcuțelor Arduino se pot realiza numeroase aplicații cum ar fi: robot autonom, brațuri robotice, alarmă inteligentă, stație meteo, termometru, sisteme de monitorizare pentru diverse obiecte sau chiar de monitorizarea cutremurelor, producerea unor sunete cu ajutorul unui buzzer și multe altele. Acestea la rândul lor putând fi dezvoltate în aplicații mult mai complexe.

ARDUINO MEGA

În lucrare am folosit placa de dezvoltare Arduino MEGA (figura 4.11 ) și este prevăzută cu un microcontroler ATmega2560. Dispune de 54 de intrări/ieșiri digitale (din care 14 pot fi utilizate ca ieșiri PWM), 16 intrări analogice, 4 UART (porturi seriale hardware), un oscilator de cristal de 16 MHz, o conexiune USB, o mufă de alimentare, și un buton de resetare.

Figura 4.11. Prezentare Arduino MEGA

Arduino Mega2560 poate fi alimentat prin conexiunea USB sau cu o sursă externă de alimentare; sursa de alimentare este selectată automat. Alimentarea externă (non-USB) poate proveni de la un adaptor ca-cc sau de la un acumulator (baterie).

Placa poate funcționa pe o sursă externă de 6 până la 20 de volți. Dacă este alimentată cu mai puțin de 7V, totuși, pinul 5V poate furniza mai puțin de cinci volți, iar placa poate fi instabilă. Dacă se utilizează mai mult de 12V, regulatorul de tensiune se poate supraîncălzi și poate deteriora placa. Intervalul recomandat este de la 7 la 12 volți.

ATmega2560 sprijină, de asemenea, comunicarea I2C și SPI. Software-ul Arduino include o bibliotecă Wire pentru simplificarea utilizării magistralei I2C.

Caracteristici tehnice

Microcontroler Atmega 2560;

Tensiune de operare: 5V;

Tensiune de alimentare recomandată: 7-12V;

54 pini digitali, dintre care 14 pini asigură ieșirea PWM;

16 pini de intrare analogici;

Viteză ceas: 16 MHz;

SRAM 8kb;

EEPROM 4kb.

În tabelul următor este prezentată descrierea pinilor plăcii Arduino Mega.

Tabel 4.4. Descriere pini Arduino Mega

4.3. INTERFAȚAREA SENZORILOR

În acest capitol se va prezenta interfațarea senzorilor cu placa de dezvoltare precum și noțiuni despre interfețele seriale I2C și SPI.

INTERAFAȚA I2C

Interfața I2C (sau IIC-Inter Integrated Circuits sau cum este numită deseori, TWI – two wire interface) este o interfață serială apărută din necesitatea de a realiza sisteme la preț redus cu microcontrolere , destinate în primul rând conducerii proceselor industriale. Un asemenea sistem este compus dintr-un microcontroler sau mai multe microcontrolere și o multitudine de echimanente periferice. Conectarea acestora printr-o interfață serială satisface următoarele cerințe: cost redus, ușor de implementat și de viteză moderată.

Interfața I2C folosește doar două linii, de aceea mai este numită și interfața pe două fire, și anume:

SDA (Serial Data Line) – linie de date serială ;

SCL (Serial Clock Line) – linie de ceas serială.

Protocolul de transfer al datelor pe magistrala I2C presupune inițierea transferului prin aducerea magistralei în condiția de START, transferul propriu-zis și încheierea transferului prin aducerea magistralei în condiția de STOP. Cele două condiții sunt ilustrate în figura 4.12; ele sunt întotdeauna generate de către master.

Condiția de START (S) este definită prin trecerea liniei SDA din 1 în 0, în timp ce linia SCL este menținută la nivel ridicat.

Condiția de STOP (P) este definită prin trecerea liniei SDA din 0 în 1, în timp ce linia SCL este menținută la nivel ridicat.

Figura 4.12 . Definirea condițiilor de Start și Stop.

Fiecare dispozitiv este caracterizat de o adresă unică și poate opera fie ca emițător, fie ca receptor (exemplu: memoria poate fi receptor sau emițător, iar un LCD este doar receptor). Ambele sunt însă noduri sclav/slave.

Tabel 4.5. Descriere termeni utilizați de magistrale

Figura 4.13. Interfața electrică de bază la magistrala I2C

Figura 4.14 . Nivelul fizic I2C

Avantaje:

reduce dimensiunile circuitelor, pentru că interfața la magistrală are nevoie doar de două fire;

număr mic de pini la capsulă ;

complexitate redusă a conexiunii ;

transfer bidirecțional ;

magistrală multimaster ;

lungimea datelor nu este pre-fixată.

INTERFAȚA SPI

Interfața SPI ( Serial Peripherical Interface – Interfață serială periferică) este un alt protocol de comunicație serială. Acest protocol de comunicație serială poate conecta mai multe dispoitive pe distanță scurtă, dar la viteze mai mari decat protocol I2C. aceasta interfață se folosește pentru a comunica cu diverse dispozitive precum: senzori, circuite de comandă a displayurilor, drivere, etc.

În mod obișnuit, există trei linii comune tuturor dispozitivelor și o linie comună pentru orice device:

MISO (Master In Slave Out) – Linia Slave pentru trimiterea datelor către Master;

MOSI (Master Out Slave In) – Linia Master pentru trimiterea de date către periferice;

SCK (ceas serial) – impulsuri de ceas care sincronizează transmisia de date generate de master;

SS (Slave Select) – pinul de pe fiecare dispozitiv pe care masterul îl poate utiliza pentru a activa și dezactiva anumite dispozitive (o linie specifică pentru fiecare dispozitiv).

În următorul tabelul 4.6 avem prezentați pinii care corespund celor 4 linii pe care se efectuează comunicația SPI.

Tabel 4.6. Pinii interfeței SPI pentru Arduino UNO și MEGA

SENZORUL DHT11

Senzorul de temperatură DHT11 folosește un singur fir pentru transmisia datelor; se poate folosi orice pin digital – în cazul de față s-a folosit pinul digital 34.

Conectarea senzorului DHT11 la plăcuța de dezvoltare Arduino UNO se realizează după cum se observă în tabelul 4.7, respectiv figura 4.15 .

Tabel 4.7. Conectare pinilor senzorului DHT11 la pinii Arduino MEGA

Figura 4.15. Conectarea senzorului DHT11 la Arduino MEGA

Acest tip de senzor nu are inclus și un rezistor pull-up. Senzorul DHT11 trimite informații digitale; informația digitală este 0 sau 1 (high sau low). În cazul în care nimic nu este conectat la pin, pentru a defini aceste stări, 0 sau 1 avem nevoie de un rezistor pull-up. Rezistorul pull-up se leagă între pinul de Vcc și pinul de date. Această conexiune se poate observa în figura 4.16.

Figura 4.16. Conectarea rezitorului pull-up la DHT11

Avantaje și dezavantaje privind senzorul DHT11

Avantaje:

Senzorul este compatibil cu mai multe plăci de dezvoltare, de exemplu Arduino;

Oferă simplitate în utilizare;

Oferă acuratețe bună;

Are dimensiuni reduse (așa cum se poate observa în figura 4.17 );

Este convenabil, are un preț mic.

Figura 4.17. Dimensiunile senzorului DHT11

Dezavantaje:

Vaporii din materiale chimice pot interfera cu elemntele sensibile ale senzorului DHT11 și pot deteriora sensibilitatea lui. Un grad înalt de contaminare poate degrada permanent senzorul;

Expunerea îndelungată la razele solare puternice și la ultraviolete afectează performanța senzorului DHT11;

Umiditatea relativă depinde într-o mare măsura de temperatură. Deși se folosește tehnologia de compensare a temperaturii pentru a măsura cu precizie umiditatea relativă, se recomandă ca senzorii de temperatură și umiditate să se pastreze la aceeași temperatură. Senzorul trebuie montat cât mai departe posibil de părțile care degajă caldură;

Se recomandă o calitate înaltă a conexiunilor firelor pentru a nu afecta calitatea și distanța comunicării;

A se evita folosirea senzorului pe condiții de rouă;

Observație:

Senzorul se păstrează la o temperatură optimă între 10-40℃ și umiditate relativă mai mică de 60%.

Caracteristici tehnice DHT11

tensiunea de alimentare: minim 3V, maxim 5 V;

curent de alimentare: minim 0,5mA, maxim 2,5mA;

gama de măsurare a umidității 20% – 95% UR;

precizia măsurării umidității: 5%

gama de măsurare a temperaturii: 0℃-60℃

precizia măsurării temperaturii: ±2℃

perioada de eșantionare minim:1 secundă

SENZORUL BMP180

Senzorul de temperatură și presiune atmosferică se conectează la Arduino cu ajutorul a patru pini și transmite datele folosind comunicația serială I2C. Toate informațiile se transmit cu ajutorul magistralei I2C, mai exact cu ajutorul conexiunilor SDA (seria data line) și SCL (serial clock line) dar și conexiunea de masă. Conectarea senzorului la placa de dezvoltare Arduino se face după cum urmează în tabelul de mai jos ( a se vedea și figura 4.18 ).

Tabel 4.8. Modul de conectare al senzorului DHT11

Figura 4.18. Conectarea senzorului BMP180 la Arduino MEGA

Avantaje ale senzorului BMP180:

Precizie ridicată;

Liniaritate și stabilitate pe termen lung;

Calibrare completă;

Include măsurarea temperaturii și a altitudinii;

Dimensiuni mici.

Caracteristici tehnice:

Tesiune de alimentare: 1.8-3,6V;

Interfață I2C;

Curent: 5µA;

Măsoară presiuni între 300-1100hPa;

Precizie relativă ±0,12hPa(±1m)

Rezoluție de 0,03hPa/0,25m;

Figura 4.19. Dimensiunile senzorului BMP180

4.4. PROIECTAREA SCHEMEI ELECTRICE

Proiectarea schemei electrice a stației meteo utilizând Arduino Mega2560 este prevăzută cu senzorul de temperatură și umiditate, senzorul de presiune atmosferică, modulul RTC, buzzerul este prezentată în figura 4.20.

Pentru a putea conecta senzorul BMP180 la tensiunea optima de 3.3V am utilizat un regulator de tensiune L78L33, rolul acestuia fiind de a-mi coborî tensiunea de 5V generată de placa de dezvoltare Arduino la 3,3V, tensiunea de alimentare a senzorului.

Figura 4.20. Schema electrică în programul EasyEDA

ALOCAREA PINILOR PLĂCUȚEI DE DEZVOLTARE ARDUINO MEGA

Pinii plăcii de dezvoltare utilizați în realizarea stației meteo sunt prezentați în tabelul următor.

Tabel 4.9. Alocarea pinilor plăcuței din punct de vedere hardware

4.5. PROIECTAREA CABLAJULUI

Pentru realizarea cablajului s-a avut în vedere etapele specifice proiectării cablajului electronic prezentate mai jos.

ETAPELE PROIECTĂRII UNUI CABLAJ ELECTRONIC

Cunoașterea cerințelor de funcționare a sistemului electronic;

Stabilirea blocurilor funcționale ale schemei electronice;

Proiectarea și dezvoltarea blocurilor funcționale și realizarea machetelor de test pentru fiecare bloc în parte;

Punerea în funcțiune a întregului sistem;

Cunoașterea restricțiilor de proiectare a cablajului;

Crearea documentației de proiectare;

Realizare footprinturilor și a simbolurilor;

Editare schemă electronică;

Proiectare cablaj electronic;

Întocmirea documentației de fabricație (datasheet).

Pentru proiectarea unui cablaj electronic se va porni de la condiția existenței tuturor specificațiilor necesare proiectării. Dacă aceasta condiție nu este îndeplinită, se strâng datele necesare proiectării și a componentelor utilizate, iar dacă se îndeplinesc aceste cerințe se va începe proiectarea blocurilor funcționale ale schemei electronice, pe baza acestora construindu-se un prototip functional cu ajutorul unui mediu destinat proiectării cablajelor electronice. Se realizează directoare unde poate fi salvat fișierul după care se poate începe realizarea footprinturilor (amprente de cablaj).

Realizarea footprinturilor se face parcurgând o serie de etape:

Se identifică în documentația fiecărei componente în parte elementele necesare realizări unui footprint;

precizarea numărului total de pin ice vor fi utlizați în proiect;

precizarea numărului pinilor electrici și a celor neelectrici;

identificarea tipului de pini utilizați în realizarea amprentei de cablaj;

Pentru fiecare pin creat se adaugă un nume padului;

Fiecare pad va fi modelat conform foilor de catalog;

Sincronizarea pinilor cu simbolul componentei;

Realizarea footprintului este considerată finalizată în momentul în care coordonata de referință (x,y) este in conformitate cu foaia de catalog.

După realizarea footprinturilor se vor construi simbolurile specifice fiecărei componente în parte din cadrul proiectului, se va realiza schema electronica, iar după ce s-au realizat toate aceste etape menționate mai sus se va începe realizarea cablajului electronic.

4.6. REALIZAREA PRACTICĂ

Realizarea practică a cablajului a fost proiectată cu ajutorul unei mașini CNC (computering numeric control – echipament complex dotat cu sisteme de comandă și control numeric al deplasărilor) și a programului software Mach3, un program destul de complex utilizat la nivel mondial. În figurile de mai jos avem:

interfața programului software cu care s-a proiectat realizarea cablajului;

procesul de găurire al cablajului;

realizarea traseelor;

amprenta de cablaj;

cablaj final cu senzorii specifici stației meteo (vedere spate și față);

conectarea cablajului final senzorii stației meteo la Arduino;

Stația meteo cu Arduino.

Figura 4.21 . Interfața programului Mach3

Figura 4.22. Procesul de găurire al cablajului

Figura 4.23. Realizarea traseelor

Figura 4.24. Amprentă cablaj

Figura 4.25. Cablaj final cu senzorii specifici stației meteo (vedere spate și față)

Figura 4.26. Conectarea cablajului final senzorii stației meteo la Arduino

Figura 4.27. Stație meteo cu Arduino

CAPITOLUL 5. PROIECTAREA SOFTWARE

5.1. MEDIUL DE PROGRAMARE ARDUINO

Arduino IDE este program software în care se scrie codul ce urmează a fi încărcat pe placa de dezvoltare.

Figura 5.1 . Interfața mediului de dezvoltare Arduino IDE

Orice program scris în Arduino cuprinde două mari secțiuni, și anume:

Secțiunea de setup ( void setup () ) în care programul rulează o singura dată atunci cand placa este alimentată sau când este apăsat butonul de ”RESET”. Funcția se utilizează pentru a inițializa variabilele, pinii, etc.

Secțiunea de loop ( void loop() ), aici programul rulează la infinit.

5.2. ORGANIGRAMA GENERALĂ A PROGRAMULUI PRINCIPAL

Organigrama programului principal respecta structura clasică a unui program realizat cu Arduino, adică programul prezintă secțiunea de setup unde se inițializează codul și care se execută o singură data și secțiunea loop unde programul principal este executat într-o buclă infinită.

void setup(void) {

// Inițializez senzorii și ecranul

pinMode(buzzer, OUTPUT);

digitalWrite(buzzer, HIGH);

dht.begin();

presiune.begin();

Serial.begin(115200);

tft.reset();

tft.begin(0x9325);

tft.setRotation(1);

tft.fillScreen(BLACK); //fundalul ecranului este negru

tft.setCursor(25, 15); //coordonatele textului "NASTASE MARIA MIRABELA"

tft.drawRoundRect(15, 10, 290, 40, 5, RED); //desenez chenar

tft.setTextColor(BLUE); //de culoare albastră

tft.setTextSize(2); //mărimea textului

tft.println("NASTASE MARIA MIRABELA");

tft.setCursor(50, 35); //coordonatele textului "UPIT_EA 2014-2018"

tft.println("UPIT_EA 2014-2018");

//meniul static

tft.setTextColor(YELLOW); tft.setTextSize(2);

tft.setCursor(15,60);     tft.print("Data: ");

tft.setCursor(180,60);    tft.print("Timp: ");

tft.setTextColor(BLUE);

tft.setCursor(15,100);

tft.print("T1: ");

tft.setCursor(180,100);

tft.print("UR: ");

tft.setTextColor(WHITE);

tft.setCursor(15,140);    tft.print("T2: ");

tft.setCursor(15,165);    tft.print("PRESIUNE ABS: ");

tft.setCursor(15,190);    tft.print("PRESIUNE REL: ");

tft.setCursor(15,215);    tft.print("ALTITUDINE: ");

//creeaz două chenare albastre pe tot ecranul

tft.drawRoundRect(2, 2, 318, 237, 5, BLUE);

tft.drawRoundRect(5, 5, 312, 231, 5, BLUE);

}//void setup

void loop()

{

data_timp();

umid_temp();

pres_temp_alt();

delay(3000);

} //void loop

În cadrul acestui proiect, stația meteo este implementată cu ajutorul unui microcontroller Arduino Mega. Acesta are rolul de a implementa software componentele caracteristice stației meteo prezentate în capitolele anterioare și anume: modulul RTC, senzorul DHT11, senzorul BMP180, buzzerul, LCD-ul pentru care am creat funcțiile corespunzătoare fiecărui parametru ce se dorește a fi măsurat și afișat pe ecranul LCD. Aceste funcții sunt:

Funcția data_timp() pentru afișarea dății și a timpului. Secvența de cod este:

void data_timp(){

tmElements_t tm; //creez elementele timpului

if (RTC.read(tm)) {

//data

tft.setCursor(75,60); //setez coordonatele unde va fi afișată data

tft.fillRoundRect(72, 55, 101, 25, 5, BLUE); //chenar albastru

tft.print(tm.Day); //afișez pe ecran ziua

tft.print('/'); //afișez pe ecran caracterul /

tft.print(tm.Month); //afișez pe ecran luna

tft.print('/');

tft.print(tmYearToCalendar(tm.Year)); //afișez pe ecran anul

//timpul

tft.setCursor(240,60); // setez coordonatele unde va fi afișat ceasul

tft.fillRoundRect(235, 56, 66, 25, 5, BLUE); //chenar albastru

tft.print(tm.Hour); //afișez pe ecran ora

tft.print(":");

tft.print(tm.Minute);//afișez pe ecran minutele

//in momentul in care dorim sa afisam numere pe o cifra trebuie sa adaugam un zero fortat inaintea acestora

if (tm.Minute <= 9) {

tft.print("0");

tft.print(tm.Minute);

}

else

tft.print(tm.Minute); //afișez pe ecran minutele

//afișez datele în consolă

//data

Serial.println();

Serial.print("Dată: ");

Serial.print(tm.Day);

Serial.write('/');

Serial.print(tm.Month);

Serial.write('/');

Serial.print(tmYearToCalendar(tm.Year));

//timp

Serial.print("  Timp: ");

print2digits(tm.Hour);

Serial.write(':');

print2digits(tm.Minute);

Serial.write(':');

print2digits(tm.Second);

Serial.println();

} //if

else {

if (RTC.chipPresent()) {

Serial.println("DS1307 s-a oprit. Se va rula Set Time");

Serial.println();

} //if

else {

Serial.println("DS1307 citește eroare! Se va verifica circuitul.");

Serial.println();

} //else

} //else

} //void data_timp

Funcția temp_umid() pentru măsurarea temperaturii și a umidității. Secvența de cod este:

void umid_temp(){

//se citește umiditatea în %

float h = dht.readHumidity();

// se citește temperatura în grade Celsius

float t = dht.readTemperature();

// se citește temperatura în Fahrenheit(isFahrenheit = true)

float f = dht.readTemperature(true);

//se verifică dacă au fost citite greșeli și dacă nu s-a putut citi date de la senzor, se încearcă din nou

if (isnan(h) || isnan(t) || isnan(f)) {

Serial.println("Nu s-a putut citi date de la DHT11");

return;

} //if

//temperatura

tft.setTextColor(BLUE); //setez culoarea valorii afișate

tft.fillRoundRect(55, 93, 98, 25, 5, YELLOW); //chenar galben

tft.setCursor(64, 100); // setez coordonatele unde va fi afișată temperatura

//afișez valoarea pe ecran în grade Celsius

tft.print(t);

tft.print(" C ");

//umiditatea

tft.fillRoundRect(215, 93, 80, 25, 5, YELLOW); //al doilea chenar galben

tft.setCursor(220,100); // setez coordonatele unde va fi afișată umiditatea

tft.setTextColor(BLUE); //setez culoarea textului

// afișez umiditatea în procente

tft.print(h);

tft.print("%");

//afișare în consolă

//temperatura

Serial.println();

Serial.println("DHT11");

Serial.print("TEMPERATURA: ");

Serial.print(t);

Serial.print(" ℃  ");

//umiditatea

Serial.print(f);

Serial.print(" F\t");

Serial.print("  UMIDITATE: ");

Serial.print(h);

Serial.print(" %\t");

Serial.println();

} //void afisareumidtemp

Funcția pres_temp_alt() pentru măsurarea presiunii aerului, temperaturii și a altitudinii. Secvența de cod este:

void pres_temp_alt(){

char status;

double T,P,p0,a;

// se activează citirea presiunii la fiecare 10 secunde

//=================================================

// mai întâi se efectuează o măsurare a temperaturii pentru a putea efectua citirea presiunii

// se începe măsurarea temperaturii

status = presiune.startTemperature();

if (status != 0)

{

// se așteaptă finalizarea măsurării

delay(status);

// se preia măsurarea temperaturii finalizate

// măsurarea este stocată în variabila T.

// funcția returnează 1 dacă este cu succes și 0 dacă eșuează

status = presiune.getTemperature(T);

if (status != 0)

{

tft.setCursor(64,140); //setez coordonatele unde va fi afișată valoare temperaturii

tft.fillRoundRect(55, 133, 98, 25, 5, RED); //primul chenar roșu

tft.setTextColor(WHITE);//setez culoarea textului

//afișez temperatura în grade Celsius

tft.print(T,2);

tft.print(" C  ");

//afișare în consolă

Serial.println();

Serial.println("BMP180");

// afișare măsurare temperatură în grade Celsius și conversia in Farenheit

Serial.print("Temperatură: ");

Serial.print(T,2);

Serial.print(" ℃ , ");

Serial.print((9.0/5.0)*T+32.0,2);

Serial.println(" F");

//=================================================

// se începe măsurarea presiunii

//presiunea absolută

status = presiune.startPressure(3);

if (status != 0)

{

// se așteaptă ca măsurătoare să se finalizeze:

delay(status);

// măsurătorile sunt stocate în variabila P

// se reține ca funcția necesită temperatura măsurată anterior(T).

// funcția returnează 1 daca este cu succes și 0 în caz contrar..

status = presiune.getPressure(P,T);

if (status != 0)

{

tft.setCursor(182,165);

tft.fillRoundRect(175, 159, 130, 25, 5, RED);

tft.setTextColor(WHITE);

//afișare pe ecran a presiunii absolute în mmHg

tft.print(P*0.750062,2);

tft.print("mmHg");

//afișare în consolă a măsurării presiunii absolute în mb și conversia acesteia în mmHG

Serial.print("Presiunea absolută: ");

Serial.print(P,2);

Serial.print(" mb, ");

Serial.print(P*0.750062,2);

Serial.print(" mmHg");

Serial.println();

//presiunea relativă

p0 = presiune.sealevel(P,ALTITUDINE); //ne situăm la 289 metri altitudine

tft.setCursor(180,190);

tft.fillRoundRect(175, 184, 130, 25, 5, RED);

tft.setTextColor(WHITE);

//afișare pe ecran a presiunii relative

tft.print(p0*0.750062,2);

tft.print("mmHg");

//afișare în consolă a presiunii relative în mb, respective mmHG

Serial.print("Presiune Relativă: ");

Serial.print(p0,2);

Serial.print(" mb, ");

Serial.print(p0*0.750062,2);

Serial.print(" mmHg");

Serial.println();

//=================================================

//altitudinea

// dacă se dorește să se determine altitudinea din măsurarea presiunii, se utilizează funcția de altitudine împreună cu o presiune de bază/

// Parametri: P = presiunea absolută în mb, p0 = presiunea de bază (realtivă)în mb.

// Rezultat: a = altitudine în m.

a = presiune.altitude(P,p0);

tft.setCursor(180,215);

tft.fillRoundRect(175, 209, 130, 25, 5, RED);

tft.setTextColor(WHITE);

tft.print(a,0);

tft.print(" metri");

//afișare în consolă a altitudinii în metri

Serial.print("Altitudine: ");

Serial.print(a,0);

Serial.println(" metri ");

} //if

} //if

} //if

} //if

} //void pres_temp_alt

Pentru generarea sunetului de alarmă în momentul depășirii valorilor impuse am utilizat secvența de cod:

//pentru senzorul DHT

if(t>35)

digitalWrite(buzzer,LOW);

else digitalWrite(buzzer, HIGH);

//pentru senzorul BMP

if(T>35)

digitalWrite(buzzer,LOW);

else digitalWrite(buzzer, HIGH);

La senzorul BMp180, înainte de a citi presiunea, se citește o temperatură. Acest lucru se face cu startTemperature() și getTemperature(). Rezultatul este în grade C. Odată ce s-a citit o temperatură, se poate citi o presiune. Acest lucru se face cu startPressure() și getPressure(). Rezultatul este în millibari (mb).

Pentru citirea altitudini, mai întâi trebuie să oferim altitudinea cunoscută la care s-a măsurat presiunea.Pentru aceasta se utilizează funcția sealevel(). Dacă se dorește măsurarea altitudinii, va trebui să se cunoască presiunea la o altitudine de referință. Acest lucru se face cu funcția de altitudine ().

Acest program nu putea rula fără bibliotecile necesare componentelor din cadrul proiectului. Aceste librării sunt declarate la începutul programului așa cum se observă mai jos. Tot la început, imediat după includerea librăriilor se specifica și variabilele globale ce vor fi recunoscute de întreg programul.

//librăria specific ecranului LCD

#include <SPFD5408_Adafruit_TFTLCD.h>

//librăria senzorului de temperatură și umiditate

#include <DHT.h>

//librăriile ceasului RTC DS1307

#include <TimeLib.h>

#include <DS1307RTC.h>

//librăria senzorului de presiune, temperatură și altitudine

#include <SFE_BMP180.h>

//librăria specifică comunicației seriale I2C

#include <Wire.h>

#define DHTPIN 37 //deffinirea pinului utilizat de DHT

//definirea tipului de senzor utilizat, în cazul de față DHT11

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHT11);

#define buzzer 29 //definirea pinului utilizat de buzzer

// creez un obiect SFE_BMP180 numit presiune

SFE_BMP180 presiune;

#define ALTITUDINE 289.0 // Altitudinea în metrii la nivelul orașului Pitești

#define LCD_CS A3

#define LCD_RS A2

#define LCD_WR A1

#define LCD_RD A0

#define LCD_RESET A4

//definim culorile ce le vom folosi în program

#define  BLACK    0x0000

#define BLUE      0x001F

#define RED       0xF800

#define GREEN     0x07E0

#define CYAN      0x07FF

#define MAGENTA   0xF81F

#define YELLOW    0xFFE0

#define WHITE     0xFFFF

#define NAVY      0x000F

#define DARKGREEN 0x03E0

#define DARKCYAN  0x03EF

#define MAROON    0x7800

#define PURPLE    0x780F

#define OLIVE     0x7BE0

#define LIGHTGREY 0xC618

#define DARKGREY  0x7BEF

#define ORANGE    0xFD20

#define GREENYELLOW 0xAFE5

#define PINK      0xF81F

Adafruit_TFTLCD tft(LCD_CS, LCD_RS, LCD_WR, LCD_RD, LCD_RESET);

Orgranigrama programului principal de lucru este prezentată în figura 5.2.

Figura 5.2. Organigrama de lucru a programului principal

Alocarea pinilor plăcuței de dezvoltare Arduino MEGA.

Tabel 5.1. Alocarea pinilor plăcuței din punct de vedere software

CAPITOLUL 6. TESTARE

În acest capitol voi prezenta programarea și testarea fiecărei componente în parte în anumite situații.

Testarea senzorului DHT11

Atunci când microcontrolerul trimite un semnal de start, senzorul trece în modul de funcționare. După ce a așteptat ca microcontrolerul să completeze semnal de pornire, senzorul trimite date acestuia, date ce includ informații despre umiditate și temperatura.

În figura 6.1 avem conectarea senzorului la placă iar în figura 6.2 se observă că inițializarea senzorului DHT11 a fost cu succes (s-au transmis date către microcontroler, acesta prelucrându-le în valorile finale dorite) iar alăturat remarcăm faptul ca senzorul nu s-a putut citi date de la senzor. Pentru acest lucru se verifică dacă conectarea senzorului a fost făcută corespunzător sau dacă în codul sursă pentru testarea senzorului există erori de sintaxă.

Figura 6.1. Conectarea DHT11 la Arduino Mega

Secvența programului corespunzătoare testării senzorului DHT11

void loop()

{

afisareumidtemp();

delay(2000);

}

//funcția de citire și afișare umiditate și temperatură

void afisareumidtemp(){

float h = dht.readHumidity();

float t = dht.readTemperature();

float f = dht.readTemperature(true);

if (isnan(h) || isnan(t) || isnan(f)) {

Serial.println("Nu s-a putut citi date de la DHT11");

return;

}

Serial.print("TEMPERATURĂ: ");

Serial.print(t);

Serial.print(" *C ");

Serial.print(f);

Serial.print(" *F\t");

Serial.print("  UMIDITATE: ");

Serial.print(h);

Serial.print(" %\t");

Serial.println();

} //void afisareumidtemp

Figura 6.2. Testarea senzorului DHT11

Figura 6.3 . Senzorul DHT11 supus unei surse de căldură

În figura 6.3 se observă că, atunci când senzorul este supus unei surse de caldură, temperatura și umiditatea crește treptat (umiditatea crește în funcție de sursa de caldură generată), după care acești parametrii scad până se revine la temperatura și umiditatea mediului ambiant.

Testarea senzorului BMP180

BMP180 măsoară presiunea absolută și relativă, temperatura, dar și altitudinea la nivelul mării. Presiunea absolută este presiunea atmosferică reală văzută de dispozitiv, care variază atât în funcție de altitudine, cât și de vreme.

Înainte de a citi presiunea, se citește o temperatură. Acest lucru se face cu startTemperature () și getTemperature (). Odată ce s-a citit o temperatură, se poate citi o presiune (se face cu startPressure () și getPressure () ).

Pentru citirea altitudini, mai întâi trebuie să oferim altitudinea cunoscută la care s-a măsurat presiunea. Pentru aceasta se utilizează funcția sealevel (). Dacă se dorește măsurarea altitudinii, va trebui să se cunoască presiunea la o altitudine de referință. Acest lucru se face cu funcția de altitudine(). Biblioteca (librăria) SFE_BMP180 utilizează ecuațiile cu puncte variabile dezvoltate de proiectul Weather Station Data Logger. Conectarea senzorului BMP180 la Arduino Mega se face ca în figura 6.4.

Figura 6.4. Conectare BMP180 la placa de dezvoltare.

Secvența programului de testare pentru afișarea presiunii, temperaturii și a altitudinii.

void PTA()

{

char status;

double T,P,p0,a;

Serial.println();

Serial.print("ALTITUDINE CUNOSCUTĂ ");

Serial.print(ALTITUDINE,0);

Serial.print(" metri ");

status = presiune.startTemperature();

if (status != 0) {

delay(status);

status = presiune.getTemperature(T);

if (status != 0){

Serial.print("TEMPERATURĂ:");

Serial.print(T,2);

Serial.print(" ℃ , ");

Serial.print((9.0/5.0)*T+32.0,2);

Serial.println(" F");

status = presiune.startPressure(3);

if (status != 0){

delay(status);

status = presiune.getPressure(P,T);

if (status != 0){

//afișare presiune absolută

Serial.print("PRESIUNEA ABSOLUTĂ: ");

Serial.print(P,2);

Serial.print(" mb, ");

Serial.print(P*0.750062,2);

Serial.println(" mmHg");

p0 = presiune.sealevel(P,ALTITUDINE);

//afișare presiune absolută

Serial.print("PRESIUNEA RELATIVĂ ( la nivelul mării): ");

Serial.print(p0,2);

Serial.print(" mb, ");

Serial.print(p0*0.750062,2);

Serial.println(" mmHg");

a = presiune.altitude(P,p0);

// afișare altitudine

Serial.print("ALTITUDINE CALCULATĂ: ");

Serial.print(a,0);

Serial.println(" metri ");}//if

else Serial.println("eroare restabilire măsurare presiune\n");

}//if

else Serial.println("eroare începere măsurare presiune\n");

}//if

else Serial.println("eroare restabilire măsurare temperatură\n");

}//if

else Serial.println("eroare începere măsurare temperatură\n");

delay(5000);

}//void PTA

Dacă senzorul este conectat corespunzător figurii 6.4, consola ne va afișa parametrii din figura 6.5. (cu excepția timpului și a dății, unde s-a folosit o altă funcție pentru afișarea acestora și anume, funcția void afisaredatatimp() ) iar dacă avem probleme de conexiune sau erori de sintaxă, nu se vor putea citi datele de la senzor și trebuie să se verifice circuitul sau să se remedieze erorile apărute în program.

Figura 6.5. Testare BMP180

Testarea modului RTC DS1307

Figura 6.6. Conectare DS1307

Pentru testarea modului RTC s-a folosit secvența de cod de mai jos, funcția implementată pentru citirea și afisarea datelor fiind void afisaredatatimp().

void afisaredatatimp(void)

{

tmElements_t tm;

if (RTC.read(tm)) {

Serial.print("Dată: ");

Serial.print(tm.Day);

Serial.write('/');

Serial.print(tm.Month);

Serial.write('/');

Serial.print(tmYearToCalendar(tm.Year));

Serial.print("    Timp: ");

print2digits(tm.Hour);

Serial.write(':');

print2digits(tm.Minute);

Serial.write(':');

print2digits(tm.Second);

Serial.println();} //if

else {

Serial.println("DS1307 citește eroare! Se va verifica circuitul.");

Serial.println();} //else

} //void afisaredatatimp

Figura 6.7. Afișarea timpului și a dății în timp real

Testare modulul buzzer

Figura 6.8. Conectarea buzzerului

Buzzerul a fost utilizat pentru a genera sunet de alarmă în momentul depășirii valorii impuse de mine și anume: la tempertura măsurată de senzorul DHT și cea măsurată de BMP am stabilit o valoare limită de 35℃. Dacă se depășește această valoare, buzzerul va genera semnal de alarmă (conectarea buzzerului este prezentată în figura 6.7). Secvența de cod a acestuia este prezentată în capitolul anterior.

Testarea întregului sistem

Rezultatele obținute în urma măsurării temperaturii ambientale de către cei doi senzori, DHT11 și BMP180, indică faptul că temperatura afișată pe display este mult mai precisă în cazul senzorului BMP180 față de senzorul DHT11. Precizia măsurării temperaturii afiată de senzorul a fost comparată cu o altă sursă digitală de afișare a temperaturii ambientale și poată fi observată în figuraz() de mai jos de unde putem observa similitudinea valorilor obținute în cele două cazuri.

Pentru ca datele să fie transmise cât mai rapid pe linia serială, am mărit viteza de transfer de la 9600 la 115200 biți pe secundă.

Figura 6.9 . Stație meteo cu Arduino

Figura 6.10. Afișarea parametrilor stației meteo în consolă

Figura 6.11. Realizare practică (placă de test)

Figura 6.12. Stație digitală de afișare a temperaturii vs. stație meteo Arduino

Figura 6.13. Afișarea parametrilor stație meteo din mediul extern

În figurile 6.13 și 6.14 avem prezentate statisticile meteo din data de 08.07.2018 de pe doua site-uri web de specialitate, și anume: https://www.accuweather.com/en/ro/pitesti/271848/current-weather/271848 și http://www.meteoromania.ro/anm2/ .

Figura 6.14. Date privind starea vremii furnizate furnizate de AccuWeather

Figura 6.15. Date privind starea vremii furnizate de ANM

Presiunea afișată pe cele doua site-uri este presiunea relativă a aerului dar afișată în milibari. Pentru a face conversia din milibari în mmHG am folosit formula:

p0[mmHg]=p0*0.750062 (7.1)

CAPITOLUL 7. CONCLUZII

Chiar dacă o stație meteo poate fi mult mai complexă și este capabilă să ofere mult mai multe date decât temperatura, umiditatea, presiunea atmosferică și altitudinea, am considerat că și aceste date sunt utile pentru a afla într-un timp căt mai scurt care este temperatura din mediul ambiant.

La început mi-am propus să măsor temperatură, umiditatea și presiunea atmosferică (presiunea absolută). Acest lucru a fost posibil datorită senzorului de temperatură și umiditate DHT11 și a senzorului BMP180 care măsoară presiunea atmosferică, atât presiunea absolută cât și presiunea relativă . Pe parcurs am adaugat un modul RTC pentru afișarea timpului și a dății dar și un buzzer care generază sunet de alarmă în momentul depășirii unei valorii limite prestabilite.

Așa cum am mai precizat și în capitolele anterioare, senzorul DHT11 are un interval de măsurare al temperaturii cuprins între 0 și 50 ℃, cu o precizie de ±2℃ și un interval de măsurare al umidității cuprins între 20 % și 90%UR (umiditate relativă) cu o precizie de ±5%UR. Totuși, chiar dacă nu are o precizie uimitoare, acest senzor este util și acceptabil în aplicațiile destinate activităților didactice cât și a celor casnice. Este foarte util în monitorizarea temperaturii locuinței dar și a temperaturii exterioare, însă trebuie respectate cerințele de funcționare, este ideal pentru a face statistici între anotimpuri: pentru a observa cum crește sau scade temperatura în funcție de sezon.. Senzorul DHT11 nu se poate folosi în cazul în care dorim să măsurăm temperaturi negative.

Făcând comparația între termometrul de camera și temperatura măsurata cu ajutorul senzorului DHT11, pot spune ca senzorul are o acuratețe de -0.4℃. Totuși, este un senzor care conectat la microcontroler oferă un răspuns rapid.

Din punct de vedere al fiabilității, senzorul DHT11 este compatibil cu multe plăci de dezvoltare Arduino, oferă o simplitate în utilizare, o acuratețe bună, are dimensiuni mici, toate aceste caracteristici fiind înglobate într-un preț redus.

Totuși, acest senzor prezintă și unele dezavantaje, cum ar fi expunerea directă și îndelungată la raze solare puternice sau faptul că senzorul nu trebuie montat aproape de componentele care degajă caldură. Aceste dezavantaje conduc la scăderea performanței senzorului.

Despre senzorul BMP180 se știe că este un senzor cu o precizie ridicată, acest lucru rezultând și din măsurători. El este capabil să măsoare, pe lânga presiune, temperatura și altitudinea. Pentru a se putea efectua citirea presiunii, mai întai se efectuează măsurarea temperaturii, după care abia după finalizarea măsurării temperaturii se poate începe măsurarea presiunii.

În data de 1.07.2018, din măsurători s-a obținut o presiune relativă a aerului de aproximativ 730 mmHg (figura , din capitolul anterior), comparativ cu documentația oficială găsită pe site-uri web de specialitate unde presiunea relativă este de 727 mmHg.

Din punct de vedere al fiabilității, acest senzor oferă o calibrare completă, stabilitate pe termen lung, dimensiuni mici și un preț accesibil tuturor. Trebuie avut în vedere că pentru buna funcționare a acestuia, condițiile de funcționare și nu trebuie niciodată conectat la mai mult de 3.6V(maxim), astfel evitându-se distrugerea senzorului.

Acest proiect se poate dezvolta într-unul mult mai complex. Se poate realiza o stație meteo care, pe lângă măsurarea temperaturii, umidității, presiunii, atmosferice și altitudinii să măsoare și direcția vântului, viteza vântului și cantitatea se precipitații. Acest lucru se poate realiza cu ajutorul unui kit de senzori prezentat în figura 7.1 și este compus din:

Anemometru capabil să măsoare viteza văntului;

Giruetă: determină direcția vântului;

Pluviometru: determină cantitatea de apă căzută într-un interval de timp.

Figura 7.1. Kit senzori stație meteo

Stația meteo poate include un senzor care să indice nivelul radiațiilor UV și luminozitatea solară.

BIBLIOGRAFIE

Cărți:

[1] Monica-Anca Chiță, Senzori și actuatoare, Matrix ROM, București, 2017.

[2] Alexandru Rebega, Bogdan-Florin Florea, Introducere în Arduino, București, 2016.

[3] Radu Pietraru, Alexandru Velicu, Elemente practice de bază în dezvoltarea sistemelor cu microprocesoare integrate, Techno Media, Sibiu, 2014.

[4] Mazăre Alin-Gheorghiță, Ionescu Laurențiu-Mihai, Îndrumar lucrări practice-Tehnici CAD utilizând CADENCE, Univ. din Pitești, Pitești, 2015.

Pagini web

[5]https://wiki.eprolabs.com/index.php?title=Humidity_Sensor_DHT11

[6]http://www.meo.etc.upt.ro/materii/laboratoare/IV/Document1.pdf

[7]https://www.optimusdigital.ro/ro/senzori-senzori-de-temperatura/584-senzor-de-temperatura-dht11.html?search_query=dht11&results=7

[8]https://www.optimusdigital.ro/ro/senzori-senzori-de-presiune/149-modul-senzor-de-temperatura-si-presiunbmp180.html?search_query=bmp180&results=6

[9]https://www.optimusdigital.ro/ro/audio-buzzere/10-modul-cu-buzzer-activ.html?search_query=buzzer&results=33

[10]https://www.optimusdigital.ro/ro/altele/148-modul-ceas-in-timp-real-ds1307.html?search_query=rtc&results=46

[11]https://www.optimusdigital.ro/ro/shield-uri-pentru-arduino/2025-shield-pentru-arduino-lcd-rosu-de-24-cu-touchscreen.html?search_query=spfd&results=2

[12]https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf

[13]https://www.mouser.com/ds/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf

[14]https://datasheets.maximintegrated.com/en/ds/DS1307.pdf

[15]https://github.com/adafruit/DHT-sensor-library

[16]http://www.instructables.com/id/How-to-use-24-inch-TFT-LCD-SPFD5408-with-Arduino-U/

[17]https://github.com/JoaoLopesF/SPFD5408

[18]https://www.arduino.cc/

[19]https://ro.wikipedia.org/wiki/Prognoz%C4%83_meteorologic%C4%83

[20]https://github.com/adafruit/Adafruit-BMP085-Library

[21]https://github.com/esp8266/Arduino/blob/master/libraries/Wire/Wire.h

[22]https://www.arduino.cc/en/Main/arduinoBoardMega/

[23]https://www.robofun.ro/arduino_mega2560

[24]http://www.mantech.co.za/datasheets/products/A000047.pdf

[25]https://easyeda.com/editor#id=817e5fbef04e4725bb8c6f2c6f4d4b25|6539c4ec9e14037a2ee8c095c02632a

[26]https://en.wikipedia.org/wiki/CNC_router

[27]http://www.rasfoiesc.com/educatie/informatica/Mach-CNC-Controller-Softwareul89.php

[28]https://en.wikipedia.org/wiki/Numerical_control

[29]http://iota.ee.tuiasi.ro/~czet/Curs/Teledata/Cap4_Interfete_seriale.pdf

[30]http://www.meo.etc.upt.ro/materii/cursuri/ISMT/5.pdf

[31]https://ro.wikipedia.org/wiki/I%C2%B2C

[32]https://ro.wikipedia.org/wiki/Arduino

ANEXE

CODUL SURSĂ

În următoarele rânduri este listat întreg programul utilizat în realizarea proiectului, cod elaborat în mediul de programare Arduino IDE. Pentru o înțelegere mai ușoară a acestuia și pentru a facilita ulterioarele modificări asupra programului, acesta are alăturate și comentarii.

#include <SPFD5408_Adafruit_TFTLCD.h>

#include <DHT.h>

#include <TimeLib.h>

#include <DS1307RTC.h>

#include <SFE_BMP180.h>

#include <Wire.h>

#define DHTPIN 37

//se folosește senzorul DHT11

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHT11);

#define buzzer 29

// creez un obiect SFE_BMP180 numit presiune

SFE_BMP180 presiune;

#define ALTITUDINE 289.0 // Altitudinea în metrii la nivelul orașului Pitești

#define LCD_CS A3

#define LCD_RS A2

#define LCD_WR A1

#define LCD_RD A0

#define LCD_RESET A4

#define  BLACK    0x0000

#define BLUE      0x001F

#define RED       0xF800

#define GREEN     0x07E0

#define CYAN      0x07FF

#define MAGENTA   0xF81F

#define YELLOW    0xFFE0

#define WHITE     0xFFFF

#define NAVY      0x000F

#define DARKGREEN 0x03E0

#define DARKCYAN  0x03EF

#define MAROON    0x7800

#define PURPLE    0x780F

#define OLIVE     0x7BE0

#define LIGHTGREY 0xC618

#define DARKGREY  0x7BEF

#define ORANGE    0xFD20

#define GREENYELLOW 0xAFE5

#define PINK      0xF81F

Adafruit_TFTLCD tft(LCD_CS, LCD_RS, LCD_WR, LCD_RD, LCD_RESET);

//–-Setup

void setup(void) {

// Inițializez senzorii

pinMode(buzzer, OUTPUT);

digitalWrite(buzzer, HIGH);

dht.begin();

presiune.begin();

Serial.begin(115200);

tft.reset();

tft.begin(0x9325);

tft.setRotation(1);

tft.fillScreen(BLACK);

tft.setCursor(25, 15);

tft.drawRoundRect(15, 10, 290, 40, 5, RED);

tft.setTextColor(BLUE);

tft.setTextSize(2);

tft.println("NASTASE MARIA MIRABELA");

tft.setCursor(50, 35);

tft.println("UPIT_EA 2014-2018");

tft.setTextColor(YELLOW); tft.setTextSize(2);

tft.setCursor(15,60);     tft.print("Data: ");

tft.setCursor(190,60);    tft.print("Timp: ");

tft.setTextColor(BLUE);

tft.setCursor(15,100);    tft.print("T1: ");

tft.setCursor(190,100);   tft.print("UR: ");

tft.setTextColor(WHITE);

tft.setCursor(15,140);    tft.print("T2: ");

tft.setCursor(15,165);    tft.print("PRESIUNE ABS: ");

tft.setCursor(15,190);    tft.print("PRESIUNE REL: ");

tft.setCursor(15,215);    tft.print("ALTITUDINE: ");

//creeaz două chenare albastre

tft.drawRoundRect(2, 2, 318, 237, 5, BLUE);

tft.drawRoundRect(5, 5, 312, 231, 5, BLUE);

}//void setup

//–-loop

void loop()

{

data_timp();

umid_temp();

pres_temp_alt();

delay(3000);

} //void loop

//=================

void data_timp(){

tmElements_t tm; //creez elementele timpului

if (RTC.read(tm)) {

//data

tft.setCursor(73,60); //setez coordonatele unde va fi afișată data

tft.fillRoundRect(72, 55, 110, 25, 5, BLUE); //chenar albastru

tft.print(tm.Day); //afișez pe ecran ziua

tft.print('/'); //afișez pe ecran caracterul /

tft.print(tm.Month); //afișez pe ecran luna

tft.print('/');

tft.print(tmYearToCalendar(tm.Year)); //afișez pe ecran anul

//timpul

tft.setCursor(247,60); // setez coordonatele unde va fi afișat ceasul

tft.fillRoundRect(245, 56, 66, 25, 5, BLUE); //chenar albastru

tft.print(tm.Hour); //afișez pe ecran ora

tft.print(":"); tft.print(tm.Minute); //afișez pe ecran minutele

//afișez datele în consolă

//data

Serial.println();

Serial.print("Dată: ");

Serial.print(tm.Day);

Serial.write('/');

Serial.print(tm.Month);

Serial.write('/');

Serial.print(tmYearToCalendar(tm.Year));

//timp

Serial.print("  Timp: ");

print2digits(tm.Hour);

Serial.write(':');

print2digits(tm.Minute);

Serial.write(':');

print2digits(tm.Second);

Serial.println();

//in momentul in care dorim sa afisam numere pe o cifra trebuie sa adaugam un zero fortat inaintea acestora

if (tm.Minute <= 9) {

tft.print("0");

tft.print(tm.Minute);

}

else

tft.print(tm.Minute); //afișez pe ecran minutele

} //if

else {

if (RTC.chipPresent()) {

Serial.println("DS1307 s-a oprit. Se va rula Set Time");

Serial.println();

} //if

else {

Serial.println("DS1307 citește eroare! Se va verifica circuitul.");

Serial.println();

} //else

} //else

} //void data_timp

void print2digits(int number) {

if (number >=0 && number < 10) {

Serial.write('0');

} //if

Serial.print(number);

} //void print2digits

void umid_temp(){

//se citește umiditatea în %

float h = dht.readHumidity();

// se citește temperatura în grade Celsius

float t = dht.readTemperature();

// se citește temperatura în Fahrenheit(isFahrenheit = true)

float f = dht.readTemperature(true);

//se verifică dacă au fost citite greșeli și dacă nu s-a putut citi date de la senzor, se încearcă din nou

if (isnan(h) || isnan(t) || isnan(f)) {

Serial.println("Nu s-a putut citi date de la DHT11");

return;

} //if

//temperatura

tft.setTextColor(BLUE); //setez culoarea valorii afișate

tft.fillRoundRect(55, 93, 98, 25, 5, YELLOW); //chenar galben

tft.setCursor(64, 100); // setez coordonatele unde va fi afișată temperatura

//afișez valoarea pe ecran în grade Celsius

tft.print(t);

tft.print(" C ");

//umiditatea

tft.fillRoundRect(231, 93, 80, 25, 5, YELLOW); //al doilea chenar galben

tft.setCursor(236,100); // setez coordonatele unde va fi afișată umiditatea

tft.setTextColor(BLUE); //setez culoarea textului

// afișez umiditatea în procente

tft.print(h);

tft.print("%");

//afișare în consolă

//temperatura

Serial.println();

Serial.println("DHT11");

Serial.print("TEMPERATURA: ");

Serial.print(t);

Serial.print(" ℃  ");

//umiditatea

Serial.print(f);

Serial.print(" F\t");

Serial.print("  UMIDITATE: ");

Serial.print(h);

Serial.print(" %\t");

Serial.println();

if(t>35)

digitalWrite(buzzer,LOW);

else digitalWrite(buzzer, HIGH);

} //void afisareumidtemp

//=======================

void pres_temp_alt(){

char status;

double T,P,p0,a;

// se activează citirea presiunii la fiecare 10 secunde

//=================================================

// mai întâi se efectuează o măsurare a temperaturii pentru a putea efectua citirea presiunii

// se începe măsurarea temperaturii

status = presiune.startTemperature();

if (status != 0)

{

// se așteaptă finalizarea măsurării

delay(status);

// se preia măsurarea temperaturii finalizate

// măsurarea este stocată în variabila T.

// funcția returnează 1 dacă este cu succes și 0 dacă eșuează

status = presiune.getTemperature(T);

if (status != 0)

{

tft.setCursor(64,140); //setez coordonatele unde va fi afișată valoare temperaturii

tft.fillRoundRect(55, 133, 98, 25, 5, RED); //primul chenar roșu

tft.setTextColor(WHITE);//setez culoarea textului

//afișez temperatura în grade Celsius

tft.print(T,2);

tft.print(" C  ");

//afișare în consolă

Serial.println();

Serial.println("BMP180");

// afișare măsurare temperatură în grade Celsius și conversia in Farenheit

Serial.print("Temperatură: ");

Serial.print(T,2);

Serial.print(" ℃ , ");

Serial.print((9.0/5.0)*T+32.0,2);

Serial.println(" F");

if(T>35)

digitalWrite(buzzer,LOW);

else digitalWrite(buzzer, HIGH);

//=================================================

// se începe măsurarea presiunii

//presiunea absolută

status = presiune.startPressure(3);

if (status != 0)

{

// se așteaptă ca măsurătoare să se finalizeze:

delay(status);

// măsurătorile sunt stocate în variabila P

// se reține ca funcția necesită temperatura măsurată anterior(T).

// funcția returnează 1 daca este cu succes și 0 în caz contrar..

status = presiune.getPressure(P,T);

if (status != 0)

{

tft.setCursor(182,165);

tft.fillRoundRect(175, 159, 130, 25, 5, RED);

tft.setTextColor(WHITE);

//afișare pe ecran a presiunii absolute în mmHg

tft.print(P*0.750062,2);

tft.print("mmHg");

//afișare în consolă a măsurării presiunii absolute în mb și conversia acesteia în mmHG

Serial.print("Presiunea absolută: ");

Serial.print(P,2);

Serial.print(" mb, ");

Serial.print(P*0.750062,2);

Serial.print(" mmHg");

Serial.println();

//presiunea relativă

p0 = presiune.sealevel(P,ALTITUDINE); //ne situăm la 289 metri altitudine

tft.setCursor(180,190);

tft.fillRoundRect(175, 184, 130, 25, 5, RED);

tft.setTextColor(WHITE);

//afișare pe ecran a presiunii relative

tft.print(p0*0.750062,2);

tft.print("mmHg");

//afișare în consolă a presiunii relative în mb, respective mmHG

Serial.print("Presiune Relativă: ");

Serial.print(p0,2);

Serial.print(" mb, ");

Serial.print(p0*0.750062,2);

Serial.print(" mmHg");

Serial.println();

//=================================================

//altitudinea

// dacă se dorește să se determine altitudinea din măsurarea presiunii, se utilizează funcția de altitudine împreună cu o presiune de bază/

// Parametri: P = presiunea absolută în mb, p0 = presiunea de bază (realtivă)în mb.

// Rezultat: a = altitudine în m.

a = presiune.altitude(P,p0);

tft.setCursor(180,215);

tft.fillRoundRect(175, 209, 130, 25, 5, RED);

tft.setTextColor(WHITE);

tft.print(a,0);

tft.print(" metri");

//afișare în consolă a altitudinii în metri

Serial.print("Altitudine: ");

Serial.print(a,0);

Serial.println(" metri ");

} //if

} //if

} //if

} //if

} //void pres_temp_alt

SCHEMĂ ELECTRICĂ

PLANIFICAREA ACTIVITĂȚII

Pentru a detalia mai bine activitatea derulării proiectului am elaborat un grafic Gantt unde se pot observa etapele principale ale proiectului.

DIAGRAMA GANTT

Proiectul de licență este structurat pe 7 capitole, acestea incluzând aspect generale specifice lucrării, proiectare hardware și proiectare software.

Primul capitol include motivația alegerii temei de licență, precum și noțiuni generale prinvind stațiile meteo.

Capitolele 2 și 3 cuprind noțiuni teoretice privind achizițiile de date, aspect generale despre senzori și traductoare, cât si considerații teoretice despre senzorii folosiți în proiect.

Capitolele 4 și 5 includ atât proiectarea hardware, cât și proiectarea software și organigrama de lucru a programului principal.

Capitolul 6 prezintă rezultatele obținute în urma unor teste în mediul ambiental și în mediul extern, rezultate prezentate comparativ.

Capitolul 7 include concluzii, opinia personală cu privire la rezultatele obținute dar și îmbunătățiri ce pot fi aduse pe viitor acestui proiect.

Similar Posts