Sistem de Telemasurare a Unor Marimi Neelectrice

Sistem de telemăsurare a unor mărimi neelectrice

CUPRINSUL

1. INTRODUCERE

2. DESCRIEREA PROIECTULUI

2.1 Schema bloc a sistemului de măsurare

2.2 Schema electronică a modulului de măsurare

2.3 Cablaj placă (sistem de achiziție)

2.4 Prezentarea senzorilor utilizați în proiect

2.4.1 Senzorul de nivel pentru lichide

2.4.2 Senzorul de temperatură DS18B20

2.4.3 Senzorul de temperatură NTC-1K

2.4.4 Senzorul de zgomot

2.4.5 Senzorul de fum și gaze inflamabile MQ-2

2.4.6 Senzorul numeric de iluminare BH1750FVI

2.4.7 Senzorul de lumină cu fotodiodă

2.4.8 Senzorul de atingere

2.5 Microcontrolerul ATmega16

2.5.1 Caracteristici

2.6 Modulul de comunicație radio

2.6.1 Caracteristici

2.7 Schema bloc a sistemului de afișare date

2.8 Schema electronică a modulului de procesare și afișare date

2.9 Cablaj placă (sistem de afișare date)

2.10 Microcontrolerul Atmega16

2.11 Modulul wireless nRF24L01+

2.12 Display LCD 20×4

2.11.1 Caracteristici

2.13 Prezentare software

3. CONCLUZII

4. BIBLIOGRAFIE

5. REFERINȚE WEB

INDEX

LISTA FIGURILOR

Figura 1. Schema bloc a sistemului de măsurare……….………………….……….………….12

Figura 2. Sistemul de măsurare (schema electronică)……..…………..………………………..…14

Figura 3. Cablaj placă de achiziție…………………..………………….……….………………..14

Figura 4. Structura unui traductor ………………………….……………………………………..….15

Figura 5. Clasificarea caracteristicilor senzorilor………………………………………………….…….16

Figura 6. Senzor de nivel pentru lichide……………..…………………………………………………….16

Figura 7. Senzor de temperatură DS18B20……………………………………………………………………17

Figura 8. Diagrama bloc (senzor de temperatură DS18B20)……………………………………………18

Figura 9. Senzor rezistiv de temperatură NTC-1K………………………………………………………….19

Figura 10. Caracteristica putere consumată-temperatură ambiantă…………………………….……19

Figura 11. Caracteristica valoare citită-valoare afișată (NTC-1K)………………………………..20

Figura 12. Sezor de zgomot……………………………………………………………………………..20

Figura 13. Microfonul EM-B9760UL……………………………………………………..………21

Figura 14. Senzor de fum și gaze inflamabile (1)…………………..………………………….…..21

Figura 15. Senzor de fum și gaze inflamabile (2)…..………………………………………………….22

Figura 16. Senzor gaz MQ-2……………………………………………………………………………………….22

Figura 17. Senzorul numeric de iluminare BH1750FVI………………………………………………….22

Figura 18. Senzor de iluminare (4fire) Lm393……………………………………………………………23

Figura 19. Caracteristica valoare citită-valoare afișată (senzor cu fotodiodă)……………..…….24

Figura 20. Senzor de atingere………………………………………………………………………………………25

Figura 21. Schema familiei AVR8……………………………………………………………………26

Figura 22. Structura internă generală a microcontrolerului Atmega16………………………………26

Figura 23. Diagrama bloc (ATmega16)……………………………………………………………………27

Figura 24. Registrul de stare ………………………………….………………………………………29

Figura 25. Schema echivalentă a unui pin……………………………………………………………………..33

Figura 26. Semnificația pinilor…………………………………………………………………..…33

Figura 27. Indicatorul de stivă………..………………………………….……………………….…35

Figura 28. Organizarea spațiului de memorie………………………………………………………………..35

Figura 29. NRF24L01+……………………………………………………………………………………………..36

Figura 30. Diagrama bloc (nRF24L01+)………………………..…………………………………………….37

Figura 31. Semnificația pinilor sistemului wireless nRF24L01+…..……………………..……..37

Figura 32. Schema bloc a sistemului de procesare și afișare date .………………………..………40

Figura 33. Sistemul de procesare și afișare date (schema electronică)……..………………………42

Figura 34. Cablaj placă afișare date………………………………..……………….……………………43

Figura 35. Display LCD 20×4……………………………………………………………………..45

Figura 36. Schema LCD 20×4…………………………………..……………….…………..………………45

Figura 37. Diagrama bloc (LCD 20×4)…………………………………………………………………………46

Figura 38. Structura de alimentare pentru modulul LCD 20×4…………………………………………47

Figura 39. Caracteristici de timp, segment de timp…………………………………………………………48

Figura 40. Caracteristici de timp, timp comun……………………………………………………………….49

Figura 41. Schema logică pentru sistemul de măsurare…………………………………………………..60

Figura 42. Schema logică pentru sistemul de afișare………………………………………………………61

LISTA TABELELOR

Tabelul 1. Caracteristicile materialelor (Platină, Nichel, Cupru) ………………..…….……..19

Tabelul 2. Funcțiile pinilor………………………………………………………………..……37

Tabelul 3. Maxime absolute…………………………………………………………….…….38

Tabelul 4. Condiții de funcționare……………………………………………….…….………38

Tabelul 5. Consumul de energie………………………………………….…….……..……….38

Tabelul 6. Condiții generale de RF…………………………………………..…….…………..39

Tabelul 7. Funcționarea transmițătorului………………………………………….….…..….39

Tabelul 8. Caracteristici DC, pin de intrare……………………….…….…………………………..39

Tabelul 9. Caracteristici DC, pin de ieșire………………….………………………….……..………39

Tabelul 10. Funcționarea receptorului…………………….…..………………………..……………40

Tabelul 11. Specificații generale (LCD 20×4)………………….….………………..……………46

Tabelul 12. Maxime absolute…………………………………………………….……………46

Tabelul 13. Caracteristici electrice……………………………………………….……………47

Tabelul 14. Caracteristici optice………………………………………………….………….…47

Tabelul 15. Funcțiile pinilor (LCD 20×4)………………………………….……………………48

Tabelul 16. Caracteristici de timp…………………………………………….…………….…..48

1. INTRODUCERE

Proiectul meu, Sistem de telemăsurare a unor mărimi neelectrice, este compus din două părti:

Secțiunea de achiziție care este compusă dintr-o placă de bază pe care sunt conectați senzori, un microcontroler și un modul wireless.

Secțiunea de procesare și afișare date compusă dintr-o placa de bază pe care sunt conectate un microcontroler, un modul wireless și un display LCD 20×4 caractere, leduri pentru indicarea stărilor diverșilor senzori.

Sistemul de măsurare va evalua temperatura, nivelul de lichid, zgomotul, iluminarea, vibrațiile, prezența.

Datorită acestui proiect am reușit să-mi pun în practică o mare parte din cunoștințele acumulate pe parcursul celor patru ani de facultate.

2. Descrierea proiectului

2.1 Schema bloc a sistemului de măsurare

Figura 1. Schema bloc a sistemului de masurare

Sistemul se alimentează la o tensiune continuă cuprinsă între 7 și 18 V.

Blocul de alimentare conține o protecție minimă cu o diodă serie la alimentare inversă, condensatoare pentru filtrare și stabilizator de tensiune pentru alimentarea în siguranță a componentelor. Datorită diodei serie de pe alimentare, sistemul se poate alimenta și cu tensiune alternativă cuprinsă între 14 și 20V.

Blocul de alimentare conține stabilizator de tensiune de 5 și 3,3 V pentru alimentarea microcontrolerului, senzorilor dar și pentru modulul de comunicație.

Microcontrolerul are porturi digitale, porturi analogice și porturi de comunicație SPI și UART. Prin portul digital acesta comunică cu interfața afișare cu leduri și primește date de la senzorii numerici. Prin portul analogic primește date de la senzorii cu ieșire analogică, iar prin portul SPI comunică cu modulul de comunicație.

2.2 Schema electronică a modulului de măsurare

Figura 2. Sistemul de măsurare (schema electronică)

2.3 Cablaj placă(sistem de achiziție)

Figura 3. Cablaj placă de achiziție

2.4 Prezentarea senzorilor utilizați în proiect

Prin cuvântul ”senzor” putem înțelege ”dispozitiv care detecteazã o schimbare într-un stimul fizic și o transformã într-un semnal care poate fi mãsurat sau înregistrat”, iar pentru cuvântul “traductor” definiția este “dispozitiv care transferã putere de la un sistem la altul în aceeași formã sau în una diferitã”.

Senzorii sunt ansambluri de dispozitive sensibile care permit determinarea unui câmp de valori pentru o mãrime fizicã într-o manierã similarã cu organele de simț umane.

Un senzor realizeazã aceeași funcție ca și un traductor, adicã percepe starea unei mãrimi fizice pe care o convertește în semnal electric dar și structura funcțională a senzorului coincide cu cea a traductorului. De aceea cuvintele ”senzor” și ”traductor” sunt folosite împreuna de cei mai mulți autori.

În practică, dispozitivele care oferă o ieșire electrică sunt numite traductoare electrice.

Figura 4. Structura unui traductor

Ieșirea traductorului este proporțională cu intrarea. Acesta trebuie sa furnizeze semnale care să poată fi interpretate, deci ieșirea lui este un semnal electric.

Caracteristicile generale ale senzorilor reflectă interdependența dintre mărimile de intrare și de ieșire sub aspect funcțional. Acestea sunt:

caracteristici de intrare, care reflectă interacțiunea dintre mărimile de intrare și obiectul supus măsurării;

caracteristici de transfer, care reprezintă relația dintre o mărime de intrare și o mărime de ieșire, fără a ține cont de celelalte elemente ale sistemului de măsură;

caracteristici de ieșire, care reflectă interacțiunea mărimilor de ieșire cu elementul cu care este cuplat la ieșire.

Mai există și caracteristici speciale care nu intervin direct în relația de dependență, dar condiționează calitațile tehnice și economice ale senzorilor.

Figura 5. Clasificarea caracteristicilor senzorilor

2.4.1 Senzorul de nivel pentru lichide

Figura 6. Senzor de nivel pentru lichide

Senzorul pentru nivelul de lichid este realizat din mai multe fire paralele intre care lichidul formeaza o rezistenta invers proportionala cu nivelul.

Specificații:

Tensiunea de operare: DC 3-5 V;

Curentul de operare: mai mic de 20mA;

Tip senzor analog;

Zona de detectare: 40mm x 16mm;

Procesul de producție: FR4 față – verso HASL;

Temperatura de operare: 10º C – 30º C;

Umiditate: 10% – 90% fara condens;

Dimensiune: 62mm x 20mm x 8mm.

Domeniul de masurare al acestuia este de 0-40mm. Alimentarea se face cu o tensiune de 3-5V iar ieșirea acestuia este o tensiune analogică care variază între 0 și tensiunea de alimentare.

Linii de cod care dau dependența dintre mărimea citită de la senzor și mărimea ce se dorește a fi afișată.

nivelS = (float)((float)(adc_var1-read_val_S1[index_mm-1])/((float)(read_val_S1[index_mm]-read_val_S1[index_mm-1])));

nivelS = nivelS*((float)(S1mm[index_mm]-S1mm[index_mm-1]))+(float)(S1mm[index_mm-1]);

2.4.2 Senzorul de temperatură DS18B20

Figura 7. Senzorul de temperatură DS18B20

Măsurarea temperaturii constituie una din cele mai uzuale procese de masurare. Când sonda este introdusă într-un obiect sau plasată pe suprafața acestuia, va exista ur de nivel pentru lichide

Senzorul pentru nivelul de lichid este realizat din mai multe fire paralele intre care lichidul formeaza o rezistenta invers proportionala cu nivelul.

Specificații:

Tensiunea de operare: DC 3-5 V;

Curentul de operare: mai mic de 20mA;

Tip senzor analog;

Zona de detectare: 40mm x 16mm;

Procesul de producție: FR4 față – verso HASL;

Temperatura de operare: 10º C – 30º C;

Umiditate: 10% – 90% fara condens;

Dimensiune: 62mm x 20mm x 8mm.

Domeniul de masurare al acestuia este de 0-40mm. Alimentarea se face cu o tensiune de 3-5V iar ieșirea acestuia este o tensiune analogică care variază între 0 și tensiunea de alimentare.

Linii de cod care dau dependența dintre mărimea citită de la senzor și mărimea ce se dorește a fi afișată.

nivelS = (float)((float)(adc_var1-read_val_S1[index_mm-1])/((float)(read_val_S1[index_mm]-read_val_S1[index_mm-1])));

nivelS = nivelS*((float)(S1mm[index_mm]-S1mm[index_mm-1]))+(float)(S1mm[index_mm-1]);

2.4.2 Senzorul de temperatură DS18B20

Figura 7. Senzorul de temperatură DS18B20

Măsurarea temperaturii constituie una din cele mai uzuale procese de masurare. Când sonda este introdusă într-un obiect sau plasată pe suprafața acestuia, va exista un transfer de caldură între sondă și obiect: senzorul se va raci sau se va încalzi. Această sondă de temperatură permite masurarea cu precizie a temperaturii în medii umede.

Există doua metode de procesare a semnalului în măsurătorile de temperatură: metoda echilibrării și metoda predictivă.

Pentru metoda echilibrării, temperatura se va măsura doar în momentul în care nu mai există gradient de temperatură între senzor și obiect (au aceeași temperatură).

În metoda predictivă, punctul de echilibru nu este atins niciodată, ci este determinat din viteza de schimbare a temperaturii senzorului.

Folosind metoda echilibrării, timpul necesar atingerii temperaturii de echilibru poate fi de durată foarte mare (mai ales când suprafața de contact este uscată).

Figura 8.Diagrama bloc (senzor de temperatură DS18B20)

Caracteristici:

Pachet de înaltă calitate din oțel inoxidabil (tub), rezistent la apa și la umiditate;

Detectorul folosește senzorul de temperatură DS18B20;

Tensiune de intrare: 3-5V;

Interval de temperatură: -55 ° C până la +125 °;

Precizie: ± 0.5 ° C la -10 ° C până la +85 ° C;

Rezoluția reglabilă: 9 – 12 biți;

1. Firul roșu se conectează la alimentare (VCC).

2. Firul galben este firul de date, se conectează la MCU.

3. Firul negru se conectează la masa (GND).

Domeniul de masurare este cuprins între 0 și 105 grade Celsius. Alimentarea se face cu o tensiune de 3-5V iar pe ieșire are o tensiune analogică care variază între 0 și tensiunea de alimentare.

Linii de cod care dau dependența dintre mărimea citită de la senzor și mărimea ce se dorește a fi afișată.

tempS= (float)((float)(adc_var1-read_val_S2[index_gc-1])/((float)(read_val_S2[index_gc]-read_val_S2[index_gc-1])));

tempS = tempS*((float)(S2gC[index_gc]-S2gC[index_gc-1]))+(float)(S2gC[index_gc-1]);

2.4.3 Senzorul rezistiv de temperatură NTC-1K

Figura 9. Senzorul de temperatură NTC-1K

Termometrele cu rezistență metalică acoperă un domeniu relativ larg de temperaturi, fiind folosite pentru măsurarea temperaturii gazelor și lichidelor, a temperaturii suprafețelor unor solide sau temperature din interiorul unor solide ușoare. Ele sunt stabile și rezistente la condiții de mediu neprietenoase, fiind des folosite în industria chimică sau industria alimentară. Termometrele cu rezistență metalică au o acuratețe bună dar un raspuns lent în timp, fiind destul de fragile și uneori scumpe.

Metalele cele mai des folosite ca traductori de temperatură sunt platina, cuprul și nichelul. Valorile standard pentru rezistența la temperatura de referință Ro (valori nominale) sunt 10, 50, 100, 500 și 1000 ohmi.

În tabelul de mai jos sunt prezentate caracteristicile acestor materiale, cu precizarea că ele se referă la termometrele cu rezistența nominală de 100 Ω.

Tabel 1. Caracteristicile materialelor (Platină, Nichel, Cupru)

Figura 10. Caracteristica putere consumată – temperatură ambiantă

Temperatura care poate fi masurată de acest senzor este în domeniul -55°C ~ +125°C, iar puterea este de 0,5W.

Valoare citită de la senzor

Temperatură afișată

Figura 11. Caracteristica valoare citită – valoare afișată (NTC-1K)

Domeniul de masurare fixat pentru acest proiect este cuprins între 0 și 105 grade Celsius, se alimentează cu o tensiune 3-5V, iar pe ieșirea are o tensiune analogică care variază între 0 și tensiunea de alimentare.

Linii de cod care dau dependența dintre mărimea citită de la senzor și mărimea ce se dorește a fi afișată.

tempS = (float)((float)(adc_var1-read_val_S1[index_gc-1])/((float)(read_val_S1[index_gc]-read_val_S1[index_gc-1])));

tempS = tempS*((float)(S1gC[index_gc]-S1gC[index_gc-1]))+(float)(S1gC[index_gc-1]);

2.4.4 Senzorul de zgomot

Figura 12. Senzorul de zgomot

În cadrul acestei componente elementul activ care masoară nivelul de sunet este un microfon (piesa rotunda). Se poate regla nivelul sunetului la care modulul sa se declanșeze prin intermediul potențiomentrului albastru. Acest senzor recunoaște doar disponibilitatea de sunet (principiul vibrații) nu poate identifica dimensiunile sunetului sau frecvențele specifice ale sunetului.

Caracteristici:

Tensiune de lucru: 3,3V-5V;

Pe ieșire un singur semnal de canal;

Semnalul de ieșire efectivă este de nivel scăzut;

Atunci când nu există sunet, ieșirile au nivel scăzut, iar semnalul este luminos;

Poate detecta intensitatea sunetului mediului;

Sensibilitate ajustabilă prin potențiometrul digital (albastru).

Tensiunea de alimentare este de 3,3-5V iar pe ieșirea acestuia se regasește o tensiune analogică cuprinsă între 0 și tensiunea de alimentare. Acest tip de senzor folosește microfonul EM-B9760UL. Condiții de utilizare pentru EM-B9760UL:

Temperatura: -20 ~ +70℃;

Umiditate: 35% ~ 85%RH;

Presiune: 86 ~ 106Kpa;

Zgomot: 36dB (maxim);

Tensiune de operare: 1 ~ 10VDC.

Figura 13. Microfonul EM-B9760UL

2.4.5 Senzorul de fum și gaze inflamabile MQ-2

Figura 14. Senzorul de fum și gaze inflamabile (1)

Senzorul de fum și gaze inflamabile are un domeniu larg de aplicare cu un circuit simplu de acționare. Are un raspuns rapid și de înaltă sensibilitate dar și o viată stabilă și lungă. Este utilizat pentru detectarea scurgerilor de gaz în medii casnice si industriale (GPL, i-butan, propan, metan, alcool, hidrogen, fum).

Caracteristici:

Dimensiuni: 32 x 22 x 27 (L x W x H);

Tensiune de lucru: DC 5V;

Detectare de gaze: gaze inflamabile, vapori, fum;

Concentrație detectabilă: 300-10000ppm (gaze inflamabile);

Cip: LM393, ZYMQ-2 senzori de gaze;

Ieșire dublu semnal (ieșire analogică și ieșire de nivel TTL);

0 ~ 5V tensiune de ieșire analogică, este mai mare concentrația, mai mare tensiunea;

Caracteristicile de răspuns și de recuperare sunt rapide.

Figura 15. Senzorul de fum și gaze inflamabile (2)

Figura 16. Senzorul gaz MQ-2

2.4.6 Senzorul numeric de iluminare BH1750FVI

Figura 17. Senzorul numeric de iluminare BH1750FVI

Acesta este un senzor pentru intensitatea luminii care generează la ieșire un semnal digital. Aplicații unde poate fi folosit: telefonul mobil, TV LCD, aparat foto digital, cameră video digitală, ecran LCD.

Caracteristici:

Modul digital pentru detectarea intensității luminii: GY-30;

ROHM chip original, BH1750FVI;

Alimentare: 3-5V;

Gama de masurare : 0…65535 lx;

Ieșire digitală directă, calculul complex este omis;

Nu face distincție între lumină ambientală;

Este posibil să se detecteze min. 0,11 lx, max. 100,000 lx.

Niveluri de iluminare orientative (lx):

Noapte: 0,001 ~ 0,02 (lx);

Noapte (lună): 0.02 ~ 0.3 (lx);

Noros: 5 ~ 50 (lx);

Senin: 50 ~ 500 (lx);

Însorit: 100 ~ 1000 (lx).

2.4.7 Senzorul de lumină cu fotodiodă

Figura 18. Senzorul de lumină (4fire) Lm393

LM393 este un senzor de lumină semiconductor care are atât ieșiri analogice cât și ieșiri digitale. Ieșirea digitală are un potențiometru care poate fi folosit pentru a stabili un nivel de iluminare de declanșare.

Caracteristici:

Tensiunea de lucru: 3,3 V – 5 V;

Tensiune de ieșire analogică;

Dimensiunea PCB: 3cm x 1.6cm;

Ieșiri de comutare digitală (0 și 1).

Cele 4 fire, funcționare:

1. VCC: 3,3V – 5V tensiune externă (poate fi conectat direct la microcontroler 5V);

2. GND;

3. DO: Interfață ieșire digitală (0 și 1);

4. AO: Interfață ieșire analogică.

Valoare citită de la senzor

Lumeni afișați

Figura 19. Caracteristica valoare citită – valoare afișată (senzor cu fotodiodă)

Domeniul de măsurare al acestui senzor este cuprins între 0 și 2800 de lumeni. Pe intrare avem o tensiune de alimentare de 3,3-5V, iar pe ieșire avem o tensiune analogică care variază între 0 și tensiunea de alimentare.

Linii de cod care dau dependența dintre mărimea citită de la senzor și mărimea ce se dorește a fi afișată.

lum = (float)((float)(adc_var-read_val_lum[index_lum-1])/((float)(read_val_lum[index_lum]-read_val_lum[index_lum-1])));

lum = lum*((float)(lumeni[index_lum]-lumeni[index_lum-1]))+(float)(lumeni[index_lum-1]);

2.4.8 Senzor de atingere

Figura 20. Senzor atingere

Modulul este bazat pe un senzor de atingere IC (TTP223B) tactil. În starea normală, consumul de energie este redus. Când un deget atinge poziția corespunzătoare, ieșirea modulului are un consum mai mare de energie, în cazul în care nu e atins timp de 12 secunde, comută în modul economic.

Caracteristici:

Dimensiuni: 45mm x 18mm x 5mm (L x l x H);

Tensiune de lucru: 3V – 5V;

Ieșire TLL;

Porturile de ieșire IO pot fi conectate direct la microcontroler;

Modul releu poate fi controlat individual;

Pe intrare avem o tensiune de alimentarede 3-5V iar pe ieșire avem o tensiune numerică care poate fi 0 sau tensiunea la care este alimentat, rezultat (ON / OFF).

2.5 Microcontrolerul ATmega16

ATmega16 este un microcontroler RISC pe 8 biți realizat de firma Atmel. ATmega16 este de mică putere bazat pe arhitectura RISC AVR îmbunatațită. Memoriile ROM, EEPROM și SRAM sunt integrate în același chip, înlaturând nevoia de memorie externă. Dispune de un set de 131 instrucțiuni și 32 de regiștri de uz general. Cele 32 de registre sunt direct adresabile de Unitatea Logică Aritmetică (ALU), permițând accesarea a două registere independente într-o singură instrucțiune. Astfel se obține o eficiența mai mare in execuție (de până la 10 ori mai rapide decât cele convenționale CISC).

Microcontrolerele AVR pe 8 biți (Atmel) au la bază un nucleu RISC cu arhitectura Harvard. Aceste microcontrolere sunt destinate aplicațiilor simple: controlul motoarelor, controlul fluxului de informație pe portul USB, aplicații din domeniul automobilelor, controlul accesului de la distanță, etc.

Figura 21. Schema familiei AVR8

2.5.1 Caracteristici

Principalele caracteristici ale acestuia sunt:

16 KB de memorie Flash reinscriptibilă pentru stocarea programelor;

1 KB de memorie RAM;

512 B de memorie EEPROM;

două numărătoare/temporizatoare de 8 biți;

un numărător/temporizator de 16 biți;

conține un convertor analog – digital de 10 biți, cu intrări multiple;

conține un comparator analogic;

conține un modul USART pentru comunicație serial(port serial);

dispune de un cronometru cu oscilator intern;

oferă 32 de linii I/O organizate in patru porturi (PA, PB, PC, PD).

Figura 22. Structura internă generală a microcontrolerului ATmega16

Funcția principală a nucleului CPU-AVR este aceea de a asigura executia corectă a programului. Pentru aceasta, nucleul este capabil să acceseze memoriile, sa execute calcule, sa controleze perifericele și sa prelucreze întreruperile. Structura internă generală a controlerului este prezentată în figura 22. Se poate observa că există o magistrală generală de date la care sunt conectate mai multe module:

unitatea aritmetică și logică (ALU) ;

registrele generale ;

memoria RAM și memoria EEPROM ;

liniile de intrare (porturile I/O) și celelalte blocuri de intrare/ieșire.

Figura 23. Diagrama bloc (Atmega16)

O caracteristică foarte importantă pentru orice procesor și în particular pentru microcontrolere este sistemul de întreruperi. O întrerupere reprezintă un semnal generat de un modul extern unității centrale de procesare (CPU) pentru a anunța apariția unui eveniment care trebuie tratat. Utilizarea unui astfel de sistem permite implementarea de module specializate care să execute operații în paralel cu CPU și să solicite intervenția acestuia numai la terminarea operațiilor sau în alte cazuri definite.
ATmega16 dispune de 21 surse de întrerupere. Atunci când una dintre ele devine activă se suspendă cursul normal de execuție și se face salt automat la o adresă prestabilită din memoria program.

Reset – Generată la alimentare sau la un semnal pe pinul RESET

EXT INT0 – Întrerupere externă 0

EXT INT1 – Întrerupere externă 1

TIM2_COMP – Generată când Timer/Counter2 atinge valoarea de prag

TIM2_OVF – Generată când Timer/Counter2 atinge valoarea maximă

TIM1_CAPT – Generată de unitatea de captură a timerului pe 16 biți

TIM1_COMPA – Generată când timerul pe 16 biți atinge valoarea de prag A

TIM1_COMPB – Generată când timerul pe 16 biți atinge valoarea de prag B

TIM1_OVF – Generată când timerul pe 16 biți atinge valoarea maximă

TIM0_OVF – Generată când Timer/Counter0 atinge valoarea maximă

SPI_STC – Generată de unitatea SPI

UART_RXC – Generată la recepția completă a unor date de catre modulul USART

UART_DRE – Generată când registrul de date al modulului USART este gol

UART_TXC – Generată la transmisia completă a unor date de către modulul USART

ADC – Generată de modulul ADC

EE_RDY – Generată de modulul EEPROM

ANA_COMP – Generată de comparatorul analogic

TWI – Generată de modulul TWI

INT2 – Întrerupere externă 2

TIM0_COMP – Generată când Timer/Counter0 atinge valoarea de prag

SPM_RDY – Generată de modulul de auto-scriere a memoriei Flash

Dacă o singură întrerupere nu este utilizată se recomandă ca pe poziția acesteia să se introducă o instrucțiune de salt către eticheta RESET. Primele patru instrucțiuni care apar după eticheta RESET sunt utilizate pentru a inițializa pointer-ul de stivă definit de registrele SPH și SPL.

ATmega16 este susținut de o serie completă de instrumente de program și de dezvoltare a sistemului, care include: compilatoare, macroasambloare, programe debug/simulare etc.

Registrul de stare (SREG)

Registrul de stare contine informații despre ultima operație aritmetică efectuată de ALU. După fiecare operație aritmetică, starea registrului este actualizată. Conținutul registrului de stare poate fi salvat/restaurat prin program, de exemplu, la accesarea unei subrutine.

Figura 24. Registrul de stare

Bitul 7 (I – Global Interrupt Enable) – activare/dezactivare globală întreruperi

Acest bit trebuie să aibă valoarea „1” pentru a permite execuția oricărei întreruperi. Dacă are valoarea „0” orice sursă de întrerupere este dezactivată.

Bitul 6 (T – Bit Copy Storage) – bit de copiere

Bitul 5 (H – Half Carry Flag) – indicator de transport la jumătate

Bitul 4 (S – Sing bit) – indicator de semn

Bitul 3 (V – Two’s Complement Overflow Flag) – indicator de depășire în cazul operațiilor în complement față de 2

Bitul 2 (N – Negative Flag) – indicator de rezultat negativ

Bitul 1 (Z – Zero Flag) – indicator de zero

Acest bit devine „1” dacă rezultatul unei operații aritmetice sau logice a fost zero.

Bitul 0 ( C – Carry Flag) – indicator de transport

Acest bit devine „1” în cazul unei depășiri la operații pe 8 biți.

Instrucțiuni aritmetice și logice

Cele mai uzuale instrucțiuni aritmetice și logice sunt:

– ADD Rd,Rr

Efectul: se adună conținutul registrului Rd cu cel al registrului Rr și rezultatul se pune în Rd.

– ADC Rd,Rr

Efectul: se adună conținutul registrului Rd cu cel al registrului Rr și cu indicatorul de transport și rezultatul se pune în Rd.

– SUB Rd,Rr

Efectul: se scade conținutul registrului Rr din cel al registrului Rd și rezultatul se pune în Rd.

– AND Rd,Rr

Efectul: se face „ȘI logic” între conținutul registrului Rd și cel al registrului Rr iar rezultatul se pune în Rd.

– INC Rd

Efectul: incrementează conținutul registrului Rd și pune rezultatul în Rd.

– DEC Rd

Efectul: decrementează conținutul registrului Rd și pune rezultatul în Rd.

Instrucțiuni de salt

Cele mai uzuale instrucțiuni de salt sunt:

– JMP k

Efectul: se face salt necondiționat cu „k” poziții față de adresa curentă din memoria program. Instrucțiunea se poate utiliza și în forma „JMP etichetă”.

– RCALL subrutină

Efectul: se apelează o subrutină. Pentru a reveni din aceasta se utilizează instrucțiunea RET.

– RETI

Efectul: se revenire dintr-o subrutină de tratare a unei întreruperi.

– CPSE Rd,Rr

Efectul: se compară valorile regiștrilor Rd și Rr și în caz de egalitate instrucțiunea imediat următoare nu se mai execută.

– CP Rd,Rr

Efectul: compară valorile regiștrilor Rd și Rr fără să modifice conținutul acestora. Ca urmare a ecuției acestei instrucțiuni se vor schimba corespunzător biții registrului de stare.

– SBRC Rd,b

Efectul: dacă bitul b din registrul Rd are valoarea „0” instrucțiunea imediat următoare nu se mai execută.

– SBRS Rd,b

Efectul: dacă bitul b din registrul Rd are valoarea „1” instrucțiunea imediat următoare nu se mai execută.

– SBIC P,b

Efectul: dacă bitul b din registrul de intrare/ieșire P are valoarea „0” instrucțiunea imediat următoare nu se mai execută.

– SBIS P,b

Efectul: dacă bitul b din registrul de intrare/ieșire P are valoarea „1” instrucțiunea imediat următoare nu se mai execută.

– BREQ etichetă

Efectul: dacă indicatorul Z are valoarea „1” se face salt la etichetă.

Instrucțiuni de transfer

Cele mai uzuale instrucțiuni de transfer sunt:

– MOV Rd,Rr

Efectul: copiază conținutul registrului Rr în registrul Rd.

– LDI Rd,k

Efectul: copiază valoarea k în registrul Rd. Această instrucțiune lucrează numai cu registrele

r16 – r31.

– IN Rd,P

Efectul: copiază conținutul registrului de intrare/ieșire P în registrul Rd.

– OUT P,Rr

Efectul: copiază conținutul registrului Rr în registrul de intrare/ieșire P.

Instrucțiuni care lucrează la nivel de bit

Cele mai uzuale instrucțiuni care lucrează la nivel de bit sunt:

– SBI P,b

Efectul: bitul b din registrul de intrare/ieșire P ia valoarea „1”. Instrucțiunea se poate utiliza numai pentru regiștri P situați la adresele de memorie 20h – 3Fh.

– CBI P,b

Efectul: bitul b din registrul de intrare/ieșire P ia valoarea „0”. Instrucțiunea se poate utiliza numai pentru regiștri P situați la adresele de memorie 20h – 3Fh.

– LSL Rd

Efectul: Registrul Rd este deplasat logic la stânga cu o poziție.

– ROR Rd

Efectul: Registrul Rd este rotit la dreapta cu o poziție prin bitul indicator de transport.
Instrucțiuni speciale

Instrucțiunile speciale sunt:

– NOP

– SLEEP

– WDR

Descrierea pinilor

Majoritatea pinilor au funcții alternative legate de funcționarea dispozitivelor periferice. Activarea funcțiilor alternative ale unor pini nu afectează utilizarea altor pini ca port I/O general.

Figura 25. Schema echivalentă a unui pin

Figura 26. Semnificația pinilor

VCC – Tensiunea de alimentare

GND – Masa

Portul A (PA7…PA0)

Portul A este un port bidirecțional de 8 biți programabil. Liniile portului A sunt folosite și ca intrări analogice pentru convertorul A/D. Liniile portului pot fi conectate optional la VCC prin rezistente de agațare (pull-up resistor). Buffer-ele de ieșire ale portului A au caracteristici de amplificare.

Portul B (PB7…PB0)

Portul B este un port I/O de 8 biți bidirecțional prevazut cu rezisțente de agațare interne (optional). Buffer-ele de ieșire ale portului B au caracteristici de amplificare. Portul B indeplinește de asemenea funcții speciale ale microcontrolerului ATmega 16.

Portul C (PC7…PC0)

Portul C este un port I/O de 8 biți bidirecțional prevazut cu rezistențe de agațare interne (optional). Buffer-ele de ieșire ale portului C au caracteristici de amplificare. Daca interfata JTAG (de depanare) este activată, rezistentele pinilor PC5(TDI), PC3(TMS) si PC2(TCK) vor fi activate, chiar dacă are loc o resetare. Port-ul C îndeplinește de asemenea funcții ale interfeței JTAG și alte funcții speciale ale ATmega 16.

Port D (PD7…PD0)

Portul D este un port I/O de 8 biți bidirecțional prevazut cu rezistențe de agațare interne (optional). Buffer-ele de ieșire ale portului D au caracteristici de amplificare. Portul D îndeplinește de asemenea funcții speciale ale ATmega 16.

Reset – inițializarea procesorului.

XTAL 1 și XTAL 2 – intrarea și ieșirea amplificatorului inversor al generatorului de tact.

AVCC – pin de alimentare pentru portul A și pentru convertorul A/D.

AREF – pin de intrare pentru referința analogical a convertorului A/D.

Stiva

Microcontrolerele AVR folosesc o stivă organizată în memoria SRAM de date. Stiva se folosește în principal pentru stocarea temporară a datelor, pentru stocarea variabilelor locale dar și pentru stocarea adreselor de revenire din întreruperi. Accesarea stivei se face prin registrului contor de stiva SP (Stack Pointer) care este actualizat de procesor la fiecare accesare a stivei. Stiva lucrează pe principiul LI-FO (Last Input – First Output) și evoluează prin decrementarea adreselor. La încarcarea unei date în stivă SP este decrementat, iar la citire este incrementat, de aceea SP indică întotdeauna prima locație liberă din vârful stivei. Dimensiunea memoriei SRAM instalate condiționează dimensiunea propriu-zisă a stivei. Utilizatorul setează prin program adresa de început a stivei (care este adresa cea mai mare a zonei de memorie alocată stivei). Procesorul folosește instrucțiunea PUSH pentru transferul de date în stivă, iar instrucțiunea POP este folosită pentru transferul din stivă.

Indicatorul de stivă (SP) este decrementat cu 1 când se introduc date în stivă cu instructiunea PUSH, și decrementat cu 2 când sunt salvate în stivă adresele de revenire la apelarea subrutinelor cu instructiunile CALL sau GOTO sau la acceptarea unei întreruperi. Indicatorul de stivă este incrementat cu 1 când datele sunt citite din stivă cu instructiunea POP, și incrementat cu 2 când sunt citite din stivă adrese la executia unei instructiuni de revenire dintr-o subrutina (RET) sau dintr-o întrerupere (RETI).

Indicatorul de stivă este implementat cu două registre de 8 biți. Aceste registre sunt adresate în spatiul de adrese al dispozitivelor I/O (registrele SPH și SPL). De structura implementării depind numărul de biți folosiți. Spațiul de adrese poate fi mic la unele implamentări ale arhitecturii AVR, deoarece este folosit doar registrul SPL(SP Low). În acest caz registrul SPH (SP High) nu mai este utilizat.

Figura 27. Indicatorul de stivă

Organizarea memoriei

Atmega16 are două spații de memorie principală: memoria de date și memoria de program. În plus Atmega16 are și o memorie nevolatilă EEPROM pentru memorarea datelor. Cele trei tipuri de memorie sunt adresate liniar.

Figura 28. Organizarea spațiului de memorie

2.6 Modulul de comunicație radio

Modulul wireless nRF24L01+ are un singur chip de emisie-receptie pe frecvența de 2,4GHz, folosind protocolul SPI. Pentru a proiecta un sistem cu nRF24L01+ este nevoie doar de un microcontroler și cateva componente pasive externe.

Figura 29. nRF24L01+

Specificații:

Banda de frecvență ISM de 2,4GHz;

Rata de transfer date de pană la 2Mbps;

Funcționare cu un consum mic de energie;

11.3mA TX la putere de ieșire 0dBm;

12.3mA RX la rata de transfer date 2Mbps;

900nA la putere mică;

22μA în stand-by;

5V intrări tolerante;

Tensiunea de lucru: 1,9 ~ 3.6V, low;

Rrăspuns automat și funcție automată de retransmisie;

125 de canale opționale de muncă;

60ppm 16MHz de cristal;

Transmite pana la 100 m în aer liber;

Timp de comutare canal este foarte scurt, poate fi folosit pentru salt de frecvență;

Adresa și funcția de verificare CRC;

Antenă integrată;

Distanța între pini: 2,54 mm;

Dimensiune modul: (L x l x H) 24 x 15 x 14 mm.

Figura 30. Diagrama bloc (nRF24L01+)

2.6.1 Caracteristici

Figura 31. Semnificația pinilor sistemului wireless nRF24L01+

Funcțiile pinilor:

Tabel 2. Funcțiile pinilor

1. Maxime absolute

Tabel 3. Maxime absolute

2. Condiții de funcționare

Tabel 4. Condiții de funcționare

3. Consumul de energie

Condiții: Vdd = +3V, Vss = 0V, Ta = – 40ºC ~ + 85º C.

a. Curentul este dat pentru un cristal de 12pF.

b. Impedanța de sarcină a antenei Z0=15Ω+j88Ω.

c. Impedanța de sarcină a antenei 15Ω+j88Ω. 10kbps rata medie de date și pachete complete.

d. Consumul de curent mediu de pornire TX (130μs) și modul de schimbare de la RX la TX (130μs).

e. Consumul de curent mediu de pornire RX (130μs) și modul de schimbare de la TX la RX (130μs).

Tabel 5. Consumul de energie

4. Condiții generale de RF

a. Banda utilizabilă este determinată de reglementările locale.

b. Rata de transfer date la fiecare izbucnire.

c. Distanța minimă de canal este 1MHz

Tabelul 6. Condiții generale de RF

5. Funcționarea transmițătorului

a. Impedanța de sarcină a antenei 15Ω+j88Ω.

Tabelul 7. Funcționarea transmițătorului

6. Caracteristicile DC

a. Dacă semnalul de intrare > 3,6 V, VDD trebuie să fie între 2,7 V și 3,3 V (3,0 V ± 10%).

Tabelul 8. Caracteristici DC, pin de intrare

Tabelul 9. Caracteristici DC, pin de ieșire

7. Funcționarea receptorului

a. Rata de transfer date este de 2Mbps.

b. Rata de transfer date este de 1Mbps.

Tabelul 10. Funcționarea receptorului

2.7 Schema bloc a sistemului de afișare date

Figura 32. Schema bloc a sistemului de procesare și afișare date

Față de modulul anterior avem în componență un display lcd 20×4 pentru afișarea informațiilor de la senzori și intrări de comandă cu “push buton” pentru a selecta din meniu informațiile dorite care le vrem afișate pe display. Interfața de comandă disune de 5 butoane up, down, left, right și ok.

Primul led arată starea conexiunii wireless, dacă funcționează sau nu funcționează.

Ledul de langă microcontroler arată că microcontrolerul este alimentat și funcționează.

Ledul doi atenționează utilizatorul atunci când pragul de nivel depăsește 20 mm (senzor I nivel).

Ledul trei atenționează utilizatorul când pragul intensitășii luminoase depasește 500 lumeni, iar cand intensitatea liminii este sub 400 lumeni, atunci pragul nu este atins și ledul se stinge (senzor I lumină).

Ledul patru atenționează utilizatorul când pragul temperaturii depăsește 30 de grade Celsius (senzor I temperatură).

Ledul cinci atenționează utilizatorul când pragul temperaturii depăsește 40 grade Celsius (senzor II temperatură).

2.8 Schema electronică a modulului de procesare și afișare date

Figura 33. Sistemul de procesare și afișare date (schema electronică)

2.9 Cablaj placă (sistem de afișare date)

Figura 34. Cablaj placă afișare date

2.10 Microcontrolerul ATmega16

Instrucțiunile acestei familii de microcontrolere au fost proiectate pentru a reduce dimensiunea unui program scris în limbaj C sau în limbaj de asamblare. Posibilitatea programarii memoriei FLASH și a memoriei EEPROM, face ca aceste microcontrolere să aibă o larga utilizare datorată costului mic de dezvoltare a unei aplicații prin reducerea timpului de proiectare.

O altă calitate remarcabilă a acestor microcontrolere este consumul redus de energie. Domeniul tensiunilor de alimentare este cuprins între 1,8 și 5V. Procesoarele folosesc 6 moduri diferite de funcționare cu consum redus ceea ce asigură reducerea consumului când microcontrolerul nu este activ. La frecvența de tact de 1 MHz și la o tensiune de alimentare de 3 V procesorul activ consumă 1,1 mA, iar în regim Power-down consumul se reduce la <1μA.

ATmega 16 posedă două unitați timer/numerator de 8 biti si o unitate timer/numerator de 16 biti. Principalele caracteristici ale acestor module sunt:

Posibilitatea de alegere a frecvenței de tact de la intrarea temporizatoarelor (circuit de prescalare)

Posibilitatea de citire/scriere a starii număratoarelor

Generarea de forme de undă prin folosirea unui registru de comparare

Generare de unde PWM cu posibilitatea de reglare a frecvenței

Generarea de cereri de întrerupere la interval regulate

Declanșare la un eveniment extern (captură a intrarii)

2.11 Modulul wireless nRF24L01+

Frecvență canal RF

Frecvența canalului RF determină centrul canalului utilizat de nRF24L01. Canalul ocupă o lățime de bandă de 1MHz la 1Mbps și 2MHz la 2Mbps. NRF24L01 poate funcționa pe frecvențe de la 2,400GHz la 2,525GHz.

La 2Mbps canalul ocupă o lățime de bandă mai mare decât rezoluția de setare frecvență RF. Pentru a asigura spațiu între canale la 2Mbps, ecartul dintre canale trebuie să fie de 2MHz sau mai mult. La 1Mbps banda canalului este același cu rezoluția de setare frecvență RF.

Frecvența canalului RF este stabilită de registrul RF_CH conform urmatoarei formule:

F0= 2400 + RF_CH [MHz]

Un emițător și un receptor trebuie să fie programate cu aceeași frecvență de canal RF pentru a putea comunica între ele.

2.11 Display LCD 20×4

Ecranul LCD Serial permite afișarea de text utilizând doar un singur fir (pe langa firul de alimentare și masă). Acest LCD 20×4 este electric și mecanic interschimbabil cu LCD-uri 20×4 de la mai mulți furnizori. Singurele diferențe care le-am vazut printre diferitele LCD 20×4 sunt:

1. Intensitatea iluminării de fundal LED, tensiunea și curentul variază foarte mult, la fel ca și calitatea ecranului.

2. Există un rezistor "Rf", care definește viteza interfeței LCD prin controlul intern frecvență-oscilator.

Figura 35. Display LCD 20×4

Specificații:

Număr de caractere: 20×4;

Culoare caracatere: alb;

Culoare fundal: albastru;

Viteza: 10 MHz;

Bufer: 80 caractere;

Suportă splash screen.

Figura 36. Schema LCD 20×4

2.11.1 Caracteristici

1. Specificații generale

Tabelul 11. Specificații generale (20×4)

2. Diagrama bloc

Figura 37. Diagrama bloc (LCD 20×4)

3. Maxime absolute

Tabelul 12. Maxime absolute

4. Caracteristici electrice

Tabelul 13. Caracteristici electrice

5. Caracteristici optice

Tabelul 14. Caracteristici optice

6. Sursa de alimentare pentru modulul LCD

Figura 38. Sursa de alimentare pentru modulul LCD 20×4

7. Funcțiile pinilor

Tabelul 15. Funcțiile pinilor

8. Caracteristici de timp

Tabelul 16. Caracteristici de timp

Fig. 1. Segment de timp

Figura 39. Caracteristici de timp, segment de timp

Fig. 2. Timp comun

Figura 40. Caracteristici de timp, timp comun

9. Funcția Reset

Un circuit de resetare intern inițializează automat display-ul atunci când este pornit. Următoarele instrucțiuni sunt executate în timpul inițializării. The busy flag (BF) este păstrat în stare ”ocupat” până când inițializarea este gata (BF = 1). The busy state durează 10 ms după VCC se ridică la 4,5 V.

1. Display clear

2. Function set:

DL = 1; 8 – bit interface data

N = 0; 1 – line display

F = 0; 5 × 8 dot character font

3. Display on/off control:

D = 0; Display off

C = 0; Cursor off

B = 0; Blinking off

4. Entry mode set:

I/D = 1; Increment by 1

S = 0; No shift

2.12 Prezentare software

Display LCD 20×4

//definire variabile pentru comunicația paralelă cu LCD

#define RS 0x01 //pin PC0

#define EN 0x04 //pin PC2

#define RW 0x02 //pin PC1

//PC4, PC5, PC6, PC7

//declarare prototipuri funcții pentru controlul LCD

void lcdcmd(unsigned char Data); //comenzile LCD

void lcdData(unsigned char l); //trimite date către display pentru a fi afișate

void lcdInit(); //inițializare LCD

void gotoXY(unsigned char x ,unsigned char y); //poziționare cursor

void prints(const char *s); //afișare șir caractere pe display

void integerToLcd(int integer); //afișare numar întreg pe display

void clear_lcd(); //curățare totală display

//definirea funcților

void clear_lcd()

{

gotoXY(0,0); prints(" ");

gotoXY(1,0); prints(" ");

gotoXY(2,0); prints(" ");

gotoXY(3,0); prints(" ");

}

void integerToLcd(int integer)

{

unsigned char ten_thousands, thousands,hundreds,tens,ones;

ten_thousands = integer / 10000;

if(ten_thousands > 0)

{ lcdData(ten_thousands + 0x30); }

thousands = (integer%10000) / 1000;

if((thousands == 0) & (ten_thousands == 0))

{ }

else

{lcdData(thousands + 0x30); }

hundreds = (integer%1000) / 100;

if((hundreds == 0) & (thousands == 0) & (ten_thousands == 0))

{ }

else

{lcdData( hundreds + 0x30); }

tens=(integer%100)/10;

if((tens == 0) & (hundreds == 0) & (thousands == 0) & (ten_thousands == 0))

{ }

else

{lcdData( tens + 0x30); }

ones=integer%10;

lcdData( ones + 0x30);

}

void prints(const char *s)

{ while (*s)

{ lcdData(*s);

s++;

} }

void gotoXY(unsigned char x ,unsigned char y)

{

unsigned char yy = 0;

if(y>20)

{

yy = 0;

}

else

{

yy = y;

}

if(x == 0)

{

lcdcmd(0x80 + yy);

return;

}

if(x == 1)

{

lcdcmd(0xC0 + yy);

return;

}

if(x == 2)

{

lcdcmd(0x94 +yy);

return;

}

if(x == 3)

{

lcdcmd(0xD4 + yy);

}

}

void lcdcmd(unsigned char Data)

{

PORTC &= ~RS; //trimite comanda –> RS =

PORTC &=~EN;

PORTC &=~RW;

PORTC &= 0x0f;

PORTC |= ((Data ) & 0xf0);

PORTC &=~RW;

PORTC |=EN;

_delay_ms(1);

PORTC &=~EN;

PORTC &= 0x0f;

PORTC |= ((Data<<4) & 0xf0);

PORTC |=EN;

_delay_ms(1);

PORTC &=~EN;}

void lcdData(unsigned char l)

{PORTC |=RS; //because sending data

PORTC &=~RW;

PORTC &=~EN;

PORTC &= 0x0f;

PORTC |=((l ) & 0xf0);

PORTC &=~RW;

PORTC |=EN;

_delay_ms(1);

PORTC &=~EN;

PORTC &= 0x0f;

PORTC |= ((l<<4) & 0xf0);

PORTC |=EN;

_delay_ms(1);

PORTC &=~EN;}

void lcdInit()

{PORTC &=~RS;

PORTC &=~EN;

PORTC &=~RW;

PORTC |= 0x30;

_delay_ms(40);

PORTC |=EN;

PORTC &=~EN;

_delay_ms(5);

PORTC |=EN;

PORTC &=~EN;

_delay_ms(5);

PORTC |=EN;

PORTC &=~EN;

_delay_ms(2);

PORTC &= 0x20;

PORTC |=EN;

PORTC &=~EN;

lcdcmd(0x28); //set data length 4 bit 2 line

_delay_ms(50);

lcdcmd(0x0E); // set display on cursor on blink on

_delay_ms(50);

lcdcmd(0x01); // clear lcd

_delay_ms(50);

lcdcmd(0x06); // cursor shift direction

_delay_ms(50);

lcdcmd(0x80); //set ram address

_delay_ms(50);}

Modulul wireless nRF24L01+

//definire variabile și portul pentru comunicația SPI cu modulul wireless

#define DDR_SPI DDRB

#define PORT_SPI PORTB

#define CSN PB4

#define MOSI PB5

#define MISO PB6

#define SCK PB7

#define CE PB3

#define IRQ PB2

//definirea comenzilor de bază pentru modulul wireless

#define R_REGSITER 0X00 //Read registers directly address bitwise

#define W_REGSITER 0X20 //write registers Bitwise OR with address

#define R_RX_PAYLOAD 0X61 //read data 1-32 byte From the beginning of 0 bytes

#define W_TX_PAYLOAD 0XA0 //write data 1-32 byte From the beginning of 0 bytes

#define FLUSH_TX 0xe1 //clear TX FIFO regsiters

#define FLUSH_RX 0XE2 //clear RX FIFO regsiters This command should not be used when the transfer acknowledge signal

#define RESUSE_TX_PL 0XE3 //Re-use on a packet of valid data when CE is high, the data packets continually re-launch

#define NOP 0XFF //Empty command is used to retrieve data

//definirea flagurilor din registrul de stări

#define RX_DR 6 //Receive interrupt

#define TX_DS 5 //Send completed interrupt

#define MAX_RT 4 //Retransmission interrupt

#define RECE_DATA_NUM 32 //The maximum amount of receive data

#define TRAN_DATA_NUM 32 //The maximum amount of sending data

#define TxAddNum 5 //Send address width

#define RxAddNum 5 //recive address width

//declararea variabilelor pentru a transmite și primii date

unsigned char TxData[TRAN_DATA_NUM]; //To send data

unsigned char RxData[TRAN_DATA_NUM]; //To recive data

unsigned char TxAdd[TxAddNum]={0XE7,0XE7,0XE7,0XE7,0XE7};

//declararea prototipului funcțiilor pentru comunicația wireless

void SPI_Init(void);

uint8_t SpiRW(uint8_t val);

void RF2401_Init(void);

void Tx_Mode(void);

void Rx_Mode(void);

void Sleep1_Mode(void);

void W_Send_Data(unsigned char send_data_num);

void Read_Rx(unsigned char rece_data_num);

unsigned char Read_IRQ(void);

void Clr_IRQ(unsigned char note);

void read_wifi();

//inițializare modul wireless

SPI_Init(); //initializare comunicatie SPI

sei(); //activare intrerupere

RF2401_Init(); //initialization NRF2401

Rx_Mode(); //setare wireless mod primire

PORT_SPI&=~(1<<CSN);

SpiRW(1|W_REGSITER); //write regsiter 1

SpiRW(0x0); //Prohibit automatic answering

PORT_SPI|=(1<<CSN);

PORTB&=~(1<<CSN);

SpiRW(0x31);

SpiRW(0X20); //Primire date wireless

PORTB|=(1<<CSN);

//declararea funcțiilor

//SPI initialization

void SPI_Init(void)

{

DDR_SPI|=((1<<MOSI)|(1<<SCK)|(1<<CSN)|(1<<CE)); //Set MOSI, SCK, CSN

DDR_SPI&=~((1<<MISO)|(1<<IRQ));

SPCR|=((1<<SPE)|(1<<MSTR));

}

// SPIBasic literacy function

uint8_t SpiRW(uint8_t val)

{

uint8_t temp;

SPDR=val;

while (!(SPSR&(1<<SPIF)))

;

temp=SPDR;

return temp;

}

void RF2401_Init(void)

{

DDR_SPI|=((1<<MOSI)|(1<<SCK)|(1<<CSN)|(1<<CE)); //Set MOSI, SCK, CSN output, the remaining input

DDR_SPI&=~((1<<MISO)|(1<<IRQ));

PORT_SPI|=(1<<CSN);

}

//send mode

void Tx_Mode(void)

{

PORT_SPI&=~(1<<CE);

PORT_SPI&=~(1<<CSN);

SpiRW(0|W_REGSITER); //write regsiters 0

SpiRW(0x12); //Enable all interrupts, crc, 8 crc power-transmission mode

PORT_SPI|=(1<<CSN);

PORT_SPI|=(1<<CE);

_delay_ms(1);

}

//recive mode

void Rx_Mode(void)

{

PORT_SPI|=(1<<CE);

PORT_SPI&=~(1<<CSN);

SpiRW(0|W_REGSITER);

SpiRW(0x13); //Enable all interrupts, crc, 8 crc power-receiving mode

PORT_SPI|=(1<<CSN);

_delay_ms(2);

}

//Standby mode 1

void Sleep1_Mode(void)

{

PORT_SPI&=~(1<<CE);

}

//Write to send data

void W_Send_Data(unsigned char send_data_num)

{

PORT_SPI&=~(1<<CSN);

SpiRW(FLUSH_TX); //Clear TX fifo register

PORT_SPI|=(1<<CSN);

PORT_SPI&=~(1<<CSN);

SpiRW(W_TX_PAYLOAD);//write command

unsigned char i;

for(i=0;i<send_data_num;i++)

{

SpiRW(TxData[i]);

}

PORT_SPI|=(1<<CSN);

}

//Read the received valid data

void Read_Rx(unsigned char rece_data_num)//Enter the number of data to be read

{

PORT_SPI&=~(1<<CSN);

SpiRW(R_RX_PAYLOAD);

unsigned char i;

for(i=0;i<rece_data_num;i++)

{

RxData[i]=SpiRW(NOP);

}

PORT_SPI|=(1<<CSN);

PORT_SPI&=~(1<<CSN);

SpiRW(FLUSH_RX); //

PORT_SPI|=(1<<CSN);

}

//Read interrupt flag

unsigned char Read_IRQ(void)

{

PORT_SPI&=~(1<<CSN);

unsigned char sta;

sta=SpiRW(0X07); //Read the status register

PORT_SPI|=(1<<CSN);

return sta;

}

//Clear the flag

void Clr_IRQ(unsigned char note) //Example£ºCle_IRQ(((1<<tx_dr)|(1<<max_rt)))

{

PORT_SPI&=~(1<<CSN);

SpiRW(0X07|W_REGSITER); //Write status register

SpiRW(note);

PORT_SPI|=(1<<CSN);

}

void read_wifi() //citire date de la wireless si preluarea lor in vectorul Rx_Data

{

if(!(PINB&(1<<IRQ)))

{

unsigned char irq_sta;

irq_sta=Read_IRQ();

if(irq_sta&(1<<RX_DR))

{

Clr_IRQ(1<<RX_DR);

Read_Rx(32);

_delay_ms(1);

}

}

}

Microcontrolerul ATmega16

//înainte de toate, uC a fost programat pentru a fi folosit cu oscilatorul intern de 8 MHz

//Calibration FUSE LOW 0xD4, HIGH 0xD9

// definire frecventă pentru funcția delay

#define F_CPU 8000000UL

// includere biblioteci necesare

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/delay.h>

Senzor lumină

//vectori care stabilesc corespondenta între valoarea citită de ADC de la senzor și nivelul de lumeni afișat

unsigned int read_val_lum[6] = {0, 23, 423, 843, 988, 1023};

unsigned int lumeni[6] = {0, 220, 420, 710, 1360, 2800};

//funcția care conține formula care transformă valoarea citită de ADC de la senzor în nivelul de lumeni afișat

//variabilele lum_ant, lum_ant_ant, lum_ant_ant_ant sunt folosite pentru a face o mediere între valoarea citită

// și valorile de la pasul -1, -2, -3

void cnv_adc_to_light(unsigned int adc_var)

{

unsigned char index_lum = 0;

static float lum_ant = 0, lum_ant_ant = 0, lum_ant_ant_ant = 0;

float lum = 0;

for(index_lum = 1; index_lum < 6; index_lum++)

{

if(adc_var <= read_val_lum[index_lum])

{

lum = (float)((float)(adc_var-read_val_lum[index_lum-1])/((float)(read_val_lum[index_lum]-read_val_lum[index_lum-1])));

lum = lum*((float)(lumeni[index_lum]-lumeni[index_lum-1]))+(float)(lumeni[index_lum-1]);

lum = (lum+lum_ant+lum_ant_ant+lum_ant_ant_ant)/4;

lum_ant_ant_ant = lum_ant_ant;

lum_ant_ant = lum_ant;

lum_ant = lum;

index_lum = 6;

}

}

AI2 = (unsigned int)(lum); //valoare în lumeni obținută se pune în variabila golbală AI2, care urmează a fi împachetată și transmisă pe wireless

}

Senzor temperatură

//vectori care arată corespondența între valoarea citită de ADC de la senzor și nivelul de temperatură afișat

//vectorul cu temperaturile corespondente are elementele de 10x mai mari pentru a putea afișa temperatura cat mai detaliat(o zecimală după virgulă)

unsigned int read_val_S1[15] = {0, 280, 312, 330, 350, 370, 393, 415, 558, 620, 675, 780, 820, 893, 912};

unsigned int S1gC[15] = {0, 150, 180, 200, 210, 230, 260, 280, 370, 460, 500, 600, 700, 1000, 1050};

//vectori care arată corespondența între valoarea citită de ADC de la senzor și nivelul de temperatură afișat

//vectorul cu temperaturile corespondente are elementele de 10x mai mari pentru a putea afișa temperatura cat mai detaliat(o zecimala dupa virgulă)

//momentan sunt aceleași valori dar dupa ce fac caracteristica și la celălalt senzor o sa fie diferite

unsigned int read_val_S2[15] = {0, 280, 312, 330, 350, 370, 393, 415, 558, 620, 675, 780, 820, 893, 912};

unsigned int S2gC[15] = {0, 150, 180, 200, 210, 230, 260, 280, 370, 460, 500, 600, 700, 1000, 1050};

//funcția care conține formula care transformă valoarea citită de ADC de la senzor în nivelul de temperatură afișat

//variabilele temp_ant, temp_ant_ant, temp_ant_ant_ant sunt folosite pentru a face o mediere între valoarea citită

// și valorile de la pasul -1, -2, -3

void cnv_adc_to_gC(unsigned int adc_var1, unsigned int adc_var2)

{

unsigned char index_gc = 0;

static float tempS1_ant = 0, tempS1_ant_ant = 0, tempS1_ant_ant_ant = 0;

static float tempS2_ant = 0, tempS2_ant_ant = 0, tempS2_ant_ant_ant = 0;

float tempS = 0;

for(index_gc = 1; index_gc < 15; index_gc++)

{

if(adc_var1 < read_val_S1[index_gc])

{

tempS = (float)((float)(adc_var1-read_val_S1[index_gc-1])/((float)(read_val_S1[index_gc]-read_val_S1[index_gc-1])));

tempS = tempS*((float)(S1gC[index_gc]-S1gC[index_gc-1]))+(float)(S1gC[index_gc-1]);

tempS = (tempS +tempS1_ant+tempS1_ant_ant+tempS1_ant_ant_ant)/4;

tempS1_ant_ant_ant = tempS1_ant_ant;

tempS1_ant_ant = tempS1_ant;

tempS1_ant = tempS;

index_gc = 15;

}

}

AI4 = (unsigned int)(tempS); //valoare în grade celsius obținută se pune în variabila golbală AI4, care urmează a fi împachetată și transmisă pe wireless

tempS = 0;

for(index_gc = 1; index_gc < 15; index_gc++)

{

if(adc_var2 < read_val_S2[index_gc])

{

tempS = (float)((float)(adc_var2-read_val_S2[index_gc-1])/((float)(read_val_S2[index_gc]-read_val_S2[index_gc-1])));

tempS = tempS*((float)(S2gC[index_gc]-S2gC[index_gc-1]))+(float)(S2gC[index_gc-1]);

tempS = (tempS +tempS2_ant+tempS2_ant_ant+tempS2_ant_ant_ant)/4;

tempS2_ant_ant_ant = tempS2_ant_ant;

tempS2_ant_ant = tempS2_ant;

tempS2_ant = tempS;

index_gc = 15;

}

}

AI5 = (unsigned int)(tempS); //valoare în grade celsius obținută se pune în variabila golbală AI5, care urmează a fi împachetată și transmisă pe wireless

}

Senzor nivel

//vectori care stabilesc corespondența între valoarea citită de ADC de la senzor și nivelul de lumeni afișat

//înca nu sunt gata dar vor fi, urmează a se face măsurători

unsigned int read_val_mm_S[10] = {};

unsigned int mm[10] = {};

//funcția care conține formula care transformă valoarea citită de ADC de la senzor în nivelul afișat

//variabilele mmS_ant, mmS_ant_ant, mmS_ant_ant_ant sunt folosite pentru a face o mediere între valoarea citită

// și valorile de la pasul -1, -2, -3

void cnv_adc_to_mm(unsigned int adc_var1, unsigned int adc_var2)

{

unsigned char index_mm = 0;

static float mmS1_ant = 0, mmS1_ant_ant = 0, mmS1_ant_ant_ant = 0;

static float mmS2_ant = 0, mmS2_ant_ant = 0, mmS2_ant_ant_ant = 0;

float mmS = 0;

for(index_mm = 1; index_mm < 15; index_mm++)

{

if(adc_var1 < read_val_mm_S[index_mm])

{

mmS = (float)((float)(adc_var1-read_val_mm_S[index_mm-1])/((float)(read_val_mm_S[index_mm]-read_val_mm_S[index_mm-1])));

mmS = mmS*((float)(mm[index_mm]-mm[index_mm-1]))+(float)(mm[index_mm-1]);

mmS = (mmS +mmS1_ant+mmS1_ant_ant+mmS1_ant_ant_ant)/4;

mmS1_ant_ant_ant = mmS1_ant_ant;

mmS1_ant_ant = mmS1_ant;

mmS1_ant = mmS;

index_mm = 15;

}

}

AI0 = (unsigned int)(mmS); //valoare în mm obținută se puneîin variabila golbală AI0, care urmează a fi împachetată și transmisă pe wireless

mmS = 0;

for(index_mm = 1; index_mm < 15; index_mm++)

{

if(adc_var2 < read_val_mm_S[index_mm])

{

mmS = (float)((float)(adc_var2-read_val_mm_S[index_mm-1])/((float)(read_val_mm_S[index_mm]-read_val_mm_S[index_mm-1])));

mmS = mmS*((float)(mm[index_mm]-mm[index_mm-1]))+(float)(mm[index_mm-1]);

mmS = (mmS +mmS2_ant+mmS2_ant_ant+mmS2_ant_ant_ant)/4;

mmS2_ant_ant_ant = mmS2_ant_ant;

mmS2_ant_ant = mmS2_ant;

mmS2_ant = mmS;

index_mm = 15;

}

}

AI1 = (unsigned int)(mmS); //valoare în mm obținută se pune în variabila golbală AI1, care urmează a fi împachetată și transmisă pe wireless

}

Senzori numerici

// senzori numerici sunt conectați pe portul C și valoarea acestuia este împachetată direct în mesajul ce urmează a fi transmis pe wireless

// împachetarea se face în funcția write_wifi un se sunt împachetate și celalalte valori

void write_wifi()

{

index_HB++;

TxData[1] = index_HB;

unsigned char irq_sta;

irq_sta=Read_IRQ();

split_uint(AI0);

TxData[2]=high;

TxData[3]=low;

split_uint(AI1);

TxData[4]=high;

TxData[5]=low;

split_uint(AI2);

TxData[6]=high;

TxData[7]=low;

split_uint(AI3);

TxData[8]=high;

TxData[9]=low;

split_uint(AI4);

TxData[10]=high;

TxData[11]=low;

split_uint(AI5);

TxData[12]=high;

TxData[13]=low;

TxData[14]=PINC; //îmapchetarea starii senzorilor numerici

Tx_Mode();

W_Send_Data(32); //transmitere date pe wireless

if(irq_sta&(1<<TX_DS))

{

Clr_IRQ(1<<TX_DS);

}

}

Schema logică pentru sistemul de măsurare

Figura 41. Schema logică pentru sistemul de măsurare

Schema logică pentru sistemul de afișare

Figura 42. Schema logică pentru sistemul de afișare

3. CONCLUZII

Cum am spus și la început, prin realizarea acestui proiect am încercat să pun în practică cât mai multe cunostințe dobândite pe parcursul celor patru ani de facultate.

Cea mai mare provocare încă de la început a fost realizarea fizică a cablajelor, după care comunicația wireless, care a fost foarte greu de realizat, dar și comunicația dintre microcontroler și display.

Avantajele proiectului sunt:

Comunicație radio, datele sunt transferate prin wireless pana la 100 m;

Comapatibilitatea cu mai mulți senzori;

Afișarea corectă a datelor recepționate de senzori;

Interfață de afișare ușor de înțeles;

Consum redus de energie .

În ceea ce privește posibilitatea de dezvoltare a proiectului, pot spune că montarea unui display cu caractere mai bune dar și montarea unor senzori mult mai complecși, pot îmbunătații proiectul.

4. BIBLIOGRAFIE

1. C. Călinoiu. – ”Senzori și traductoare”,vol I, Ed. Tehnica, 2009.

2. A. Ignea. – ”Măsurarea electrică a mărimilor neelectrice”,Ed. de Vest, Timișoara 1996.

3. nRF24L01 Product specification.Pdf.

4. Datasheet-urile componentelor.

5. ATMEL/8-bit AVR/ATmega16.pdf.

5. REFERINTE WEB

1. Facultate.regielive.ro.

2. ro.scribd.com

4. BIBLIOGRAFIE

1. C. Călinoiu. – ”Senzori și traductoare”,vol I, Ed. Tehnica, 2009.

2. A. Ignea. – ”Măsurarea electrică a mărimilor neelectrice”,Ed. de Vest, Timișoara 1996.

3. nRF24L01 Product specification.Pdf.

4. Datasheet-urile componentelor.

5. ATMEL/8-bit AVR/ATmega16.pdf.

5. REFERINTE WEB

1. Facultate.regielive.ro.

2. ro.scribd.com

Similar Posts