Sistem Inglobat Pentru Monitorizare Si Control al Locuintei

Cuprins

Capitolul 1. Introducere

1.1. Contextul proiectului

1.2. Domeniul proiectului

1.3. Structura lucrării de licență

Capitolul 2. Obiectivele proiectului

2.1. Cerințe funcționale

2.1.1. Modul pentru măsurarea umidității în locuință

2.1.2. Modul pentru măsurarea și controlul temperaturii

2.1.3. Modul pentru măsurarea și controlul sistemului de iluminat

2.1.4. Modul pentru măsurarea nivelului de gaze și alertare

2.1.5. Aplicația Android

2.1.6. Serviciul web

2.2. Cerințe non-funcționale

2.2.1. Scalabilitate

2.2.2. Performanța

2.2.3. Securitate

2.2.4. Portabilitate

2.2.5. Utilizabilitatea

Capitolul 3. Studiu bibliografic

3.1. Gestionarea clădirilor

3.2. Sisteme asemănătoare

3.2.1. Sistemul Metasys

3.2.2. Sistemul Synco

3.2.3. Sistemul Honeywell

3.3. Platforme pentru dezvoltarea proiectului

3.3.1. Platforma Raspberry Pi

3.3.2. Platforma Arduino

3.4. Sisteme de operare

3.4.1. Debian

3.4.2. Raspbian

3.5. Comunicare serială (SPI)

Capitolul 4. Analiză și fundamentare teoretică

4.1. Soluții alese

4.2. Funcțiile sistemului

4.2.1. Modulul termostat

4.2.2. Modulul umiditate

4.2.3. Modulul control lumini

4.2.4. Modul alarmă de incendiu

4.3. Protocolul de comunicare serială SPI

4.3.1. Trăsăturile distinctive ale protocolului SPI

4.3.2. Moduri de operare

4.3.3. Descrierea semnalelor

4.3.4. Descrierea registrelor

4.3.5. Transmisia de date

4.4. Convertor analog-digital MCP3008-I/SL

4.4.1. Formule de calcul

4.4.2. Secvență de comunicare

4.5. Senzor de temperatură LM50

4.6. Senzorul de lumină PT15-21C/TR8

4.7. Senzorul de umiditate SYH-2R

4.8. Senzorul de gaze MQ-2

4.9. Sursa de alimentare

4.10. Client SMTP

4.11. Server PHP

4.12. Server baze de date

Capitolul 5. Proiectare de detaliu si implementare

5.1. Componente periferice

5.1.1. Pregătirea plăcii pentru prima utilizare

5.1.2. Convertorul analog – digital

5.1.3. Modul termostat

5.1.4. Modul umiditate

5.1.5. Modul control lumini

5.1.6. Modul alarmă de incendiu

5.2. Componente software

5.2.1. Diagramă de secvență

5.2.2. Aplicația înglobată

5.2.3. Utilizarea bazei de date

5.2.4. Serviciul web

5.2.5. Aplicația Android

Capitolul 6. Testare și validare

6.1. Testarea performanței

6.2. Corectitudinea datelor

Capitolul 7. Manual de instalare si utilizare

7.1. Resurse hardware

7.2. Resurse software

7.3. Rularea sistemului

Capitolul 8. Concluzii

8.1. Conținutul lucrării

8.2. Realizări

8.3. Dificultăți întâlnite

8.4. Dezvoltări ulterioare

Bibliografie

Anexe

Introducere

“Calculatoarele sunt incredibil de rapide, precise și proaste. Ființele umane sunt incredibil de lente, inexacte și geniale. Împreună, puterea lor depășește orice imaginație limită.” (Albert Einstein)

Contextul proiectului

Din viața cotidiană, a fiecărui om care trăiește în secolul XXI, sunt nelipsite dispozitivele electronice și sistemele informatice. Acestea sunt folosite de multe ori fără știință, dar ușurând viața semnificativ pe anumite planuri. Sistemul informatic despre care este vorba în această lucrare este adesea întâlnit la clădiri mari, de birouri, unde necesitatea unui astfel de sistem este mult mai mare, dar trendul este de a scala astfel de sisteme la un nivel mai scăzut pentru a fi accesibil oamenilor simpli, pentru automatizarea propriei locuințe.

Utilitatea acestui sistem se adresează acelor persoane care nu muncesc la domiciliu și ajung acasă târziu. Modul în care acest sistem ajută utilizatorul este prin monitorizarea și controlul anumitor dispozitive mecanice, cum ar fi sistemul de încălzire sau alarma de incendiu, la distanță asupra propriei locuințe. Monitorizarea și controlul se efectuează prin intermediul unui dispozitiv mobil conectat la internet, smartphone, tableta etc, pe care rulează un sistem de operare Android. Cu ajutorul acestui sistem persoanele beneficiare, se pot simți confortabil și în siguranță.

Domeniul proiectului

Domeniul proiectului de față este dezvoltarea unui sistem informatic de administrare al locuinței, care să poată fi acționat de la distanță. Acest sistem informatic de administrare al locuinței este un ansamblu de reguli cu ajutorul cărora anumite condiții existente la domiciliul beneficiarului, pot fi monitorizate sau chiar controlate de la distanță.

Sistemul trebuie instalat în locuințele unde acesta urmează să își desfășoare domeniul de activitate, preluând controlul anumitor dispozitive mecanice și electrice, iar prin controlarea acestora unele condiții existente în locuință pot fi modificate. Un astfel de sistem este constituit din două părți importante: o parte hardware si o parte software. Partea hardware se ocupă de monitorizarea si controlarea condițiilor existente, cum ar fi temperatura, umiditatea, iluminarea sau chiar sisteme de siguranță, sistemul de incendiu sau sistemul de alarmă. Partea software se ocupă de modul în care acesta monitorizează și controlează condițiile de confort, dar si de manipularea acestora la distanță.

Beneficiile oferite consumatorului de acest sistem ar fi controlul și monitorizarea la distanță asupra locuinței, concretizându-se atât printr-un confort mult îmbunătățit, dar si prin reducerea consumului de utilități, rezultând costuri reduse de întreținere.

Structura lucrării de licență

În acest subcapitol va fi prezentat pe scurt conținutul fiecărui capitol care urmează să fie prezent în această lucrare.

În primul capitol se realizează introducerea cititorului în contextul și domeniul de activitate al produsului. Tot aici se regăsește și un rezumat succint al conținutului prezentat în fiecare capitol.

Cel de-al doilea capitol prezintă tema propriu-zisă și detaliază obiectivele pe care acest sistem trebuie să le îndeplinească. Fiecărui modul al acestui proiect îi este prezentată funcționalitatea.

Capitolul al treilea va conține studiu despre documentarea bibliografică care a fost necesară în stadiul de proiectare al acestui sistem informatic. În cadrul acestui capitol regăsim informații despre modul în care acest gen de sisteme ne ajută, despre sisteme asemănătoare deja existente pe piață și despre tehnologii folosite pentru crearea sistemului.

Capitolul patru împreună cu următorul sunt cele mai importante capitole fiind prezentate detaliile proiectului. Capitolul intitulat Analiză și fundamentare teoretică conține explicații teoretice detaliate despre principiile de funcționare și implementare ale aplicației. Vor fi explicate protocoalele utilizate, soluțiile alese, dar și modurile de funcționare ale componentelor folosite pentru realizarea proiectului.

În capitolul intitulat Proiectare de Detaliu și Implementare aplicația este explicată în detaliu, astfel încât aceasta să poată fi înțeleasă în întregime cu scopul ca mentenanța și dezvoltarea ulterioară să fie posibilă. Tot în acest capitol este inserată o diagramă principală detaliată a modului în care sistemul lucrează. Este descris modul de funcționare al fiecărei componente folosite și modul interacțiunii dintre aceasta și modulul din care fiecare face parte.

Capitolul Testare și validare este dedicat pentru testarea și validarea funcționării sistemului, dar si explicarea datelor obținute în urma acestor teste. Sunt prezentate atât rezultatele obținute în urma testării cerințelor funcționale cât și cele obținute în urma testării cerințelor non-funcționale cum ar fi indicele de performanță.

În cadrul capitolului Manual de Instalare și Utilizare sunt prezentate resursele software și hardware necesare instalării și rulării aplicației, precum și o descriere pas cu pas a procesului de instalare, rulare și utilizare.

Acest capitol prezintă modul de instalare și utilizare a sistemului din punctul de vedere al utilizatorului, fără să fie menționate aspecte tehnice pentru care să trebuiască cunoștințe specifice din domeniul IT. Sunt folosite o sumedenie de capturi ale ecranului pentru ca utilizatorul să înțeleagă cu ușurință cum trebuie folosit produsul.

În capitolul cu numărul opt sunt prezentate concluziile rezultate în urma proiectării, implementării și testării proiectului. Sunt prezentate anumite situații cheie întâlnite pe parcursul celor trei etape principale enumerate mai sus.

În finalul documentului sunt prezente bibliografia și anexele. La bibliografie sunt enumerate referințele bibliografice la care se face referire pe parcursul celor 8 capitole, iar ultima parte o reprezintă anexele care conțin cele mai importante funcții din acest proiect.

Obiectivele proiectului

Principalul obiectiv al acestui proiect este realizarea unui sistem înglobat care odată montat în locuință preia din sarcinile utilizatorului, prin monitorizare și control în timp real a anumitor dispozitive electronice sau mecanice. Acest sistem trebuie să poată fi monitorizat și controlat de la distanță, prin intermediul internetului, cu ajutorul unui dispozitiv pe care rulează sistemul de operare Android.

Dezvoltarea aplicației Android este un alt obiectiv în realizarea acestui proiect. Prin intermediul acestei aplicații pot fi monitorizate condiții existente in locuința de domiciliu sau de vacanță a celui care dorește montarea lui, dar și controlul anumitor module, cum este modulul de termostat sau modulul de iluminat.

Sistemul trebuie sa fie unul accesibil utilizatorilor obișnuiți, care nu au de-a face cu domeniul informaticii sau al electronicii, simpli utilizatori ai unor dispozitive portabile conectate la internet. Funcționalitățile sistemului trebuie sa fie utile consumatorilor pentru îmbunătățirea confortului. Interfața aplicației Android trebuie să fie una ușor de utilizat, înțeleasă de oameni de toate vârstele.

Funcționalitățile sistemului trebuie să fie exacte și executate într-un timp cât mai scurt. Timpul de răspuns cât mai scăzut trebuie să fie o caracteristică puternică a sistemului rezultat în urma acestui proiect. Este important să nu fie o diferență importantă între acționarea directă a sistemului și acționarea la distanță asupra acestuia.

Stabilitatea, performanța și scalabilitatea trebuie să se numere printre principalele caracteristici ale sistemului.

Cerințe funcționale

Sistemul trebuie creat pentru a fi folosit de utilizatori obișnuiți, care nu activează în domeniul ingineresc, iar singurele cunoștințe pe care aceștia le dețin sunt cele de utilizare ale sistemului de operare Android. Din acest motiv interfața utilizator trebuie să fie intuitivă si prietenoasă cu cel care o folosește. În cadrul acestei interfețe se vor pune la dispoziția beneficiarului funcționalitățile sistemului.

Obiectivele funcționale pe care sistemul trebuie să le cuprindă sunt următoarele:

Măsurarea temperaturii în mai multe încăperi ale locuinței

Controlul sistemului de încălzit separat pentru fiecare încăpere în funcție de senzorul de temperatură prezent în aceasta

Utilizatorul trebuie să poată controla temperatura din locuință

Măsurarea umidității din locuință

Măsurarea luminozității

Controlul unor surse de iluminat

Măsurarea nivelului de gaze inflamabile din locuință

Avertizarea proprietarului în caz de pericol

Realizarea aplicației Android pentru controlul de la distanță asupra sistemului înglobat

Realizarea unui serviciu care să ruleze la nivelul păcii Raspberry Pi, pe care va fi implementat sistemul, pentru interacțiunea acesteia cu aplicația Android

În cele ce urmează vor fi detaliate cerințele funcționale ale sistemului, fiind dispuse în module.

Modul pentru măsurarea umidității în locuință

Din interfața Android, proprietarul acestui sistem va avea posibilitatea de a monitoriza umiditatea existentă în locuință.

Modul pentru măsurarea și controlul temperaturii

Sistemul va conține un modul pentru monitorizarea temperaturii culese de pe senzorii de temperatură montați în camere diferite ale imobilului. Temperaturile vor fi afișate în interfața utilizator a aplicației Android. Tot de aici utilizatorul poate seta temperatura dorită în incinta locuinței, iar sectronicii, simpli utilizatori ai unor dispozitive portabile conectate la internet. Funcționalitățile sistemului trebuie sa fie utile consumatorilor pentru îmbunătățirea confortului. Interfața aplicației Android trebuie să fie una ușor de utilizat, înțeleasă de oameni de toate vârstele.

Funcționalitățile sistemului trebuie să fie exacte și executate într-un timp cât mai scurt. Timpul de răspuns cât mai scăzut trebuie să fie o caracteristică puternică a sistemului rezultat în urma acestui proiect. Este important să nu fie o diferență importantă între acționarea directă a sistemului și acționarea la distanță asupra acestuia.

Stabilitatea, performanța și scalabilitatea trebuie să se numere printre principalele caracteristici ale sistemului.

Cerințe funcționale

Sistemul trebuie creat pentru a fi folosit de utilizatori obișnuiți, care nu activează în domeniul ingineresc, iar singurele cunoștințe pe care aceștia le dețin sunt cele de utilizare ale sistemului de operare Android. Din acest motiv interfața utilizator trebuie să fie intuitivă si prietenoasă cu cel care o folosește. În cadrul acestei interfețe se vor pune la dispoziția beneficiarului funcționalitățile sistemului.

Obiectivele funcționale pe care sistemul trebuie să le cuprindă sunt următoarele:

Măsurarea temperaturii în mai multe încăperi ale locuinței

Controlul sistemului de încălzit separat pentru fiecare încăpere în funcție de senzorul de temperatură prezent în aceasta

Utilizatorul trebuie să poată controla temperatura din locuință

Măsurarea umidității din locuință

Măsurarea luminozității

Controlul unor surse de iluminat

Măsurarea nivelului de gaze inflamabile din locuință

Avertizarea proprietarului în caz de pericol

Realizarea aplicației Android pentru controlul de la distanță asupra sistemului înglobat

Realizarea unui serviciu care să ruleze la nivelul păcii Raspberry Pi, pe care va fi implementat sistemul, pentru interacțiunea acesteia cu aplicația Android

În cele ce urmează vor fi detaliate cerințele funcționale ale sistemului, fiind dispuse în module.

Modul pentru măsurarea umidității în locuință

Din interfața Android, proprietarul acestui sistem va avea posibilitatea de a monitoriza umiditatea existentă în locuință.

Modul pentru măsurarea și controlul temperaturii

Sistemul va conține un modul pentru monitorizarea temperaturii culese de pe senzorii de temperatură montați în camere diferite ale imobilului. Temperaturile vor fi afișate în interfața utilizator a aplicației Android. Tot de aici utilizatorul poate seta temperatura dorită în incinta locuinței, iar sistemul se va ocupa ca aceasta să devină cea dorită și uniformă în camerele unde sunt montați senzorii.

Modul pentru măsurarea și controlul sistemului de iluminat

Aplicația va conține o pagină a interfeței grafice dedicată vizualizării și setarea stării sistemului de iluminat. La dorința utilizatorului controlul automat al luminilor poate fi activ sau inactiv. În cazul în care acesta devine activ luminile vor fi controlate automat în funcție de datele citite de pe senzorul de lumină.

Modul pentru măsurarea nivelului de gaze și alertare

Acest modul, ca și precedentul, va deține o pagină a interfeței utilizator din aplicația Android. Pe această pagină utilizatorul poate vizualiza dacă densitatea de gaze depășește sau nu limitele admise. Și asupra acestui sistem proprietarul poate lua decizia de a îl activa sau dezactiva. În cazul în care modulul este activ, iar acesta decide, în funcție de datele prelevate de pe senzor, că densitatea de gaze este prea mare, proprietarul va fi informat cu privire la acest lucru prin intermediul unui e-mail. E-mail-ul va fi trimis cu ajutorul unui server de SMTP.

Aplicația Android

Aplicația Android reprezintă interfața utilizator a sistemului. Prin intermediul acestei aplicații utilizatorii interacționează cu sistemul înglobat pentru control și monitorizare. Interfața aplicației trebuie să fie una ușor de utilizat, la îndemâna mai multor clase sociale, de vârste diferite.

Serviciul web

Serviciul web va fi realizat cu ajutorul limbajului de programare PHP. Acesta va fi apelat de aplicația android pentru realizarea diferitor modificări asupra sistemului sau doar pentru monitorizarea lui. Apelul din aplicația android se va realiza cu ajutorul metodei POST, permisă de protocolul HTTP.

Cerințe non-funcționale

Obiectivele non-funcționale pe care sistemul trebuie să le îndeplinească sunt următoarele:

Scalabilitate

Performanță

Securitate

Portabilitate

Utilizabilitate

Aceste obiective sunt detaliate în următoarele subcapitole.

Scalabilitate

Una din cerințele non-funcționale, de o importanță majoră, pe care acest sistem trebuie să o îndeplinească este scalabilitatea. Din acest motiv sistemul va fi conceput modular, pentru ca în urma unei necesități ulterioare, acestuia să i se poată adăuga funcționalități fără să aibă repercusiuni asupra modului în care sistemul își execută sarcinile până în acel moment.

Performanța

O altă cerință non-funcțională cu o importanță ridicată este performanța. Pentru ca sistemul să fie unul performant, atât aplicația embedded cât si aplicația distribuită trebuie să răspundă la comenzi într-un timp cât mai scurt. Timpul de răspuns reprezintă timpul în care sistemul termină de executat o comandă, de la plasarea comenzii până la momentul în care comanda și-a îndeplinit obiectivul. Timpul de execuție a programului embedded este și el important. Acesta poate fi diminuat prin diferite tehnici de programare.

Securitate

Securitatea este un alt atribut non-funcțional, cel puțin la fel de important al sistemului pe care trebuie să-l îndeplinească. Sistemul va putea fi comandat din aplicația Android, doar după ce utilizatorul se loghează în contul de utilizator cu un nume si o parolă cunoscută doar de el.

Portabilitate

Sistemul trebuie să fie ușor de portat pe alte plăci pentru dezvoltare. Această cerință non-funcțională este importantă atunci când produsul rezultat trebuie să funcționeze pe scară largă.

Utilizabilitatea

Interfața utilizator trebuie să fie una simplă, ușor de lucrat cu aceasta și ușor de intuit pentru a nu da mare bătaie de cap celui care o folosește. Trebuie ținut cont de faptul

că sistemul este conceput pentru persoane care nu au cunoștințe în domeniul informaticii sau electronicii.

Studiu bibliografic

În cadrul acestui capitol vor fi prezentate cele mai importante surse de inspirație pentru realizarea acestui proiect.

Gestionarea clădirilor

Un sistem de gestionare al clădirilor este un sistem care se bazează pe programarea unui calculator care să monitorizeze și să controleze echipamentele mecanice și electrice existente în clădire în funcție de dorințele celor care locuiesc sau muncesc în ele. Printre cele mai importante module controlate de aceste sisteme se numără sistemul de iluminat, cel pentru confortul termic, de securitate, alarma de incendiu, etc.

Sistemele de management al clădirilor sunt puse în aplicare de cele mai multe ori în proiecte mari, unde componentele mecanice, electrice și grupurile sanitare sunt în număr mare. În cele mai multe cazuri, consumul componentelor legate la un astfel de sistem este în procent de 40%, iar dacă sistemul se ocupă si de gestionarea luminilor, procentul crește până în jur de 70%. Aceste sisteme sunt foarte importante și în economisirea energiei. Un astfel de sistem corect configurat duce la reducerea cu până la 20% a consumului[2].

Principalele beneficii ale sistemelor de automatizare a clădirilor sunt:

Confortul condițiilor interioare

Controlul individual al fiecărei încăperi

Monitorizarea clădirii la distanță

Reducerea consumului de energie

Mentenanță mai ușor de realizat

Automatizarea locuințelor este considerată o ramură din automatizarea clădirilor puțin dezvoltată, dar într-un trend tot mai ascendent. La fel ca în cazul automatizării clădirilor și aici este vorba de un sistem informatic, un calculator programat să monitorizeze și sa controleze, prin intermediul unor dispozitive mecanice și electrice, diferite condiții existente. Principalele module de care sistemul informatic se ocupă sunt modulele de încălzire-ventilație, modulul de iluminare, modulul pentru alarma de incendiu, etc[3].

În ultimii ani popularitatea sistemelor informatice de automatizare a locuințelor a crescut foarte mult datorită accesibilității mult mai mari, dar si ușurinței prin care aceste sisteme se pot conecta cu telefoanele inteligente din ziua de azi. Un concept nou, numit “Internet al lucrurilor ”, s-a dezvoltat și este în strânsă legătură cu popularizarea automatizărilor de locuințe.

Cu toate că de câțiva ani buni automatizările de case ale viitorului au fost expuse la târguri de case și la prelegeri despre știință, nu au putut penetra piața oamenilor obișnuiți datorită costurilor ridicate. Lucrurile încep să se schimbe datorită accesibilității la tehnologie tot mai mare, dar si datorită necesităților tot mai ridicate ale omenirii[4],[5].

Principalele beneficii ale sistemelor de automatizare a locuințelor sunt:

Confortul condițiilor interioare

Evitarea unor catastrofe datorită avertizărilor

Siguranța proprietarilor

Monitorizarea și controlul locuinței la distanță

Reducerea consumului de energie

Mentenanță mai ușor de realizat

Sisteme asemănătoare

Piața actuală oferă o serie de produse asemănătoare acestui proiect, destinate gestionării clădirilor comerciale.

Cele mai cunoscute sisteme de acest gen sunt sistemul Metasys al firmei Johnson Controls și sistemul Synco al celor de la Siemens.

Sistemul Metasys

Metasys[6] este un sistem de management al clădirilor dezvoltat de firma americană Johnson Controls. Acest sistem este “cel mai capabil si scalabil sistem de management al clădirilor”, după cum o spun chiar producătorii lui.

Sistemul Metasys excelează prin furnizarea automatizării facilităților tradiționale de management al clădirilor. Utilizarea standardelor IT și utilizarea internetului sunt ultimele extinderi ale sistemului, depășind domeniul sistemelor tradiționale de control al clădirilor. Prin intermediul internetului sistemul de management poate fi monitorizat și controlat de oriunde doar printr-o simpla autentificare. Schema arhitecturală a sistemului poate fi consultată mai jos în figura 3.1.

Principalele caracteristici ale sistemului sunt:

Monitorizare și control la distanță

Modul pentru controlul confortului termic

Modul pentru sistemul de iluminat

Modul pentru alarma de incendiu

Modul pentru securitate și acces în clădire

Interfață utilizator pentru monitorizare și control

Tehnologie “wireless” pentru conectarea modulelor la rețeaua principală a sistemului

Server pentru baza de date cu informațiile utilizatorilor

Figura 3.1 Schema arhitecturală a sistemului Metasys

Sistemul Synco

Synco[7] este un sistem de management al clădirilor, dezvoltat de firma Siemens, care se ocupă de confortul termic al oamenilor din fiecare încăpere după dorința acestora. Acest sistem este unul care poate fi gestionat de la distanță prin intermediul unei aplicații de telefon inteligent.

Principalele mecanisme pe care acesta le controlează sunt sistemul de încălzire și sistemul de ventilație, pentru o reglare cât mai precisă a temperaturii astfel încât aceasta să fie cea dorită de utilizator. În figura 3.2 poate fi analizat modul de funcționare al acestui sistem.

1

Figura 3.2 Schema arhitecturală a sistemului Synco

Sistemul Honeywell

Honeywell[8] este un alt sistem de management a clădirilor, al cărui accent este pus în special pe sistemul de securitate. Datorită acestei particularități firma producătoare a sistemului Honeywell a câștigat în 2012 licitația pentru montarea lui în spitalele militare din Africa de Sud (Pretoria). Faptul că folosește tehnologia de ultimă oră EBI, a fost un alt mare atu al acestui sistem care a condus la câștigarea licitației. În figura 3.3 poate fi vizualizată schema arhitecturală a acestui sistem.

Principalele trăsături ale sistemului sunt:

Sistem de acces și securitate împotriva personalului neautorizat

Control și monitorizare asupra sistemelor de încălzire, ventilare și aer condiționat

Control și monitorizare asupra sistemului de lumini și al echipamentelor electrice

Oferă protecție și siguranță personalului din întreaga clădire

Sistem de supraveghere video digitală, care include urmărirea si monitorizarea personalului

Se ocupă de managementul energiei clădirii oferind un rating verde de patru stele

Figura 3.3 Schema arhitecturală a sistemului Honeywell

Platforme pentru dezvoltarea proiectului

Pe piața produselor pentru dezvoltarea tehnologiei informației există mai multe variante din care s-a putut alege pentru dezvoltarea acestui proiect. Printre aceste variante se numără Raspberry Pi, Arduino, Beagle, Chumby, etc.

Platforma Raspberry Pi

Raspberry Pi este un mini-calculator de dimensiunea unui card de credit, dezvoltat în Marea Britanie de către fundația Raspberry Pi, cu intenția de a promova știința calculatoarelor la un nivel de bază în școli[9].

Platforma vine echipată cu un cip Broadcom BCM2835 care folosește tehnologia SoC (sistem format dintr-un singur cip) și înglobează un microprocesor ARM1176JZF-S de 700 MHz, un cip video GPU model IV și o memorie RAM care la început era de 256 MB, iar mai apoi 512 RAM. Totuși acest cip nu include o memorie internă SSD sau Flash, fiind necesară adăugarea unui card de memorie externă SD, de pe care cipul BCM2835 încarcă fișierele necesare rulării.

Prima apariție pe piață a acestui produs a fost în data de 29 Februarie 2012 după o perioadă de 6 ani în care dezvoltatorii platformei au întâmpinat diferite probleme pe parcursul dezvoltării.

Producătorii acestei platforme recomandă și oferă distribuții de linux precum Debian sau Arch Linux ARM pentru utilizare. Platforma a fost gândită de către fundația dezvoltatoare, ca Python[16] să fie limbajul principal de programare, oferind toate uneltele și bibliotecile necesare. Totuși, fundația Raspberry Pi oferă suport și pentru alte limbaje de programare precum C, Java etc.

Figura 3.4 reprezintă schema bloc a platformei de dezvoltare Raspberry Pi.

Figura 3.4 Schema bloc a platformei Raspberry Pi

Platforma Arduino

Arduino este o placă pentru dezvoltare care are la bază un microcontroler, destinat să ușureze interacțiunea între diferite medii. Această platformă a prins contur ca un proiect a unor studenți de la institutul pentru dezvoltarea interacțiunilor din Ivrea, Italia.

Creierul acestei platforme a fost la început un microcontroler de 8-biți numit Atmel AVR, iar mai apoi, odată cu evoluția tehnologiei, acesta a fost înlocuit cu unul mai puternic de 32-biți Atmel ARM. Modelele actuale sunt dotate cu o interfață USB prin care se programează microcontrolerul și 20 de pini pentru I/O, din care 6 pini suportă intrări/ieșiri analogice, iar ceilalți 14 pini intrări/ieșiri digitale, pentru a putea atașa diferite module de extensie.

Platforma a reprezentat un proiect prin care, să se poată oferi un mod ieftin și ușor pasionaților, studenților și profesorilor, de a interacționa cu mediul exterior. O serie de periferice precum transiver pentru PWM (Pulse Width Modulation), SPI (Serial Peripheral Interface), I2C (Inter-Integrated Circuits), pe care placa le conține fac această interacțiune atât de ușoară.

În figura 3.5 este ilustrat un Arduino Leonardo.

Figura 3.5 Schema bloc a platformei Arduino

Sisteme de operare

Există mai multe variante de sisteme de operare din care se poate alege pentru instalarea și rularea cu succes a plăcuței Raspberry Pi. Toate aceste variante sunt gratuite fiind bazate pe sistemul de operare UNIX care este open source.

Debian

Debian este un sistem de operare apărut la data de 16 august 1993, fiind anunțat de un student de la Purdue University, Ian Murdock. Acesta este un sistem de operare compus din software open source bazat pe bine cunoscuta distribuție GNU/Linux.

Debian se numără printre distribuțiile menținute la zi datorită unui grup de programatori adunați de pe tot mapamondul și al efortului depus de aceștia. Înainte de a fi lansată o versiune nouă a distribuției, este foarte riguros testată pentru a menține un grad de stabilitate și securitate ridicat. Nu este destinată utilizatorului de rând, deoarece este destul de greu de configurat, fiind orientată către utilizatorii cu un minim de experiență în domeniu, dar stă la baza multor distribuții mult mai prietenoase cu utilizatorii obișnuiți. Distribuția este adesea întâlnită pe calculatoare care funcționează ca server de rețea datorită siguranței crescută pe care o oferă. ARM se numără printre platformele pe care acest sistem de operare le suportă.

Raspbian

Raspbian este un sistem de operare gratuit, bazat pe distribuția sistemului de operare Debian și optimizat pentru Raspberry Pi. Acesta este creat de o societate care nu este afiliată fundației Raspberry Pi, ci un grup restrâns, pasionat de hardware-ul oferit de Raspberry Pi, cu scop educațional.

Prima versiune a sistemului de operare a apărut în luna Iunie a anului 2012, oferind un set de 35.000 pachete precompilate și optimizate pentru resursele pe care le pune la dispoziție Raspberry Pi.

Raspbian este sistemul de operare recomandat de fundația Raspberry Pi pentru o funcționare cât mai optimă a platformei pe care o dezvoltă.

Comunicare serială (SPI)

SPI (Serial Peripheral Interface)[10] este o interfață serială sincronă de mare viteză. Aceasta operează în mod duplex și este folosită ca magistrală sincronă serială de transmitere și recepție date, acolo unde circuite digitale pot fi conectate în mod master – slave. În cadrul acestei interfețe pot fi folosite mai multe dispozitive de tip slave, dar un singur dispozitiv master care decide cu care dintre dispozitivele slave comunică. Interfața este compusă din patru linii de bază:

SCLK – semnal de ceas pe care diapozitivul master îl scoate pentru dispozitivele slave

SS – semnal de selectare a dispozitivului slave cu care comunică, ieșire activă pe starea logică 0

MOSI – linie de date care merge dinspre dispozitivul master spre dispozitivul slave cu care acesta comunică

MISO – linie de date care merge dinspre dispozitivul slave spre dispozitivul master

Acestor patru linii de bază, li se mai pot adăuga și alte linii pentru extinderea protocolului, în cazul în care este nevoie ca dispozitivul slave să poată iniția o cerere de comunicare cu dispozitivul master.

În figura 3.6 se poate observa schema bloc a unei comunicări seriale SPI standard între un dispozitiv master și un dispozitiv slave.

Figura 3.6 Comunicare serială

Analiză și fundamentare teoretică

Acest capitol este destinat explicațiilor și detaliilor care stau la baza analizei si fundamentării teoretice pe care este construit acest proiect.

Pentru a putea citi senzorii analogici cum sunt cei de umiditate, temperatură etc, plăcii Raspberry Pi trebuie să îi adăugam un convertor Analog-Digital, deoarece acesta nu conține unul. Acest convertor va fi legat la unul din cele două module SPI ale platformei.

Circuitul electronic trebuie sa aibă o integritate ridicată în vederea evitării apariției unor evenimente nedorite care ar putea duce la afectarea componentelor lui.

Soluții alese

Platformele pentru dezvoltare Arduino și Raspberry Pi beneficiază de cel mai complexe comunități care oferă suport pentru realizarea diferitor obiective, fapt pentru care am ales să elimin restul platformelor în detrimentul celor două și să aleg una din cele două pentru realizarea proiectului. În cele din urmă am ales ca suportul hardware pentru dezvoltarea acestui sistem să fie platforma Raspberry Pi, deținătoare a unui microprocesor ARM, cu o frecvență de 700 MHz produs de multinaționalul Samsung, o memorie RAM de 512 MB și un set de dispozitive periferice incorporate BCM2835[6] special creat pentru a fi ușor de utilizat împreună cu microprocesoarele ARM.

Motivul principal în alegerea unui hardware atât de puternic pentru implementarea acestor funcționalități a fost dorința ca sistemul să înglobeze într-un singur dispozitiv cele două părți importante ale proiectului, aplicația embedded și sistemul distribuit.

Aplicația embedded este scrisă în limbajul de programare Python[16], motivat de varietatea posibilităților de suport și a bibliotecilor existente pentru folosirea acestui limbaj de programare. Această aplicație va implementa funcționalitățile pentru monitorizarea și controlul hardware al sistemului. Aplicația este una modulară, lăsând loc pentru dezvoltări ulterioare.

Sistemul distribuit este compus și el din două parți, un serviciu web și o aplicație Android care îl apelează. Partea de serviciu web va fi scrisă in limbajul de programare PHP, iar pentru aplicația Android se vor folosi bibliotecile Java SDK.

Alegerea unui serviciu web implementat pe un server PHP, s-a datorat consumului mai mic de resurse, față de un server Java sau :NET.

Am ales implementarea unei aplicații Android pentru a realiza interacțiunea cu utilizatorul, deoarece Android este unul din cele mai utilizate sisteme de operare pentru dispozitive mobile (tablete, telefoane inteligente, etc), bucurându-se de o continuă creștere.

Funcțiile sistemului

Principalele funcționalități ale sistemului înglobat sunt dispuse în module. Aceasta este necesară pentru modularizarea sistemului și acceptarea de către acesta a unor noi module dezvoltate ulterior.

Analizând cerințele descrise în capitolul al doilea, se remarcă patru module care vor compune aplicația de nivel scăzut pentru monitorizarea unor componente periferice hardware și logica pentru controlul altora în funcție de datele citite de pe acestea. Aplicația trebuie să poată interacționa cu serviciul web cu scopul monitorizării si controlul sistemului la distanță.

Figura 4.1 Schema bloc a sistemului.

Modulul termostat

În cadrul acestui modul se vor monitoriza senzorii de temperatură, iar în funcție de temperaturile existente la nivelul lor, sistemul ia o decizie asupra sistemului de încălzit.

Acest modul interacționează cu următoarele componente periferice:

Senzorii de temperatură prin intermediul unui convertor analog-digital

Valvele caloriferelor

Sistemul de încălzire (ex: centrală)

Led-uri pentru monitorizarea stărilor

Toate modificările interceptate și produse de către acest sistem sunt introduse în baza de date într-o tabelă dedicată pentru crearea unui jurnal al modulului.

Utilizatorul trebuie să poată interacționa cu acest modul pentru a putea vizualiza starea sistemului și controlul temperaturii.

Modulul umiditate

Acest modul este dedicat monitorizării senzorului de umiditate și returnarea valorii citite de pe acesta, cu ajutorul unui convertor analog-digital, procentual.

Utilizatorul interacționează cu acest modul doar în sens unui-direcțional prin monitorizarea valorii returnate de acesta, valoarea procentuală a umidității din locuință.

Modulul control lumini

Modulul este dedicat monitorizării luminozității și controlului unor surse de iluminat cu scopul ușurării vizibilității în condiții cu lumină insuficientă.

Modulul interacționează cu următoarele periferice:

Senzor de luminozitate

Surse de lumină prin intermediul releelor

Utilizatorul interacționează cu modulul de iluminat prin intermediul aplicației Android pentru setarea stării de activare sau dezactivare a modulului.

Modul alarmă de incendiu

Alarma de incendiu este un modul care ține de siguranța utilizatorilor. Acest modul se ocupă de monitorizarea senzorului de gaze. Datele rezultate de acest senzor sunt utile pentru stabilirea faptului că densitatea gazelor inflamabile este peste un maxim admis.

În cazul în care densitatea de gaze este prea mare, modulul îl informează pe beneficiar cu privire la acest lucru prin intermediul unui client de SMTP instalat la nivelul platformei Raspberry Pi.

Protocolul de comunicare serială SPI

Protocolul pentru comunicare serială numit Serial Peripheral Interface, pe scurt SPI, este unul dintre cele mai utilizate protocoale seriale. Acesta este reprezentat printr-o magistrală serială sincronă de mare viteză, operând în mod duplex complet. Magistrala este folosită pentru transmiterea și recepția de date în dispozitive digitale conectate în modul master-slave. Cele mai dese implementări ale acestui protocol sunt întâlnite atunci când două circuite electronice de control sau periferice trebuie să comunice între ele.

În tabelul 4.1 sunt prezentate acronimele și abrevierile folosite.

Tabel 4.1 Acronime și abrevieri

Trăsăturile distinctive ale protocolului SPI

Moduri pentru master și slave

Mod de comunicare bi-direcțional

Selectarea modulului pentru ieșire

În caz de marcare eroare are capacitatea de a genera întrerupere de eroare

Registru de date cu buffer dublu

Semnal de ceas serial cu posibilitatea de a seta faza si frontul de start

Controlul operațiilor în modul de așteptare

Moduri de operare

SPI poate funcționa în trei moduri: rulare, așteptare, stop.

Modul rulare

Este modul de bază pentru executarea operațiilor.

Modul de așteptare

Protocolul poate fi setat în modul de așteptare pentru a minimiza consumul. Acest mod se poate activa prin configurarea bitului SPISWAI din cadrul registrului SPICR2. În cazul în care acest bit devine 1, modulul intră într-un mod de conservare, fiind oprită generarea semnalului de ceas. Dacă este configurat în mod master acesta oprește transmisia aflată în progres, iar daca este slave transmisia continuă, modulul fiind sincronizat cu modulul master permanent.

Modul stop

Transiver-ul de SPI este oprit în modul stop pentru reducerea consumului. La fel ca și la modul așteptare dacă este configurat în mod master acesta oprește transmisia aflată în progres, iar daca este slave transmisia continuă, rămânând sincronizat cu master –ul.

Descrierea semnalelor

Semnalul MOSI este folosit pentru transmiterea datelor prin protocolul SPI de la un modul care este configurat în modul master, la un modul care este configurat in modul slave

Semnalul MISO reprezintă celălalt pin de date, opus pinului MOSI. Atunci când SPI-ul este configurat în mod master primește date, iar când este configurat în mod slave trimite date

Semnalul SCLK este folosit pentru ieșirea semnalului de ceas atunci când se trimit date pe liniile MOSI și MISO. În cazul în care modulul este configurat în mod master generează semnal de ceas, iar dacă este configurat în mod slave primește semnal de ceas pentru a putea interpreta datele

Semnalul SS este folosit pentru a transmite semnalul și pentru a selecta dispozitivul periferic care să recepționeze datele. Dispozitivul configurat în modul master transmite semnalul, iar dispozitivul configurat în modul slave îl recepționează

Descrierea registrelor

Pentru mai multe detalii despre regiștrii, consultați bibliografia [10].

Există mai multe scalări a protocolului SPI pentru noile dispozitive care folosesc regiștrii cu un număr mai mare de biți. În cele ce urmează este prezentat modelul clasic de SPI.

Maparea registrelor în memorie

În tabelul 4.2 este descrisă maparea registrelor în memorie.

Tabel 4.2 Maparea registrelor în memorie

Note: 1-Biți care nu pot fi modificați, 2-Scrierea în registru este ignorată, 3-Citirea din registru returnează zerouri.

SPICR1 – în acest registru se activează sau dezactivează diferite funcționalități ale modului de SPI. De asemenea acest registru setează polaritatea și faza semnalului de ceas, în cazul unui dispozitiv master.

SPICR2 – acesta este un registru pentru completarea setărilor din registrul SPICR1. Acesta setează modul de comunicare precum și modul în care se află modulul de SPI

SPIBR – reprezintă registrul pentru setarea ratei de transfer la nivelul comunicației și frecvența semnalului de ceas

SPISR – acesta este registru de stare al modulului SPI. În acest registru sunt semnalate erorile, prezența sau absența datelor

SPIDR – acest registru este atât registru de intrare, cât și registru de ieșire pentru date. Cu ajutorul acestui registru se permite transmiterea unui octet de date

Transmisia de date

În figura 4.2 este reprezentată diagrama bloc a unei transmisii de date seriale cu ajutorul protocolului SPI. Comunicarea începe după ce dispozitivul master configurează frecvența semnalului de ceas. Aceasta trebuie să fie mai mică sau egală cu maximul pe care îl suportă dispozitivul slave și selectarea slave-ul cu care comunică. În cazul acestui proiect nu este nevoie de selectarea slave-ului deoarece acesta este unul singur, convertorul analog-digital.

Este important ca și polaritatea ceasului să fie setată înainte de începerea transmisiunii. Datorită specificațiilor convertorului, valoarea inițială a semnalului de ceas trebuie să fie jos, aceasta însemnând că bitul CPOL al registrului SPICR1 este setat 0. Datele sunt pregătite pe frontul crescător al semnalului de ceas și citite pe frontul descrescător, bitul CPHA este setat la valoarea logică 0.

Transmisia se desfășoară în modul următor:

Master-ul pune pe linia MOSI un bit de date, iar slave-ul citește de pe aceeași linie bitul

Slave-ul pune pe linia MISO un bit de date, iar slave-ul citește de pe aceeași linie bitul

Transmisia implică doi regiștrii, unul pe fiecare dispozitiv care comunică, aceștia fiind legați într-o configurație de tip inel. Pentru transmisia unei cantități mari de date, după un ciclu al transmisiei, datele sunt mutate într-o locație de memorie pentru a nu fi pierdute.

Figura 4.2 Transmisie master-slave, digrama bloc

În figura 4.3 este prezentat un ciclu de transmisie între două dispozitive care comunică prin intermediul protocolul SPI. Comunicarea este cea care se întâmplă și în cazul acestui proiect între platforma Raspberry Pi (master) și convertorul analog-digital (slave).

Figura 4.3 Secvență de comunicare SPI (CPHA=0)

Convertor analog-digital MCP3008-I/SL

Cipul MCP3008-I/SL[11] reprezintă un convertor analog-digital care transformă semnalele analogice cu o rată maximă de două sute de mii de eșantionări pe secundă, obținute atunci când este alimentat la 5V. Acest modul convertește semnale analogice din intervalul [0V, 3.3V] la o valoare digitală de 10 biți. Suportă 4 perechi de intrări diferențiale sau 8 intrări analogice. Lățimile de bandă a semnalelor analogice de intrare sunt limitate la o frecvență astfel în cât să se încadreze în rata de eșantionare a convertorului. Transferul de date se produce cu ajutorul protocolului SPI, pentru care convertorul are suport. În cadrul acestei comunicații, convertorul reprezintă dispozitivul slave, iar Raspberry Pi reprezintă dispozitivul master.

În figura 4.4 este prezentată diagrama bloc funcțională a convertorului în partea stângă, iar în partea dreaptă poate fi văzută cutia neagră a cipului convertor.

Figura 4.4 Diagramă funcțională și cutia neagră a convertorului

Formule de calcul

Formula din care putem extrage tensiunea de intrare din cei 10 biți pe care convertorul îi furnizează este:

Vin este tensiunea de intrare pe care dorim să o aflăm

Vref este tensiunea de referință a convertorului (3.3V).

Secvență de comunicare

În figura 4.5 este prezentată secvența de inițializare al modulului SPI a convertorului.

Figura 4.5 Secvență de configurare SPI convertor + date

Convertorul analog digital are nevoie de o serie de configurări pentru inițializarea comunicației. Acesta necesită ca linia CS (SS) să fie la nivelul logic 0 pe durata comunicării. Șase impulsuri ale semnalului de ceas sunt necesare pentru pornirea modulului de SPI al convertorului. După cele cinci semnale de ceas, semnalul CS în stare 0 și semnalul de date în starea logica 1 reprezintă bitul de start al comunicației. Următorul bit SGL/DIFF spune convertorului dacă intrările analogice ale acestuia funcționează în mod diferențial sau simplu. Secvența de trei biți D2,D1,D0 care urmează după bitul SGL/DIFF, sunt pentru a selecta canalul de intrare. Selecția se realizează după tabelul 4.3. Urmează un bit care este nul, iar apoi biții de date.

Tabel 4.3 Selectarea canalului de intrare a semnalului analogic

Senzor de temperatură LM50

Senzorul de temperatură LM50[12] este un circuit integrat de precizie care poate detecta temperaturi între -40˚C și 125˚C folosind o singură linie de tensiune pozitivă. Acesta este direct calibrat în grade Celsius, fiecare 10 mV însemnând 1˚C. 100 mV înseamnă -40˚C, iar 1.75V înseamnă 125˚C. Formula cu ajutorul căreia din tensiunea de la ieșirea senzorului se poate face tranziția la grade Celsius este următoarea:

Vout – tensiunea de ieșire a senzorului

500 – se aliniază 0˚C la 500 mV

10 – 10 mV reprezintă 1˚C

Temp – temperatura rezultată

În figura 4.6 este prezentată schema bloc a sistemului în partea stângă, iar în partea dreaptă cutia neagră a senzorului.

Figura 4.6 Diagramă bloc a senzorului de temperatură LM50

Senzorul de lumină PT15-21C/TR8

Senzorul de lumină PT15-21C/TR8[13] este compus dintr-o fotodiodă și un amplificator de impedanță formând un singur circuit integrat. Tensiunea pe care senzorul o scoate pe pinul de ieșire este direct proporțională cu intensitatea luminii de pe fotodiodă. Semnalul de ieșire al senzorului este unul analogic, deci trebuie convertit într-unul digital pentru a putea fi procesat.

În figura 4.7 sunt prezentate schema bloc și cutia neagră a senzorului.

Figura 4.7 Diagramă bloc a senzorului de lumină PT15-21C/TR8

Senzorul de umiditate SYH-2R

Senzorul analogic de umiditate SYH-2R[14] este un senzor care produce o tensiune de ieșire lineară între fiecare două puncte de pe graficul prezentat în figura 4.8, invers proporțională cu nivelul de umiditate și raportată la tensiunea de alimentare. Variația temperaturii de alimentare va fi resimțită și în temperatura de ieșire. Senzorul este calibrat să funcționeze la o tensiune de 5V, dar în caz de nevoie acesta funcționează în intervalul 4.5V-8V. După cum se poate observa în figura 4.8, la tensiunea de intrare la care senzorul este calibrat, tensiunea de ieșire variază între 1.5 mV până la 2890 mV, ceea ce reprezintă 95% umiditate respectiv 20% umiditate. Valorile care nu sunt reprezentate în intervalul [20,95], sunt considerate condiții extreme, obținute doar în condiții excepționale.

Figura 4.8 Caracteristicile senzorului de umiditate SYH-2R

Senzorul de gaze MQ-2

Senzorul de gaze inflamabile MQ-2[15] este bazat pe un material sensibil la gaze numit SnO2 (Oxid de staniu). În caz de aer curat acesta are o conductivitate scăzută, iar dacă se face simțită prezența de gaze, atunci conductivitatea devine mai mare, fiind direct proporțională cu densitatea de gaz. Senzorul detectează cu ușurință gaze precum GPL (Gaz petrolifer lichefiat), propan, hidrogen, metan etc.

Senzorul este montat pe un PCB, proiectat pentru a se putea pune un rezistor de 10KOhmi și un potențiometru pentru reglarea sensibilității la gaze. Acesta este calibrat să funcționeze în parametrii, la o tensiune de alimentare de 5V. Pentru a ajunge să lucreze corect în parametrii corespunzători, senzorul trebuie alimentat cu circa două minute înainte de utilizare pentru a ajunge la temperatura la care acesta funcționează, 60˚C. Temperatura poate varia ușor în sus sau în jos în funcție de setarea sensibilității din potențiometru. Senzorul necesită un curent furnizat de 1,5A pentru funcționarea în parametrii, iar placa de dezvoltare poate furniza un curent total de 500mA, ceea ce duce la necesitatea unei surse de alimentare externe.

În figura 4.9 este prezentat graficul după care se realizează formula de liniarizare a senzorului.

Figura 4.9 Caracteristici de liniarizare ale senzorului MQ-2

Figura 4.10 Diagrama bloc și cutia neagră a senzorului

Vc – tensiunea de alimentare

VH – tensiunea de încălzire – se modifică în funcție de sensibilitatea la care este setat

VRL- tensiunea de ieșire

Sursa de alimentare

Sursa de alimentare este necesară deoarece curentul însumat necesar senzorilor și submodulelor atașate nu este suportat de către platforma de dezvoltare Raspberry Pi.

Soluția aleasă pentru sursa externă este modificarea unei surse funcționale dintr-un calculator vechi astfel încât aceasta să fie utilizabilă. Tensiunile de ieșire ale sursei sunt -12V, -5V, 3.3V, 5Vși 12V. Modificările necesare sursei sunt următoarele:

Adăugarea unui comutator pentru pornire/oprire a sursei. Comutatorul este legat pe firul de culoare verde și un fir de Ground.

Adăugarea unei rezistențe de 22 Ohm și 10W consum pentru stabilizarea și evitarea deteriorării sursei datorită mersului în gol.

Adăugarea de borne de tip mamă la capetele firelor pentru o conectare mai ușoară

Figura 4.11 Sursă de tensiune externă

Client SMTP

SMTP(Simple Mail Transfer Protocol) este un protocol simplu de transmitere a mesajelor în format electronic prin intermediul internetului. Acesta specifică modul în care mesajele electronice sunt transferate între procese SMTP aflate pe sisteme diferite. Protocolul lucrează cu procese din sistemul de operare, procesul care are de transmis un mesaj este numit client SMTP, iar cel care primește este numit server SMTP. Acest protocol are legătură cu modalitatea în care mesajul este transmis de la utilizator la clientul de SMTP sau modul în care mesajul recepționat este livrat de serverul de SMTP utilizatorului destinatar. Comunicarea între client și server este realizată prin caractere ASCII.

Conexiunea către server-ul de SMTP este inițializată de către client, iar dacă server-ul răspunde cu mesajul 220, înseamnă că acesta este pregătit pentru stabilirea conexiunii. Dacă server-ul este supraîncărcat, acesta poate să întârzie transmiterea răspunsului. După stabilirea conexiunii urmează o serie de comenzi care pot fi transmise prezentate mai jos.

HELO – identificare expeditor

EHLO – identificare expeditor cu cerere de mod extins

MAIL FROM – specificarea expeditorului

RCPT TO – specificarea destinatarului

DATA – conținutul mesajului

RSET – reset

QUIT – termină sesiunea

HELP – ajutor pentru comenzi

VRFY – verificarea unei adrese

EXPN – expandează o adresă

VERB – informații detaliate

Este necesară instalarea unui client de SMTP pentru stabilirea conexiunii la server-ul de SMTP a celor de Google. Adresa de e-mail de pe care mesajul de alertă va fi trimis către adresele de e-mail a celor înregistrați în baza de date, aparține bine cunoscutului furnizor Gmail.

Am ales această soluție datorită robusteții, disponibilității și integrității datelor pe care server-ul de SMTP al celor de Google o pune la dispoziție.

Server PHP

Necesitatea unui server de PHP pe placa de dezvoltare reiese din dorința ca acest sistem să fie unul înglobat. Datorită faptului că placa Raspberry Pi trebuie să îndeplinească mai multe cerințe, iar aceasta nu are resurse nelimitate, am ales instalarea unui server de PHP care să nu consume multe resurse, numit “lighttpd” recomandat de comunitatea distribuției de linux Debian .

Serverul PHP este responsabil cu rularea scripturilor PHP, scripturi care reprezintă serviciile web apelate mai apoi din aplicația Android.

PHP este un limbaj de programare folosit pentru a produce pagini web dinamice. Acesta este unul dintre cele mai importante limbaje web open-source, putând fi rulat cu ușurință pe toate sistemele de operare.

Server baze de date

Pentru managementul bazelor de date este necesar un server, a cărui consum de resurse să fie scăzut.

MySQL se numără printre sistemele de management al bazelor de date cu cerințe scăzute, dar foarte popular. Acesta este un server gratuit, cu surse disponibile utilizatorilor. Este unul dintre cele mai populare servere pentru baze de date în industria dezvoltării aplicațiilor web, datorită faptului că este una dintre componentele LAMP (Linux, Apache, MySQL, Perl/PHP, Python), bibliotecă care cuprinde toate uneltele necesare dezvoltării de aplicații web dinamice. Toate aceste componente au sursele deschise pentru cei care le utilizează.

Proiectare de detaliu si implementare

Structura sistemului trebuie foarte bine analizată înainte de a începe stadiul de implementare și dezvoltare a sistemului, pentru a elimina posibilitatea unor erori introduse în stadiul de proiectare. Sistemul este construit pe două componente principale, iar fiecare componentă la rândul ei este construită din alte câteva module separate. Fiecare dintre modulele sistemului, indiferent de anvergura sa, are caracteristici particulare și funcționalitate specifică caracteristicilor sale. Funcționalitatea de care se ocupă un modul nu este regăsită în alt modul.

Componentele periferice care se conectează la placă constituie patru module de dimensiuni mai reduse care au obiective individuale de îndeplinit, iar împreună cu placa reprezintă prima parte sistemului înglobat.

Cea de-a doua parte a sistemului este cea mai importantă, reprezentată de aplicația software, aplicație care se ocupă de citirea senzorilor, interpretarea și controlul sistemelor mecanice în funcție de datele care sunt primite de la senzori. Componenta principală a sistemului presupune integrarea părților periferice care sunt conectate la placa de dezvoltare, dar și controlul lor. Această parte poate fi considerată principală deoarece aceasta realizează legătura între modulul care se ocupă de comunicația cu utilizatorul și celelalte componente ale sistemului, componente hardware.

Aplicația Android reprezintă și ea un submodul al componentei principale din sistem.

Tot în această parte este inclus și un serviciu web construit în limbajul de programare PHP, fiind apelat prin intermediul unei aplicații Android, pentru controlul la distanță. Android este cel mai popular sistem de operare în rândul dispozitivelor portabile.

Împreună cele două părți constituie sistemul înglobat de monitorizare și control al locuinței. Ambele componente depind una de cealaltă, sistemul fiind nesemnificativ fără una din acestea. Părțile hardware sunt necesare pentru culegerea datelor din mediul exterior, dar și pentru a acționa anumite dispozitive mecanice sau electrice. Partea software este responsabilă pentru analizarea și interpretarea datelor prelevate de părțile fizice.

Prima parte a proiectului reprezintă corpul, iar cea de-a doua parte reprezintă creierul dacă facem o raportare la constituția oamenilor.

În figura 5.1 este prezentată schema bloc detaliată a întregului sistem.

Figura 5.1 Schema bloc detaliată a sistemului

În cele ce urmează este prezentată o diagramă a pinilor disponibili la nivelul plăcuței de dezvoltare Raspberry Pi, folosiți pentru adăugarea perifericelor. Aceasta poate fi consultată în figura 5.2.

Figura 5.2 Diagrama pinilor Raspberry Pi Revizia 2

Componente periferice

Componenta hardware a sistemului este reprezentată prin placa de dezvoltare Raspberry Pi și modulele adăugate acesteia pentru complexitatea sistemului.

Pregătirea plăcii pentru prima utilizare

Înainte de asamblarea circuitului electronic, trebuiesc obligatoriu analizate în detaliu specificațiile tehnice ale fiecărei componente care urmează sa fie adăugată. Această analiză este necesară pentru evitarea de incompatibilități între componente, ceea ce ar putea duce la defectarea componentei sau chiar a plăcii.

Montarea circuitului constă din următorii pași:

Pregătirea plăcii de dezvoltare

Adăugarea cardului de memorie la placă

Adăugarea convertorului analog-digital la placă

Conectarea perifericelor (monitor, tastatură, mouse)

Conectarea cablului de internet

Conectarea sursei de tensiune

Convertorul analog digital este important să fie adăugat plăcii de dezvoltare înainte de conectarea acesteia la sursa de tensiune, pentru prevenirea unui scurt-circuit, care poate cauza avarii iremediabile.

Pentru evitarea deteriorării convertorului analog digital sau chiar a modulului SPI al plăcii Raspberry Pi, acesta este obligatoriu să fie montat ca în figura 5.3.

Figura 5.3 Montare convertor analog digital

Convertorul analog – digital

Acest modul adaugă o nouă funcționalitate plăcuței Raspberry Pi, anume posibilitatea de a citi semnale analogice. Raspberry Pi nu dispune de această funcționalitate așa cum vine din fabrică, putând citi doar semnale digitale. Prin adăugarea acestui modul separat, pot fi citite un număr de opt semnale analogice, extinzând și numărul perifericelor care pot fi adăugate, deoarece convertorul consumă doar patru pini din cei douăzeci și șase ai plăcii, dar adaugă opt.

Convertorul analog digital, se conectează la placa Raspberry Pi prin intermediul unui modul de SPI. Cele patru semnale de conectare sunt CLK, MOSI, MISO, CE0, reprezentând semnalul de ceas, cele două linii de date respectiv activare cip.

În figura 5.4 este prezentată în partea stângă schema bloc a comunicației dintre convertorul analog-digital și placa Raspberry Pi. Prin intermediul acestei comunicații datele prelevate de pe toate cele opt canale ale convertorului, după conversie în digital, sunt transmise plăcii pentru interpretare.

În partea din dreapta figurii 5.4 este prezentată schema cu pinii plăcii, fiind tăiat cu o linie oblică peste pini care sunt utilizați în scopul comunicării.

Figura 5.4 Circuit electronic comunicație Raspberry Pi ADC

Pentru comunicare pe modulul de SPI se folosește biblioteca pentru limbajul de programare Python[16], pregătită în sistemul de operare folosit, Raspbian. Biblioteca este numită spidev.

Funcție pentru citirea canalelor analogice

def readADC(adcCH):

if ((adcCH > 7) or (adcCH< 0)):

return -1

r = spi.xfer2([1,(8+adcCH)<<4,0])

adcResult = ((r[1]&3) << 8) + r[2]

return adcResult

readADC.py

Funcție pentru citirea datelor de pe convertor

Funcția prezentată mai sus este responsabilă pentru citirea datelor din registru de date al SPI-ului. Funcția primește un parametru, pe care îl trimite mai departe prin intermediul bibliotecii folosite convertorului, acesta reprezentând canalul de citire a convertorului. Dacă acesta nu intră în intervalul [0,7], se returnează valoarea -1, reprezentând un canal invalid. Daca se încadrează, atunci este citit registrul de date al modului SPI în două rânduri, după care cu ajutorul unei șiftări se construiește rezultatul format din cei zece biți returnați de convertor, acesta fiind returnat de funcție.

Această funcție este apelată în cadrul fiecărei funcții care interpretează date returnate de un senzor analogic.

Modul termostat

Modulul termostat este unul nelipsit din sistemele din acest stereotip. Controlul temperaturii au fost printre primele probleme ridicate în trendul de automatizare al clădirilor și locuințelor.

Componentele necesare pentru completarea circuitului electronic a modulului de termostat sunt următoarele

Senzor pentru temperatură LM50 în fiecare din încăperile automatizate

Valve pentru cuplarea/decuplarea caloriferelor (simulate cu ajutorul ledurilor)

Releu pentru controlul sistemului de încălzire (centrală)

Leduri pentru identificarea stărilor unor dispozitive externe

Butoane pentru manipularea temperaturii

În figura 5.5 este prezentat circuitul electric pentru conectarea perifericelor care formează modulul de termostat.

Figura 5.5 Circuit electric modul termostat

Componentele auxiliare comunică cu placa Raspberry Pi prin intermediul intrărilor prezente la nivelul acesteia.

Cei doi senzorii de temperatură folosiți sunt conectați la intrările analogice ale convertorului analog-digital pentru conversia tensiunii în digital cu scopul de a putea fi interpretată de microprocesor. Canalele pe care cei doi senzori sunt conectați sunt CH0 și CH1 reprezentând camera numerotată cu numărul unu respectiv cu doi.

Valvele simulate cu ajutorul ledurilor și ledurile de stare sunt manipulate pinilor digitali ai plăcuței, aceștia fiind setați ca ieșiri. Fiecare led are două intrări, una reprezentând ground-ul, iar cealaltă tensiunea de alimentare. Tensiunea de intrare va fi furnizată doar în cazul în care software-ul ia această decizie în urma rulării codului.

Releul necesită pentru control, alimentare cu tensiune, un fie de ground și unul de 5V. Releul este alimentat din sursa externă de alimentare datorită unui consum mai ridicat de curent în cazul cuplării circuitului de 220V. Pentru ca acesta să poată fi controlat cu ajutorul platformei Raspberry Pi este absolut necesar să existe un ground comun între aceasta și sursa de alimentare comună.

Cei trei pini prezenți la nivelul butoanelor reprezintă ground, Vin (3.3V) și Vout. Pinului Vout îi este conectat un pin digital al plăcii, care este setat drept intrare la nivelul software-ului, astfel se poate primi și trata întreruperea primită pe acesta.

Funcții reprezentative ale modului

def readTemp(CH):

sumaTemperaturiPartiale = 0

countTemp = 0

value = readADC(CH)

if(value <100 or value > 800):

return -1

else:

for countTemp in range(0,50): value = readADC(CH) voltage = (value * 3.3)/1024 temperaturaPartiala = (voltage-0.50025)*100 sumaTemperaturiPartiale += temperaturaPartiala

countTemp += 1

gradeCelsius = round(sumaTemperaturiPartiale/countTemp,1)

return gradeCelsius

readADC.py

Funcție pentru obținerea temperaturii în grade Celsius

Funcția prezentată mai sus reprezintă funcția de transformare a codului binar de 10 biți, obținuți de la convertor, în grade Celsius. În cadrul acesteia este apelată funcția readADC(adcCH) pentru obținerea șirului binar. După obținerea acestuia, este verificat dacă datele nu sunt absurde, iar dacă este trecut și acest test, de pe senzor mai sunt prelevate date de încă 49 de ori, prelevări în urma cărora este aflată temperatura medie în urma celor 50 de interogări.

În fișierul termostat.py se găsește funcția care reprezintă creierul acestui modul. În cadrul acestei funcții temperaturile în grade Celsius prezente la nivelul celor doi senzori sunt preluate, iar în funcție de acestea sunt modificate stările unor mecanisme mecanice, precum sistemul de încălzire sau valvele caloriferelor. Valva caloriferului din fiecare cameră este controlată în funcție de senzorul prezent în acea cameră.

În figura 5.6 este prezentat modul de funcționare al termostatului. Sistemul de încălzire odată pus în funcțiune nu se va opri până ce temperaturile din cele două camere nu sunt cu 0.5 grade Celsius mai mari decât temperatura setată de utilizator. În cazul în care temperatura dintr-o cameră depășește cu 0.5 grade Celsius temperatura setată de utilizator, în camera respectivă valva caloriferului se va închide, dar centrala rămâne pornită până ce și în cealaltă cameră temperatura devine cu 0.5 grade mai mare decât cea setată. Sistemul odată oprit, nu va mai porni până ce temperatura dintr-o cameră nu scade cu 0.5 grade Celsius sub temperatura setată de utilizator.

Figura 5.6 Principiu de funcționare termostat

Modul umiditate

Umiditatea este un factor important al confortului uman. De aceea sistemul prezentat în lucrarea de fată măsoară nivelul umidității din locuință.

Singura componentă necesară pe lângă cele generale, placa și convertor, este senzorul analogic SYH-2R[12].

În figura 5.7 este prezentat circuitul electric pentru conectarea senzorului de umiditate la Raspberry Pi.

Figura 5.7 Circuit electric modul umiditate

Senzorul de umiditate este alimentata de o tensiune de 5V, iar tensiunea acestuia de ieșire este conectată la canalul cu numărul doi al convectorului analog-digital.

După obținerea codului de 10 biți în urma digitalizării semnalului analog de către convertorul analog digital, este nevoie de transformarea în procente a umidității citite de senzor.

def readUmiditate(CH):

value = readADC(CH)

if value >=900 and value <= 2890:

umiditate = -0.005 * value + 34.5226

elif value >=270 and value <= 900:

umiditate = -0.0159 * value + 44.2857

elif value >=81 and value <= 270:

umiditate = -0.0529 * value + 54.2857

elif value >=33 and value <= 81:

umiditate = -0.2083 * value + 66.875

elif value >=13 and value <= 33:

umiditate = -0.5 * value + 76.5

elif value >=5.3 and value <= 13:

umiditate = -1.2987 * value + 86.8831

elif value >=2.2 and value <= 5.3:

umiditate = -3.2258 * value + 97.0968

else:

umiditate = -7.1429 * value + 105.7143

return umiditate

readADC.py

Funcție pentru obținerea umidității procentuale

Funcția de liniarizare a senzorului de umiditate este construită pe baza tabelului prezentat în documentația acestuia. Tabelul poate fi urmărit mai jos.

Tabel 5.4 Liniarizare senzor umiditate

Modul control lumini

Acest modul este benefic în condițiile în care proprietarii sosesc în locuința de domiciliu la ore înaintate, iar lumina naturală este prea slabă pentru a permite o vizualizarea mediului.

Sistemul vine în ajutorul utilizatorului prin controlul unor surse de iluminat în funcție de datele citite de pe un senzor de luminozitate. În cazul în care luminozitatea pe care senzorul o interceptează este prea scăzută, sistemul decide aprinderea unor becuri pentru ca beneficiarul atunci când ajunge la domiciliu să aibă o comoditate sporită. Această caracteristică a sistemului devine utilizabilă prin adăugarea unor circuite periferice. Acestea circuite sunt:

Senzor de luminozitate (PT15-21C/TR8)

Un număr de relee egal cu numărul becurilor pe care dorește să le aprindă

În figura 5.8 este prezentată schema electrică a circuitului, exemplificată cu două relee pentru controlul a două surse de iluminat.

Figura 5.8 Circuit electric pentru modulul de iluminat

La nivelul fiecărui releu sunt prezente cinci intrări dintre care: sursa de alimentare a releului propriu-zis, ground, tensiune de 5V, o linie de comandă a releului, două linii pentru alimentare de la priză, ground și 220V, reprezentând tensiunea pe care releul o transmite sursei de iluminat în momentul cuplării.

Pini de GPIO 4 și 18 sunt setați drept ieșiri. Pe fiecare dintre ei fiind controlat separat unul sau mai multe relee. În cazul în care utilizatorul dorește controlul unui număr mai mare de becuri, pot fi adăugate noi relee, precum cele din figura 5.8. Relele sunt alimentate de la sursa de tensiune auxiliară (aceasta are ground comun cu placa Raspberry Pi), iar curentul consumat de pe linia de control legată la platforma de dezvoltare este nesemnificativă. Datorită acestui fapt liniile de ieșire pot fi bifurcate pentru controlul altor relee și extinderea numărului de becuri controlate de sistem. Releele conectate la aceeași linie de control vor fi activate simultan.

La nivelul senzorului de luminozitate sunt prezenți trei pini. Doi pini reprezintă ground-ul și tensiune de alimentare (3.3V), iar cel de-al treilea prin reprezintă tensiunea de ieșire din senzor. Acesta produce o tensiune de ieșire liniară, direct proporțională cu luminozitatea existentă a locului unde acesta este plasat. Tensiunea de ieșire a senzorului este transmisă convertorului analog-digital prin intermediul celui de-al șaptelea canal al acestuia. Circuitul electronic al senzorului este unul simplist, acesta fiind compus dintr-o fotodiodă și un amplificator de tensiune. În figura 5.9 este ilustrată schema bloc a senzorului de luminozitate.

Figura 5.9 Schema bloc a circuitului electronic pentru senzorul PT15-21C/TR8

Modul alarmă de incendiu

Acest modul al sistemului creat este unul foarte important datorită pericolelor pe care utilizatorul le evită datorită lui.

Singura componentă auxiliară care trebuie adăugată la sistem este senzorul de gaze MQ2. Acesta este capabil să detecteze prezența gazelor în cantități care predispun la pericole.

PCB-ul pe care este montat senzorul este gândit pentru adăugarea unei rezistențe de 10 kOhmi necesară și a unui potențiometru pentru reglarea sensibilității senzorului.

Pinii prezenți la nivelul PCB-ului sunt Ground, Vin și Vout. Pinul Ground și Vin sunt conectați la sursa de alimentare auxiliară, iar tensiune alimentată este de 5V. Pinul Vout este conectat la canalul șase al convertorului, dat fiind faptul că semnalul este analogic.

Este absolut necesară sursa de alimentare auxiliară datorită consumului ridicat pe care placa Raspberry Pi nu îl poate suporta. Temperatura de funcționare aproximativă a senzorului este în jur de 60℃, iar din cauza acestui fapt consumul ajunge să fie de 1.5A. Senzorului îi trebuie un interval de timp de 2-3 minute pentru ca temperatura la nivelul acestuia să fie în parametrii. Abia după această perioadă senzorul returnează corect densitatea de gaze inflamabile.

În figura 5.10 este prezentată schema electrică pentru conectarea senzorului de gaze analogic la restul sistemului.

Figura 5.10 Circuit electric pentru modulul de alarmă în caz de incendiu

Utilizatorul poate seta starea sistemului la activ sau inactiv. În cazul în care sistemul este activ, iar densitatea de gaze ajunge la un prag periculos, utilizatorul este informat prim e-mail despre acest lucru.

E-mail-ul este transmis de către sistem de pe adresa de mail [anonimizat], la care este conectată placa Raspberry Pi, pe care este implementat sistemul înglobat, cu ajutorul unui client de SMTP instalat pe aceasta. Clientul de SMTP stabilește legătura între platformă și serverul de SMTP al celor de la Google.

def sentMails():

toAdd = getEmails()

smtpUser ='[anonimizat]' smtpPass ='********'

fromAdd = smtpUser

subject = 'ALARMA'

body = ' DENSITATEA GAZELOR INFLAMABILE A DEPASIT LIMITA MXIMA ADMISA! '

s = smtplib.SMTP('smtp.gmail.com',587)

s.ehlo()

s.starttls()

s.ehlo()

s.login(smtpUser,smtpPass)

header = 'To:'+", ".join(toAdd) + '\n' + 'From:' + fromAdd + '\n' + 'Subject:' + subject

s.sendmail(fromAdd, toAdd, header + '\n\n\n\n\n' + body )

s.quit()

Funcție pentru trimis e-mail

Funcția prezentată mai sus are sarcina de a trimite e-mail de avertizare în caz de pericol.

Componente software

Componenta principală a sistemului este reprezentă de aplicația embedded și poate fi numită partea master a acestui sistem, deoarece este componenta care inițializează întreaga funcționalitate a acestuia. Este partea sistemului ce se ocupă de monitorizarea și manipularea tuturor componentelor periferice adăugate plăcii Raspberry Pi.

Acest modul rulează în timp real, la nivelul plăcii de dezvoltare Raspberry Pi, citind senzorii la un interval de timp dat, iar în funcție de aceștia sunt manipulate componentele mecanice și electrice.

Figura 5.11 prezintă modul de comunicare între cele trei submodule, aplicația pentru sistemul înglobat, serviciul web și aplicația Android.

Figura 5.11 Diagrama de funcționare a componentei software

Diagramă de secvență

Acest sub capitol prezintă o diagramă de secvență pentru una din cele mai importante acțiuni, și anume schimbarea unor setări în sistemul înglobat.

Figura 5.12 Diagrama de secvență

Aplicația înglobată

Figura 5.13 Diagrama de conectivitate între fișiere

În figura 5.12 este prezentat modul de interacțiune între fișierele aplicației înglobate. Această aplicație este formată din mai multe module, fiecare ocupându-se de câte o funcționalitate. Fiecare din cele patru module este compus din două fișiere personale și alte trei a căror funcționalitate este necesară. În fișierul main.py este găsită funcția principala main(), funcție care rulează în buclă infinită și apelează funcțiile principale din fiecare sub modul.

Funcționalitatea conținută în fișierul controlDistanță.py are sarcina de manipulare a tabelei cu ajutorul căreia se realizează comunicația dintre serviciul web și aplicația care constituie sistemul înglobat.

În fișierul gpioSet.py sunt setați pinii de GPIO ai plăcii Raspberry Pi ca intrări sau ieșiri.

Utilizarea bazei de date

Utilitatea bazelor de date în cadrul acestui proiect este una esențială. Cu ajutorul tabelelor din baza de date sunt create jurnale. Fiecare modul are propria tabelă în baza de date. Monitorizarea detaliată asupra locuinței este posibilă prin intermediul acestor tabele. În fiecare tabel corespunzător câte unui modul este adăugată câte o tuplă la fiecare minut cu starea sistemului.

În cele ce urmează sunt prezentate cele patru tabele ale fiecărui modul:

Tabel 5.5 Cap tabelă modul termostat

Tabel 5.6 Cap tabelă modul umiditate

Tabel 5.7 Cap tabelă modul iluminat

Tabel 5.8 Cap tabelă modul alarma gaze

O altă funcționalitate importantă realizată cu ajutorul bazelor de date este comunicarea dintre aplicația înglobată și serviciul web care își desfășoară activitatea la nivelul plăcii Raspberry Pi. Prin intermediul serviciului web este singura posibilitate de acces al aplicației Android la placă și implicit monitorizarea si controlul sistemului care rulează pe aceasta.

Aplicația înglobată comunică cu serviciul web prin intermediul tabele din baza de date denumită tranziție. Capătul acestei tabele este prezentat în tabelul 5.1.

Tabel 5.9 Cap tabelă tranziție

Salvarea utilizatorilor este o altă responsabilitate care îi revine bazei de date. Tabela conține date despre utilizator, dar si contul cu care acesta trebuie să se autentifice.

Tabel 5.10 Cap tabelă utilizator

În cazul în care baza de date cedează, jurnalele nu sunt pierdute, acestea fiind inserate în fișiere cu extensia .xls, care conțin tabele cu capetele identice cu cele din baza de date. Data, ora și eroarea, returnată de baza de date în momentul cedării sunt inserate într-un fișier text.

Serviciul web

Serviciul web este programat în limbajul de programare PHP, fiind instalat un server pentru ca acesta să devină utilizabil. Prin intermediul acestui serviciu se face accesul la distanță asupra sistemului înglobat. Acesta este apelat din aplicația Android prin intermediul unor POST(HTTP). Acesta comunică cu tabelele bazei de date pentru autentificare monitorizare și control asupra sistemului.

În figura 5.11 se poate vedea modul în care serviciul web comunică cu aplicația Android și cu baza de date.

Aplicația Android

Aplicația Android are un rol important în accesul de la distanță asupra sistemului înglobat. Prin intermediul activităților din aplicație, sunt apelate metode de tip POST, suportate de protocolul HTTP folosit de WWW(World Wide WEB). Aceste metode sunt folosite pentru a interoga serviciul web cu privire la anumite date.

În figura 5.14 este prezentată o diagramă a activităților care pot fi efectuate din cadrul aplicației Android.

Figura 5.14 Diagrama activităților aplicației Android

În figura 5.15 este ilustrată diagrama Use-Case a principalelor activități realizabile din aplicația Android.

Figura 5.15 Diagrama Use-Case a aplicației Android

Testare și validare

În acest capitol sunt prezentate și explicate rezultatele obținute în urma activităților de testare și validare la care a fost supus sistemul înglobat.

Testarea performanței

Această secțiune a capitolului este dedicată pentru prezentarea timpilor de execuție a sistemului pentru principalele operații pe care acesta le execută. Operațiile analizate sunt măsurarea temperaturii, umidității, luminozității și nivelului de gaze inflamabile.

Testarea timpului de execuție s-a realizat cu ajutorul unui timer al sistemului de operare, realizat cu ajutorul timer-lor hardware. Acest timer a fost apelat cu ajutorul bibliotecii time, care conține funcția time(). Funcția time() returnează timpul de când este pornit sistemul. Dacă durata de execuție a programului nu depășește un minut este incrementat un contor pentru fiecare execuție a operației, iar daca durata ajunge la un minut, execuția programului este întreruptă. Secvența de cod este rulată pentru fiecare operație în parte. În chenarul de mai jos este ilustrată funcția pentru citirea repetată a umidității în intervalul de un minut.

contor = 0

start1 = int(time.time())

while True:

start2 = int(time.time())

timer = (start1+60)-start2

readUmiditate(2)

contor+=1

print contor, timer

if(timer == 0):

break

benchmark.py

Cod pentru obținerea timpilor de execuție

Componente folosite:

Platforma pentru dezvoltare Raspberry Pi

Convertorul analog-digital MCP3008-I/SL

Senzor de temperatură LM50

Senzor de umiditate SYH-2R

Senzor de luminozitate ELPT15-21C

Senzor de gaze inflamabile MQ2

Timpul de execuție este exprimat în număr de prelevări pe secundă.

Tabel 6.11 Timpi de execuție

Corectitudinea datelor

Corectitudinea măsurării datelor este una dintre cele mai importante caracteristici ale acestui sistem. Datele pe care utilizatorul le primește trebuie să fie unele corecte ți reale despre condițiile existente. În cazul unor date eronate sistemul este unul instabil, iar controlul acestuia asupra dispozitivelor încredințate este unul incorect.

Pentru stabilirea marjei de eroare s-au analizat datele măsurate pe ambii senzori de temperatură LM50.

Dispozitivul de comparație pentru rezultatele măsurării este un multimetru produs de firma UNI-T, modelul UT55. Printre funcționalitățile acestuia se numără și măsurarea temperaturii, la achiziționare fiind inclus un senzor de temperatură compatibil în pachet.

Pentru ca rezultatul să fie unul cât mai concludent, au fost efectuate câte 10 măsurători în două condiții diferite în care se afla senzorul.

Tabel 6.12 Corectitudinea datelor

Concluzionând, după terminarea măsurătorilor și analizarea datelor, rezultatele obținute sunt bune, marja de eroare fiind de maxim 2% față de senzorul de temperatură al multimetrului considerat etalon.

Manual de instalare si utilizare

În cadrul acestui capitol este prezentat manualul de instalare a sistemului pentru a deveni utilizabil, dar si manualul de utilizare. Acest capitol nu conține date specifice din domeniu astfel încât să nu fie necesare cunoștințe în domeniu pentru instalarea și utilizarea sistemului.

Resurse hardware

Sistemul informatic fiind unul modular, nu este obligatoriu ca toate modulele să fie folosite. Fiecare modul are componentele sale periferice. În cadrul acestui subcapitol vor fi prezentate componentele maxim posibile pe care sistemul le poate monitoriza sau controla.

Placa Raspberry Pi și convertorul analog-digital MCP3008-I/SL sunt componente obligatorii pentru folosirea oricărui modul.

Modul termostat

Doi senzori de temperatură LM50, unul pentru fiecare cameră

Un led pentru starea sistemului de încălzire

Releu de 60V pentru controlul centralei

Două butoane pentru setarea temperaturii dorite

Două relee de 220V pentru controlul valvele caloriferelor din fiecare cameră

Sursă auxiliară pentru alimentarea releelor

Modul umiditate

Senzor de umiditate SYH-2R

Modul iluminat

Senzor de lumină ELPT15-21C

Un număr de relee egal cu numărul de becuri controlate de sistem

Sursă de tensiune auxiliară pentru alimentarea releelor

Modul alarmă incendiu

de gaze MQ2

Sursă de alimentare auxiliară pentru alimentarea senzorului

Dispozitiv mobil pe care rulează sistemul Android (minim 4.2.2).

Conexiunile între componentele periferice și platformă este recomandat să fie realizate cu ajutorul modelului de cablu CAT5e.

Figura 7.1 Montare convertor analog-digital

Convertorul analog-digital este foarte important să fie montat în poziția prezentată în figura 7.1 pentru evitarea deteriorării acestuia sau al plăcii Raspberry Pi.

Montarea circuitului constă din următorii pași:

Pregătirea plăcii de dezvoltare

Adăugarea cardului de memorie la placă

Adăugarea convertorului analog-digital la placă

Conectarea perifericelor (senzori, leduri, etc)

Conectarea cablului de internet

Pornirea sursei de tensiune auxiliară

Conectarea sursei de tensiune

Figura 7.2 Conectarea perifericelor

În figura 7.2 sunt prezentați pinii de conectare a perifericelor necesare funcționării sistemului.

Resurse software

Singura resursă software necesară este fișierul Sistem_înglobat.img, care trebuie scris pe cardul SD care reprezintă memoria plăcii Raspberry Pi. Această imagine conține toate setările și software-ul necesar pentru utilizarea acestui sistem.

Toată paleta de software necesară rulării sistemului pornește la startul plăcii Raspberry Pi. Este necesară o perioadă de timp de aproximativ două minute.

Rularea sistemului

După timpul de pornire a plăcii Raspberry Pi sistemul este complet funcțional. Setările inițiale ale sistemului activează toate modulele și setează temperatura la 20 ℃. Utilizatorul poate schimba temperatura în funcție de preferințe de la cele două butoane. La fiecare apăsare a butoanelor, temperatura setată crește sau scade cu 0.5 ℃.

Pentru accesarea sistemului din aplicația Android este nevoie de acces la internet atât la nivelul plăcuței cât si la nivelul dispozitivului de pe care se dorește conectarea. Aplicația Android necesită pentru instalare și rulare ca sistemul Android care rulează pe dispozitivul pe care se dorește instalarea să fie actualizat cel puțin la versiunea 4.2.2.

Figura 7.3 Pagina de autentificare

În figura 7.3 este ilustrată pagina de autentificare a aplicației Android pentru monitorizarea și controlul sistemului înglobat de la distanță prin intermediul internetului.

Atunci când aplicația este pornită de către utilizator, prima pagină care apare pe ecran este cea de autentificare. În cadrul acesteia utilizatorul trebuie să introducă contul de utilizator si parola corespondentă acestuia pentru autentificare. În cazul în care acesta greșește contul de cinci ori consecutiv, trebuie să aștepte o perioadă de 25 de secunde pentru a putea încerca o nouă autentificare. Aplicația afișează mesaje reprezentative în funcție de erori.

În cazul în care autentificarea este reușită, aplicația trece la pagina principală a utilizatorului. În cadrul acestei pagini utilizatorul poate să își schimbe parola, să adauge un nou utilizator sau să intre în pagina de control a aplicației. Pagina utilizatorului este ilustrată în figura 7.4.

Figura 7.4 Pagina utilizatorului

În figura 7.5 sunt prezentate paginile de schimbare a parolei și de adăugare a unui nou utilizator.

Figura 7.5 Managementul utilizatorilor

În partea stângă a figurii 7.5 este ilustrată pagina de schimbare a parolei pentru contul autentificat, iar în partea din dreapta imaginii este prezentată interfața pentru adăugarea unui nou utilizator. Posibilitatea adăugării unui nou utilizator o dețin toți cei care deja sunt înregistrați în baza de date. În tabele utilizatorilor aflată în imaginea Sistem_înglobat.img, există inițial un singur cont de utilizator, și anume analogia utilizator, parola admin – admin. La prima autentificare este necesară schimbarea parolei asociată acestui cont utilizator din motive de securitate.

Este important ca e-mail-ul trimis să fie unul valid, deoarece în caz contrar sistemul de alarmă este inutil.

În figura 7.6 este prezentată o captură a ecranului în care este ilustrată pagina din aplicația Android care se ocupă de monitorizarea și controlul stărilor din locuință, dar și de activarea sau dezactivarea unor module.

Din modulul termostat sunt afișate temperaturile prezente la nivelul celor doi senzori de temperatură. Din această pagina este posibilă setarea temperaturii care se dorește constantă în locuință. Temperaturile sunt reprezentate în grade Celsius.

Umiditatea este un alt factor al confortului termic care poate fi vizualizat în cadrul acestei pagini a aplicației. Aceasta este reprezentată procentual.

Modulele de iluminat și de alarmă în caz de gaze inflamabile sau incendiu pot fi activate sau dezactivate în funcție de preferințe din cadrul acestei interfețe. Aceste module controlează anumite dispozitive în mod automat.

Figura 7.6 Controlul și monitorizarea locuinței

Concluzii

Acest capitol prezintă pe scurt concluziile obținute în urma implementării sistemului, fiind analizate obiectivele stabilite în capitolul al doilea și rezultatele obținute pe parcursul dezvoltării.

Conținutul lucrării

Începutul lucrării ne prezintă o scurtă introducere în contextul și domeniul de activitate al proiectului, urmată de stabilirea obiectivelor și funcțiilor pe care acesta trebuie să le acopere.

În urma analizei și fundamentării teoretice pe baza unui studiu bibliografic asupra sistemelor asemănătoare și a posibilităților din care se poate alege, au fost stabilite soluțiile hardware și software care stau la baza dezvoltării proiectului. Ulterior acestei etape este prezentată proiectarea de detaliu și modul de implementare a proiectului, fiind prezentate și testele de performanță și corectitudine a proiectării și implementării.

Manualul de instalare și utilizare prezintă modul în care sistemul trebuie instalat pentru a deveni utilizabil, dar și modul în care se desfășoară interacțiunea dinte utilizator și sistem în timpul rulării.

La final sunt prezentate concluziile obținute pe parcursul și după implementarea sistemului.

Realizări

Aruncând o privire asupra obiectivelor funcționale propuse spre îndeplinire în capitolul 2, au fost realizate cu succes următoarele:

Funcționale

Monitorizarea temperaturii în două încăperi diferite

Monitorizarea umidității mediului

Monitorizarea luminozității

Monitorizarea densității de gaze

Controlul sistemului de încălzire, în cele două camere, în funcție de temperatură

Controlul sistemului de iluminat

Controlul sistemului de alarmă de incendiu și expedierea de e-mail proprietarului în caz de pericol

Crearea câte unui jurnal în cazul fiecărui modul

Non-funcționale

Sistemul este unul scalabil datorită construcției modulare

Sistemul este unul performant, rezultatele obținute și prezentate în capitolul 7 o dovedesc

Sistemul este ușor de utilizat, având o interfață simplă și ușor de înțeles

Sistemul este securizat, fiind nevoie de autentificare pentru interacțiunea cu el de la distanță

Dificultăți întâlnite

Una din cele mai importante dificultăți întâlnite a fost consumul de curent ridicat al unor dispozitive periferice, fiind nevoie de adăugarea unei surse de tensiunea auxiliare, deoarece platforma Raspberry Pi nu putea face față.

Necesitatea învățării unui nou limbaj de programare, Python[16], care nu a fost studiat înainte de începerea acestui proiect, se numără printre dificultățile întâlnite.

O altă dificultate întâlnită a fost găsirea unei formule de liniarizare a senzorului de umiditate, deoarece documentația acestuia nu oferă una.

Dezvoltări ulterioare

Sistemul poate fi dezvoltat ulterior prin adăugarea de noi module, reprezentând noi funcționalități sau prin extinderea celor existente. Acestea ar putea fi:

Controlul sistemului de aer condiționat

Controlul sistemului de umbrire

Controlul sistemului de irigație

Monitorizarea video a intrărilor in locuință

Controlul accesului în locuință

Controlul sistemului multimedia

O importantă extindere ulterioară este extinderea aplicației Android pentru vizualizarea jurnalelor fiecărui modul direct pe dispozitivul mobil.

Un alt mod de extindere a sistemului prezentat este axarea către anumite clase sociale sau categorii de utilizatori.

Bibliografie

[1] KMC Controls. "Understanding Building Automation and Control Systems". Retrieved 27 March 2013

[2] Gerhart, James. Home Automation and Wiring. McGraw-Hill Professional. ISBN 0070246742, 31 March 1999.

[3] Spicer, Dag. "If You Can't Stand the Coding, Stay Out of the Kitchen: Three Chapters in the Hi | Dr Dobb's". Drdobbs.com. Retrieved 2012-10-26.

[4] "Bay Area Computer History Perspectives". Computer.org. Retrieved 2012-10-26.

[5] Inc. P.O. Box 423, Milwaukee, WI 53201 Printed in USA PUBL-5638, 2008 Johnson Controls

[6] Broadcom Europe Ltd., BCM2825 ARM Peripherals, 06 February 2012,

http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf

[7] Siemens Switzerland Ltd, “simple and energy-efficient HVAC control”, 2013, http://www.siemens.com/synco/

[8] http://www.securitysa.com/news.aspx?pklnewsid=42032 , Enterprise Solutions,

1 May 2012

[9] Cellan-Jones, Rory. "A £15 computer to inspire young programmers". BBC News, 5 May 2011

[10] Motorola, Inc. „SPI Block Guide V03.06”, Revised: 04 FEB 2003, http://www.ee.nmt.edu/~teare/ee308l/datasheets/S12SPIV3.pdf

[11] Microchip Technology Inc. DataSheets “MCP3004/3008”, 2008

https://www.adafruit.com/datasheets/MCP3008.pdf

[12] Texas Instruments, SNIS118E – JULY 1999 REVISED SEPTEMBER 2013

http://www.ti.com/lit/ds/symlink/lm50.pdf

[13] Everlight Electronics Co., Ltd., Rev 1.1, Prepared date 04-28-2003, http://www.robofun.ro/docs/ELPT15-21C.pdf

[14] Samyoung S&C Co., LTD. http://www.micropik.com/PDF/syh2r.pdf

[15] HANWEI ELECTRONICS CO.,LTD, http://www.seeedstudio.com/depot/datasheet/MQ-2.pdf

[16] Python v2.7.7 documentation, last updated JUN 25, 2014, https://docs.python.org/2.7/

Anexa 1. Funcții pentru citirea senzorilor

# functie pentru citirea canalelor de ADC

def readADC(adcCH):

if ((adcCH > 7) or (adcCH< 0)): # daca canalul adc-ului pe care il citim este nu exista se returneaza -1

return -1

r = spi.xfer2([1,(8+adcCH)<<4,0]) # se citesc registrii SPI-ului

adcResult = ((r[1]&3) << 8) + r[2] # se unesc cele doua valori de 8 biti in care se afla rezultatul ultimi 3 biti di r1 si ce 8 biti din r2

return adcResult # se returneaza rezultatul ADC-ului

# functie pentru citirea temperaturii

def readTemp(CH):

sumaTemperaturiPartiale = 0

countTemp = 0

value = readADC(CH)

if(value <100 or value > 800): # daca valoarea nu se afla in acest interval ne putem da seama ca valoarea este ireala sau incorecta

return -1

else:

for countTemp in range(0,50): # 50 iteratii pentru a face o medie intre 50 sample-uri partiale

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

voltage = (value * 3.3)/1024 # referinta la ADC VCC si scalat la rezolutia ADC

temperaturaPartiala = (voltage-0.50025)*100 # calcul temperatura dupa formula din datasheet

sumaTemperaturiPartiale += temperaturaPartiala

countTemp += 1

gradeCelsius = round(sumaTemperaturiPartiale/countTemp,1) # media celor 50 esantionari-uri

return gradeCelsius

# functie pentru citirea luminozitatii

def readLuminozitate(CH):

sumaLuminozitatiPartiale = 0

count = 0

for count in range (0,10): # 10 iteratii pentru a face o medie intre 10 de esantionari-uri partiale

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

voltage = (value * 3.3)/1024 # referinta la ADC VCC si scalat la rezolutia ADC

sumaLuminozitatiPartiale += value

count += 1

luminozitate = sumaLuminozitatiPartiale/count # media celor 10 esantionari-uri

return luminozitate

# functie pentru citirea senzorului de gaze

def readGazeInflamabile(CH):

sumaGazeInflamabilePartiale = 0

count = 0

for count in range (0,10): # 10 iteratii pentru a face o medie intre 10 de esantionari-uri partiale

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

voltage = (value * 3.3)/1024 # referinta la ADC VCC si scalat la rezolutia ADC

sumaGazeInflamabilePartiale += value

count += 1

gazeInflamabile = sumaGazeInflamabilePartiale/count # media celor 10 esantionari-uri

return gazeInflamabile

# functie pentru citirea umiditatii

def readUmiditate(CH):

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

if value >=900 and value <= 2890: # formula de liniarizare a senzorului de umiditate

umiditate = -0.005 * value + 34.5226

elif value >=270 and value <= 900:

umiditate = -0.0159 * value + 44.2857

elif value >=81 and value <= 270:

umiditate = -0.0529 * value + 54.2857

elif value >=33 and value <= 81:

umiditate = -0.2083 * value + 66.875

elif value >=13 and value <= 33:

umiditate = -0.5 * value + 76.5

elif value >=5.3 and value <= 13:

umiditate = -1.2987 * value + 86.8831

elif value >=2.2 and value <= 5.3:

umiditate = -3.2258 * value + 97.0968

else:

umiditate = -7.1429 * value + 105.7143

return umiditate

Anexa 2. Control sistem de încălzire

def getTempFromButton(setTemp,plus,minus): # setarea temperaturii dorite de la butonae

#global setTemp

if isInput(plus): # daca se primeste intrerupere de la butonul de +

if setTemp > 29.9: # temperatura nu poate fi setata mai sus de 30 grade

setTemp = 30.0

else:

setTemp += 0.5 # se creste temperatura dorita cu 0.5 grade Celsius

if isInput(minus): # daca se primeste intrerupere de la butonul de –

if setTemp < 10.1: # temperatura nu poate fi setata mai jos de 10 grade

setTemp = 10.0

else:

setTemp -= 0.5 # se scade temperatura dorita cu 0.5 grade Celsius

return setTemp # se returneaza temperatura setata

def termostatTemp(tempDorita,CH1,CH2,CH3,plus,minus,gpioCaloriferCamera1, gpioCaloriferCamera2,gpioCentrala,delayToOFF,delayToON): # controlul sisstemului de incalzire

global stareCentrala

global stareCaloriferCamera1

global stareCaloriferCamera2

umiditate = round(readUmiditate(CH3),1) # se citeste umiditatea de pe canalul analog CH3

temperaturaCamera1 = readTemp(CH1) # se citeste temperatura de pe canalul analog CH1

temperaturaCamera2 = readTemp(CH2) # se citeste temperatura de pe canalul analog CH2

tempDorita = getTempFromButton(tempDorita,plus,minus) # se pune temperatura dorita de la butoane in tempDOrita

print "–––––––-SetTemp–––––––\n"

print "Temperatura setata",tempDorita , "Grade Celsius\n"

print "––––––––––––––––-\n"

difTemp1 = round((temperaturaCamera1 – tempDorita),1) # aflam diferenta dintre temperatura actuala si temperatura setata, rotunjim cu 1 zecimala si o salvam in difTempo1

difTemp2 = round((temperaturaCamera2 – tempDorita),1) # aflam diferenta dintre temperatura actuala si temperatura setata, rotunjim cu 1 zecimala si o salvam in difTempo2

if (temperaturaCamera1 == -1): # se verifica existenta senzorilor de temperatura

difTemp1 = 0

print "–––––––Temperatura––––––\n"

print colored('WARNING:Fara senzor de temperatura C1\n','red')

print "––––––––––––––––-\n"

elif (temperaturaCamera2 == -1):

difTemp2 = 0

print "–––––––Temperatura––––––\n"

print colored('WARNING:Fara senzor de temperatura C2\n','red')

print "––––––––––––––––-\n"

if ((temperaturaCamera1 == -1) and (temperaturaCamera2 == -1)): # daca senzorii de temperatura lipsesc, sau sunt defecti, oprim centrala

powerUpDown(gpioCentrala,False) # se opreste centrala

stareCentrala = False # salvam starea centralei in variabila stareCentrala

delayToON = 0

delayToOFF = 0

print "–––––––Temperatura––––––\n"

print colored('WARNING:Fara senzori de temperatura\n','red')

print "––––––––––––––––-\n"

else: # daca exista senzori

if ((difTemp1 <= -0.5) or (difTemp2 <= -0.5)): # daca diferenta de temperatura este mai < sau = cu 0.5 grade pe unul din senzori, atunci dupa un delay se porneste centrala

if delayToON == 20: # testam daca este atins delay-ul

delayToON = 0 # resetam delay-urile

delayToOFF = 0

powerUpDown(gpioCentrala,True) # se porneste centrala si starea acesteia devine True

stareCentrala = True

if (difTemp1 >= 0.5): # control valve calorifere pe camere

powerUpDown(gpioCaloriferCamera1, False)

stareCaloriferCamera1 = False

if (difTemp2 >= 0.5):

powerUpDown(gpioCaloriferCamera2, False)

stareCaloriferCamera2 = False

if (difTemp1 <= -0.5):

powerUpDown(gpioCaloriferCamera1,True)

stareCaloriferCamera1 = True

if (difTemp2 <= -0.5):

powerUpDown(gpioCaloriferCamera2,True)

stareCaloriferCamera2 = True

else:

delayToON +=1 # daca delay-ul nu a ajuns la cel prestabilit, il incrementam cu 1

elif (difTemp1 >= 0.5) and (difTemp2 >= 0.5): # daca diferenta de temperatura este mai > sau = cu -0.5 grade pe unul din senzori, atunci dupa un delay prestabilit oprim centrala

if delayToOFF == 20: # testam daca este atins delay-ul

delayToOFF = 0 # resetam delay-urile

delayToON = 0

powerUpDown(gpioCentrala,False) # se opreste centrala si starea acesteia devine False

stareCentrala = False # se redeschid valvele

powerUpDown(gpioCaloriferCamera1,True)

stareCaloriferCamera1 = True

powerUpDown(gpioCaloriferCamera2,True)

stareCaloriferCamera2 = True

else:

delayToOFF += 1 # daca delay-ul nu a ajuns la cel prestabilit, il incrementam cu 1

print "–––––––Temperatura––––––\n"

print "Temperatura in C1 este:", temperaturaCamera1,"Grade Celsius\n"

print "––––––––––––––––-\n"

print "–––––––Temperatura––––––\n"

print "Temperatura in C2 este:", temperaturaCamera2,"Grade Celsius\n"

print "––––––––––––––––-\n"

if stareCentrala == False:

print colored('Centrala OFF!','red')

elif stareCentrala == True:

print colored('Centrala ON!','green')

return (delayToOFF,delayToON,temperaturaCamera1,temperaturaCamera2,umiditate,tempDorita,stareCaloriferCamera1,stareCaloriferCamera2,stareCentrala) # sunt returnate cele doua delay-uri și datele necesare

Anexa 3. Modul termostat – acțiuni asupra bazei de date

#functie de inserare a datelor modului de termostat in tabela "termostat"

def inserareTermostat(dateTermostat,delayIntrDate):

global contor

dataCurenta = time.strftime("%d%m%Y") # se pune data curenta in dataCurenta in format zi,luna,an

oraCurenta = time.strftime("%H%M%S") # se pune ora curenta in oraCurenta in format ora,minute,secunde

if (delayIntrDate==400): # inseram in baza de date aproximativ odata la 1 minut

db = MySQLdb.connect("localhost", "admin", "admin", "casamea") # datele de conectare la baza de date in ordine "locatia bazaei de date", "username", "parola", "nume baza de date"

cursor = db.cursor()

if (000000<int(oraCurenta)<000200):

exportBazaDateTermostat(dataCurenta,cursor)

statementTermostat = "INSERT INTO termostat VALUES(CURRENT_DATE(), NOW(), %f,%f,%f,%f,%r,%r,%r)"%(dateTermostat[2], dateTermostat[3],dateTermostat[4],dateTermostat[5],dateTermostat[6],dateTermostat[7],dateTermostat[8]) # propozitie pentru inserarea in baza de date

try:

cursor.execute (statementTermostat)

db.commit() # se insereaza in baza de date

print colored('MODUL Termostat: Datele au fost introduse cu succes!','green') # afisare in consola

db.close() # se inchide baza de date

except: # daca nu se poate conecta la baza de date se arunca exceptie, iar datele pt. a nu fi pierdute se isereaza in fisier text

print colored('ERROR MODUL Iluminat: Nu se poate conecta la baza de date','red')

timpCurent = time.strftime("%c")

f = open("errors/ERROR_BD_Termostat_"+dataCurenta,"a+") # se creeaza fisier de eroare in folder-ul errors

if (contor == 0):

f.write(" Data TemperaturaC1 TemperaturaC2 Umiditate TemperaturaDorita CaloriferC1 CaloriferC2 StareCentrala\n") # antetul se insereaza o singura data

contor = 1

f.write(timpCurent+" ") # se insereaza datele

f.write(str(dateTermostat[2])+" ")

f.write(str(dateTermostat[3])+" ")

f.write(str(dateTermostat[4])+" ")

f.write(str(dateTermostat[5])+" ")

f.write(str(dateTermostat[6])+" ")

f.write(str(dateTermostat[7])+" ")

f.write(str(dateTermostat[8])+"\n")

f.close() # se inchide fisierul

delayIntrDate = 0; # se reseteaza delay-ul

else:

delayIntrDate += 1 # se incrementeaza delay-ul

return delayIntrDate

# fuctie pt. export a bazei de date, mai putin ultima luna

def exportBazaDateTermostat(dataCurenta,cursor):

oneMonthAgo = str(int(dataCurenta)-10000) # se calculeaza data curenta – 1 luna

oneMonthAgoDate = datetime(year=int(dataCurenta[4:8]),month=(int(dataCurenta[2:4])-1),day=int(dataCurenta[0:2])).date() # rearanjare data

workbook = xlsxwriter.Workbook("dataLog/"+oneMonthAgo+"_dataBase_export_Termostat.xlsx") # se creeaza un nou document .xlsx

worksheet = workbook.add_worksheet() # se creeaza un o noua foaie in document

worksheet.set_column('A:J',12) # se seteaza coloana si linia de inceput

bold = workbook.add_format({'bold':True}) # se creeaza un format cu bold

worksheet.write('A1','Data',bold) # se scrie antetul

worksheet.write('B1','Ora',bold)

worksheet.write('C1','TemperaturaC1',bold)

worksheet.write('D1','TemperaturaC2',bold)

worksheet.write('E1','Umiditate',bold)

worksheet.write('F1','Temp. Setata',bold)

worksheet.write('G1','StareCaloriferC1',bold)

worksheet.write('H1','StareCaloriferC1',bold)

worksheet.write('I1','Stare Centrala',bold)

statement = "SELECT * FROM termostat WHERE data <= '%s'"%(oneMonthAgoDate) # propozitia de selectia a datelor care trebuie puse in fisier

cursor.execute(statement)

numarRanduri = int(cursor.rowcount) # se selecteaza si insereaza toate liniile care corespund propozitiei

for rand in range(0,numarRanduri):

data = cursor.fetchone()

for coloana in range(0,9):

worksheet.write_string(rand+1, coloana, str(data[coloana]))

statementdelete = "DELETE FROM termostat WHERE data <= '%s'"%(oneMonthAgoDate) # propozitia de stergere a datelor de sters din baza de date

cursor.execute(statementdelete)

Bibliografie

[1] KMC Controls. "Understanding Building Automation and Control Systems". Retrieved 27 March 2013

[2] Gerhart, James. Home Automation and Wiring. McGraw-Hill Professional. ISBN 0070246742, 31 March 1999.

[3] Spicer, Dag. "If You Can't Stand the Coding, Stay Out of the Kitchen: Three Chapters in the Hi | Dr Dobb's". Drdobbs.com. Retrieved 2012-10-26.

[4] "Bay Area Computer History Perspectives". Computer.org. Retrieved 2012-10-26.

[5] Inc. P.O. Box 423, Milwaukee, WI 53201 Printed in USA PUBL-5638, 2008 Johnson Controls

[6] Broadcom Europe Ltd., BCM2825 ARM Peripherals, 06 February 2012,

http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf

[7] Siemens Switzerland Ltd, “simple and energy-efficient HVAC control”, 2013, http://www.siemens.com/synco/

[8] http://www.securitysa.com/news.aspx?pklnewsid=42032 , Enterprise Solutions,

1 May 2012

[9] Cellan-Jones, Rory. "A £15 computer to inspire young programmers". BBC News, 5 May 2011

[10] Motorola, Inc. „SPI Block Guide V03.06”, Revised: 04 FEB 2003, http://www.ee.nmt.edu/~teare/ee308l/datasheets/S12SPIV3.pdf

[11] Microchip Technology Inc. DataSheets “MCP3004/3008”, 2008

https://www.adafruit.com/datasheets/MCP3008.pdf

[12] Texas Instruments, SNIS118E – JULY 1999 REVISED SEPTEMBER 2013

http://www.ti.com/lit/ds/symlink/lm50.pdf

[13] Everlight Electronics Co., Ltd., Rev 1.1, Prepared date 04-28-2003, http://www.robofun.ro/docs/ELPT15-21C.pdf

[14] Samyoung S&C Co., LTD. http://www.micropik.com/PDF/syh2r.pdf

[15] HANWEI ELECTRONICS CO.,LTD, http://www.seeedstudio.com/depot/datasheet/MQ-2.pdf

[16] Python v2.7.7 documentation, last updated JUN 25, 2014, https://docs.python.org/2.7/

Anexa 1. Funcții pentru citirea senzorilor

# functie pentru citirea canalelor de ADC

def readADC(adcCH):

if ((adcCH > 7) or (adcCH< 0)): # daca canalul adc-ului pe care il citim este nu exista se returneaza -1

return -1

r = spi.xfer2([1,(8+adcCH)<<4,0]) # se citesc registrii SPI-ului

adcResult = ((r[1]&3) << 8) + r[2] # se unesc cele doua valori de 8 biti in care se afla rezultatul ultimi 3 biti di r1 si ce 8 biti din r2

return adcResult # se returneaza rezultatul ADC-ului

# functie pentru citirea temperaturii

def readTemp(CH):

sumaTemperaturiPartiale = 0

countTemp = 0

value = readADC(CH)

if(value <100 or value > 800): # daca valoarea nu se afla in acest interval ne putem da seama ca valoarea este ireala sau incorecta

return -1

else:

for countTemp in range(0,50): # 50 iteratii pentru a face o medie intre 50 sample-uri partiale

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

voltage = (value * 3.3)/1024 # referinta la ADC VCC si scalat la rezolutia ADC

temperaturaPartiala = (voltage-0.50025)*100 # calcul temperatura dupa formula din datasheet

sumaTemperaturiPartiale += temperaturaPartiala

countTemp += 1

gradeCelsius = round(sumaTemperaturiPartiale/countTemp,1) # media celor 50 esantionari-uri

return gradeCelsius

# functie pentru citirea luminozitatii

def readLuminozitate(CH):

sumaLuminozitatiPartiale = 0

count = 0

for count in range (0,10): # 10 iteratii pentru a face o medie intre 10 de esantionari-uri partiale

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

voltage = (value * 3.3)/1024 # referinta la ADC VCC si scalat la rezolutia ADC

sumaLuminozitatiPartiale += value

count += 1

luminozitate = sumaLuminozitatiPartiale/count # media celor 10 esantionari-uri

return luminozitate

# functie pentru citirea senzorului de gaze

def readGazeInflamabile(CH):

sumaGazeInflamabilePartiale = 0

count = 0

for count in range (0,10): # 10 iteratii pentru a face o medie intre 10 de esantionari-uri partiale

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

voltage = (value * 3.3)/1024 # referinta la ADC VCC si scalat la rezolutia ADC

sumaGazeInflamabilePartiale += value

count += 1

gazeInflamabile = sumaGazeInflamabilePartiale/count # media celor 10 esantionari-uri

return gazeInflamabile

# functie pentru citirea umiditatii

def readUmiditate(CH):

value = readADC(CH) # citim valoarea transmisa de senzor ADC-ului

if value >=900 and value <= 2890: # formula de liniarizare a senzorului de umiditate

umiditate = -0.005 * value + 34.5226

elif value >=270 and value <= 900:

umiditate = -0.0159 * value + 44.2857

elif value >=81 and value <= 270:

umiditate = -0.0529 * value + 54.2857

elif value >=33 and value <= 81:

umiditate = -0.2083 * value + 66.875

elif value >=13 and value <= 33:

umiditate = -0.5 * value + 76.5

elif value >=5.3 and value <= 13:

umiditate = -1.2987 * value + 86.8831

elif value >=2.2 and value <= 5.3:

umiditate = -3.2258 * value + 97.0968

else:

umiditate = -7.1429 * value + 105.7143

return umiditate

Anexa 2. Control sistem de încălzire

def getTempFromButton(setTemp,plus,minus): # setarea temperaturii dorite de la butonae

#global setTemp

if isInput(plus): # daca se primeste intrerupere de la butonul de +

if setTemp > 29.9: # temperatura nu poate fi setata mai sus de 30 grade

setTemp = 30.0

else:

setTemp += 0.5 # se creste temperatura dorita cu 0.5 grade Celsius

if isInput(minus): # daca se primeste intrerupere de la butonul de –

if setTemp < 10.1: # temperatura nu poate fi setata mai jos de 10 grade

setTemp = 10.0

else:

setTemp -= 0.5 # se scade temperatura dorita cu 0.5 grade Celsius

return setTemp # se returneaza temperatura setata

def termostatTemp(tempDorita,CH1,CH2,CH3,plus,minus,gpioCaloriferCamera1, gpioCaloriferCamera2,gpioCentrala,delayToOFF,delayToON): # controlul sisstemului de incalzire

global stareCentrala

global stareCaloriferCamera1

global stareCaloriferCamera2

umiditate = round(readUmiditate(CH3),1) # se citeste umiditatea de pe canalul analog CH3

temperaturaCamera1 = readTemp(CH1) # se citeste temperatura de pe canalul analog CH1

temperaturaCamera2 = readTemp(CH2) # se citeste temperatura de pe canalul analog CH2

tempDorita = getTempFromButton(tempDorita,plus,minus) # se pune temperatura dorita de la butoane in tempDOrita

print "–––––––-SetTemp–––––––\n"

print "Temperatura setata",tempDorita , "Grade Celsius\n"

print "––––––––––––––––-\n"

difTemp1 = round((temperaturaCamera1 – tempDorita),1) # aflam diferenta dintre temperatura actuala si temperatura setata, rotunjim cu 1 zecimala si o salvam in difTempo1

difTemp2 = round((temperaturaCamera2 – tempDorita),1) # aflam diferenta dintre temperatura actuala si temperatura setata, rotunjim cu 1 zecimala si o salvam in difTempo2

if (temperaturaCamera1 == -1): # se verifica existenta senzorilor de temperatura

difTemp1 = 0

print "–––––––Temperatura––––––\n"

print colored('WARNING:Fara senzor de temperatura C1\n','red')

print "––––––––––––––––-\n"

elif (temperaturaCamera2 == -1):

difTemp2 = 0

print "–––––––Temperatura––––––\n"

print colored('WARNING:Fara senzor de temperatura C2\n','red')

print "––––––––––––––––-\n"

if ((temperaturaCamera1 == -1) and (temperaturaCamera2 == -1)): # daca senzorii de temperatura lipsesc, sau sunt defecti, oprim centrala

powerUpDown(gpioCentrala,False) # se opreste centrala

stareCentrala = False # salvam starea centralei in variabila stareCentrala

delayToON = 0

delayToOFF = 0

print "–––––––Temperatura––––––\n"

print colored('WARNING:Fara senzori de temperatura\n','red')

print "––––––––––––––––-\n"

else: # daca exista senzori

if ((difTemp1 <= -0.5) or (difTemp2 <= -0.5)): # daca diferenta de temperatura este mai < sau = cu 0.5 grade pe unul din senzori, atunci dupa un delay se porneste centrala

if delayToON == 20: # testam daca este atins delay-ul

delayToON = 0 # resetam delay-urile

delayToOFF = 0

powerUpDown(gpioCentrala,True) # se porneste centrala si starea acesteia devine True

stareCentrala = True

if (difTemp1 >= 0.5): # control valve calorifere pe camere

powerUpDown(gpioCaloriferCamera1, False)

stareCaloriferCamera1 = False

if (difTemp2 >= 0.5):

powerUpDown(gpioCaloriferCamera2, False)

stareCaloriferCamera2 = False

if (difTemp1 <= -0.5):

powerUpDown(gpioCaloriferCamera1,True)

stareCaloriferCamera1 = True

if (difTemp2 <= -0.5):

powerUpDown(gpioCaloriferCamera2,True)

stareCaloriferCamera2 = True

else:

delayToON +=1 # daca delay-ul nu a ajuns la cel prestabilit, il incrementam cu 1

elif (difTemp1 >= 0.5) and (difTemp2 >= 0.5): # daca diferenta de temperatura este mai > sau = cu -0.5 grade pe unul din senzori, atunci dupa un delay prestabilit oprim centrala

if delayToOFF == 20: # testam daca este atins delay-ul

delayToOFF = 0 # resetam delay-urile

delayToON = 0

powerUpDown(gpioCentrala,False) # se opreste centrala si starea acesteia devine False

stareCentrala = False # se redeschid valvele

powerUpDown(gpioCaloriferCamera1,True)

stareCaloriferCamera1 = True

powerUpDown(gpioCaloriferCamera2,True)

stareCaloriferCamera2 = True

else:

delayToOFF += 1 # daca delay-ul nu a ajuns la cel prestabilit, il incrementam cu 1

print "–––––––Temperatura––––––\n"

print "Temperatura in C1 este:", temperaturaCamera1,"Grade Celsius\n"

print "––––––––––––––––-\n"

print "–––––––Temperatura––––––\n"

print "Temperatura in C2 este:", temperaturaCamera2,"Grade Celsius\n"

print "––––––––––––––––-\n"

if stareCentrala == False:

print colored('Centrala OFF!','red')

elif stareCentrala == True:

print colored('Centrala ON!','green')

return (delayToOFF,delayToON,temperaturaCamera1,temperaturaCamera2,umiditate,tempDorita,stareCaloriferCamera1,stareCaloriferCamera2,stareCentrala) # sunt returnate cele doua delay-uri și datele necesare

Anexa 3. Modul termostat – acțiuni asupra bazei de date

#functie de inserare a datelor modului de termostat in tabela "termostat"

def inserareTermostat(dateTermostat,delayIntrDate):

global contor

dataCurenta = time.strftime("%d%m%Y") # se pune data curenta in dataCurenta in format zi,luna,an

oraCurenta = time.strftime("%H%M%S") # se pune ora curenta in oraCurenta in format ora,minute,secunde

if (delayIntrDate==400): # inseram in baza de date aproximativ odata la 1 minut

db = MySQLdb.connect("localhost", "admin", "admin", "casamea") # datele de conectare la baza de date in ordine "locatia bazaei de date", "username", "parola", "nume baza de date"

cursor = db.cursor()

if (000000<int(oraCurenta)<000200):

exportBazaDateTermostat(dataCurenta,cursor)

statementTermostat = "INSERT INTO termostat VALUES(CURRENT_DATE(), NOW(), %f,%f,%f,%f,%r,%r,%r)"%(dateTermostat[2], dateTermostat[3],dateTermostat[4],dateTermostat[5],dateTermostat[6],dateTermostat[7],dateTermostat[8]) # propozitie pentru inserarea in baza de date

try:

cursor.execute (statementTermostat)

db.commit() # se insereaza in baza de date

print colored('MODUL Termostat: Datele au fost introduse cu succes!','green') # afisare in consola

db.close() # se inchide baza de date

except: # daca nu se poate conecta la baza de date se arunca exceptie, iar datele pt. a nu fi pierdute se isereaza in fisier text

print colored('ERROR MODUL Iluminat: Nu se poate conecta la baza de date','red')

timpCurent = time.strftime("%c")

f = open("errors/ERROR_BD_Termostat_"+dataCurenta,"a+") # se creeaza fisier de eroare in folder-ul errors

if (contor == 0):

f.write(" Data TemperaturaC1 TemperaturaC2 Umiditate TemperaturaDorita CaloriferC1 CaloriferC2 StareCentrala\n") # antetul se insereaza o singura data

contor = 1

f.write(timpCurent+" ") # se insereaza datele

f.write(str(dateTermostat[2])+" ")

f.write(str(dateTermostat[3])+" ")

f.write(str(dateTermostat[4])+" ")

f.write(str(dateTermostat[5])+" ")

f.write(str(dateTermostat[6])+" ")

f.write(str(dateTermostat[7])+" ")

f.write(str(dateTermostat[8])+"\n")

f.close() # se inchide fisierul

delayIntrDate = 0; # se reseteaza delay-ul

else:

delayIntrDate += 1 # se incrementeaza delay-ul

return delayIntrDate

# fuctie pt. export a bazei de date, mai putin ultima luna

def exportBazaDateTermostat(dataCurenta,cursor):

oneMonthAgo = str(int(dataCurenta)-10000) # se calculeaza data curenta – 1 luna

oneMonthAgoDate = datetime(year=int(dataCurenta[4:8]),month=(int(dataCurenta[2:4])-1),day=int(dataCurenta[0:2])).date() # rearanjare data

workbook = xlsxwriter.Workbook("dataLog/"+oneMonthAgo+"_dataBase_export_Termostat.xlsx") # se creeaza un nou document .xlsx

worksheet = workbook.add_worksheet() # se creeaza un o noua foaie in document

worksheet.set_column('A:J',12) # se seteaza coloana si linia de inceput

bold = workbook.add_format({'bold':True}) # se creeaza un format cu bold

worksheet.write('A1','Data',bold) # se scrie antetul

worksheet.write('B1','Ora',bold)

worksheet.write('C1','TemperaturaC1',bold)

worksheet.write('D1','TemperaturaC2',bold)

worksheet.write('E1','Umiditate',bold)

worksheet.write('F1','Temp. Setata',bold)

worksheet.write('G1','StareCaloriferC1',bold)

worksheet.write('H1','StareCaloriferC1',bold)

worksheet.write('I1','Stare Centrala',bold)

statement = "SELECT * FROM termostat WHERE data <= '%s'"%(oneMonthAgoDate) # propozitia de selectia a datelor care trebuie puse in fisier

cursor.execute(statement)

numarRanduri = int(cursor.rowcount) # se selecteaza si insereaza toate liniile care corespund propozitiei

for rand in range(0,numarRanduri):

data = cursor.fetchone()

for coloana in range(0,9):

worksheet.write_string(rand+1, coloana, str(data[coloana]))

statementdelete = "DELETE FROM termostat WHERE data <= '%s'"%(oneMonthAgoDate) # propozitia de stergere a datelor de sters din baza de date

cursor.execute(statementdelete)

Similar Posts

  • Proprietatile Structurale ale Substantelor

    Chimie fizica CUPRINS Capitolul I. Prezentarea și interpretarea rezultatelor experimentale I.1. Reprezentarea grafică I.2. Determinarea parametrilor unei funcții liniare I.3. Calcularea erorilor I.4. Exprimarea rezultatului final Capitolul II. Proprietățile structurale ale substanțelor II.1. Spectrofotometria în vizibil II.1.1 Legea absorbției luminii II.1.2 Spectre de absorbție II.1.3 Principiul aparaturii II.1.4 Analiza chimică cantitativă II.1.5 Prevederile Farmacopeei Române…

  • Structura DE Date DE Tip Lista

    CUPRINSUL LUCRĂRII DE DIPLOMĂ CAP. 1 LISTE 1.1 Structura de date de tip listă 1.2 Implementarea listelor cu ajutorul tipului pointer 1.3 Tehnici de inserție a nodurilor și de creare a listelor înlănțuite 1.4 Tehnici de suprimare a nodurilor 1.5 Traversarea unei liste înlănțuite 1.6 Traversarea unei liste ordonate. Tehnica celor doi pointeri 1.7 Tehnica…

  • Studiul Variatiei Parametrilor Caracteristici Ai Lampilor cu Descarcare In Vapori Metalici la Inalta Presiune In Functie de Valoarea Tensiunii de Alimentare

    PROIECT DE DIPLOMĂ STUDIUL VARIAȚIEI PARAMETRILOR CARACTERISTICI AI LĂMPILOR CU DESCĂRCARE ÎN VAPORI METALICI LA ÎNALTĂ PRESIUNE ÎN FUNCȚIE DE VALOAREA TENSIUNII DE ALIMENTARE CUPRINS Introducere CAPITOLUL I. Noțiuni generale privind rețelele de joasă tensiune. I.1 Rețele electrice de joasă tensiune. Structura. I.2 Tensiuni standardizate a rețelelor electrice de joasă tensiune. I.3 Tipuri de receptori…

  • Studiul Actionarii Elctrice a Schimbatoarelor de Cale In Sistemul Feroviar

    CUPRINS CAP.1.Istoria transportului feroviar……………………………………………………………………………..3 1.1.Căile “ferate” din lemn……………………………………………………………………………….4 1.2Căile ferate metalice……………………………………………………………………………………4 CAP.2. Sistemele de acționare…………………………………………………………………………………….6 2.1.Introducere……………………………………………………………………………………………….6 2.2. Elemente componente ale acționărilor electrice ……………………………………………7 CAP.3. Infrastructura feroviară………………………………………………………………………………….11 3.1.Suprastructura căii…………………………………………………………………………………….11 3.2.Infrastructura căii……………………………………………………………………………………..11 3.3.Instalații de electrificare…………………………………………………………………………….11 3.4.Calea de rulare………………………………………………………………………………………….12 CAP.4.Schimbatorul de cale ferată…………………………………………………………………….14 4.1.Aparate de cale………………………………………………………………………………..14 4.2.Schimbătorul de cale simplu………………………………………………………………16 4.3.Elemente componente……………………………………………………………………….17 CAP.5.Motorul de current continuu…………………………………………………………………………….18 5.1.Generalitați………………………………………………………………………………………18 5.2.Tipuri…

  • Mecanica Fluidelor Si Actionari Hidraulice

    MECANICA FLUIDELOR ȘI ACȚIONĂRI HIDRAULICE ( CUPRINS CUVÂNT ÎNAINTE Capitolul 1. INTRODUCERE Generalități 1.2. Definirea și clasificarea sistemelor de acționare hidraulică 1.3. Lichide folosite în sistemele hidraulice de acționare 1.3.1. Proprietățile fizice ale fluidelor 1.3.2. Tipuri de lichide utilizate în sistemele hidraulice Capitolul 2. STATICA FLUIDELOR 2.1. Presiunea 2.1.1. Măsurarea presiunii fluidelor în repaos 2.1.2….

  • Definitia Cogenrarii

    Cogenerarea reprezintă un ciclu de transformare in care, pornind de la combustibil (energia primară), se produce in aceeași instalație și in același timp energie mecanică și energie termică; in marea majoritate a cazurilor, energia mecanică este transformată prin intermediul unui generator electric, in energie electrică. Figura 1.1 Ilustrarea principiului cogenerării În literatura americană sau engleză,…