Sistem de Supraveghere a Conditiilor de Mediu din Sere Si Stocarea Masuratorilor Intr O Baza de Date
CUPRINS
Listă figuri
Fig. 1 Structura sistemului propus 8
Fig. 2 Implementare parte hardware 9
Fig. 3Schema unui microcontroller[2] 12
Fig. 4 Selecția microcontroller-ului 21
Fig. 5 AVR Studio 22
Fig. 6 AVR Burn-O-Mat- Setări 22
Fig. 7 AVR Burn-O-Mat 23
Fig. 8 USBasp 23
Fig. 9 Configurație pini USBasp 24
Fig. 10 Schema electrică USBasp[7] 25
Fig. 11 Interfața grafică 26
Fig. 12 Baza de date 27
Fig. 13 ATmega328P 28
Fig. 14 Configurația pinilor microcontroller-ului 29
Fig. 15 Diagrama blic ATmega328P 30
Fig. 16 Structura cadrului la USART 31
Fig. 17 Senzorul de temperatură 32
Fig. 18 Senzorul de umiditate HIH-5030 33
Fig. 19 Fotorezistor 34
Fig. 20 Schemă de conectare fotorezistor 34
Fig. 21 Configurația pinilor LM393 36
Fig. 22 Componentele de bază ale unui motor de curent continuu[16] 37
Fig. 23 Configurație pini L293D 38
Fig. 24 Schemă electrică L293D 38
Fig. 25 Conectare L293D în Proteus 39
Fig. 26 Proiectare sistem de încălzire 40
Fig. 27 Oscilator cu cuarț 41
Fig. 28 Diodă elecroluminiscentă 41
Fig. 29 Modulul Bluetooh cu shield 43
Fig. 30 Schemă electrică HC-05 45
Fig. 31 Schema electrică a sistemului 47
Fig. 32 Schemă logică slave 48
Fig. 33 Acționări fotorezistor 49
Fig. 34 Acționări umiditate sol 49
Fig. 35Acționări switch 49
Fig. 36 Acționări temperatură 50
Fig. 37 Interfața grafică-partea de setări 56
Fig. 38 Interfața grafică-grafice 56
Fig. 39 Schemă logică master-home 58
Fig. 40 Schemă logică master-grafice 58
Fig. 41 Setări realizate de un utilizator 59
Fig. 42 Interfță grafică-email invalid 60
Fig. 43 Interfață grafică-praguri nesetate 61
Fig. 44 Achiziții de date 65
Fig. 45 DateTimePicker 67
Fig. 46 Grafic temperatură 68
1 INTRODUCERE
1.1 Generalități
Secolul în care trăim astăzi este un secol al vitezei, al lucrurilor care se modifică cu o rapiditate de neimaginat. Este secolul în care oamenii trebuie sa țină pasul cu noile descoperiri care, în majoritatea cazurilor ușurează mult munca oamenilor. Comunicațiile de date, cunosc o dezvoltare continuă și se adresează nevoilor oamenilor de comunicare, având posibilitatea de a pătrunde în orice mediu, cu condiția să existe metode acceptabile de transmisie a datelor. Tehnicile wireless de comunicare (Bluetooth pentru comunicarea între diferite echipamente, WiFi pentru Internet) sunt de preferat în fața rețelelor cablate, mai ales în locurile în care folosirea cablajului nu este posibilă sau este greu de realizat.
Sistemele de achiziții de date au cunoscut o dezvoltare impresionantă de-a lungul anilor, și ocupă, de asemenea, un rol important în procesele de automatizare. Procesul de achiziție de date reprezintă o ramură a ingineriei care se ocupă cu colectarea informației de la un număr de surse numerice și/sau analogice, convertirea acestor date într-o formă digitală, prelucrarea, stocarea și transmiterea datelor, de exemplu la un computer/laptop printr-o interfață grafică, afișaj alfanumeric, etc.
În acest domeniu s-au realizat descoperiri uimitoare de-a lungul anilor care se reflectă în ziua de astăzi prin construirea și folosirea unor sisteme de măsurare cât mai performante, mai precise și mai flexibile care ușurează semnificativ munca unui operator uman. Această prelucrare a datelor se realiza exclusiv sub formă analogică în urmă cu câțiva ani, dar cu cât sistemele au devenit mai rapide și mai complexe se impune stocarea lor într-o formă digitală. Scopul acestei cerințe este ca datele să fie prelucrate de către un computer care are avantajul că poate citi mai multă informație și are capacitatea de a o prelucra mult mai rapid, în comparație cu un operator uman. Controlul în timp real a datelor și luarea unor decizii pe baza acestora reprezintă un al scop al sistemelor de achiziții de date.
Funcțiile cele mai importante pe care trebuie să le poată realiza un sistem de achiziție sunt următoarele:
Convertirea fenomenului fizic într-un semnal care poate fi măsurat;
Posibilitatea de măsurarea a semnalelor generate de senzori/traductori pentru a obține o informație;
Prezentarea datelor într-o formă utilizabilă și eventual analiza acestora;[1]
În procesul de achiziții de date în timp real un rol semnficativ îl au senzorii, fără de care procesul de automatizare nu ar mai exista. Senzorii sunt dispozitive care reacționează calitativ sau cantitativ prin propriile mărimi măsurabile, la anumite proprietăți fizice sau chimice ale mediului de care ei aparțin. Aceștia pot măsura diferiți parametrii: umiditatea, temperatura, accelerația, intensitatea sonoră, intensitatea luminoasă, etc.
Pe lângă partea de achiziții de date citite de la senzori în cele mai multe cazuri există o parte de control al datelor care au fost citite, parte care permite luarea unor decizii conform cu cerințele utilizatorului. Pe piață există deja implementate, în diferite domenii de activitate, sisteme care se ocupă de procesul de achiziție de date și automatizare. Unul dintre exemple poate fi un sistem de control automat al temperaturii, umidității solului și intensității luminoase în domeniul industrial. Sistemele de climatizare în domeniul industrial sunt utilizate pentru îmbunătățirea condițiilor de microclimat interior sau pentru atingerea anumitor parametri de stare a aerului interior care să fie cât mai apropiate de condițiile de comfort termic cerute. La ora actuală există diverse sisteme de climatizare folosite în domeniul industrial, în sere, silozuri, în camere de servere, etc.
Utilitatea practică a acestora este evidentă nemaifiind necesară prezența operatorului uman în procesele de măsurare a parametrilor și nici în procesele de luare a unor decizii. Totul se bazează pe automatizare în funcție de parametrii care au fost setați, existând și sisteme de alarmă în cazul depășirii unor valori de prag. Operatorul uman poate fi anunțat prin diverse moduri: email, mesaj pe telefon cu privire la starea sistemului.
Sistemele de achiziții de date automate sunt controlate de către dispozitive externe, cum ar fi calculatoare/laptop-uri sau sisteme cu microprocesor. Conectarea instrumentelor cu un calculator/laptop se poate face prin intermediul intefeței RS-232, prin Bluetooth, WiFi. Practic, intervenția operatorului uman în acest proces este redusă, acesta având doar posibilitatea de a porni și opri sistemul de măsurare, precum și introducerea diferitelor praguri pentru luarea unor decizii. Acest mod de achiziții de date prezintă o serie de avantaje, precum: comunicarea cu calculatorul/laptop-ul se face pe distanțe mari, fără ca informația sa aibă de suferit; operațiile de măsurare au loc cu o rapiditate mare; posibilitatea de a controla parametrii mediului; creșterea preciziei de măsurare, ca urmare a eliminării erorilor datorate operatorului uman.[1]
Domeniul colectării de date și de prelucrare ulterioară a acestora reprezintă o ramură importantă pentru sistemele de achiziții de date. Stocarea datelor într-o bază de date folosind o aplicație dezvoltată într-un limbaj de programare, satisface cerințele de prelucrare a datelor, furnizând statistici, rezultate comparative sau grafice privind evoluția în timp.
1.2 Tema proiectului
Aceast proiect îmbină partea hardware cu cea software în realizarea unui sistem de achiziții de date în timp real. Scopul proiectului este acela de a monitoriza și contoriza informațiile primite de la patru senzori: de temperatură, umiditate, umiditate sol și de lumină, informații care apoi vor fi transmise mai departe la un sistem de operare (laptop/PC) folosind conexiunea bluetooth. Utilizarea modulului bluetooth în implementarea acestui proiect ușurează munca utilizatorului, întrucât comunicația wireless elimină necesitatea folosirii unei interfețe separate de transmitere a datelor și a unui cablu de conectare. S-a ales ca implementarea practică a micului sistem de achiziții de date să fie realizată într-un mediu în care parametrii menționați anterior joacă un rol important, și anume într-o seră. Orice seră trebuie să asigure o monitorizare atentă și permanentă, un control optim al parametrilor care contribuie la creșterea în condiții normale a plantelor. Astfel, pe baza datelor achiziționate se va realiza un sistem de control automat al temperaturii, umidității solului și al intensității luminoase.
Conținutul proiectului se bazează pe proiectarea sistemului și a funcțiilor caracteristice ale acestuia, și pe proiectarea părții hardware pornind de la schema electrică. De asemenea, implementarea funcțiilor prin software este realizată și explicată prin prezentarea a unor părți de bază din cod. Este urmărită prelevarea informațiilor de la senzori, informații care vor fi stocate într-o bază de date. Prin intermediul unei interfețe grafice realizate în limbajul de programare C# vor fi afișate datele respective la anumite intervale de timp. Pe baza acestora vor fi realizate grafice, determinări privind valoarea minimă și maximă dintr-o zi cu ajutorul datelor stocate în MySql.
La depașirea unor valori de prag ale temperaturii (optime pentru creșterea în condiții normale a plantelor, valori setate de către utilizator ) va porni automat un sistem de încălzire/ventilare. Este binecunoscut faptul că plantele au nevoie de lumină pentru a crește, de aceea controlul automat al unei surse de lumină (în acest caz un LED) este mai mult decât necesar într-o seră. Un sistem de irigare este necesar pentru a uda plantele atunci când umiditatea solului nu se încadrează în parametrii doriți. Un senzor on/off (switch) oferă informații despre starea ușii, deschisă înseamnă on, iar închisă off. Toate aceste măsurători sunt trimise la PC/laptop cu o periodicitate aleasă de operatorul uman.Prin intermediul aplicației utilizatorul are posibilitatea să-și introducă adresa de email pentru a fi anunțat cu privire la eventualele evenimente neplăcute care pot apărea în funcționarea normală a sistemului.
Schema generală a proiectului:
În continuare este prezentată schema bloc a sistemului care include toate componentele hardware care sunt utilizate în proiectarea acestuia.
Senzo
În schema bloc se observă prezența microcontroller-ului care furnizează informații la nodul master. Pe lângă echiparea acestuia cu modulul Bluetooth necesar transmisiei datelor, acesta mai conține o serie de senzori, un sistem de ventilare, respectiv încălzire și un sistem
de irigare. LED-ul are rol în reglarea intensității luminoase. Datele preluate de la microcontroller sunt transmise de către acesta către un PC/laptop prin intermediul conexiunii Bluetooth. Astfel, pe display-ul monitorului se pot afișa datele recepționate, existând și posibilitatea de a realiza un grafic cu datele captate dintr-o anumită zi. Comunicația între master și slave se realizeză prin Bluetooth, ceea ce permite plasarea acestora pe o distanță de până la 10m.
1.3 Structura proiectului
Acest proiect poate fi structurat în două mari componente, atât din punct de vedere hardware cât și din punct de vedere software. Aceste două componente sunt:
Interfața cu utilizatorul
Componente hardware:
Laptop/PC
Componente software:
Aplicație creată în C#
Baze de date MySql
Sistem de monitorizare și control a temperaturii, umidității solului și a intensității luminoase:
Componente hardware:
Microcontroller ATmega328P
Modul Bluetooth HC-05
Senzor temperatură
Senzor umiditate
Fotorezistor
Senzor umiditate sol
Senzor on/off (switch)
Motor de curent continuu 5V (ventilator)
Motor de curent continuu 5V (pompă apă)
L293D
Rezistențe
LED
Oscilator cu cuarț
Componente software:
Limbaj de programare C
2 FUNDAMENTE TEORETICE
2.1 Microcontroller-e
2.1.1 Scurtă introducere
Având în vedere evoluția din punct de vedere istoric a operației de comandă a unui proces putem contura imaginea unui microcontroller. Se poate afirma că un microcontroller este un sistem utilizat în speță pentru a comanda și a prelucra stări de la un proces sau de la diferite aspecte din mediul înconjurător. Dimensiunile controller-elor erau foarte mari la început, dar odată cu dezvoltarea microprocesoarelor dimensiunile acestor echipamente s-au redus. Procesul de reducere a dimensiunilor s-a extins, astfel că toate componentele unui controller au fost integrate pe același chip. În acest mod a luat naștere calculatorul pe un singur chip, microcontroller-ul care este specializat pentru implementarea operațiilor de control. [2]
În sens larg, un controller se referă la o structură electronică realizată pentru a putea controla un proces sau, o interacțiune cu mediul exterior, nefiind necesar ca operatorul uman să intervină. La inceput pentru realizarea controler-elor se foloseau tehnologii pur analogice, utilizandu-se componente electromecanice și/sau componente electronice.
Microcontroller-ele care fac referire la tehnica numerică modernă au fost realizate inițial pe baza logicii cablate (cu circuite integrate numerice standard SSI (Small Scale Integration- care au aproximativ 10 porți) și MSI (Medium Scale Integration-între 10 și 100 porți)) și a unei electronici analogice uneori complexe, dezavantajele fiind dimensiunile mari, consumul energetic pe măsură și, din păcate, o fiabilitate care lăsa de dorit.[3]
Avantajele folosirii unui controller într-o aplicație fac referire la reducerea semnificativă a numărului de componente electronice precum și reducerea costului proiectării și dezvoltării unui produs .
2.1.2 Aspecte generale ale unui microcontroller
Microcontroller-ul este un calculator ce include un microprocesor fiind destinat aplicațiilor de control și nu calcului de uz general. Numele dispozitivului este sugestiv astfel, cuvântul „micro” se referă la dimensiunea redusă a chip-ului, iar controller indică faptul că acest dispozitiv este proiectat pentru aplicații de control a unor evenimente, obiecte. Scopul proiectării microcontroller-elor este de a obține o dimensiune redusă a chip-ului, reducerea costurilor și includerea de spațiu de memorie și I/O pe chip.
Un microcontroller conține în același circuit integrat cel puțin:
UCP
memorie
I/O
Orice aparat pe care îl utilizăm astăzi are integrat în el un microcontroller. Se poate deduce faptul că aparatele pe care le utilizăm și care realizează cel puțin una din operațiile de comandă, afișare informații sau stocare conțin un microcontroller. Un exemplu la îndemână este un automobil care are integrat cel puțin un microcontroller pentru comanda motorului mașinii sau pentru a comanda alte sisteme din interiorul autovehiculului. Printre exemple se numară și calculatoarele în care microcontroller-ele se găsesc în tastatură, imprimante și alte periferice. [2]
Schema generală simplificată a unui microcontroller este redată în figura 2. După cum se poate observa din figură, pentru funcționarea unui microcontroller sunt necesare programe care se stochează în memoria sa proprie. Acest sistem de calcul include o unitate centrală, oscilator pentru tact, memorie și dispozitive de intrare-ieșire. Intrările pot fi analogice sau digitale, de regulă semnalele provenind de la diferiți senzori sau de la comutatoare. Ieșirile sunt de obicei diode cu LED, motoare, relee, etc.
Microprocesoarele sunt utilizate în PC-uri, laptop-uri, servere, unde flexibilitatea, compatibilitatea software și performanța sunt criterii care trebuie îndeplinite. Spre deosebire de microprocesoare, microcontroller-ele sunt specializate pe aplicații în dauna flexibilității. Minimul de resurse necesare pe care ar trebui să le includă un microcontroler sunt următoarele:
o unitate centrală (UCP), cu un oscilator intern pentru ceasul de sistem
o memorie locală tip ROM/PROM/EPROM/FLASH (eventual și una de tip RAM)
un sistem de întreruperi
I/O – intrări/ieșiri numerice (de tip port paralel)
un port serial de tip asincron și/sau sincron, programabil
un sistem de temporizatoare/numărătoare programabile
Este posibil ca la acestea să fie adăugate, la un preț de cost avantajos, caracteristici specifice sarcinii de control care trebuie îndeplinite:
un sistem de conversie analog-digitală (una sau mai multe intrări analogice)
un sistem de conversie digital analogic și/sau ieșiri PWM (cu modulare în durată)
un comparator analogic
o memorie de date nevolatilă de tip EEPROM
un ceas de gardă (timer de tip watchdog)
facilități pentru optimizarea consumului propriu [2]
2.1.3 Arhitectura unui microcontroller
Microcontroller-ul este un caz particular de calculator (specializat pentru operații I/O, realizat pe un singur chip) și conține cinci componentele de bază: unitate de control, unitate aritmetică și logică, unitate de memorie, unitate de intrare și unitate de ieșire(system I/O).
Unitatea centrală de prelucrare (UCP) este compusă din unitatea de control și unitatea aritmetică și logică. Sarcina efectuării operațiilor aritmetice și logice asupra operanzilor îi revine unității aritmetice și logice. Utilizatorul nu cunoaște modul de implementare al operațiilor, important pentru utilizatorul de microcontroller este repertoriul operațiilor implementate pentru a aprecia posibilitatea implementării optime a aplicației particulare de control. Decodificarea codului operației conținut de codul unei instrucțiuni cade în sarcina unității de control. UCP conține un set de regiștrii interni, care sunt folosiți pentru memorarea unor date apelate în mod frecvent sau pentru programarea unor funcții. Fiecare familie de MCU utilizează seturi diferite de registre, dar există și o serie de registre comune:
A (Acumulator)- rolul acestuia este de a stoca un operand și rezultatul unei operații
PC (Program Counter)- este registrul în care se stochează adresa următoarei instrucțiuni de executat
SP (Stack Pointer)- acest registru conține adresa curentă a stivei. Stiva reprezintă o zonă de memorie în care sunt stocate temporar informații importante în desfășurarea programului.[2]
O altă caracteristică importantă în arhitectura unui MCU este modul de programare. Cu cât structura, funcționalitatea și accesul la resurse sunt mai bine standardizate și concepute, cu atât numărul de instrucțiuni de care dispune MCU este mai redus și viteza de execuție a programelor crește. Majoritatea MCU sunt construite pornind de la conceptul CISC (Complex Instruction Set Computer) care prevede existența unui număr mare de instrucțiuni (>80). Acest număr mare de instrucțiuni vin în ajutorul programatorului, înlesnindu-i munca.
Arhitectura RISC (Reduced Instruction Set Computer), care prevede un număr mic de instrucțiuni, reprezintă direcția înspre care se îndreaptă MCU-urile. Avantajele sunt: dimensiunea redusă a chip-ului, numărul mai mic de pini, viteza mai mare. Instrucțiunile sunt simetrice, adică pot fi folosite la fel în orice mod de adresare sau cu orice registru, nu au excepții sau restricții.[2]
Un microcontroller utilizează diferite tipuri de informații, care sunt păstrate în diferite tipuri de memorii. O memorie nevolatilă, unde informațiile se păstrează și după oprirea și repornirea sursei de alimentare este necesară pentru stocarea informațiilor care sunt răspunzătoare de funcționarea microcontroller-ului. Memoria volatilă are scopul de a păstra rezultatele intermediare și variabilele, iar la acest tip de memorie este important să se poată realiza scrierea /citirea rapid și simplu în timpul funcționării.
Tipuri de memorii:
Memoria RAM (Random Access Memory) este un tip de memorie volatilă, putând fi citită sau scrisă de unitatea centrală. Ocupând mult loc pe chip, costurile de implementare cresc și astfel un MCU include de obicei puțin RAM.
Memoria ROM (Read Only Memory) este cea mai simplă memorie, accesibilă la un preț avantajos și este utilizată la stocarea programelor în faza de fabricație. În acest caz, unitatea centrală are posibilitatea de a citi informațiile, dar nu le poate modifica.
Memoria PROM (Programmable Read Only Memory) este asemănătoare cu memoria ROM, dar cu deosebirea că poate fi programată de către utilizator. În funcție de posibilitățile de ștergere, ea se împarte în mai multe tipuri:
Memoria EPROM (Erasable PROM) care oferă posibilitatea de ștergere prin metoda expunerii la razele ultraviolete. Permite ștergerea întregii informație, nu doar anumite fragmente. Memoria poate fi ștearsă și reînscrisă de un număr finit de ori.
OTP (One Time Programmable PROM) este utilizată pentru mai multe tipuri de MCU. În principiu, o astfel de memorie, este de fapt o memorie EPROM, al cărui chip a fost încapsulat într-o capsulă de material plastic fără fereastră, care este mult mai ieftină. Dezavantajul acetei memorii este că nu se poate șterge sau reprograma.
Memoria EEPROM (Electrically Erasable Programmable Read Only Memory) permite ștergerea electrică a informațiilor de către unitatea centrală. Ștergerea poate fi făcută pe fragmente, adică permite ștergere selectivă.
Memoria FLASH este o memorie asemănătoare EPROM și EEPROM prin prisma faptului că poate fi ștearsă și reprogramată în sistemul în care este folosită (fără a fi necesar un sistem dedicat). [2]
Dispozitivele I/O reprezintă un aspect de mare interes atunci când intră în discuție microcontroller-ele, interes rezultat din însăși particularitatea unui MCU: aceea de a interacționa cu mediul în procesul de control pe care îl conduce. Aceste dispozitive permit operații generale de comunicație (transfer paralel sau serial de date), operații de conversie analog/numerică, funcții generale de timp, iar lista poate continua. Modulele de I/O pot fi serial sau paralele.
Magistrala internă (bus) leagă între ele componentele microcontroller-ului. Pe magistrală se vehiculează semnale de adresă, semnale de date și semnale de control. Performanța unui microcontroller este determinată și de mărimea magistralelor. Cu ajutorul magistralei de adrese unitatea centrală de prelucrare (UCP) selectează o locație de memorie sau un dispozitiv I/O, iar magistrala de date întreține schimbul de date între UCP și memorie sau dispozitivele I/O. Între UCP și memorie se transferă atât date cât și instrucțiuni (se pot transfera pe o singură magistrală de date sau pe magistrale de date distincte). În acest sens sunt definite două arhitecturi: arhitectura von Neumann în care se utilizează un bus unic pentru circulația datelor și a instrucțiunilor și arhitectura Harvard în care există un bus separat pentru circulația datelor și a instrucțiunilor. La primul tip de arhitectură accesul este mai lent, pe când la arhitectura Harvard performanțele de viteză sunt mai mari, dar și structura acestei arhitecturi este mai complexă. [2]
2.1.4 Aplicații ale microcontroller-elor
Microcontrollerele au un spectru larg de utilizări, aplicațiile în care acestea sunt integrate fac parte din categoria așa numitelor “embedded systems” (sisteme încapuslate). În acest caz existența unui sistem integrat/încorporat este aproape transparentă pentru utilizator.
Aplicațiile în care aceste microcontrollere sunt utilizate sunt multiple, printre domenii enumerându-se:
industria de automobile (controlul aprinderii/motorului, climatizare, diagnoză, sisteme de alarmă, etc.)
electronică de consum (sisteme audio, televizoare, camere video și videocasetofoane, telefonie mobilă, etc.)
aparatura electrocasnică (mașini de spălat, frigidere)
controlul mediului și climatizare (sere, locuințe, hale industriale)
industria aerospațială
mijloacele moderne de măsurare – instrumentație (aparate de măsură, senzori și traductoare inteligente)[2]
2.1.5 Familii de microcontrollere
Microcontroller-ele sunt produse într-o mare diversitate în care există totuși elemente comune. Prin utilizarea unui nucleu comun au fost definite de-a lungul anilor mai multe familii de microcontroller-e. Toți membrii unei anumite familii de microcontroller-e folosesc același nucleu care este constituit dintr-o unitate centrală și o serie de periferice și interfețe. Din punct de vedere al programatorului, toți membrii unei familii folosesc același set de instrucțiuni, permit aceleași moduri de adresare și folosesc aceleași registre. Diferențele care apar între membrii unei familii se referă în primul rând la echiparea chip-ului cu memorie (tipul de memorie utilizat și la capacitatea memoriei), la frecvența de clock folosită pentru UCP față de cel mai simplu reprezentant al familiei. Modul de conectare a semnalelor la pin, tipul capsulei circuitului integrat subliniază o altă diferență între membrii unei familii. Cele mai importante familii de microcontroller-e sunt prezentate în continuare fiind luate în considerare însușirile lor caracteristice:
INTEL 4048 cu o structură Harvard modificată, a fost primul microcontroller apărut pe piața, astăzi fiind utilizat în multe aplicații datorită prețului său redus.
INTEL 8051 (MCS-51) reprezintă a doua generație de microcontroller-e pe 8 biți a firmei Intel și, la ora actuală pe piață, este familia care se vinde cel mai bine. I8051 are o structură Harvard modificată cu spațiu de adresare diferit pentru program și date. Acest tip de microcontroller folosește un procesor boolean prin care se pot realiza operații complexe la nivel de bit, iar în funcție de rezultate se pot face salturi.
INTEL 80C196 (MCS-96) este un microcontroller pe 16 biți care admite un tact până la 50MHz și reprezintă a treia generație de microcontroller-e produsă de compania Intel. Are o arhitectură von Neumann, conține blocuri aritmetice pentru înmulțire și împărțire, lucrează cu șase moduri de adresare, convertor analog numeric, generator PWM și timer watchdog.
INTEL 80186 și 80188 sunt microcontroller-e propuse de Intel ca versiuni ale popularelor microprocesoare 8086 și 8088 care au fost integrate în primele calculatoare IBM PC XT. Provenind din clasele 8086/8088 ele conțin pe același chip două canale DMA, două număratoare(timere), un sistem de întreruperi și un bloc de refresh pentru memoria RAM. Un avantaj al utilizării acestor microcontroller-e este că se pot folosi unelte de dezvoltare, precum compilatoare, asambloare de la PC-uri. Spațiul mare de adresare specific PC-urilor reprezintă un alt mare avantaj.
MC14500 a fost primul microcontroller realizat de Motorola. Caracteristicile acestuia erau: capsulă de 16 pini(mică), 16 instrucțiuni, arhitectură RISC cu calea de date de un bit.
Motorola 6805 se bazează pe procesorul 6800 și are o arhitectura von Neumann, așadar are un singur bus pentru circulația datelor și a instrucțiunilor. O parte din microcontroller-ele din această familie conțin convertoare A/D, canale seriale și sintetizatoare de frecvență cu buclă PLL.
Motorola 68HC11 este un microcontroller cu o arhitectură von Neumann, având 8 biți de date și 16 biți de adresă. Conține memorie EEPROM sau OTP, linii digitale I/O, numărătoare/temporizatoare, convertoare A/D, canale seriale de comunicații sincrone și asincrone.
PIC(MicroChip) fac parte din categoria microcontroller-erelor cu arhitectură RISC fiind primele aparute. Numărul de instrucțiuni este redus semnificativ în comparație cu microcontroler-ele 8048(33 instrucțiuni față de 90). Consumul redus, viteza mare, prețul mic și dimensiunea redusă a chip-ului au impus MC PIC pe piață. Există trei linii de astfel de microcontroller-e: low range, middle range și high range(acestea se diferențiază prin lungimea cuvântului de programare și prin alte beneficii legate de structură).
COP400 (NationalSemiconductor) este un microcontroller pe 4 biți integrat în capsule de 20-28 pini unde tensiunile de alimentare sunt cuprinse în intervalul 2,3V-6,0V.
COP800 (NationalSemiconductor) este un microcontroller pe 8 biți care este înzestrat cu MICROWIRE, UART, RAM, ROM, sistem de întreruperi, comparator, ceas de gardă, generator PWM, convertor analog/numeric cu 8 canale de prescalare, mod de așteptare și HALT, un trigger Schmitt și oferă protecție la scăderea tensiunii de alimentare.
HPC (NationalSemiconductor) sunt microcontroller-e de mare performanță pe 16 biți și cu o arhitectură von Neumann. Se diferențiază prin canale seriale HDL(High Level Data Link Control) și elemente DSP (Digital Signal Processor), la o tensiune de alimentare de 3,3V. Aceste tipuri de microcontroller-e își găsesc utilizarea în domeniul telecomunicațiilor, imprimate laser, hard discuri și aplicații militare.
AVR sunt microcontroller-e care au la bază un procesor RISC cu o arhitectură Harvard. Pe baza acestui nucleu compania Atmel a dezvoltat mai multe familii de microcontroller-e cu diferite structuri de memorie și de interfețe I/O destinate diferitelor clase de aplicații.[2]
2.2 Senzori
2.2.1 Scurt istoric
Noțiunea de senzor a apărut odată cu dezvoltarea microelectronicii, împreună cu alte noțiuni de mare impact, printre care cea de “microprocesor”, ”actuator” și “microcontroller”. Odată cu evoluția complexității sistemelor automatizate de producție sunt necesare folosirea unor componente care să poată să transmită și să recepționeze informații referitoare la procesul de producție. Aceste informații sunt primite, prelucrate și transmise mai departe de către senzori. Senzorii au un rol important în controlul proceselor tehnologice, fără ei se poate afirma că nu ar exista automatizare.
Denumirea de senzor provine din limba latină de la “sensus=simț”, care face referire la simț și care înainte de a fi utilizat în domeniul tehnic, a fost și încă este utilizat pentru a desemna capacitățile organelor de simț ale organismelor și a organelor vii. Senzorul are capacitatea de a sesiza (simți) un anumit fenomen, de a recepționa și a răspunde la un stimul fizic. Este dispozitivul de la intrarea sistemului de măsurare. [4]
Senzorul este un dispozitiv care atunci când este expus unui fenomen fizic (temperatură, deplasare, forță, etc.) produce un semnal de ieșire proporțional (electric, mecanic, magnetic, etc.) .În esență, senzorul este un dispozitiv care răspunde la variația unui fenomen fizic. [4]
2.2.2 Clasificare senzori
În ziua de astăzi sunt utilizați senzori pentru mai mult de 100 de mărimi fizice, iar în cazul în care se iau în considerare și senzorii pentru diferite substanțe chimice, numărul acestora crește considerabil. Senzorii au devenit componente electronice omniprezente, fiind răspândiți în foarte multe domenii, la ora actuală prea puține fiind domeniile în care aceștia nu se utilizează.
Criteriile de clasificare a senzorilor sunt numeroase, din acest motiv se vor enumera câteva din cele mai importante:
Clasificare după tipul mărimii fizice de intrare
Senzori absoluți, la care semnalul electric de la ieșire conține toate valorile mărimii fizice de la intrare
Senzori incrementali, la care fiecare valoare măsurată reprezintă originea pentru următoarea, din pricina faptului că nu se poate stabili o origine pentru toate punctele din cadrului domeniului de măsurare
Clasificare în funcție de tipul mărimii de ieșire
Senzori analogici, la care semnalul de ieșire este proporțional cu mărimea fizică de la intrare
Senzori digitali, la care semnalul de ieșire poate lua un număr limitat de valori discrete, valori care permit cuantificarea semnalului de la intrare
Senzori logici (binari)
Clasificare după tipul semnalului specific senzorului
Mecanici
Electrici
Optici
Clasificare după natura mărimii de intrare
Accelerație
Deplasare
Temperatură
Umiditate
Debit
Presiune
Lumină
Clasificare după natura mărimii de ieșire
Rezistivi
Inductivi
Capacitivi
Clasificare în funcție de domeniul de aplicabilitate
Automotive
Robotică
Medicină
Agricultură
Industria militară [4]
2.3 Convertoare analog-numerice
Sistemele de achiziții de date sunt circuite complexe, al căror rol este de a realiza conversia analog-numerică a unuia sau mai multor semnale analogice în scopul memorării, transmiterii la distanță, prelucrării sau vizualizării ulterioare a acestora.
Lumina, căldura, sunetul sunt semnale analogice care fac parte din lumea înconjurătoare. Aceste semnale trebuie convertite în valori numerice discrete pentru a putea fi măsurate într-un sistem de calcul digital. Comunicarea dintre lumea exterioară și microcontroller nu se poate realiza folosind canale digitale care au două nivele de tensiune. Senzorii, de la care datele sunt preluate sub formă analogică (adică fiecărui nivel de tensiune îi corespunde o anumită valoare) se află în această situație. În acest context, utilizarea porturilor digitale nu este posibilă pentru citirea valorilor analogice. Pentru a facilita prelucrarea digitală a datelor provenite de la surse analogice se utilizează convertoare.
Un convertor analog-numeric/digital reprezintă un dispozitiv electronic care convertește o tensiune analogică de la intrare într-o valoare digitală. Un astfel de convertor analog-numeric transformă un interval în care mărimea analogică de la intrare poate avea o infinitate de valori, într-o mulțime finită de valori. Procesul de conversie presupune compararea tensiunii analogice de la intrare Ui cu o tensiune de referință Uref , rezultatul fiind un număr subunitar N, care aproximează raportul Ui/ Uref.
Una din caracteristicile de bază ale unui convertor analog-digital o reprezintă rezoluția sa. Rezoluția unui astfel de circuit electronic indică numărul de valori discrete pe care convertorul poate să le furnizeze la ieșirea sa. Întrucât, de cele mai multe ori, rezultatele conversiei sunt stocate sub formă binară, rezoluția unui convertor analog-digital este exprimată în biți. De exemplu, daca rezoluția unui convertor este de 8 biți atunci el poate furniza 2^8 = 255 valori diferite la ieșire.
O altă caracteristică importantă a unui convertor analog-digital o reprezintă rata de eșantionare. Aceasta depinde de timpul dintre două conversii succesive și afectează modul în care forma de undă originală va fi redată după procesarea digitală. Teorema lui Nyquist spune că este necesară o rată de cel puțin două ori mai mare decât frecvența semnalului măsurat pentru a reproduce fără pierderi un semnal de o frecvență dată.
Datorită elementelor pasive și active din structura dispozitivului, convertoarele analog-digitale introduc erori instrumentale și eroarea de de cuantizare. Timpul de conversie Tc, care reprezintă intervalul de timp dintre momentul aplicării semnalului analogic la intrarea convertorului și momentul obținerii rezultatului final sub formă digital, caracterizează regimul dinamic al convertoarelor analog digitale.
În prezent există o mare varietate de convertoare analog-digitale. Acestea sunt folosite pe scară largă în măsurările electronice și în sistemele de măsurare electrică sau electronică. Decizia de a lucra cu un tip sau altul de convertor se face pornind de la cerințele pe care aplicația le impune (viteză, precizie, cost). [5]
Convertoarele utilizate în instrumentele de măsură pot fi clasificate în două categorii:
Convertoare analog-numerice integratoare. Aceste tipuri de CAN sunt lente, precise și ieftine
Convertoare analog-numerice neintegratoare. Ele sunt mult mai rapide decât cele integratoare, de aceea sunt și mai scumpe. În schimb sunt mai puțin precise, fiind utilizate în aplicațiile în care viteza este o cerință de bază. Aceste tipuri de convertoare pot fi împărțite la rândul lor în CAN neintegratoare:
b’) cu reacție
Cu numărare
Cu urmărire
Cu rampă în trepte
Cu aproximări succesive
b”) fără reacție
Paralel
Serie
Paralel-Serie
Cu rampă liniară [5]
3 UTILITARE SOFTWARE UTILIZATE
Pentru dezvoltarea proiectului, pe partea software s-au folosit atât ustensile pentru programarea microcontroller-ului, cât și pentru realizarea unei interfețe grafice care să fie ușor de utilizat de către operatorul uman.
3.2.1 Programarea microcontroller-ului
Programarea microcontroller-ului s-a realizat folosind următoarele programe software:
Mediu de dezvoltare: Atmel Studio 6.2
Încarcarea programului pe chip folosind AVR Burn-O-Mat
Pe partea hardware pentru realizarea transferului programului în memoria microcontroller-ului se utilizează programatorul USBasp.
3.2.1.1 Atmel Studio 6.2
Atmel Studio 6.2 oferă un spațiu de dezvoltare ușor de utilizat și un set de librării bogate. Această versiune este succesorul versiunii anterioare AVR Studio 5. Este o platformă pentru dezvoltarea și depanarea procesoarelor Atmel ARM și a microcontroller-elor Atmel AVR. Atmel Studio 6.2 pune la dispoziție un mediu de dezvoltare ușor de utilizat pentru a scrie, a construi și depana aplicații dezvoltate în diferite limbaje de programare. Este un tool interactiv, cu o interfață userfriendly și spre deosebire de alte compilatoare poate fi descărcat gratuit, iar instalarea este destul de simplă. Suportă toate microcontrollerele AVR, pe 8 sau 32 biți, noua familie Soc wireless și microcontrollerele SAM3, SAM4 și SAM D20.
Caracteristicile acestui mediu de dezvoltare sunt prezentate pe scurt în cele ce urmează:
Este un mediu de dezvoltare integrat pentru AVR software
Suportă întreaga familie de microcontroller-e AVR
Oferă o interfață ușor de utilizat și o vedere de ansamblu completă
Utilizează aceeași interfață pentru simulare și emulare
Suportă atât procesoarele Atmel AVR cât și ARM
Oferă peste 1100 exemple de cod
Aplicațiile pot fi scrise în C, C++ sau în limbaj de asamblare
Cerințe de sistem
Sisteme de operare suportate:
Windows XP (x86)
Windows Vista (x86 și x64)
Windows 7 (x86 și x64)
Windows 8/8.1 (x86 și x64)
Windows Server 2003 (x86 și x64)
Windows Server R2 (x86 și x64)
Windows Server 2008 (x86 și x64)
Windows Server 2008 R2 (x86 și x64)
Arhitecturi suportate:
32 biți (x86)
64 biți (x64)
Cerințe hardware:
Procesor de 1.6GHz sau mai rapid
RAM – 1GB RAM (pentru x86) și 2GB RAM (pentru x64)
4GB spațiu disponibil pe hard disk [6]
Codul programului este, așadar dezvoltat în Atmel Studio 6.2 și ulterior se transferă în memoria de program a microcontroller-ului ATMega328P cu ajutorul mediului de programare AVR Burn-O-Mat. La crearea unui proiect în Atmel Studio 6.2 se alege GCC C Executable Project și apoi se alocă un nume proiectului. La pasul următor, utilizatorul are posibilitatea să aleagă dintr-o multitudine de microcontroller-e, ATMega328P găsindu-se în familia de dispozitive megaAVR, 8 biți.
Ulterior, apare fereastra de ecran capturată în imaginea următoare. Structura de bază a programului este deja scrisă, fiind necesară inițializarea variabilelor și plasarea codului în interiorul buclei while(1).
3.2.1.2 AVR Burn-O-Mat
AVR Burn-O-Mat este o interfață grafică pentru AVRdude scrisă în Java, acest lucru implicând instalarea Java SE Runtime Environment (JRE).Simplifică configurarea microcontrolerelor AVR prin ușurința cu care se pot scrie și citi biții, EEPROM și memoria de program. Este ușor de utilizat, fără a fi necesară scrierea unei serii de opțiuni de linie de comandă consumatoare de timp.
Sunt necesare o serie de setări minime care trebuie realizate înainte de a încărca fișierul .hex în memoria de program a microcontroller-ului. Primul pas constă în verificarea căii de unde va fi preluat fișierul, apoi se va selecta programatorul folosit și portul la care acesta este conectat. Alt pas constă în alegerea tipului de microcontroller folosit (există o listă cu MCU-urile suportate) .
După ce acești pași au fost urmați cu succes se caută fișierul .hex care urmeză a fi înscris în memoria microcontroller-ului. Dacă nu există nicio eroare codul va fi stocat cu succes.
USBasp a fost utilizat pentru transferarea codului scris în ATMEL Studio 6.2 în memoria microcontroller-ului. El este utilizat pentru microcontroller-e AVR și se bazează pe design-ul Thomas Fischl’s. Are un design compact, ușor de utilizat și se conectează la portul USB al calculatorului/laptop-ului. USBasp prezintă o serie de caracteristici:
Este destinat microcontroller-elor din seria AVR
Interfața USB e realizată cu microcontroller-ul ATMega8
Citire/scriere din/în memoria EEPROM a microcontroller-ului
Interfața ISP (In-system programming ) cu 10 pini
Suportă dispozitive cu frecvență de ceas mică
Viteza maximă de scriere este de 5KB/s
Softuri suportate: AVRdude, Khazama AVR Programmer, BASCOM
Alimentare 3.3V sau 5V
Oferă un design compact
Descrierea componentelor programatorului
USB Tip A- această parte a programatorului se conecteză direct la portul USB al computer-ului/laptop-ului
ISP10 pini – acești pini oferă o interfață pentru legarea la microcontroller. Semnificația pinilor este prezentată în figura 9.
Pinii au următoarea semnificație:
MOSI (Master Output Slave Input) este ieșirea serială pentru master;
MISO (Master Input Slave Output) este intrarea serială pentru master;
SCK (Serial Clock) este ieșire de tact pentru sincronizare;
RST (Reset)
JP1-Tensiunea de alimentare- acest jumper controlează tensiunea pinului VCC de pe conector. Tensiunea poate fi setată la 3.3V, 5 V sau jumper-ul poate fi dezactivat în cazul în care dispozitivul are alimentare proprie.
JP2-Self Programare- este utilizat pentru a actualiza firmware-ul programatorului USBasp.
JP3-SCK- când acest jumper este setat, modul de ceas slow este activat. Dacă ceasul dispozitivului este mai mic de 1.5MHz, atunci jumper-ul trebuie setat .
Led-uri-programatorul dispune de 2 led-uri, iar semnificația acestora este următoarea:
LED R- programatorul comunică cu dispozitivul target
LED G- alimentarea [7]
Schema hardware a programatorului
USBasp constă dintr-un microcontroller ATMega8 și un număr de componente pasive. Lucrează cu un oscilator extern de 12 MHz pentru a obține o stabilitate mai mare a frecvenței. AMS1117-3.3V reprezintă un regulator de tensiune la ieșirea căruia valoarea tensiunii este fixă, în acest caz 3.3V.
3.2.2 Realizarea interfeței grafice
3.2.2.1 Mediul de dezvoltare Visual Studio
Microsoft Visual Studio este un mediu de dezvoltare integrat (IDE – Integrated Development Environment ) de la Microsoft. Acest mediu de dezvoltare poate fi folosit în diverse moduri pentru a face posibilă dezvoltarea aplicațiilor tip consolă și aplicațiilor cu interfață grafică pentru toate platformele suportate de Microsoft Windows .
Printre facilitățile oferite de Microsoft Visual Studio se enumeră: editor, compilator/debugger și mediu de proiectare (designer) pentru o serie de limbaje de programare. Acest mediu de dezvoltare include mai multe limbaje de programare dintre care cele mai commune sunt: Microsoft Visual C++, Microsoft Visual C#, Microsoft Visual Basic, Microsoft Visual Web Developer, Team Foundation Server. În afara acestor limbaje, Microsoft Visual Studio oferă support și pentru limbaje ca: Ruby, Python. Poate fi disponibil în mai multe variante: Express, Professional, Premium, Ultimate. [8]
La dezvoltarea limbajului C# a contribuit o echipă restrânsă de ingineri de la Microsoft, echipă din care s-a remarcat Anders Hejlsberg (autorul limbajului Turbo Pascal și membru al echipei care a proiectat Borland Delphi). Acest limbaj este unul simplu, care conține aproximativ 80 de cuvinte cheie și 12 tipuri de date predefinite. Urmărind conceptele moderne ale programării,acest limbaj permite programarea structurată, orientată pe obiecte și modulară. La baza programării C# stau principiile programării orientate pe obiecte, precum încapsularea, moștenirea, și polimorfismul. În cea mai mare parte, C# se bazează pe principiile de programare din C,C++. Au fost adăugate o serie de tipuri noi de date sau funcțiuni diferite ale datelor din C++. Există și similitudini cu limbajul de programare Java. În scopul realizării unor secvențe de cod sigure, unele funcțiuni au fost adăugate (de exemplu, interfețe și delegări), diversificate (tipul struct) , modificate (tipul string) sau chiar eliminate. În esență, limbajul C# este un limbaj modern, simplu și orientat pe obiecte, care are ca scop ușurarea muncii programatorului. Este un limbaj puternic cel puțin la fel de valoros ca Visual Basic, Visual C++ sau Java, care pune la dispoziție dezvoltarea atât a aplicațiilor Windows cât și a aplicațiilor și serviciilor WEB.
Limbajul C# include două categorii generale de tipuri predefinite: tipuri valorice și tipuri referință. Exemple de tipuri specific limbajului C#:
Tipuri valoare
Tipul simple: byte, char, int, float, etc.
Tipul enumerate – enum
Tipul structură – struct
Tipuri referință
Tipul clasă 7– class
Tipul interfață – interface
Tipul delegat – delegate [8]
O aplicație tipică Windows, realizată în C#, afișează una sau mai multe ferestre care permit utilizatorului să interacționeze cu ele. În principiu, un form este un obiect care definește modul de afișare și metodele care permit interacțiunea cu un utilizator. Acesta dispune de o serie de proprietăți care pot fi setate în funcție de necesitățile sau cerințele aplicației. Form-urile sunt instanțe ale clasei Form (sau ale unor clase derivate din aceasta) care conține un număr impresionant de metode și evenimente. Controalele oferă suport pentru interacțiunea cu utilizatorul. Ele nu pot exista independent de formular, formularul fiind elementul de bază pentru acestea. Programând/scriind codul care răspunde la evenimente, de fapt sunt realizate niște obiecte al căror comportament este în tocmai cu cerințele aplicației. Evenimentele au loc ca urmarea a acțiunilor utilizatorului, a execuției programului. În figura următoare este prezentată interfața grafică care a fost realizată în C#.
S-a apelat la acest limbaj de programare, pentru că oferă posibilitatea de a implementa toate cerințele pe care aplicația le necesită. Fiind un mediu de programare cu o interfață prietenoasă, prin simpla selectare din meniul de design a elementelor dorite și aranjându-le în vedera obținerii unui aspect plăcut, a rezultat fereastra de aplicație prezentată în figura 11.
3.2.2.2 MySQL
Bazele de date permit stocarea datelor într-o anumită ordine specificată în vederea furnizării acestora în funcție de solicitările primite. Spre deosebire de fișiere, bazele de date sunt mult mai avantajoase. O bază de date integrează mai multe tabele care conțin toate informațiile adăugate la un moment dat. Un sistem de gestiune a bazelor de date este o aplicație care găzduiește o bază de date. Un exemplu foarte practic și mult utilizat este MySQL (Structured Query Language).
MySQL Workbench este un instrument grafic de lucru cu servere și baze de date MySQL. Funcționalitatea MySQL acoperă 4 mari teme principale: dezvoltare SQL (permite crearea și gestionarea conexiunilor la serverele de baze de date), modelarea datelor, administrare server (permite administrarea instanțelor de server MySQL prin administrarea utilizatorilor, efectuarea de back-up și recuperare) și migrația datelor.[9]
Pentru realizarea aplicației propuse și integrarea acesteia cu MySql este necesară crearea unei baze de date care să colecteze datele referitoare la măsurătorile efectuate. S-a creat baza de date intitulată test care conține tabelul edata. Tabelul conține 8 intrări care permit stocarea datelor. Aceste câmpuri sunt: idedata, temperatura, umiditate, data, time, dataandtime, lumina, umiditatesol. Câmpul idedata este cheie primară și este folosit ca identificator unic pentru intrările respective. Temperatura, umiditate, lumină și umiditate sol conțin informațiile furnizate de către cei 4 senzori. În acest tabel sunt stocate și data și ora la care au fost înregistrate aceste valori pentru a realiza ulterior grafice la cererea utilizatorului.
În final, prin integrarea tuturor câmpurilor și stocarea datelor a rezultat următoarea bază de date care este deja populată cu înregistrările primite pe parcursul a mai multor zile.
4 ECHIPAMENTE HARDWARE FOLOSITE
4.1.1 Componente hardware folosite
Sistemul de supraveghere și control a condițiilor de mediu din seră include o serie de componente hardware, astfel încât în realizarea proiectului s-au folosit următoarele :
Microcontroller ATmega328P
Modul bluetooth HC-05
Senzor de temperatură LM35DZ
Senzor de umiditate
Fotorezistor
Senzor umiditate sol
Motor de curent continuu 5V (ventilator)
Motor de curent continuu 5V (pompă apă)
Rezistențe de putere
Led
Oscilator cuarț 8MHz
Alimentare 5V
4.1.2 Descrierea componentelor hardware
4.1.2.1 Prezentare ATmega328P
Microcontroller-ul care a fost ales pentru realizarea proiectului se numește ATmega328P și e produs de către firma Atmel. Acest tip de microcontroller oferă o gamă largă de funcții și există multe unelte de dezvoltare pentru soft-ul intern al chip-ului.
ATmega328P este un microcontroller pe 8 biți și este bazat pe arhitectura AVR RISC (Reduced Instruction Set Computing). Folosind acest tip de arhitectură, microcontroller-ul are un set redus de instrucțiuni (131), iar reducerea instrucțiunilor are avantajul că salvează și spațiu în microprocesor. Procesorul AVR combină un bogat set de instrucțiuni cu 32 de registre de uz general. Cele 32 de registre de uz general sunt direct conectate la unitatea aritmetică și logică (ALU-Arithmetic Logic Unit), fapt ce permite ca două registre independente să fie accesate printr-o singură instrucțiune într-un singur moment de tact. Prin această arhitectură se ating performanțe de aproape 10 ori mai mari decât la microcontroler-ele CISC obișnuite. Pentru a maximiza performanța, AVR utilizează o arhitectură Harvard. care presupune existența memoriilor separate pentre date și instrucțiuni.
Caracteristici ale microcontroller-ului ATMega328P conform foii de catalog:
Producător :ATMEL
Tip circuit integrat: AVR microcontroller
Tip capsulă: PDIP (Plastic Dual In Line Package)
Număr pini: 28 pini
Capaciate memorie EEPROM: 1 Kbytes
Capaciate memorie Flash: 32 Kbytes
Număr de intrări/ieșiri: 23
Dimensiunea regiștrilor: 8 biți
Număr timere: 2 timere/countere de 8 biți și unul de 16 biți
Număr de converoare analog digitale:1 CAD (6 canale)
Canale PWM: 6
Sistem de întreruperi interne și externe
Watchdog
Modul USART pentru comunicație serială
Interfață serială SPI
Comparator analogic pe chip
Moduri de funcționare economice
Temperatura de operare: -40 ° C la +85 ° C
Tensiune de alimentare: 1.8-5.5V [10]
ATMega328P dispune de 28 de pini, dintre care doar 23 de pini pot fi utilizați pentru programarea microcontroller-ului. Pinii VCC și GND sunt utilizați pentru alimentarea chip-ului cu tensiune de la rețeaua de alimentare. Ceilalți 3 pini: AVCC, AREF și GND sunt folosiți pentru alimentarea convertorului analog-digital. În următoarea schemă se prezintă configurația pinilor microcontroller-ului conform cu specificațiile din foaia de catalog.
În următoarea figură se prezintă diagrama bloc a microcontroller-ului pe 8 biți ATMega328P.
Funcționalități utilizate de la microcontroller-ul ATMega328P
Convertorul analog–digital de pe acest microcontroller are rezoluție de 10 biți ceea ce înseamnă că ia valori între 0-1023. Dacă tensiunea de referință este de 5V, acest lucru se traduce în faptul că cea mai mică schimbare de tensiune la intrare este de 5V/1023=0.00488V sau 4,88 mV.
Există mai multe posibilități de alegere a referinței de tensiune pentru convertorul analog-digital: referință externă prin pinul AVcc, internă egală cu 1.1V sau internă egală cu Vcc. Acest lucru se realizează din software prin setarea biților REFS1 și REFS0 din registrul ADMUX (ADC Multiplexer Selection Register).
Acest convertor dispune de un număr de 6 canale de intrare și se poate citi doar un singur canal la un moment dat. Rezultatele obținute în urma citirii sunt stocate în regiștrii ADCH și ADCL, regiștrii de câte 8 biți. Întrucât, rezultatul obținut de la ADC este pe 10 biți, se vor folosi ambii regiștrii pentru memorarea rezultatului. Pentru realizarea acestui lucru se folosește bitul 5 ADLAR din registrul ADMUX al cărui rol este de a selecta varianta de stocarea a valorii citite în cei doi regiștrii. Se folosesc 4 biți (MUX3…0) pentru a selecta canalul de unde va fi citit semnalul. [10]
Microcontroller-ul dispune de o interfață serială USART (Universal Synchronous/Asynchronous Receiver/Transmitter) care este un standard de comunicare serială sincronă sau asincronă între diverse dispozitive. Comunicația poate fi unidirecțională sau bidirecțională și se poate lucre în modul master/slave. În cazul comunicației unidirecționale, există un singur transmițător și un receptor (sau invers), iar în cazul bidirecțional, pe o legătură se realizează transmisia și pe altă legatură recepția. Dacă este vorba de o comunicație sincronă se utilizează o legatură prin care se stabilește același semnal de tact între emițător și receptor.
Masterul reprezintă dispozitivul care transmite date, iar slave-ul este cel care recepționează datele. Funcțiile masterului sunt de a stabili formatul cuvântului și frecvența ceasului. Slave-ul trebuie să recepționeze date care au același format cu datele transmise de master și trebuie să lucreze la aceeși frecvență ca și masterul.
În cazul microcontroller-ului ATMega328P, USART este împărțită în 3 blocuri: generatorul de clock și părțile de transmisie și recepție. Receptorul este partea cea mai complexă a modulului USART datorită ceasului său și unității de recuperare a datelor. Pe lângă unitatea de recuperare, receptorul mai cuprinde un verificator de paritate, o logică de control, un registru de șiftare și două buffere de primire. Generatorul de ceas generează ceasul de bază atât pentru emițător cât și pentru receptor.
Un cadru serial este definit ca fiind un caracter de biți de date cu biți de sincronizare (biți de start și stop), și opțional un bit de paritate pentru verificarea erorii. Modul USART acceptă toate cele 30 de combinații pentru un cadru:
Un bit de start
5, 6, 7, 8 sau 9 biți de date
Un bit de paritate pară /impară sau fără bit de paritate
1 sau 2 biți de stop
Un cadru începe cu bitul de start urmat de bitul cel mai puțin semnificativ. Când un cadru întreg este transmis, el poate fi urmat de un cadru nou sau comunicația poate fi trecută într-o stare de inactivitate. În figura următoare sunt exemplificate combinațiile posibile pentru formatul cadrului.[10]
Semnificația biților:
St- bit de start, întotdeauna cu nivel jos
P- bit de paritate(impar/par)
Sp- bit de stop,î ntotdeauna cu nivel sus
Idle- nu există comunicare pe linie
4.1.2.2 Senzorul de temperatură LM35DZ
Seriile LM35DZ sunt senzori de temperatură cu o tensiune de ieșire liniară, direct proporțională cu temperatura Celsius. Acest senzor are un avantaj față de senzorii liniari calibrați în grade Kelvin, deoarece nu e necesar ca utilizatorul să scadă o valoare constantă din tensiunea de ieșire pentru a obține o scalare convenabilă în grade Celsius. Senzorul nu are nevoie de nicio calibrare externă pentru a obține precizii tipice de ±0.25⁰ C la temperatura camerei (25⁰ C) și de ±0.75⁰ C în exterior pe tot domeniul de temperatură.
Impedanța de ieșire scazută, ieșirea liniară și calibrarea internă fac din LM35 un circuit ușor de interfațat cu alte circuite de citire sau de control. Senzorul poate fi alimentatat de la o sursă monoalternanță (+V,0V), sau de la o sursă dublă-alternanță (+V, 0V, -V). Consumul de curent foarte scăzut al lui LM35 (60 μA) atrage după sine o auto-încălzire de mai puțin de 0.1 ° C în aer.
Caracteristici ale senzorului de temperatură:
Calibrat direct în grade Celsius (⁰C)
Interval de funcționare : -55⁰C până la 150⁰C
Tensiune de alimentare: 4-30V
Potrivit pentru aplicații la distanță
Impedanță de ieșire joasă: 0.1 Ω pentru 1mA
Acuratețe garantată: 0.5⁰C
Curentul consumat: 60 μA
Auto-încălzire în timpul funcționării: 0.08⁰C [11]
Tensiunea furnizată pe pinul ADC0 al microcontrollerului este calculabilă cu formula:
(4.1)
Conform foii de catalog temperatura în grade Celsius se calculează cu formula:
(4.2)
4.1.2.3 Senzorul de umiditate HIH-5030
Seriile de senzori de umiditate HIH-5030 de joasă tensiune operează până la tensiunea de 2.7V. Acești senzori sunt proiectați pentru un volum mare de utilizări în diverse domenii. Intrarea directă la un controller sau la alt dispozitiv este posibilă prin tensiunea de ieșire liniară. HIH-5030 este rezistent la condensare, echipat cu un filtru hidrofob permițându-i să fie folosit în multe medii de condensare, incluzând aplicații industriale, medicale și comerciale. Construcția multistratului oferă rezistență excelentă la majoritatea pericolelor, precum praf, uleiuri, murdărie și alte chimicale.
Specificații ale acestui tip de senzor:
Ieșirea este analogical
Temperatura de operare: -40⁰C la 85⁰C
Intervalul de umiditate: 0% -100%
Acuratețe de +/-3%RH
Domeniul de alimentare: 2.7-5.5V
Timp de răspuns rapid
Rezistență chimicală
Senzorul de umiditate este folosit într-o multitudine de aplicații, printre domeniile în care își găsește aplicabilitate se amintesc:
– domeniul industrial
Compresoare de aer
Sisteme pe bază de baterii
Echipamente de uscare
HVAC (aer condiționat, mișcarea aerului, termostate, umidificatoare)
Stații meteo și echipamente meteorologice
Sere
-domeniul medical
Incubatoare pentru sugari
Compresoare de aer pentru spitale [12]
Tensiunea furnizată pe pinul ADC1 al microcontrollerului este calculabilă cu formula:
(4.3)
Ținând cont de specificațiile date de producător, umiditatea se poate determina din formula următoare:
(4.4)
(4.5)
(4.6)
(4.7)
(4.8)
4.1.2.4 Fotorezistor
Fotorezistorul este un dispozitiv electronic, a cărui rezistență electrică se modifică sub acțiunea unui flux luminos care cade pe suprafața sensibilă a acestuia. Astfel, fără lumină fotorezistorul are o rezistență mare, iar în prezența luminii valoarea rezistenței scade. Acest dispozitiv electronic este realizat dintr-o peliculă din material semiconductor care prin evaporare în vid, este depusă pe un grătar metalic fiind fixat pe o placă izolatoare. Pelicula este prevăzută la capete cu contacte ohmetrice care reprezintă terminalele și pentru protecție se acoperă cu un lac sau se încapsulează într-un material plastic.
Fotorezistorii sunt componente electronice care sunt ideale pentru realizarea senzorilor foto-electrici, pentru sisteme de monitorizarea a luminilor, sisteme de alarmă, etc. [13]
În continuare se prezintă modul de conectare al fotorezistorului și o serie de calcule necesare pentru a afla intensitatea luminoasă.
Pentru ca această valoare a rezistenței să poată fi furnizată intrării ADC a microcontroller-ului și apoi transformată într-o valoare digitală, este nevoie de montarea fotorezistorului într-un circuit de divizare a tensiunii după cum se observă din figura prezentată anterioră. Se folosește o rezistență de 10kΩ. Vout este legat la pinul microcontroller-ului. Aplicând formula divizorului rezistiv se obține următoarea relație:
(4.9)
Relația tipică dintre rezistența unui fotorezistor și intensitatea luminoasă, valabilă în majoritatea cazurilor este:
(în kΩ) (4.10), iar prin operație inversă, rezultă: (4.11)
Pornind de la formula (4.9) și folosind relația (4.10) se fac următoarele calcule:
Înlocuind cu Vin=5V și R1=10kΩ, rezultă că intensitatea luminosă poate fi calculată cu formula: .
4.1.2.5 Senzor umiditate sol YL-69
Senzorul de umiditate sol este constituit din doi electrozi care se înfig în pământ. Acest senzor detectează umezeala din jurul său. Prin electrozi trece un curent, iar rezistența la curent în sol determină umezeala solului. Dacă solul are rezistență mai mare la apă va fi scăzut, așadar mai mult curent va trece prin el. Pe de altă parte, dacă umezeala solului este redusă atunci ieșirea senzorului va avea un nivel mare de rezistență. Acest senzor are două ieșiri: una digitală, care este mai puțin precisă și una analogică.
Specificații tehnice ale senzorului:
Alimentare : 3.3 V sau 5V
Curent: 35mA
Tensiunea semnalelor de ieșire: 0 – 4.2 V
Ieșiri digitale : 0 sau 1
Senzorul este însoțit de un mic cablaj imprimat PCB (Printed Circuit Board) pe care este montat un comparator LM393 și un potențiometru digital. [14]
Comparatorul LM393 este o componentă electronică care compară două valori de tensiune sau curent și oferă un semnal digital la ieșire. Acesta are rolul de a indica care dintre mărimile comparate este mai mare. LM393 este un comparator diferențial, ceea ce înseamnă că acceptă două intrari pentru a fi comparate. Comparatorul își găsește aplicații în comparatoarele limită, convertoare analog digitale simple, multivibratoare și porți logice digitale de înaltă tensiune.
Caracteristici ale comparatorului :
Alimentare : 2-36V
Tensiunea de saturație : ±3mV [15]
Potențiometrul digital este un rezistor variabil. Pe același principiu ca potențiometrele analogice, acestea sunt folosite pentru a ajusta sau scala rezistența circutului. În senzorul de umiditate a solului, potențiometrul este utilizat pentru reglarea sensibilitații senzorului.
Ieșirea ADC-ului ia valori între 0-1023. Pentru a determina nivelul de umiditate s-a realizat un mic experiment. Introducând senzorul într-un recipient cu apă valoarea citită a fost 200, iar dacă senzorul nu se afla într-un mediu umed, valoarea citită a fost 1023. S-a ajuns la concluzia că 200 înseamnă umiditate 100 %, iar 1023 corespunde unei umidități a solului de 0%.
4.1.2.6 Motoare de curent continuu
În domeniul microcontroller-elor multe aplicații au sarcina acționării unor motoare. Motorul electric de curent continuu are rolul de a transforma energia electrică de curent continuu în energie mecanică. Energia electricǎ este primită de la rețeaua de alimentare, iar puterea (energia) mecanicǎ este livrată la ax. Un astfel de motor oferă o serie de avantaje precum: posibilitatea reglării vitezei, posibilitatea modificării sensului de rotație, etc. Funcționarea motorului de curent continuu se bazează pe fenomenul de apariție a forței electromagnetice care acționează asupra unui conductor parcurs de curent și situat în câmp magnetic.
În proiectarea sistemului propus, partea de ventilare, irigare este asigurată de două motoare de acest tip. Un motor este realizat din două componente principale: stator (partea statică) și rotor ( partea mobilă).
Partea fixă a motorului cuprinde următoarele elemente constructive: carcasa, cutia cu bornele de alimentare, armătura feromagnetică statorică și bobinajul (într-un strat sau două straturi). Statorul este destinat producerii fluxului magnetic necesar funcționării mașinii electrice. Partea mobilă a motorului, rotorul este compusă dintr-un ax și o armătură rotorică ce susține înfășurarea rotorică, colector și lamele de ventilație. În rotor se induc, în general, tensiuni electromotoare. Între stator și rotor, existǎ o porțiune de aer numitǎ întrefier (de ordinul milimetrilor) ce permite mișcarea rotorului fațǎ de stator. Grosimea întrefierului este un indicator important al performanțelor motorului. [16]
4.1.2.7 Driver pentru motor L293D
În sistemele de automatizare sunt necesare motoare care pun în funcțiune diferite sisteme (un sistem de ventilare, un robot, sistem de irigare, etc). Din moment ce un motor necesită mai mult curent decât poate genera pinul unui microcontroller, este necesar un switch (tranzistori, MOSFET, etc.) care acceptă un curent de valoare mică, îl amplifică și generează un curent mai mare. Întreg procesul este realizat cu ajutorul unui driver pentru motor pentru a ușura munca. L293D este un driver pentru motoare care este ușor de legat la microcontroller prin intermediul pinilor de alimentare și de control. În esență, un driver pentru motor este, de fapt, un amplificator de curent care preia un semnal de curent mic de la microcontroller și generează un curent mai mare cu care se poate controla un motor.
Un circuit L293D conține câte patru semipunți care au posibilitatea de a suporta curenți electrici mari. Acest circuit a fost gândit pentru comutarea bidirecțională a unor curenți de până la 1 A/600 mA, cu valori ale tensiunii cuprinse între 4,5 și 36 V. L293D a fost proiectat pentru a comanda motoare de curent continuu, motoare pas cu pas cu comandă bipolară, electromagneți, relee. Intrările sunt compatibile TTL, iar cele patru semipunți sunt activate pe perechi. Activarea se realizează cu ajutorul semnalelor de validare 1,2 EN pentru semipunțile 1 și 2, respectiv, 3, 4 EN pentru semipunțile 3 și 4. [17]
În cazul în care intrările de validare se află în stare logică 1, adică High, tranzistoarele care compun respectivele semipunți conduc și ieșirile sunt activate și în fază cu intrările. În caz contrar, adică când intrările de validare se află în starea logică 0 Low (0 logic) tranzistoarele de putere corespunzătoare sunt blocate, iar ieșirile semipunților sunt în starea de înaltă impedanță. Intrările 1A și 2A determină sensul de rotație a motorului: 1A – Low și 2A –High sens orar, respective 1A – High și 2A –Low sens antiorar. Dacă ambele intrări se află în stările low sau high se produce fenomenul de frânarea rapidă a motorului. [17]
Schema electrică preluată din datasheet prezintă comportamentul descris mai sus. Pe schemă sunt marcate semnalele de intrare, cele de ieșiere și semnalele de enable. Cele două alimentari au următoarea semnificație: VCC2 se utilizează pentru alimentarea motoarelor, iar VCC1 se folosește pentru driver.
Fig. 23 Schemă electrică L293D
În următorul tabel se explică funcționarea motorului în funcție de semnalele primite pe IN1, IN2, ENABLE1, pentru cealaltă parte a motorului lucrurile fiind similare.
Tab. 1 Explicarea funcționării driver-ului
Conectarea driverului de motor la microcontroller se prezintă în figura următoare, avănd în vedere specificațiile din foaia de catalog a producătorului.
4.1.2.8 Proiectare sistem de încălzire
Sistemul de încălzire constă din două rezistențe de putere (1/2W) legate în paralel. S-a utilizat un tranzistor Darlington TIP142,tranzistor care preia un curent de valoare mică de la pinul microcontroller-ului și îl amplifică, pentru a obține un curent de valoare mai mare.
Tranzistorul îndeplinește o funcție importantă, și anume cea de amplificare. Acesta poate fi folosit atât pentru amplificarea curentului cât și pentru amplificarea semnalelor de timp. Există o relație strânsă între curentul de colector și cel de bază :. Întrucât β are valori de ordinul sutelor rezultă o amplificare considerabilă care tranversează structura de tranzistor între emitor și colector. De cele mai multe ori pentru obținerea unui factor de amplificare mai mare se conectează în cascadă mai multe etaje de amplificare. Combinația Darlington este una dintre cele mai uzuale metode care utilizează 2 tranzistori în cascadă. În acest caz factorul de amplificare este : .[18]
S-au realizat o serie de calcule pentru determinarea valorilor componentelor care formează sistemul de încălzire. În următoarea figură se reprezintă schema care a fost concepută pentru a obține un efect de încălzire al rezistențelor.
Presupunând că linia de port a microcontroller-ului poate scoate 0.5mA, rezultă că valoarea rezistenței din baza tranzistorului se calculează după formula: . Valoarea rezistenței s-a ales 8.2, fiind cea standardizată.
Cele două rezistențe din colector sunt în paralel, astfel rezistența echivalentă are valoarea . Rezistențele alese au o putere de 1/2W, iar puterea totală are valoarea de 1W. Pentru a obține efectul de încălzire dorit, se presupune că puterea este 1.45 W. Valoarea rezistenței echivalente se calculează după formula : Deoarece cele două rezistențe sunt în paralel se pot lega 2 rezistențe de 28 Ω, 1/2 W .
4.1.2.9 Oscilatorul cu cuarț
Microcontroller-ul ATmega lucrează cu un oscilator intern de 8MHz care este divizat cu prescaler-ul 8, obținându-se în final frecvența de 1MHz. Deoarece este necesară o stabilitate mai mare a frecvenței se utilizează un oscilator extern care poate îndeplini această condiție.
Oscilatoarele cu cuarț sunt oscilatoare de semnale sinusoidale de foarte mare stabilitate a frecvenței. Oscilatorul este montat în interiorul unei carcase metalică prevăzută cu doi pini pe care se înscrie frecvența de oscilație. Cuarțul are proprietăți piezo-electrice, iar într-un montaj acesta se comportă ca un circuit RLC.
Proprietățile oscilatorului care determină marea stabilitate a frecvenței acestuia sunt:
Cele două frecvențe de rezonanță, una serie și alta derivație
Valoarea mare a factorului de calitate Q
Stabilitatea în timp a valorilor parametrilor R, L, C
4.1.2.10 Dioda electroluminiscentă
Acest tip de diodă este uzual denumită LED (Light Emitting Diode). Un LED este o diodă electroluminiscentă care emite lumină în momentul când aceasta este polarizată direct. Culoarea luminii depinde în primul rând de compoziția și condițiile materialului semiconductor utilzat, și poate fi în infraroșu, vizibil sau ultraviolet. Un LED este un convertor de energie care transformă energia electrică (primită de la sursă de polarizare) în energie luminoasă.
4.1.2.11 Metode de conectivitate la distanță
La ora actuală există o multitudine de metode de comunicare la distanță, însă pentru implementarea sistemului s-a ales comunicația prin Bluetooth. Tehnologia Bluetooth a fost creată ca un standard liber pentru a permite conectivitatea și colaborarea dintre diverse produse și industrii.
Modul de comunicație prin Bluetooth este cel mai potrivit atunci când distanța dintre emițător/receptor este scurtă, când se dorește o putere consumată cât mai scăzută, iar rata de transfer este mare. Standardul care se ocupă de toate specificațiile privind tehnologia Bluetooth se numește 802.15.1. Acest standard de comunicație prezintă 3 scopuri principale: consum minim, dimensiune redusă și preț cât mai scăzut pentru a fi accesibil cât mai multor utilizatori, scopuri care sunt realizate încă din faza de proiectare.
Sistemul Bluetooth este îndreptat către aplicații de voce și date și gama de frecvențe de operare o constituie banda nelicențiată industrială, științifică și medicală (ISM) de la 2.4GHz la 2.48Hz. Se utilizează tehnica spectrului împrăștiat cu salt în frecvență (FHSS), ceea ce reprezintă că purtătoarea face salturi în frecvență (de până la 1600 salturi pe secundă) și acoperă întreg spectrul de 79 canale. Avantajul salturilor rapide îl reprezintă lungimea mică a pachetelor de date. Dacă un pachet nu este recepționat corect, dispozitivul cere retransmisia pachetului, retransmisie care se va realiza pe o altă frecvență, în funcție de frecvența de salt stabilită.
Procesul de “pairing” (împerechere) are loc în momentul când două dispozitive Bluetooth se conectează între ele. Această tehnologiei Bluetooth permite oricărui dispozitiv Bluetooth să se conecteze la orice alt dispozitiv Bluetooth aflat în apropierea lui la o distanță de cel mult 100m. Funcționează pe o distanță de la 1m la 100m, fiind definite în acest sens 3 clase Bluetooth. În tabelul următor sunt exemplificate cele 3 clase Bluetooth, cu razele lor de acoperire și puterea maximă admisă. [19]
Printre avantajele oferite de tehnologia Bluetooth se numară posibilitatea de a trece prin obiectele solide, omidirecționalitatea, iar pentru conectarea cu celelalte dispozitive Bluetooth nu e nevoie de vizibilitate directă cu acestea.
Tehnologia Bluetooth se poate clasifica după versiunile apărute până în acest moment în:
Bluetooth 1.0 care reprezintă prima versiune și a apărut în 1999. Această primă versiune a avut multe probleme în încercarea producătorilor de a face produsele interoperabile.
Odată cu apariția Bluetooth 1.1 s-a încercat să se corecteze problemele apărute în versiunea anterioară 1.0. În acest sens s-a adaugat suport pentru canalele necriptate și a fost introdus RSSI (Receiver Signal Strenght Indicator)-Indicator de nivel al semnalului recepționat.
Bluetooth 1.2 permite compatibilitatea cu versiunea 1.1 fiind aduse niște îmbunătățiri majore. Una dintre ele se referă la viteze de transmitere mai mari (maxim 721 kbit/s). O altă îmbunătățire se referă la AFH (Adaptive Frequency Hopping), care crește rezistența la interferențele frecvenței radio, evitând utilizarea frecvențelor aglomerate în secvența de salt.
Bluetooth 2.0 este o versiune care permite compatibilitate cu celelalte versiuni 1.x. Principala diferență este introducerea de EDR (Enhanced Data Rate) pentru transfer de date mai rapid. Avantajele introducerii EDR:
viteza de transmitere de 3 ori mai mare
raza de acțiune 100m
consum de putere mai mic
lățime de bandă mai mare
îmbunătățire BER (Bit Error Rate)
Compatibilă cu 1.2, versiunea 2.1+EDR propune împerecherea sigură simplă (SSP-secure simple pairing) care îmbunătățește procedura de pairing pentru dispozitivele Bluetooth, crescând și folosirea și puterea securității. Alte îmbunătățiri sunt: creșterea nivelului de cunoaștere între dispozitivele rețelei, permite schimbarea cheilor de criptare și reducerea consumului în “low-power mode”.
Bluetooth 3.0 aduce o noutate prin introducerea AMP (Alternate MAC/PHY), adică adăugarea lui 802.11 (asociat de regulă cu WiFi) ca un mod de transport de mare viteză.
Bluetooth v4.0 – a fost finalizată de SIG și adoptată începând cu 30 iunie 2010. Aceasta include protocoalele: classic Bluetooth, Bluetooth Hogh Speed și bluetooth Low Energy. Bluetooth High Speed este bazat pe tehnologia Wi-Fi.[19]
4.1.2.11.1 Modulul Bluetooth HC-05
Pentu realizarea comunicației dintre microcontroller-ul ATmega328P și PC/laptop s-a utilizat modulul bluetooth HC-05. Acest modul bluetooth este un modul de dimensiuni reduse utilizat pentru comunicații seriale (RX/TX). Modulul care s-a ales pentru a fi utilizat în acest proiect este încapsulat într-un shield. Bluetooth-ul HC-05 este dotat cu regulatoare de tensiune, astfel încât poate fi alimentat cu orice tensiune între 3.3 V și 6V.
Semnificația pinilor modulului Bluetooth:
TXD(PIN 1)- pin serial de ieșire (transmisie)
RXD(PIN 2)- pin serial de intrare (recepție)
EN(PIN34)- acest pin trebuie setat HIGH pentru a intra în modul de setare a comenzilor AT
VCC(PIN 12)-indică intervalul de alimentare 3.3V-6V. Pentru siguranță se alimentează la 3.3V. Shield-ul pe care este montat Bluetooth-ul, suportă tensiune de alimentare între 3.6 – 6V, deoarece, shield-ul are pe el o sursă de alimentare, ce transformă direct în 3.3V tensiunea cu care modul de Bluetooth se alimentează.
GND(PIN 13)-ground
Proprietățile generale ale modulului:
Bluetooth V2.0+EDR (Enhanced Data Rate)
Modul bluetooth de clasa 2
Distanța maximă de transmisie este aproximativ 10m
Puterea de transmisie este ≤4dBm
Sensibilitate: ≤-84dBm la 0.1% BER
Operează în banda de frecvențe ISM de la 2.4GHz -2.48GHz
Modulație GFSK (Gaussian Frequency Shift keying)
Prevăzut cu antenă integrată
Interfață UART
Baud rate este implicit setat la 9600(poate fi modificat din software)
Securitate: autentificare și criptare
Temperatura de operare: -20⁰C~75⁰C
Dimensiuni: 26.9mm (L) x13mm (W) x2.2 mm (H)
Alimentare de 3V-6V
Certificat ROHS
Modulul Bluetooth își găsește aplicații în multe domenii, fiind utilizat cu precădere în majoritatea proiectelor care folosesc microcontrolere și în multe aplicații din zona de control industrial.
În cazul în care nu se dorește utilizarea modulului cu valorile implicite (default) există o serie de comenzi AT care pot fi setate astfel încât modulul să fie configurat conform cerințelor necesare. Comenzile AT uzuale pentru programarea modulului sunt următoarele:
AT – verifică conexiunea
AT+NAME
AT+NAME=<param> – schimbă numele modulului Bluetooth
AT+NAME? – indică numele modulului Bluetooth (implicit HC05)
AT+VERSION? – indică versiunea modulului Bluetooth
AT+ADDR? – indică adresa implicită sub forma NAP:UAP:LAP
AT+PSWD
AT+PSWD<param> – setează parola
AT+PSWD?- indică parola (parola implicită este “1234”)
AT+ORGL – revine la setările implicite
AT+RESET – resetare și ieșire din modul AT
AT+BAUD<param1>,<param2>,<param3>-schimbă valoarea ratei de transfer,numărul de biți de stop și tipul de paritate. Modul default pentru acest Bluetooth: 9600, 0 (1 bit de stop) , 0 (fără paritate).
AT+ROLE
AT+ROLE=<param> – 0(slave); 1(master)
AT+ROLE?- indică rolul modulului Bluetooth (implicit este slave) [20]
În continuare este capturată schema electrică a modulului realizată în Proteus.
5 IMPLEMENTARE FUNCȚIONALITĂȚI
5.1 Modulul slave
5.1.1 Schema electrică
Pornind de la schema bloc realizată în figura 1, care reprezintă schema de bază a sistemului propus am realizat schema electrică în Proteus. Componenta de bază a ansamblului electronic este microcontroller-ul ATmega328P, în capsulă PDIP (Plastic Dual –In-Line Package) care dispune de 28 pini. După cum se poate observa din figura 31, microcontroller-ul interacționează cu partea de senzoristică, cu sistemul de ventilare/încălzire/irigare. Pinul 7, VCC este dedicat pentru alimentare, iar pinul imediat următor, GND pentru conectarea la masă. Între acești doi pini am utilizat un condensator de 100 nF pentru decuplarea semnalului alternativ.
Pentru conectarea oscilatorului extern de 8MHz am utilizat doi condensatori de valori egale, de 22pF, având în vedere specificațiile din foaia de catalog a acestui tip de microcontroller. Pentru ca microcontroller-ul să lucreze cu oscilatorul extern a fost necesară modificarea unor biți și înscrierea acestora în microcontroller.
Pentru programarea serială a microcontroller-ului s-a utilizat programatorul USBasp a cărui funcționalitate a fost explicată mai detaliat în capitolul 3. În tabelul următor se prezintă pe prima coloană numerele pinilor, pe cea de-a doua coloană funcțiile pinilor conectați la microcontroller și în ultima coloană pinii microcontroller-ului la care se conectează.
Tab. 3 Pini USBasp
Prin intermediul pinilor 20..22 am setat tensiunea de referință pentru convertorul analog-digital. Pinul 20 reprezintă intrarea pentru tensiunea de referință AREF, de 5 V. Pinul 20 se conecteză la alimentarea de 5V, iar pinul 22 este dedicat pentru masă. Între cei doi pini am plasat un condensator de 100nF. Pinii 23..26, au fost programați ca intrări pentru convertorul analog-digital, la care am conectat cei patru senzori.
Tensiunea de 5V este necesară și modulului Bluetooth și celor 4 senzori. Pinii folosiți pentru transmisia și recepția datelor sunt pinii Tx și Rx ai microcontroller-ului conectați la pinii Rx și Tx ai modulului Bluetooth.
Pinul 14 este folosit pentru aprinderea unui LED de culoare albă, conectat la GND printr-un rezistor de 470Ω pentru a limita valoarea curentului la 5mA. La pinul 6 se conectează un switch on/off care permite citirea stării acestuia: low sau high. Nu a mai fost necesară conectarea unei rezistențe externe pentru switch, ci din software am avut posibilitatea de a activa rezistența internă de pull-up. Pinul 15 este folosit pentru aprinderea unui LED de culoare roșie, conectat la GND printr-un rezistor de 470Ω pentru a limita valoarea curentului. Pinul 13 este utilizat pentru comanda sistemului de încălzire printr-un tranzistor Darlington.
Pinii 4 și 5 , respectiv 11 și 12 sunt folosiți pentru comanda a două motoare de curent continuu. Un circuit driver L293D în capsulă PDIP care prezintă 16 pini este utilizat pentru a furniza curentul necesar punerii în funcțiune a motoarelor. Am utilizat o alimentare separată pentru motoarele de curent continuu după cum este prezentat și în schema bloc a sistemului din figura1. Utilizând aceeași sursă de alimentare și pentru motoare și pentru microcontroller am observat o schimbare în valorile măsurate de senzori, de aceea am ales două surse de alimentare diferite.
În cele ce urmează se prezintă schema electrică a sistemului propus care conține toate componentele hardware care au fost prezentate în capitolul 4.
5.1.2 Descrierea funcționării
Programul stocat în memoria microcontroller-ului ATmega328P:
Recepționează de la aplicația care rulează pe un PC/laptop pragurile pentru parametrii furnizați de senzori (intervalul la care datele să fie trimise la PC/laptop, temperatura maximă, temperatura minimă, umiditatea solului minimă, luminozitatea minimă)
Citește temperatura mediului furnizată de senzorul de temperatură montat pe un pin al CAD-ului al microcontroller-ului.
Citește umiditatea mediului furnizată de senzorul de umiditate montat pe un pin al CAD-ului al microcontroller-ului
Citește intensitatea luminoasă furnizată de fotorezistorul montat pe un pin al CAD-ului al microcontroller-ului
Citește umiditatea solului furnizată de senzorul de umiditate a solului montat pe un pin al CAD-ului al microcontroller-ului și partea cealaltă introdusă în sol
Citește starea switch-ului (on/off) care este folosit ca un senzor pentru ușă
Transmite la distanță prin comunicație fără fir în banda de 2.4GHz, la intervale egale de timp prestabilite de un posibil utilizator informațiile mediate de la senzori
Ia decizii cu privire la funcționarea sistemului în funcție de pragurile prestabilite de un posibil utilizator (pornește ventilator/încălzire, oprește ventilator/încălzire, pornește/oprește irigare ). În subcapitolul următor vor fi prezentate mult mai detaliat deciziile pe care sistemul le ia în funcție de valoarea curentă a fiecărui senzor.
5.1.3 Schemă logică implementare cod ATmega328P
Operațiile de realizare măsurări și conversia acestor măsurători în valori care pot fi interpretate de operatorul uman sunt realizate de câte 4 ori(pentru fiecare tip de senzor), iar valorile obținute sunt mediate și trimise la master. În funcție de valorile de prag recepționate se iau o serie de decizii cu privire la funcționarea sistemului, decizii luate pe baza măsurătorilor efectuate.
Acționări pentru senzori :
V
5.1.4 Realizarea codului aferent microcontroller-ului ATmega328P
Configurare USART
Registrele UBRR0H și UBRR0L sunt registre pentru baud rate, primul conținând 4 cei mai semnificativi biți, iar cel de-al doilea 8 cei mai puțini semnificativi biți. Valoarea aleasă pentru BAUD rate trebuie să fie înscrisă în acești 2 regiștrii. Ecuația pentru calcularea valorii care trebuie înscrisă în UBRR este: Înlocuind cu valorile Fosc=8MHz și BAUD=9600, rezultă că UBRR are valoarea 51. Conform foii de catalog a producătorului rezultă că pentru frecvența de 8MHz și un baud rate de 9600, există o eroare . Cu ajutorul RXEN0 ȘI TXENO am activat receptorul și transmițătorul. Formatul cadrului are următoarea structură : 8 biți de date, fără paritate și 1 bit de stop.
void USARTInit(uint16_t ubrr_value)
{
//Setez Baud rate
UBRR0H = (unsigned char)(ubrr_value>>8);
UBRR0L = (unsigned char)ubrr_value;
//activez rx și tx
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
//setez formatul cadrului: 8 biti date,fără paritate
UCSR0C = (3<<UCSZ00);
}
Configurare ADC
Am ales ca referință pentru funcționarea ADC-ului valoarea de 5V, prin setarea bitului REFS0 din ADMUX. În acest caz, orice valoare analogică între 0-5V este convertită în valoarea echivalentă ADC așa cum o să prezint în cele ce urmează. Intervalul 0-5V este divizat în 1023 de pași. Astfel, având 0V la intrare, ieșirea va fi 0, iar la 5V la intrare valoarea de ieșirea a ADC este 1023. Convertorul analog-digital al microcontroller-ului convertește valorile analogice ale semnalelor în unele digitale la intervale regulte. Acest interval este determinat de frecvența ceasului. În general, ADC-ul lucrează cu frecvențe in intervalul 50kHz-200 kHz. Frecvența CPU este de ordinul MHz, de aceea este necesar un factor de divizare a frecvenței. Am ales factorul de prescalare 128. Pentru a activa ADC-ul este necesară setarea bitului ADEN. Regiștrii microcontroller-ului sunt pe 8 biți, iar rezultatul conversiei ADC este pe 10 biți, de aceea este necesară stocarea rezultatului în 2 regiștrii. Am ales ca rezultatul să fie aliniat la stânga.
void InitADC ( )
{
// pentru ARef = AVcc
ADMUX |= (1<<REFS0) ;
//ADC enable si prescalar Div Factor = 16 si frecv de 8MHz inte 50-100kHz;impart si vad ca trebuie sa laeg prescalerul intrte 40-160(aleg 128)
ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) ;
ADMUX|=(1<<ADLAR);// aliniat la stanga
Recepția pragurilor trimise de către master
Prin utilizarea funcțiilor USARTReceive și USARTReceiveString care vor fi prezentate mai detaliat în anexe sunt recepționate pragurile setate de către utilizator. Pragurile vor fi recepționate în următoarea ordine : interval citire, temperatura minimă, luminozitate minimă, temperatură maximă și umiditate sol minimă. Pentru timpul la care să se execute citirile s-a ales următoarea convenție : dacă s-a recepționat litera ‘b’ există un delay de 10 secunde între cele patru seturi de citiri ale canalelor convertorului analog-digital, după care are loc medierea valorilor, în final rezultând o valoare de 40 secunde, valoare care a fost setată de către utilizator. În caz contrar, dacă se recepționeză litera ‘c’, pe baza aceluiași principiu enunțat mai sus, rezultă o valoare de 60 secunde setată de către utilizator.
//intervalul la care sa se realizeze citirile
char delayreceive=USARTReceive();
//temperatura minima
char *tempmin=USARTReceiveString();
double tmin=atof(tempmin);
//luminozitate minima
char *lummin=USARTReceiveString();
double lu=atof(lummin);
//temperatura maxima
char *tempmax=USARTReceiveString();
double tmax=atof(tempmax);
//umiditate sol maxima
char *umsolmin=USARTReceiveString();
double umin=atof(umsolmin);
if(delayreceive=='b')
{
delay=10000;
}
if(delayreceive=='c')
{
delay=15000;
}
Citire senzori și introducerea formulelor pentru obținerea mărimilor corespunzătoare
Citirea canalelor convertorului analog-digital implică folosirea unei funcții ReadADC(uint8_t channel)a cărui descriere este explicată în anexe. Am citit pe rând cele 4 canale corespunzătoare celor 4 senzori.
adc_result_0 = ReadADC (0);
adc_result_1 = ReadADC (1);
adc_result_2 = ReadADC (2);
adc_result_3 = ReadADC (3);
double temp0=adc_result_0*((Vout*constmv/Adcres)/steps);
double HH5030V=adc_result_1 * (Vout/Adcres);
double humidity0=((HH5030V/Vout)-HHconstant)/0.00636;
double light0=adc_result_2;
double voutlight0=light0*(Vout/Adcres);
double lux0=500/(10*((5-voutlight0)/voutlight0));
long soil0=map(adc_result_3,200,1023,100,0);
În funcție de valoarea furnizată de ADC pentru fiecare canal în parte și utilizând
formulele care au fost explicate în capitolul 4 se obțin mărimile specifice condițiilor de mediu.
Explicarea alegerii valorilor pentru constatele din formulele necesare obținerii valorilor condițiilor de mediu:
pentru oricare dintre cei 3 senzori tensiunea de referință este de 5V, rezultă double Vout=5.00;
pentru transformarea din V în mV, rezultă double constmv=1000;
rezoluția convertorului analog-digital este pe 10 biți (210), rezultă Adcres=1023;
pentru LM35, 10mV sunt echivalenți unui grad C, rezultă double steps=10;
pentru HIH-5030 în datasheet este introdusă o constantă pentru calculul umidității, rezultă double HHconstant=0.1515;
Procedura de mai sus se repetă de 4 ori, între citiri fiind un delay de câteva secunde. După aceste citiri, am făcut medierea valorilor obținute pentru fiecare senzor în parte. Am ales această metodă, deoarece valorile senzorilor variau de la o citire la alta și astfel am încercat să mai elimin din instabilitatea măsuratorilor.
Trimiterea măsurătorilor la master (laptop)
Prin intermediul funcției USARTTransmitt_string sunt transmise datele, funcție prezentată detaliat în anexe. Datele sunt transmise în formatul (data1-data2-….-datan). Între fiecare informație transmisă există un delimitator “-”, pentru a sepera datele transmise și a face mai ușoară partea de recepție.
dtostrf(temperatura_mediata, 10, 1, buffer);
USARTTransmitt_string ("(");
USARTTransmitt_string(buffer);
USARTTransmitt_string("-");
dtostrf(humidity_mediata, 10, 1, buffer);
USARTTransmitt_string(buffer);
USARTTransmitt_string("-");
dtostrf(lux_mediata, 10, 1, buffer);
USARTTransmitt_string(buffer);
USARTTransmitt_string("-");
dtostrf(soil_mediata, 10, 1, buffer);
USARTTransmitt_string(buffer);
USARTTransmitt_string("-");
USARTTransmitt_string(onoff);
USARTTransmitt_string(")");
Acționări senzori
-fotorezistor : în cazul în care luminozitatea este mai mică decât valoarea de prag recepționată, se comandă aprinderea unui LED.
if(lux_mediata<lu)
{
PORTB|=(1<<PINB0);
}
else
{
PORTB &=~(1<<PINB0);
}
-umiditate sol : în cazul în care umiditatea solului este mai mică decât valoarea de prag recepționată, se comandă pornirea unui motor de curent continuu. Motorul de curent continuu are rolul unei pompe de apă, fiind o invenție homemade.
if(soil_mediata<umin)
{
PORTD|=(1<<PIND5);
}
else
{
PORTD &=~(1<<PIND5);
}
-switch : în cazul în care switch-ul este on (ușă deschisă), se aprinde un led.
if(bit_is_clear(PIND,4))
{
onoff="on";
PORTB|=(1<<PINB1);
}
else
{
onoff="off";
PORTB &=~(1<<PINB1);
}
-temperatură : în cazul în care temperatura din seră este mai mică decât valoarea de prag minimă recepționată, se comandă pornirea unui sistem de încălzire. În cazul în care temperatura din seră este mai mare decât valoarea de prag maximă recepționată, se comandă pornirea unui ventilator. Pentru orice valoare din interval sistemul funcționează fără a fi necesară luarea unor decizii.
if(temperatura_mediata>=tmax)
{
//pornesc ventilator
PORTD|=(1<<PIND2);
if(temperatura_mediata>d)
{
//sting incalzire
PORTD &=~(1<<PIND7);
}
}
else
{
if(temperatura_mediata>tmax-diferenta)
{
//pornesc ventilator
PORTD|=(1<<PIND2);
if(temperatura_mediata>d)
{
//sting incalzire
PORTD &=~(1<<PIND7);
}
}
else
{
//opresc ventilator
PORTD &=~(1<<PIND2);
if(temperatura_mediata<d)
{
//pornesc incalzire
PORTD|=(1<<PIND7);
}
else
{
if(temperatura_mediata<d+diferenta)
{
//pornesc incalzirea
PORTD|=(1<<PIND7);
}
else{
//opresc incalzire
PORTD &=~(1<<PIND7);}
}
}
}
5.2 Modulul master
5.2.1 Descrierea funcționării
Pentru realizarea interfeței grafice am optat pentru limbajul de programare C#, întrucât este un limbaj simplu, care întrunește toate condițiile pentru dezvoltarea aplicației propuse. În figurile următoare este prezentată interfața grafică care permite unui operator uman să seteze anumite praguri, să vizualizeze în timp real anumiți parametrii ai mediului și să observe grafic evoluția în timp a acestor parametrii.
Aplicația constă dintr-un tab control care este împărțit în două părți: partea care este responsabilă de setarea pragurilor și vizualizarea datelor recepționate și a doua parte care permite vizualizarea graficelor. O imagine de ansamblu a interfeței grafice este prezentată în figurile următoare, prima reprezentând partea de Home, iar un simplu click permite deplasarea în partea dedicată graficelor.
Aplicația care rulează pe laptop/PC:
Permite conectarea la un port COM după realizarea procedurii de împerechere dintre modulul Bluetooth aferent nodului slave și adaptorul Bluetooth al master-ului (laptop)
Permite introducerea valorilor necesare funcționării sistemului de către un utilizator așa cum este prezentat în figura 41
Transmite la distanță prin comunicație fără fir în banda de 2.4GHz pragurile setate de un posibil utilizator
Recepționează informațiile primite de la senzori
Afișează și stochează într-o baza de date măsurătorile primite de la senzori
Informează printr-un email utilizatorul cu privire la starea sistemului în cazul apariției unor situații critice
Permite utilizatorului să vizualizeze evoluția parametrilor de mediu în timp prin selectarea unei date calendaristice și realizarea unui grafic. De asemenea, pentru fiecare dintre cei 4 parametrii se poate vizualiza care a fost valoarea minimă și maximă din ziua respectivă, respectiv ora la care au fost atinse aceste valori.
5.2.2 Schema logică
a)Partea Home
(1)După deschiderea aplicației se completează temperatura minima (tmin) , temperatura maximă (tmax) , lumina minimă (lmin), umiditatea solului minimă (umin) pe care utilizatorul le dorește și în funcție de care se vor lua deciziile referitoare la controlul condițiilor de mediu din seră. Se bifează și intervalul la care se dorește ca senzorii să transmită valorile citite, precum și adresa de email.
b)Partea responsabilă de afișarea graficelor
Fig. 39 Schemă logică master-grafice
5.2.3 Realizarea codului
În cele ce urmează voi prezenta codul pentru interfața grafică cu explicațiile de rigoare, cât și capturi de ecran pentru o mai bună exemplificare.
Conform cu schema logică prezentată în subcapitolul anterior după deschiderea aplicației, pașii care trebuie urmați sunt:
Selectarea unui port COM din cele disponibile care apar în lista aferentă combobox-ului pentru realizarea conexiunii.
Funcția următoare permite actualizarea porturilor COM disponibile. Deoarece laptopul nu are Bluetooth integrat, am folosit un adaptor Bluetooth pe care l-am împerecheat cu modulul Bluetooth care aparține de slave. În acest fel se alocă un port COM, care se adaugă într-un combobox de unde poate fi selectat pentru a realiza comunicarea.
private void update_COM_ports ()
{
try
{
string[] ports = SerialPort.GetPortNames();
//update la lista de porturi
this.COMPortName.Items.Clear();
//adaugarea tuturor porturilor diponibile in combo box
foreach (string port in ports)
{
this.COMPortName.Items.Add(port);
}
}
catch (Exception ex)
{}
Completarea pragurilor pentru funcționarea sistemului și validare datelor
Utilizatorul are datoria să seteze pragurile dorite. Fiecare dintre cele 4 textbox-uri au o metodă prin care la apăsarea unei taste se verifică dacă aceasta este sau nu o cifră sau dacă s-a apăsat tasta backspace. Această verificare este utilă în cazul în care din simpla neatenție se introduce o literă, lucru care ar conduce la apariția unor probleme. În continuare am exemplificat această funcționalitate doar pentru unul din textbox-uri, întrucât pentru celelalte bucata de cod este similară.
private void textBox6_KeyPress(object sender, KeyPressEventArgs e)
{
char character = e.KeyChar;
//verifică dacă tasta apăsată este cifră
if (!Char.IsDigit(character) & character != 8)
{
e.Handled = true;
//e.Handled=true are rolul de a restricționa introducerea caracterelor care nu sunt cifre sau tasta backspace în textbox
}
}
Prin intermediul celor două checkbox-uri se alege intervalul de timp la care valorile măsurate să fie trimise la aplicație. Prin bifarea primului checkbox, se dezactivează cel de-al doilea, acest lucru fiind valabil și în sens invers.
private void checkBox1_CheckedChanged_1(object sender, EventArgs e)
{
if (checkBox1.Checked == true)
{
checkBox2.Enabled = false;
}
if (checkBox1.Checked == false)
{
checkBox2.Enabled = true;
}
}
Introducerea adresei de email este necesară pentru ca utilizatorul să primescă anumite înștiințări de la aplicația care rulează pe PC/laptop în cazul în care parametrii măsurați nu se încadrează în limitele setate. Formatul adresei de email este verificat prin intermediul unei expresii regulate. Expresia de validare a adresei de email începe cu semnul ^ și se termină cu semnul $, ceea ce înseamnă că potrivirea trebuie să fie pentru toate caracterele unei adrese de email. Am verificat partea de username a unei adrese de email și apoi partea de subdomeniu. Dacă email-ul nu este introdus corect apare mesajul de eroare “Email invalid”.
private void textBox3_Validating(object sender, CancelEventArgs e)
{
System.Text.RegularExpressions.Regex rEMail = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z][\w\.-]{2,28}[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$");
if (textBox3.Text.Length > 0)
{
if (!rEMail.IsMatch(textBox3.Text))
{
MessageBox.Show("Email invalid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
textBox3.SelectAll();
e.Cancel = true;
}
}
}
Conectarea/deconectarea master-ului
Partea de conectare este disponibilă doar după ce toate pragurile au fost completate. Dacă există vreun prag necompletat apare un mesaj de eroare prin care se solicită completarea tuturor datelor.
if ((textBox1.Text == string.Empty) | (textBox2.Text == string.Empty) | (textBox4.Text ==string.Empty)|(textBox6.Text==string.Empty) | (String.IsNullOrEmpty(textBox3.Text)))
{
MessageBox.Show("Completati campurile goale!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
Un Windows Form oferă posibilitatea de a alege din lista de componente disponibile o componentă numită SerialPort. După alegerea componentei și adăugarea acesteia în formular, am creat un obiect numit serialPort1 care permite accesul la portul serial. Pentru a putea utiliza funcționalitatea aceastei componente a fost necesară introducerea directivei using System.IO.Ports;. În fereastra de proprietăți a serialPort1 am adăugat “port_DataReceived” în câmpul DataReceived.
Inițierea comunicației se realizează prin selectarea unui port COM. Codul următor este necesar pentru configurarea baud rate la 9600, numărului de biți de stop (1) și a biților de paritate, precum și a registrului pentru datele recepționate. Odată ce comunicația a fost stabilită în partea stanga de jos a aplicație apare un mesaj ”Conectare cu success ”.
private void ConnectButton_Click(object sender, EventArgs e)
{
if (serialPort1 != null && ConnectButton.Text == "Conectare")
{
//Initierea comunicatiei
serialPort1.PortName = COMPortName.Text;
serialPort1.BaudRate = 9600;
serialPort1.StopBits = StopBits.One;
serialPort1.Parity = Parity.None;
serialPort1.DataReceived+=new SerialDataReceivedEventHandler(port_DataReceived);
serialPort1.Open();
ConnectButton.Text = "Deconectare";
Informationbox.Text = "Conectare cu succes";
}
Partea de deconectare a master-ului presupune încheierea comunicației pe portul serial.
else
{
serialPort1.Close();
serialPort1.DataReceived-=new SerialDataReceivedEventHandler(port_DataReceived);
serialPort1 = null;
ConnectButton.Text = "Conectare";
Info_box.Text = "Port deconectat";
label6.Hide();
label7.Hide();
label28.Hide();
label65.Hide();
textBox3.Enabled = true;
}
}
Trimiterea pragurilor la slave pentru funcționarea sistemului
După completarea câmpurilor și conectarea la un port serial este necesară apăsarea butonului Automat pentru ca toate datele să fie transmise la slave. Printr-un message box se înștiințează că datele au fost trimise.
private void button5_Click(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
serialPort1.Write("b");
checkBox2.Enabled = false;
}
if (checkBox2.Checked)
{
serialPort1.Write("c");
checkBox1.Enabled = false;
}
//trimitere temperatura minima, luminozitate minima, temperatura maxima, umiditate sol minima
serialPort1.Write(textBox1.Text + "\r\n");
serialPort1.Write(textBox2.Text + "\r\n");
serialPort1.Write(textBox4.Text + "\r\n");
serialPort1.Write(textBox6.Text + "\r\n");
textBox1.Enabled = false;
textBox2.Enabled = false;
textBox3.Enabled = false;
textBox4.Enabled = false;
textBox6.Enabled = false;
MessageBox.Show("Sent");}
Odată ce conexiunea s-a realizat cu succes există o serie de pași care sunt executați atunci când datele sosesc prin conexiunea Bluetooth de la slave. Acești pași sunt:
Recepția datelor primite de la slave, afișarea și stocarea acestora în baza de date
Funcția următoare permite recepția datelor de la port. Dacă am primit caractere ele vor fi adaugate permanent în buffer-ul dataReceived și se va apela funcția care permite afișarea acestora.
public void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (e.EventType == SerialData.Chars)
{
dataReceived += serialPort1.ReadExisting();
Display_data();
}
}
Datele de la slave sunt transmise în formatul (data1-data2-….-datan). Datele sosite sunt delimitate de caracterul – pentru a separa informațiile de la fiecare senzor. Folosind
funcțiile indexOf și Substring care permit lucrul cu string-uri, am separate informațiile primate de la senzori.
Conectarea la o bază de date necesită o conexiune care oferă informații despre server-ul la care urmează să se realizeze conectarea, baza de date utilizată. Fiecare bază de date are caracteristicile sale proprii, propriul server și informații de logare. Astfel, conectarea se face la localhost pe portul 3306, informații care sunt stocate într-un string. Localhost-ul este un server personal, ușor de instalat pe orice laptop și este creat cu ajutorul programului xampserver.
MySqlConnection conn este folosit pentru a crea obiectul și primește ca parametru string-ul care conține informațiile de conectare. Această linie de cod string myInsert = "insert into test.edata(temperatura,umiditate,data,time,dataandtime,lumina,umiditatesol) values (@temperatura,@umiditate,@data,@time,@dataandtime,@lumina,@umiditatesol)"; permite inserarea datelor recepționate în tabelul edata. Linia de cod MySqlCommand cmd = new MySqlCommand(myInsert, conn); reprezintă comanda care se va ocupa de interogare și de conectare. Am deschis conexiunea cu funcția Open() . Prin specificarea numelui și valorii parametrului prin cmd.Parameters.AddWithValue("@temperatura", datareceive[0]); pentru ele 5 câmpuri și apelând cmd.ExecuteNonQuery(); interogarea va fi executată, adică datele vor fi inserate în baza de date.
private void Display_data()
{
string extract_data;
if (dataReceived.IndexOf('(') >=0 && dataReceived.IndexOf(')')< dataReceived.Length)
{
extract_data = dataReceived.Substring(dataReceived.IndexOf('('));
if (extract_data.IndexOf(')') >= 0 && extract_data.IndexOf(')') < extract_data.Length)
{
extract_data = extract_data.Substring(1, extract_data.IndexOf(')') – 1);
datareceive = extract_data.Split('-');
string myConn= "datasource=localhost;port=3306;username=root;password=";
MySqlConnection conn = new MySqlConnection(myConn);
try
{
conn.Open();
string myInsert = "insert into test.edata(temperatura,umiditate,data,time,dataandtime,lumina,umiditatesol)vluees (@temperatura,@umiditate,@data,@time,@dataandtime,@lumina,@umiditatesol)";
MySqlCommand cmd = new MySqlCommand(myInsert, conn);
cmd.Parameters.AddWithValue("@temperatura", datareceive[0]);
cmd.Parameters.AddWithValue("@umiditate", datareceive[1]);
cmd.Parameters.AddWithValue("@data", label24.Text);
cmd.Parameters.AddWithValue("@time", label8.Text);
cmd.Parameters.AddWithValue("@dataandtime", label25.Text);
cmd.Parameters.AddWithValue("@lumina", datareceive[2]);
cmd.Parameters.AddWithValue("@umiditatesol", datareceive[3]);
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
dataReceived = "";
}
}
}
În vectorul de tip string datareceive se pastrează datele recepționate după ce s-au eliminat caracterele cu rol de delimitare. Astfel, pentru afișarea acestora se folosesc 5 label-uri în care se memorează informațiile din datareceive[0], datareceive[1], etc. Un timer verifică cu o anumită periodicitate dacă vectorul este gol sau nu. Dacă conține anumite date acestea sunt afișate în interfața grafică.
private void timer1_Tick(object sender, EventArgs e)
{
if (datareceive != null)
{
label4.Text = datareceive[0];
label5.Text = datareceive[1];
label22.Text = datareceive[2];
label10.Text = datareceive[3];
label63.Text = datareceive[4];
label6.Show();
label7.Show();
label28.Show();
label65.Show();
}
}
Avertizare prin email în caz de avarie
Înainte de a crea corpul mesajului care va fi transmis automat, am considerat că este necesar să verific dacă există conexiune la internet pentru ca mesajul să poată fi trimis. Email-ul se va transmite doar dacă temperatura este cu ±1C față de valorile setate de utilizator.
SMTP sau Simple Mail Transfer Protocol oferă o modalitate pentru aplicații să se conecteze la serverul de email și de a trimite mesaje de email prin intermediul serviciului SMTP. Cele mai comune clase pe care le-am utilizat în realizarea aplicației sunt:
SmtpClient: Este una dintre clasele de bază care oferă mijloace de conectare la serverul SMTP și trimiterea de mesaje e-mail. Înainte de a folosi această clasă și de a trimite un e-mail, a fost necesară inițializarea propritățile serverului, ca de exemplu gazda ("smtp.mail.yahoo.com"), portul (587), și EnableSSL pentru a permite comunicarea cu serverul SMTP.
MailMessage: Această clasă oferă multe proprietăți specifice mesajului. Dintre proprietățile oferite am folosit câmpul pentru destinatar, numele subiectului pentru mesaj, corpul mesajului.
MailAddress: încapsulează o adresă de email
boolnet_available=System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
double avariemin = Convert.ToDouble(textBox1.Text) – 2.0;
double avariemax = Convert.ToDouble(textBox4.Text) + 2.0;
double t = Convert.ToDouble(temp[0])/100;
if (net_available == true)
{
if(t<=avariemin || t>=avariemax)
{
SmtpClient client = new SmtpClient("smtp.mail.yahoo.com", 587);
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials=newNetworkCredential("[anonimizat]", "florin1987");
MailMessage msg = new MailMessage();
msg.To.Add(textBox3.Text);
msg.From = new MailAddress("[anonimizat]");
msg.Subject = "Sistem de supraveghere a conditiilor de mediu din sere";
msg.Body = "In procesul de functionare normala a sistemului a intervenit o problema intrucat au fost depasite limitele impuse.";
client.Send(msg);
}
}
Realizarea graficelor în funcție de datele stocate în baza de date
Am utilizat librăria ZedGraph care permite crearea de grafice și care oferă un grad ridicat de flexibilitate prin prisma faptului că aproape orice aspect al graficului poate fi modificat. Fiecare dintre părțile graficului este încapsulat într-o structură de clasă , care are posibilitatea de modificarea a parametrilor. Am utilizat mai multe clase, dar cele mai importante sunt :
GraphPane care se ocupă de titlul panoului, fundalul ales, cadrul și axele panoului. Axele (x și y) fac referire la o serie de aspecte pe care de altfel le-am și utilizat: culori, stiluri pentru font, grile pentru grafic, opțiuni de afișare pentru domeniul de măsurare.
CurveItem este o clasă de bază care conține datele pentru o singură curbă dintr-un grafic. Există mai multe derivate din această clasă (BarItem, PieItem,etc.), dar am ales să lucrez cu LineItem.
private void CreateGraph1(ZedGraphControl zedGraphControl3)
{
GraphPane myPane3 = zedGraphControl3.GraphPane;
myPane3.Fill = new Fill(Color.DarkSeaGreen, Color.FromArgb(180, 210, 180), 11F);
myPane3.XAxis.MajorGrid.IsVisible = true;
myPane3.YAxis.MajorGrid.IsVisible = true;
myPane3.XAxis.Type = AxisType.DateAsOrdinal;
myPane3.XAxis.Scale.Format = "HH:mm:ss";
myPane3.Title.Text = "Baza de date";
myPane3.XAxis.Title.Text = "Timp[ore]";
myPane3.YAxis.Title.Text = "Umiditate[%]";
LineItem curve3 = myPane3.AddCurve("Umiditate", listbd1, Color.CadetBlue, SymbolType.None);
myPane3.XAxis.Scale.FontSpec.Angle = 45;
myPane3.XAxis.Scale.FontSpec.Size = 12;
curve3.Line.Width = 2;
myPane3.YAxis.Scale.Min = 0;
myPane3.YAxis.Scale.Max = 100;
zedGraphControl3.AxisChange();
}
Utilizatorul are posibilitatea prin intermediul unui dateTimePicker să aleagă o zi
calendaristică pentru a vizualiza evoluția parametrilor de mediu. În figura următoare este capturată o imagine care exemplifică acest lucru. Din câte se poate observa există și un buton utilizat pentru obținerea graficelor.
Din momentul în care o dată a fost selectată și butonul a fost apăsat se realizează o conexiune la baza de date în care sunt stocate datele. Pe baza datei alese am făcut o selecție a tuturor datelor stocate în ziua aleasă.
private void button3_Click(object sender, EventArgs e)
{
string constring = "datasource=localhost;port=3306;username=root;password=";
MySqlConnection conDataBase = new MySqlConnection(constring);
MySqlCommand cmdDataBase = new MySqlCommand("select * from test.edata where data= '"+dateTimePicker1.Value.ToString("yyyy:MM:dd")+"';", conDataBase);
MySqlDataReader myReader;
conDataBase.Open();
Totodată are loc selecția din baza de date a mărimilor maxime și minime pentru ziua aleasă, precum și intervalul de timp la care acestea au fost obținute. Pentru obținerea valorii minime dintr-o zi am folosit min(temperatura), iar pentru a afla intervalul de timp la care a fost înregistrată am ordonat crescător valorile în funcție de temperatură. În cazul valorilor maxime, am folosit același principiu, cu mențiunea că valorile le-am sortat descrescător în funcție de temperatură.
string temperaturamin = "select min(temperatura) from test.edata where data= '" + dateTimePicker1.Value.ToString("yyyy:MM:dd") + "'";
MySqlCommand com = new MySqlCommand(temperaturamin, conDataBase);
mintemp.Text = com.ExecuteScalar().ToString();
string tempdbmin =mintemp.Text.ToString();
if (mintemp.Text!= "")
{
//selectez momentul de timp la care temp a fost minima
string temperaturamintime = "select time from test.edata where data= '" + dateTimePicker1.Value.ToString("yyyy:MM:dd") + "' order by temperatura asc limit 1";
MySqlCommand commintime= new MySqlCommand(temperaturamintime, conDataBase);
label51.Text = commintime.ExecuteScalar().ToString();
}
Am utilizat metoda Read() pentru a obține toate înregistrările care au rezultat în urma interogării, apoi fiecare înregistrare este adăugată la grafic.
.
myReader = cmdDataBase.ExecuteReader();
while (myReader.Read())
{
DateTime tm = myReader.GetDateTime(5);
double tempbd = myReader.GetDouble("temperatura");
listbd.Add(tm.ToOADate(), tempbd);
}
zedGraphControl2.AxisChange();
zedGraphControl2.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}}
Rezultatul final este reprezentat în figura 46.
6 RAPORT TEHNICO-ECONOMIC
Obiectivul primar al proiectului “Sistem de supraveghere și control a condițiilor de mediu din sere și stocarea măsurătorilor într-o bază de date ” este realizarea unui sistem interactiv automatizat pentru măsurarea și controlul temperaturii, umidității solului și luminii care să permită persoanelor care se ocupă de sere să stăpânească procesul de încălzire și ventilare, de irigare și asigurarea unei cantități optime de lumină artificială pentru creșterea în condiții bune a plantelor.
Înainte de proiectarea sistemului s-a realizat o analiza de piață prin investigarea ofertei de sisteme automate de control și supraveghere a condițiilor de mediu comercializate prin magazinele de specialitate și pe Internet. În urma aceste analize s-a ajuns la concluzia că există o multitudine de soluții care în principiu îmbracă aceeași formă, fiind formate din unitate centrală cu montare interioară sau exterioară, capabilități de interconectare pe fir și/sau fără fir cu un număr variabil de senzori dedicați procesului dorit.
Soluții tehnice și tehnologice astfel încât sistemul să satisfacă cu succes cerințele de pe piață:
Produsele trebuie construite astfel încât prețurile acestora să fie în concurență cu produsele deja existente
Produsul trebuie realizat astfel încât să permită dezvoltare ulterioară prin introducerea de noi funcțiuni
Produsul trebuie conceput ca un produs independent care să permită soluții de realizare a unui sistem automat de control al parametrilor de mediu prin utilizarea unor echipamente de calcul (PC, laptop) existente la posibilii utilizatori
Posibilitatea informării posibililor utilizatori despre starea sistemului (email, SMS)
Acest raport tehnico-economic se referă la estimarea cheltuielilor în cadrul proiectului menționat mai sus. Costurile proiectului au fost estimate ținând cont de prețurile de pe piață al componentelor hardware la începutul anului 2015. Toate sumele sunt exprimate în RON. Tabelul de mai jos reprezintă investiția necesară luând în considerare prețul fiecărei componente hardware care a stat la baza construirii sistemului.
Având în vedere toate prețurile pentru fiecare componentă care sunt prezentate în tabelul următor, efectuând un simplu calcul matematic rezultă că aceste componente hardware costă 193,9 RON pentru un singur prototip. În acest calcul nu s-a luat în considerare transportul componentelor care au fost achiziționate de pe diferite site-uri de specialitate, transport care valorează în jur de 60 RON.
Tab. 3 Componente –preț
7 CONCLUZII
Prin prezentul proiect am reușit să realizez un sistem automat de supraveghere și control a parametrilor de mediu cu aplicații directe în agricultură, în sere, etc. A fost realizată o unitate automatizată de comandă și control, compactă, dispunând de un soft ușor de utilizat de posibilii utilizatori. În esență, am realizat un sistem bazat pe microcontroller-ul ATmega328P care are ca scop măsurarea și controlul a patru parametrii esențiali în creșterea plantelor: temperatura, umiditatea, umiditatea solului și lumina. Scopul principal al proiectului este controlul automat al parametrilor de mediu, astfel încât intervenția operatorului uman să fie redusă.
În ciuda faptului că pe parcursul dezvoltării proiectului am întâmpinat diferite probleme, în final am reușit să ating obiectivul pe care mi l-am propus încă de la început. Una din problemele de care m-am lovit încă de la început a fost partea de transmisie și recepție utilizând modulul Bluetooth, întrucât recepționam caractere eronate. Am reușit să remediez această problemă prin utilizarea unui oscilator extern care mi-a oferit o stabilitatea mai mare a frecvenței.
Sistemul proiectat de mine are o serie de avantaje, printre care:
monitorizarea permanentă a mediului ambiant și productivitate crescută prin accelerarea ritmului de creștere a plantelor
pornirea automată a sistemului de ventilare/încălzire/irigare, astfel încât intervenția operatorului uman este redusă
menținerea unei baze de date mereu actualizată și realizarea de grafice la cerere
avertizare prin email în cazul apariției unor situații critice
Ceea ce mi-am propus pe viitor este realizarea montajului pe cablaj imprimat, întrucât la momentul actual toată partea hardware este dezvoltată pe o placă de test(breadboard).Acest proiect a pornit de la o simplă idee pe care pe parcurs am încercat sa o îmbunătățesc, însă pe partea de dezvoltări ulterioare există mai multe direcții în care se poate continua. Având în vedere cele prezentate anterior, voi menționa câteva dintre opțiunile la care m-am gândit că ar putea constitui o îmbunătățire a sistemului.
O primă direcție este aceea de îmbunătățire a comunicării prin monitorizarea sistemului de la o distanță mai mare de 10m prin WiFi. În acest scop m-am gândit la utilizarea modului WiFi ESP8266.
Pentru că în ziua de astăzi aplicațiile pe Android sunt populare și pentru că este un sistem de operare mult mai permisiv în privința dezvoltării unor noi aplicații, o altă direcție importantă în îmbunătățirea sistemului este realizarea unei aplicații pe telefonul mobil care să-i permită operatorului uman vizualizarea parametrilor măsurați.
O altă direcție la care m-am gândit este crearea unei rețele formată din mai multe noduri slave (de exemplu 3), care conțin aceeași senzori pe care îi folosesc și la momentul actual. Scopul nodului master ar fi interogarea ciclică a celor 3 noduri slave care s-ar afla în incinte diferite și captarea informațiilor de la aceștia. Deoarece implementarea hardware a noului sistem ar presupune costuri ridicate, simularea acestora este o idee la îndemână pentru faza de început.
8 BIBLIOGRAFIE
[1] http://www12.tuiasi.ro/users/112/L.Zaharia-SMCAD-curs.pdf
[2] Borza, P., Gerigan, C., Ogruțan, P. și Toacșe, Gh. – Microcontrollere. Aplicații, Editura Tehnică, București, 2000.
[3] http://web.ulbsibiu.ro/laurean.bogdan/html/Microcontrolere%20introducere.pdf
[4] http://webbut.unitbv.ro/Carti%20on-line/BSM/BSM/capitol4.pdf
[5] http://andrei.clubcisco.ro/cursuri/3pm/lab4.pdf
[6] http://www.atmel.com/tools/atmelstudio.aspx
[7] https://www.protostack.com/download/Users%20Guide%20(AC-PG-USBASP-UG-V1.2).pdf-DatasheetUSBasp
[8] http://www.math.uaic.ro/~mapetrii/POO/depozit/Curs7.pdf
[9] https://www.mysql.com/products/workbench/
[10]http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf- ATmega328P
[11] http://www.ti.com/lit/ds/symlink/lm35.pdf -Datasheet LM35
[12] http://sensing.honeywell.com/index.php?ci_id=49692-Datasheet HIH-5030
[13] http://eprofu.ro/docs/electronica/carte/fotorezistor-fotodioda-fototranzistor.pdf
[14] http://eprofu.ro/docs/electronica/carte/fotorezistor-fotodioda-fototranzistor.pdf -Datasheet sensor umiditate sol YL-69
[15] http://pdf.datasheetcatalog.com/datasheet/BayLinear/mXtvuyw.pdf
[16] Marian PEARSICĂ, Mădălina Petrescu "Mașini electrice", Editura Academiei Forțelor Aeriene "Henri Coanda" , Brașov 2007
[17] http://webbut.unitbv.ro/Carti%20on-line/BSM/BSM/capitol5.pdf
[18]http://www.phys.ubbcluj.ro/~anghels/teaching/Electronics/capitole%20electronica%20pdf/Amplificarea.pdf
[19]http://www.robotics.ucv.ro/flexform/craiova_cursuri/C4/Comunicatii%20la%20distanta.%20Telegestiune/2.%20Evolutia%20Bluetooth%20-%20versiuni.pdf
[20]http://www.rcscomponents.kiev.ua/datasheets/hc_hc-05-user-instructions-bluetooth.pdf-Datasheet HC-05
ANEXE
Mediul de dezvoltare Atmel Studio 6.2 pune la dispoziția programatorului, în meniul de inițiere a proiectului, opțiuni pentru inițializări prin încărcarea valorilor potrivite în regiștri, în funcție de indicațiile oferite în foaia de catalog a microcontrollerului. La începutul programului am definit o serie constante: #define F_CPU 8000000UL (frecvența CPU de 8 MHz),#define FOSC F_CPU (frecvența oscilatorului care are valoarea tot de 8MHz),#define BAUD 9600 (rata de transmisie a datelor 9600) și o constată pe care o folosesc în procesul de inițializare a comunicației #define MYUBRR FOSC/16/BAUD-1.
Partea de inițializare USART a fost prezentată, de aceea în cele ce urmează voi prezenta codul aferent părților de recepție și transmisie a datelor.
//********************************************************************
Transmisie USART
void USARTTransmitt(unsigned char data)
{
while(!(UCSR0A & (1<<UDRE0)))
{
}
UDR0=data;
}
Această funcție oferă date la USART care le transmite mai departe pe linia TX. Înainte de a scrie date, am verificat dacă buffer-ul este gol sau nu. Dacă nu este gol, înseamnă că acesta este ocupat trimițând date și imediat ce termină el preia o altă dată din buffer și o transmite. De fiecare dată când USART preia date din buffer și buffer-ul devine gol, el anunță prin setarea UDRE0 din UCSRA0. Aștept până când bitul este setat, iar după ce acesta a fost setat cu siguranță buffer-ul este gol și pot fi scrise noi date în buffer.
Recepție USART
char USARTReceive()
{
while(!(UCSR0A & (1<<RXC0)))
{
}
return UDR0;
}
Datele sunt recepționate automate de USART și stocate în buffer și un bit din registrul UCSRA0 este setat pentru a indica că datele sunt disponibile în buffer. Datele sunt citite și procesate, în caz contrar dacă sunt recepționate noi date și nu sunt citite ele se vor pierde.
Următoarele două funcții sunt utilizate pentru transmisia, respectiv recepția unui string și apelează la funcțiile prezentate anterior.
Transmisia unui string am implementat-o în funcția USARTTransmitt_string (char* Stringtransmitt).În bucla while verific dacă mai sunt caractere de trimis, iar acest lucru este realizat prin simpla verificare a caracterului actual pentru a vedea dacă este sau nu diferit de caracterul nul. În cazul în care acesta este diferit, folosind funcția USARTTransmitt trimit un caracter la un moment dat. Prin Stringtransmitt ++ incrementez pointerul pentru a citi următorul caracter.
void USARTTransmitt_string(char* Stringtransmitt)
{
while(*Stringtransmitt != 0x00){
USARTTransmitt(*Stringtransmitt);
Stringtransmitt ++;
}
În funcția USARTReceiveString recepționez un string. Într-un buffer rețin caracterul receptionat cu ajutorul funcției USARTReceive(). Apoi, într-o buclă while verific dacă caracterul recepționat este diferit de caracterul nul și incrementez buffer-ul.
char* USARTReceiveString(void)
{
static char receivestring[20];
static char* bufferrx;
bufferrx = receivestring;
while((*bufferrx =USARTReceive()) != '\n')
{
++ bufferrx;
}
return receivestring;
}
//********************************************************************
O altă parte importantă în implementarea sistemului o joacă utilizarea convertorului analog-digital. În continuare este prezentată partea de citire a unui canal.
//********************************************************************
Citirea unui canal ADC
uint16_t ReadADC(uint8_t channel_adc)
{
//selectez canalul(0-7)
channel_adc &= 0b00000111; // si cu 7
ADMUX = (ADMUX & 0xF8)|channel_adc; // sterg ultimii 3 biți inainte de sau
//pornesc o noua conversie prin setarea ADSC
ADCSRA |= (1<<ADSC) ;
// astept terminarea conversiei
// ADSC devine 0 din nou
// pana atunci ruleaza in bucla
while(ADCSRA & (1<<ADSC));
//preiau rezultatul pe 10 biti
uint8_t thelow= ADCL;
uint16_t theTenBitResults = ADCH<<2 | thelow>>6;
return theTenBitResults;
}
Prin intermediul funcției readADC am posibilitatea să aleg oricare dintre cei 6 canale ADC de pe care doresc să le citesc. Prin channel_adc &= 0b00000111; folosesc o mască (7 în decimal) pentru a mă asigura că întotdeauna canalul ales este între ADC0-ADC5. Înainte de de a citi un alt canal, folosind masca 0XF8 pentru a mă asigur că selecția canalului anterior este eliminată (ADMUX & 0xF8). Pentru a porni o nouă conversie este necesară înscrierea bitului ADSC cu valoarea 1. Această valoare rămâne 1 atâta timp cât conversia este în curs de desfășurare apoi revine la valoarea 0. Într-o buclă aștept terminarea conversiei după care preiau rezultatul pe 10 biți.
//********************************************************************
Alte funcții:
//********************************************************************
long map (long value, long inputmin, long inputmax, long outputmin, long outputmax) {
return (value – inputmin) * (outputmax – outputmin) / (inputmax – inputmin) + outputmin;
}
Funcția are rolul de a mapa o valoare primită într-un anumit interval de valori. Astfel, intervalul de valori de intrare minim și maxim va fi mapat în intervalul de valori de ieșire minin și maxim. Funcția este necesară senzorului de umiditate sol, unde o valoare de 200 înseamnă umiditate 100%, iar o valoare de 1023 reprezintă umiditate 0%. Pentru orice altă valoare din acest interval de intrare 200-1023, funcția map calculează valoarea corespunzătoare.
//********************************************************************
La începutul funcției main sunt apelate funcțiile de inițializare USART și ADC, precum și inițializarea porturilor ca intrări și ieșiri în funcție de cerințe. Totodată au loc și recepția pragurilor pentru funcționarea sistemului care au fost prezentate în capitolul 6.
int main(void)
{
USARTInit ( MYUBRR );
InitADC ( ) ;//Initializez ADC
sei();
DDRB|=(1<<PINB0);//output pentru LED
DDRD &=~(1<<PIND4); //input pentru switch
PORTD|=(1<<PIND4);
DDRD|=(1<<PIND2)|(1<<PIND3)|(1<<PIND5)|(1<<PIND6)|(1<<PIND7);//Directia portului D ca iesire pt 2 și 3 pt MOTOR1 si iesire 5 SI 6 pt M2
int delay;
uint16_t adc_result_0 ;
uint16_t adc_result_1;
uint16_t adc_result_2;
uint16_t adc_result_3;
char delayreceive=USARTReceive();
char *tempmin=USARTReceiveString();
double tmin=atof(tempmin);
char *lummin=USARTReceiveString();
double lu=atof(lummin);
char *tempmax=USARTReceiveString();
double tmax=atof(tempmax);
char *umsolmin=USARTReceiveString();
double umin=atof(umsolmin);
if(delayreceive=='b')
{
delay=10000;
}
if(delayreceive=='c')
{
delay=15000;
}
În continuare se poate observa în funcția main() o buclă infinită în care au loc citirile canalelor ADC, medierea valorilor acestora și luarea unor decizii în funcție de pragurile recepționate prin funcția readString(). Întrucât în subcapitolul dedicat părții software al programului stocat în microcontroller s-a prezentat această parte a codului, aici doar se va exemplifica pentru o mica parte pentru a întregii imaginea părții software.
while(1)
{
adc_result_0 = ReadADC (0) ;
adc_result_1 = ReadADC (1) ;
adc_result_2 = ReadADC (2);
adc_result_3 = ReadADC (3);
double temp0=adc_result_0*((Vout*constmv/Adcres)/steps);
HH5030V=adc_result_1 * (Vout/Adcres);
double humidity0=((HH5030V/Vout)-HHconstant)/0.00636;
double light0=adc_result_2;
double voutlight0=light0*0.0048828125;
double lux0=500/(10*((5-voutlight0)/voutlight0));
long soil0=map(adc_result_3,200,1023,100,0);
delay_ms(delay);
În continuare au loc încă 3 astfel de citiri cu un delay între ele. Din cauza faptului că procedura este similară, am ales să nu mai atașez aceeași bucată de cod. După cele 4 citiri am facut media valorilor, medie pe care ulterior am trimis-o la master.
double temperaturasuma=temp0+temp1+temp2+temp3;
double humiditysuma=humidity0+humidity1+humidity2+humidity3;
double luxsuma=lux0+lux1+lux2+lux3;
double soilsuma=soil0+soil1+soil2+soil3;
double temperatura_mediata=temperaturasuma/4;
double humidity_mediata=humiditysuma/4;
double lux_mediata=luxsuma/4;
double soil_mediata=soilsuma/4;
}
}
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Sistem de Supraveghere a Conditiilor de Mediu din Sere Si Stocarea Masuratorilor Intr O Baza de Date (ID: 163534)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
