Sistem Inteligent Pentru Cladiri Controlat

SISTEM INTELIGENT PENTRU CLĂDIRI CONTROLAT

PRIN SEMNAL GSM

TEMA PROIECTULUI

Să se realizeze un sistem inteligent care să fie capabil să controleze dispozitivele electrice și electronice dintr-o clădire prin intermediul unui semnal GSM și să aibă următoarele specificații :

Să poată fi alimentat cu 7,5V și 2A;

Să se poată conecta la o rețea de telefonie mobilă;

Să poată primi semnale GSM de tipul SMS;

Să genereze un semnal electric slab pe pinii de ieșire;

Costul de producție să nu depășască 700 ron;

Să poată fi adaptat la orice dispozitiv electric;

Cuprins

Capitolul 1. Sisteme inteligente

Capitolul 1.1. Generalități

Capitolul 1.2. Locuințe inteligente

Capitolul 2. Microcontrolere

Capitolul 2.1. Aspecte generale

Capitolul 2.2. Tipuri de memorii

Capitolul 2.3. Diferența dintre microprocesor și microcontroler

Capitolul 2.4. Limbajul de programare C++

Capitolul 3. Canale de comunicații

Capitolul 3.1. Noțiuni generale privind comunicațiile

Capitolul 3.2. Semnale GSM

Capitolul 4. Sistem inteligent pentru locuințe controlat prin semnal GSM

Capitolul 4.1. Planul proiectului

Capitolul 4.2. Echipamentele folosite

Capitolul 4.3. Schema bloc și schemele electrice

Capitolul 4.4. Realizarea montajului fizic

Capitolul 4.5. Algoritmul și organigrama aplicației

Capitolul 4.6.Codul sursă si descriera acestuia

Capitolul 4.7. Considerații privind fiabilitatea sistemului

Capitolul 5. Concluzii

Capitolul 5.1. Concluzii privind sistemul realizat

Capitolul 6. Bibliografie

Capitolul 1. Sisteme inteligente

Capitolul 1.1. Generalități

Am să încep prin a vă introduce câteva noțiuni privind sistemele inteligente.

În secolul XIX, termenul de ”sistem” a fost dat de către fizicianul francez Nicolas Léonard Sadi Carnot care studia știința termodinamicii. Acesta a studiat sistemul pe care l-a numic ”working substance” în 1824, sistem ce se refera la un corp de apă vaporizată într-un motor cu aburi ce putea funcționa doar necesitând apă și foc. Această substanță (apă vaporizată) putea fi pusă într-un piston realizând presiune si punându-l în mișcare.

Unul dintre pionierii teoriei sistemelor generale a fost în 1945, Ludwin von Bertalanffy, care a introdus principiile si regulile ce se pot aplica sistemelor generale.

Ingineria sistemelor se referă la ramura ce studiază modul în care sistemele ar trebui proiectate, la design-ul acestora, implementarea, construirea și întreținerea acestora.

Un sistem are niște limite definite, asta înseamnă că trebuie să alegem ce elemente înglobăm în sistem și ce elemente excludem, elemente ce sunt componente ale mediului.

Sistemul poate fi definit ca fiind un grup de elemente ce pot interacționa între ele, ce pot fi interconectate sau independente ce formează un sistem întreg complex.

Pentru a clarifica noțiunea de mai sus, vă voi arăta câteva exemple :

Un orgranism viu, luat ca un întreg ce conține funcții și procese vitale.

Un grup de sisteme mecanice și electrice ce interacționează una cu cealaltă (de exemplu sistemul de încalzire al unei clădiri).

O rețea de structuri si canale de comunicație sau distribuție (precum o autostradă).

Un computer ce înglobează atât sisteme hardware cât și software ce se află într-o strânsă legătură, neputând funcționa unul fără altul, nemaialcătuind un sistem întreg complex.

Caracteristicile principale ale sistemelor sunt:

Structura, se referă la componentele ce alcătuiesc sistemul

Interconectarea, componentele și procesele sunt conectate prin relații structurale și/sau comportamentale.

Comportamentul, definește procesul ce duce la realizarea scopului inițial.

Tipuri de sisteme:

Sisteme închise sau deschise;

Sisteme informaționale create de către om;

Sisteme fizice sau abstracte;

Sisteme informaționale formale;

Sisteme informaționale informale;

Sisteme în timp real;

Sisteme bazate pe computere;

Un sistem închis nu interacționează cu mediul înconjurător în timp ce unul deschis o face. Sistemele închise nu sunt afectate de schimbările mediului.

Sistemul informațional creat de către om se referă la faptul că acesta este organizat de către factorul uman.

Sistemele fizice sunt cele cu care se poate interacționa spre deosebire de cele abstracte.

Un sistem formal este acela care se bazează de regulă pe un model matematic ce conține un set finit de simboluri (o limbă formală), gramatică (este cea care spune simbolurilor cum să formeze instrucțiuni) și un set de reguli.

Sistemul in timp real presupune realizarea unor procese într-un timp cât mai scurt fără a avea întârzieri.

Sistemul mai poate fi înteles și ca un set de reguli ce conduc structurile aferente și comportamentul acestora.

Elementele (în termeni informatici) ce alcătuiesc un sistem sunt:

Intrări (input)

Ieșiri (output)

Procesor

Control

Feedback

Limite și interfață

Mediul înconjurător

Intrările reprezintă valorile introduse de către factorul uman sau valorile

preluate din mediu pentru a fi procesate și livrate către ieșire ulterior.

Ieșrile sunt elementele ce ies ca procesate. Ieșirile pot fi sub formă de

informație, documente, bani lichizi, etc. toate variind în funcție de elementele de intrare.

Procesorul este cel care ia rolul de ”funcție de transfer”, adica prelucrează

informația primită, o prelucrează și o trimite mai departe ca ieșire.

Controlul are ca scop menținerea sistemului în limitele de funcționare și în

parametrii impuși.

Feedback-ul este acel element necesar oricărui sistem inteligent, oferind

posibilitatea sistemului de a se redresa singur în funcție de parametrii de ieșire.

Limite și interfață, ne spune faptul că orice sistem este mai mult sau mai puțin

limitat și că acesta deține o interfață pentru utilizator.

Mediul înconjurător poate influența sistemele, în funcție de tipul acestora.

Un sistem poate prelua elemente din exterior, să le prelucreze iar apoi să le scoată in mediul exterior. Schema următoare reprezintă un sistem ce prelucrează date de intrare (fig1.1).

Pentru a putea funcționa, sistemele au nevoie de energie și date de intrare.

Inteligența înseamna să descoperim proprietățile fenomenelor și a obiectelor înconjurătoare dar și a relațiilor dintre acestea având posibilitatea de a rezolva problemele noi apărute .

”În psihologie , inteligența apare atât ca fapt real , cât și ca unul potențial, atât ca proces, cât și ca aptitudine sau capacitate, atât formă și atribut al organizării mintale, cât și a cele comportamentale. ” (Paul Popescu –Neveanu , Dicționar de psihologie).

Înca din 1979, N.V. Findler afirma că ”un sistem este considerat că are proprietatea de inteligență, pe baza comportării sistemului, dacă se poate adapta singur la situații noi, are capacitatea de a raționa, de a înțelege legăturile dintre fapte, de a descoperi înțelesuri și de a recunoaște adevărul. De asemnea ne așteptăm ca un sistem inteligent să învețe, deci să-și înbunătățească performanțele pe baza experienței trecute.”

Considerăm un sistem ca fiind inteligent atunci când acesta are un model adecvat al mediului în care este solicitat, dacă este suficient de pregătit din punct de vedere hardware cât și software pentru a putea face față sarcinilor cerute, dacă își poate obține independent informații din mediul ce îl înconjoară.

Inteligența este un lucru abstract și nu unul material fiind dificil de definit.

Având clare în minte noțiunile prezentate mai sus ajungem la inteligența artificială .

În domeniul informaticii, inteligența artificială definește un termen tehnic.

O definiție a inteligenței artificiale a fost dată de John McCarthy în 1955, spunând că ”o mașină care se comportă într-un mod care ar putea fi considerat inteligent, dacă ar fi vorba de om.”

Una dintre trasăturile acestor sisteme inteligente este că acestea pot învăța în urma experiențelor acestora cu sau fară ajutoare externe, avându-se în vedere înbunătățirea comportamentală permanentă pentru a nu repeta greșelile făcute în experiențele trecute.

Inteligența artificială este împărțită în două categorii :

Inteligența artificială puternică (strong artificial intelligence) și se referă la o inteligență artificială bazată pe un computer ce ne poate induce senzația că acesta ar putea ”gândi”.

Inteligența artificială slabă (weak artificial intelligence) se axează însă pe un anumit segment de probleme dat, putându-le rezolva cu un algoritm impus de către inginerul programator.Această inteligență nu pretinde că poate ”gândi”.

Inteligența artificială slabă poate simula operații precum scrisul , jocul de șah, tradusul unor fraze dintr-o limbă în alta sau recunoașterea verbală, acestea fiind bazate pe algoritmi obișnuiți, parametri setați și reguli impuse.

Inteligența artificială a fost studiată încă din 1950, fiind împărțită în:

Inteligență clasică ce este folosită astăzi în sistemele expert.

Inteligență conecționistă, cea similară rețelelor neuronale.

În 1980 s-a ajuns la concluzia că ambele domenii abordate sunt de fapt limitate sever, acestea fiind parțial abandonate din lipsă de fonduri la momentul respectiv.

Principalele aplicații ale sistemelor inteligente sunt:

Sistemele expert

Sistemele și logica fuzzy

Algoritmii genetici

Sistemele inteligente hibride

Agenții inteligenți

Rețelele neuronale

Vocea electronică sintetizată

Sistemele expert aparțin unei clase a computerelor. Acest sistem expert a fost dezvoltat în 1970 de către cercetătorii inteligenței artificiale și a fost scos pe piață mai târziu, în 1980. Sistemul are la bază un set de reguli ce pot analiza informații (introduse de către utilizator) legate de un anumit domeniu, în ideea de a ajuta acest ulizator să ia o decizie corectă.

Sistemele expert sunt întâlnite cel mai des în domeniul medical. Ele ajută paramedicul de pe ambulanță având introduse date în acesta de către medicul specialist. Paramedicul introducând datele pacientului în sistemul expert, acesta îi va oferi instrucțiunile necesare pentru a putea salva pacientul respectiv.

Un sistem de control fuzzy, este un sistem de control cu logica fuzzy bazat pe matematică, acesta analizează intrările de tip analogic și le interpretează ca valori logice de 0 și 1 (0 pentru fals și 1 pentru adevărat).

Termenul de fuzzy se referă la faptul că logica aplicată este una conceptuală, adică valorile de intrare nu sunt tocmai adevărate (1) sau false (0) ci parțial adevărate sau parțial false. Sunt dezvoltate și în prezent aplicații de tip fuzzy pentru software de tip firmware, logica fuzzy în rețelele neuronale, etc.

Algoritmii genetici sunt structuri componente ale inteligenței artificiale și sunt inspirați din teoria lui Darwin despre evoluție. Teorie care spune că o problemă poate fi cel mai ușor rezolvată prin evoluție.

În tehnologia informației, rețelele neuronale sunt sistemele alcătuite din programe și structuri de date ce pot aproxima operațiile efectuate de către creierul uman. O astfel de rețea implică adesea un număr mare de procesoare ce operează în paralel, fiecare având sfera sa restrânsă de informații.

Vocea electronică sintetizată este software-ul folosit pentru a crea o voce umanoidă artificială. Aceasta poate fi folosită pentru un asistent personal digital, de exemplu Siri ce este produs de către compania Apple în terminalele sale. Acesta ofera suport și ușurința utilizării produselor respective.

Capitolul 1.2. Locuințe inteligente

Astăzi, trăind în secolul XXI, simțim nevoia să avansăm, să evoluăm. De aceea tot mai multe persoane își caută o locuință care să le ofere cât mai multe opțiuni ce le ușurează viața de zi cu zi. Acestea recurg la așa numitele ”locuințe inteligente” din nevoia de a evolua și a impune noi standarde privind locuințele simple pe care le știm cu toți.

Aceste ”locuințe inteligente” sunt de fapt locuințele bazate pe echipamente moderne ce ușurează practic modul în care putem aprinde un întrerupător, seta temperatura în casă, porni sistemele de securitate, deschide ușa unui garaj și așa mai departe, exemplele pot fi foarte multe.

Locuința inteligentă este un exemplu de sistem de control distribuit, o rețea computerizată a unor device-uri proiectate să monitorizeze și să controleze sistemele dintr-o locuință. Un astefel de sistem inteligent are ca scop reducerea costurilor aferente pentru întreținere și energie.

În acest moment sistemele inteligente sunt folosite mai degrabă în instituții, de exemplu sistemele de detecție pentru incendiu, sisteme de deteție a scăpărilor de gaze, sisteme ce sunt obligatorii în toate instituțiile.

În continure vă voi prezenta câteva elemente ce se regăsesc în locuințele inteligente.

Lumina dintr-o încăpere de exemplu, aprinderea unui be printr-un simplu întrerupător este deja prea banal, de ce să nu automatizăm acest lucru? Folosind un sistem inteligent putem controla practic aprinderea acestui bec la o anumită oră, putem folosi un senzor de proximitate pentru a îl aprinde, folosind un temporizator și un astfel de senzor putem face ca lumina respectivă să se stingă la un interval de timp setat după ce o persoană a intrat în cameră, putem controla intensitatea acestui bec, îl putem de asemenea controla prin intermediul unui telefon, mai putem folosi o fotocelulă ce o amplasăm pe pervaz de exemplu ce controlează aprinderea becului când afară se întunecă și așa mai departe, exemplele pot fi multe.

Sistemele de aer condiționat, acestea au ca rol menținerea unei temperaturi scăzute într-o încăpere atunci când temperatura mediului exterior depășește pragul de confort. Ele măsoară temperatura din interior și pornește sistemul de răcire mai tare sau mai încet pentru a ajunge la o temperatură setată de către factorul uman.

De asemenea putem controla centrala termică ce ne furnizează căldură, având posibilitatea să o pornim de exemplu înainte ca noi să ajungem acasă și să crească temperatura din interior prin simpla trimitere a unui sms de pe telefonul mobil.

Sistemul de alarma al unei clădiri are de asemenea un controler ce preia semnalele senzorilor de mișcare, senzorilor ce înregistrează vibrațiile geamurilor pentru cazul în care acestea se sparg, senzorilor de sunet, etc și activează practic alarma apelând totodata la firma ce monitorizează clădirea respectivă.

Aceste sisteme pot controla consumul de energie al clădirii, gestionând-o astfel încât să reduca costurile.

Putem controla până și sistemul de închidere al ușilor și ferestrelor cu ajutorul zăvoarelor electrice, putem monitoriza astfel dacă toate ferestrele sunt închise, putem încuia/descuia ușile de la distanță. Avem posibilitatea de a instala un sistem de video interfon însă adaptând-ul la sistemul inteligent avem posibilitatea ca atunci când cineva ne apelează să primim pe telefonul personal ceea ce se află în fața video interfonului prin intermediul unui apel video de exemplu. Având posibilitatea să și descuiem ușa.

Gazele sunt folosite astăzi cam în toate clădirile, un astfel de sistem poate depista scăpările de gaze în special atunci când nu suntem acasă și poate opri independent racordarea evitând astfel o eventuală catastrofă. Aceste traductoare pot fi legate și la traductoarele de fum în cazul în care un incendiu apare gazele să se oprească.

Camerele video ce ne ajută să supraveghem clădirea le putem face să urmărească mișcarea cu ajutorul unui senzor de mișcare, crescând astfel nivelul de securitate.

Sistemul de deschidere al ușii unui garaj cu ajutorul unei telecomenzi este deja un lucru comun. El poate fi automatizat printr-un senzor de mișcare, îl putem face să deschidă ușa prin intermediul unui apel telefonic sau a unui sms, putem face ca ușa să se închidă în urma noastră atunci când părăsim garajul fără a mai avea grija că am uitat-o deschisă, etc. Mai putem controla deschiderea acestei uși prin citirea numărului de înmatriculare al autovehiculului, astfel încât ușa să se deschidă doar când mașina personală ajunge în fața garajului.

Cu ajutorul microfoanelor plasate strategic prin casă putem da efectiv comenzi vocale locuinței, comenzi precum: ”Living on” sau ”Living off” (aprinde/stinge lumina în living), ”Open garage” sau ”Close garage” (deschide/închide ușa garajului și/sau lumina din acesta), ”Crește temperatura” (pentru a mări intensitatea căldurii furnizate de către centrala termică), ”Music on” (pentru a porni sistemul audio din încăpere).

Putem interfața aproape orice, putem ca dimineața de exemplu să facem să pornească filtrul de cafea automat la o oră setată de către noi pentru a avea cafeau caldă și proaspătă atunci când ne trezim.

Unele hoteluri de exemplu, folosesc un sistem de furnizare a energiei electrice atunci când intrăm în cameră și introducem acea cartelă de acces care ne este necesară și să descuiem ușa. Un astfel de sistem ajută la economisirea energiei pentru că atunci când clientul părăsește camera și ia cu el cartela ce îi este necesară să descuie ușa la intoarcere, sistemul electric se oprește.

La nivelul înalt la care a ajuns tehnologia folosită astăzi putem controla până și deschisul draperiilor în funcție de oră, de zi sau de noapte, etc.

Deși poate părea la prima vedere un subiect de science fiction, putem realiza accesul în propria locuință prin simpla scanare a amprentei biometrice, recunoaștere vocală sau, de ce nu amprentă oculară. Toate acestea fiind necesar a fi introduse într-o bază de date proprie securizată.

Toate aceste sisteme pot fi controlate prin intermediunl unei interfețe grafice ușor de folosit pentru a fi la îndemână utilizatorului fiind totodată compatibile cu sistemele de operare de tip Windows, Mac sau Linux, putându-se sincroniza cu acestea. Interfața grafică fiind afișată pe unul sau mai multe monitoare de mici dimensiuni încorporate în perete fiind la îndemâna utilizatorului. Sistemul poate fi de asemenea conectat sau nu la rețeaua de internet globală de unde își poate procura update-uri de soft necesare unei mai bune funcționări. Este însă de preferat ca sistemul să fie izolat pentru a evita eventualele încercări de spargere ale hackerilor.

Capitolul 2. Microcontrolere

Capitolul 2.1. Aspecte generale

Primul microprocesor inventat a fost unul pe 4 biți numit Intel 4004 fiind apărut în anul 1971, urmat apoi la câțiva ani mai târziu de câtre Intel 8008. Abia apărute pe piață acestea necesitau niște cipuri externe pentru a fi implementate în sistem crescând costurile substanțial.

În 1974 a fost lansat microcontrolerul TMS 1000 ce includea o memorie de tip ROM (ce putea fi doar citită), o memorie ce putea fi atât scrisă cât și citită, un procesor și un ceas toate fiind incluse într-un singur cip numit integrat. Ca un răspuns al lansării acestui produs, Intel a dezvoltat un computer cu un cip optimizat pentru controlul aplicațiilor, numind-ul Intel 8048. Combinând astfel memorii de tip RAM și ROM în interiorul aceluiași cip. Toate acestea întâmplându-se în 1977. Acest cip produs de Intel a avut un real succes odată ce a fost folosit în interiorul tasturilor și în multe alte aplicații.

Cele mai multe microcontrolere folosesc la acest moment memorii ce se pot șterge numite EPROM sau memorii PROM ce pot fi programate o singură dată. Memoria EPROM are în construcția sa un geam de quartz transparent ce permite ștergerea datelor cu ajutorul unui fascicul de lumină ultravioletă. Memoria PROM este construită la fel ca cea EPROM doar că nu are acestă fereastră de quartz și nu se pot șterge datele. Datorită acestei tehnologii bazate pe ferestre de quartz, memoriile ce se pot șterge sunt mult mai scumpe, având un cost de producție mult mai mare ca cel al memoriilor PROM sau OTP.

În 1993 a apărut memoria EEPROM ce putea fi ștearsă cu ajutorul unui curent electric eliminând astfel memoriile bazate pe fereastră de quartz. Desigur, costurile de producție fiind considerabil mai mici iar performanțele fiind aceleași. În același an Atmel a lansat primul microcontroler ce folosea memori flash, un fel de EPROM mai special. Dacă atunci când au apărut prețul unui astfel de microcontroler era destul de ridicat, asțăzi este destul de accesibil permițându-și-l orice pasionat ce vrea să se specializeze pe astfel de tehnologii de acasă.

Microcontrolerele se definesc ca fiind computere în miniatură pe un singur circuit intregrat, având la bază un procesor, o memorie RAM și câteva caracteristici periferice de intrare respectiv ieșire. Microcontrolerele sunt proiectate pentru o anumită gamă de aplicații spre deosebire de microprocesoarele folosite în computerele personale ce au un scop general. Aceste cipuri includ conțin cantități mici de memorii RAM, memorii FeRAM, NOR Flash sau OTP ROM.

Microcontrolerele sunt folosite în diverse dispozitive performante, sisteme inteligente, sistemele de control are autoturismelor, aparate de cafea, echipamente de mare putere și în alte sisteme integrate. Microcontrolerele controlează dispozitivele digitale și chiar mai multe procese datorită dimensiunilor și costurilor reduse. Totodată pentru că design-ul minimalist o permite, se folosesc dispozitive separate precum memoriile, microprocesoarele, intrările și ieșirile. Pe același microcontroler s-au introdus din necesitate și intrări/ieșiri analogice pentru a putea controla dispozitivele electronice analogice.

Microcontrolerele au în componența sa ceasuri cu o frecvență de 4 kHz, pentru a avea un consum redus. Scopul acestora este de a menține funcționalitatea sistemului în timp ce se așteaptă o comandă precum apăsarea unui buton sau o întrerupere. Consumul de energie a microcontrolărului atunci când este în modul sleep este unul atât de redus încât acesta poate rezista fără probleme pe o perioadă îndelungată de timp. Unele microcontrolere servesc un rol mai important precum procesoarele digitale de semnal și au nevoie de o performanță crescută și un consum de energie mai mare.

Se poate considera că un microcontroler este un sistem ce include procesor, memorii și alte elemente periferice dar într-un singur sistem pe care îl numim integrat. În timp ce unele microcontrolere sunt foarte sofisticate având până și un sistem de operare, celelalte sunt destul de limitate fiind adaptate la un singur scop, o singură sarcină, nefiind nevoie de o viteză mai mare de procesare datorită lipsei unui sistem de operare și a unor sarcini greu de executat. Elementele de intrare și ieșire pot fi sub formă de butoane cu sau fără reținere, relee, led-uri, display-uri LCD, dispozitive radio, senzori sau orice alt dispozitiv.

În sistemele integrate, microcontrolerele trebuie să furnizeze informații în timp real pentru a putea lua o decizie pe bază de algoritmi într-un timp util. Atunci când un eveniment apare, un sistem de întrerupere trebuie să anunțe procesorul pentru a opri efectiv procesul sau pentru a lua o decizie în cazul problemei apărute. Sursa unei întreruperi poate fi semnalul unui buton apăsat de exemplu, terminarea unei conversii analogice sau digitale sau terminarea transmiterii unor date etc. Atunci când consumul microcontrelerului este un factor important, o întrerupere poate preveni ca acesta să nu intre în modul sleep înainte de finalizarea procesului pe care îl execută.

Programele necesare executări unor operațiuni trebuiesc scrise într-un spațiu cât mai redus pentru că memoria microcontrelerelor este destul de redusă și nu există posibilitatea de a extinde memoria acestora cu ajutorul unei alte memorii externe. Compilatoarele sunt cele care convertesc orice limbaj avansat de programare și îl asamblează într-un cod mașină pentru a fi stocat în memoria microcontrelerului. Producătorii și-au dezvoltat propriile versiuni ale acestor microcontrolere pentru a putea fi mai ușor de utilizat de către proprii angajați și utilizatorii vizați de către aceștia. Utilizarea memoriilor ce pot rescrise în microcontrolere permite producătorilor să rescrie firmware-ul acestora înainte de a livra componentele. Mai nou, producători execută la comandă microcontrolere ce pot avea diverse intrări sau ieșiri, pot avea o memorie mai mare, sunt preactic personalizate la cerințele clienților.

Microcontrolerele au acum așa numitele intrări/ieșiri de uz general (GPIO). Acești pini pot fi configurați prin soft fie ca ieșiri fie ca intrări. Atunci când sunt setați ca pini de intrare (input) ei pot citi datele unor senzori de exemplu cum ar fi temperatura, umiditatea etc. Pini GPIO setați ca ieșire (output) emit un semnal ce poate controla diverse dispozitive (aprinderea unui led de exemplu sau pornirea unui motor).

Unul dintre proprietățile sistemului integrat este că acesta poate converti semnalul analog primit de la diverși senzori într-unul digital. Această funcție este numită ADC (analog to digital converter), asta pentru că procesorul nu poate primi semnale de tip analogică și necesită conversie. Semnalele digitale sunt acele semnale ce conțin numai elemente de 0 și 1.

O altă calitate este intervalul de timp programabil numit PIT (programmable interval timer) ce este inclusă în microprocesor și are ca rol incrementarea unei valori de la 0 sau decrementarea unei valori stabilite către 0. Odată ajuns la valoarea 0, PIT anunță procesorul că a terminat decrementarea. Această proprietate este foarte utilă în folosirea termostatului de exemplu, putând măsura temperatura la un anumit interval de timp pentru a putea decide dacă este nevoie sau nu sa pornească sistemul de aer condționat.

Cu ajutorul modulului PWM (pulse width modulation) al procesorului putem controla motoare, relee, convertoare de putere etc fără a solicita prea tare resursele procesorului.

Putem cu ajutorul modulului UART (universal asynchronus receiver/transmitter) să primim sau să trimitem date printr-o comunicație serială fără a încărca procesorul. Fiind o componentă hardware dedicată putem realiza cu ajutorul ei comunicația cu alte dispozitive aferente prin semnale digitale.

Faptul că producătorii au integrat atât memoria cât și celelalte elemente periferice în același cip a dus la scăderea prețului pentru un produs ce este defapt un sistem întreg. Datorită design-ului minimalist și a faptului că este un integrat, microcontrolerul este mai puțin probabil să se defecteze spre deosebire de un sistem ce are fiecare componentă poziționată separat.

Microcontrolerul este un singur circuit integrat ce conține:

Un procesor ce poate fi unul simplu de 4 biți până la unul mai avansat și mult mai complex de 64 de biți;

Dispozitive de intrare și ieșire precum UART;

O memorie de tip RAM, volatilă;

O memorie în care să stocăm programul, poate fi de tip Flash, EEPROM, ROM, EPROM etc.;

Elemente periferice precum watchdogs, timere etc.;

Un ceas de regulă bazat pe un cristal de quartz;

Suport pentru debugging;

Convertor de semnal analog în digital sau digital în analogic;

Această integrare într-un singur circuit reduce din start folosirea firelor ce conectează componentele între ele, dar și economisește spațiul folosit pe placă.

Arhitectura microcontrolerelor variază de la un producător la altul. În timp ce unii producători includ nuclee de uz general în interiorul procesoarului având una sau mai multe memorii ROM, RAM etc., alții se axează pe controlul anumitor aplicații.

Cele mai multe sisteme inteligente au la bază câte un sistem primar și unul secundar ce se numesc ”bus” și care conectează controlerele de nivel înalt cu cele de nivel slab, dispozitivele de intrare sau ieșire cu interfața de utilizator. Bus-ul este de fapt un sistem de comunicații ce transferă datele între componente.

Elementul principal al acestor sisteme sunt controlerele ce au forme și dimensiuni reduse și diferă de la un producător la altul. În esență, acestea sunt niște mici computere ce controlează dispozitivele regăsite în locuință sau o sub-rețea de alte controlere. Intrările acestuia preiau informații precum presiunea, temperatura, umiditatea, fluxul de aer sau curent electric și așa mai departe. Ieșirile controlerului trimit un semnal de o intensitate ce poate fi controlată către alte dispozitive conectate acestuia. Intrările și ieșirile pot fi de două tipuri și anume digitale sau analogice. Controlerele folosite în locuințele inteligente sunt de trei tipuri: PLC-uri (controlere logice programabile), controlere de sistem/rețea și controlere de unitate terminală.

PLC-urile sunt cele mai performante însă acestea sunt de doua, chiar trei ori mai scumpe decât controlerele de sistem/rețea folosite pentru locuințe. Cele mai ieftine controlere sunt cele de unitate terminală însă acestea sunt mult mai slabe din punct de vedere al performanței. PLC-urile sunt folosite adesea în instituțiile mari unde costurile acestora nu sunt o grijă prea mare.

Companiile mai mici, precum mall-uri, supermarket-uri, clădiri de birouri, folosesc mai degrabă controlerele de sistem/rețea în defavoarea PLC-urilor.

Sistemul de control al unităților terminale este folosit de obicei pentru aprinderea luminilor dintr-o încăpere de exemplu sau a unui ventilator. Acestea fiind conectate la unități deja pre-programate.

Sistemele inteligente pot avea pre-setate anumite stări precum ”încălzirea de dimineață” (pornirea sistemului de încălzire dimineață) sau ”mod economic pe timp de noapte” (reducerea consumului de energie pe timp de noapte acolo unde sistemele implicate o permit), exemplele pot fi multe.

Câteva tipuri de microcontrolere :

ARM – sunt specializate pe controlul aplicațiilor;

Atmel AVR (8 biți), AVR32 (32 biți) și AT92SAM (32 biți);

Intel 8051;

Freescale ColdFire (având 32 biți sau S08 cu 8 biți);

Freescale 68HC11 (8 biți);

PSoC (programmable system-on-chip);

MIPS;

Infineon (cu 8, 16 și 32 biți);

Microchip Technology PIC (cu 8, 16 și 32 biți);

Semiconductoare NXP (doar pe 8 biți);

Parallax Propeller;

Rabbit 2000 (8 biți);

PowerPC ISE;

Toshiba TLCS -870 ( cu 8 sau 16 biți);

Texas Instruments TI MSP430 (16 biți) și C2000 (32 biți);

STMicroelectronics STM8 (8 biți), ST10 (16 biți) și STM32 (32 biți);

Silicon Laboratories având microcontrelerul 8051 (8 biți) și un altul cu ARM (32 biți);

Renesas Electronics având RL78 (16 biți), RX32 (32 biți), SuperH, V850 (32 biți) și R8C (16 biți);

Desigur, acestea sunt doar câteva exemple existând pe piață multe altele specializate pe diferite aplicații.

Timpul de întrerupere este timpul scurs de când o întrerupere este generată și până când îi este îndeplinită solicitarea.

Microcontrolerele folosite în sistemele integrate încearcă să optimizeze timpii de întrerupere în raport cu parcurgerea instrucțiunii. Problema se referă la optimizarea timpului de răspuns făcând ca sistemul să fie mai predictibil, adică sa ofere un control în timp real.

Atunci când un dispozitiv trimite practic un semnal de întrerupere, registrele trebuie să salveze mai întâi datele înainte ca soft-ul să răspundă acestei întreruperi conform regulilor introduse în program atunci când un astfel de eveniment apare. Aceste date trebuiesc restaurate după ce se parcurg pașii la apariția întreruperii. Desigur că atunci când avem mai mulți regiștri apare efectul de ”lag”, adică sistemul întârzie cu luarea deciziei sau întârzie în parcurgerea programului. Putem elimina întârzierile prin folosirea a mai puțini regiștri sau prin folosirea metodei ”shadow registers”.

Alți factori ce pot influența întârzierile sunt:

Ciclurile necesare pentru finalizarea unuia sau mai multor procese ale procesorului.

Mărimea secvențelor ce necesită întrerupere. Intrarea într-o secvență poate restricționa accesul celorlalte structuri de date. Adesea dezvoltatorii folosesc instrumente dedicate pentru a depista întârzierile și a le minimaliza pe cât posibil.

Atunci când două întreruperi apar ”spate în spate”, microcontrolerele pot evita un ciclu în plus de salvare/restaurare a datelor printr-o formă de optimizarea numită ”tail call”.

”Tail call” este o subrutină apelabilă ce se definește ca fiind o acțiune finală a unei proceduri. Această subrutină poate fi implementată fără a necesita adăugarea sa în ”grămada” funcțiilor apelabile.

Încă de câmd au apărut, microcontrolerele au în componența sa două tipuri de memorie, una nevolatilă ce conține firmware-ul și una ce poate fi scrisă și citită pentru stocarea datelor.

Memoria ce poate fi scrisă și citită folosește de regulă șase tranzistori pentru date și având încă câțiva tranzistori pentru regiștri.

Firmware-ul este stocat în memorii de tip EEPROM ce pot fi șterse și rescrise.

Capitolul 2.2. Memorii

Memoria RAM (random-access memory) este o formă de stocare de date a computer-ului. Aceasta permite ca datele să fie citite și scrise în aproximativ aceeași perioadă de timp, indiferent de ordinea în care acestea sunt accesate.

Prima formă a memoriei RAM a fost concepută în 1947. Aceasta stoca date ca sarcini electrice la suprafața tubului catodic.

RAM-ul modern se găsește sub două forme principale: memorie statică (SRAM) și memorie dinamică (DRAM).

Primele memorii RAM au apărut pe piață prin 1960. Astăzi, memoria RAM vine sub forma unor circuite integrate, fiind o memorie de tip volatilă ce pierde informațiile stocate atunci când aceasta este oprită. Mai există de asemenea memoriile nevolatile numite ROM sau Flash.

SRAM-ul stochează un bit de date folosind celulele de memorie a șase tranzistori. Fiind o memorie ce necesită costuri de producție mari, însă este foarte rapidă și consumă puțină energie, aceasta o regăsim în procesoarele computerelor ca memorie de tip cache.

Computerele au o ierarhizare a memoriei bazată pe registrele procesoarelor, memoria SRAM, memoria DRAM, memoria virtuală, spațiul de swap al hard disc-urilor. Termenul ”RAM” este unul ce are caracter general și se referă la toate tipurile de memorii menționate.Scopul ierarhizări este să poată accesa datele cât mai rapid. Cu toate că avem acest sistem ierarhizat, timpul de acces al datelor poate varia.

În computerele moderne, memoria vine sub o formă de dimensiuni reduse și ușor de înlocuit (upgradat) cu o alta mai performantă ce poate avea un spațiu de stocare mai mare și un timp de răspuns mai bun. RAM-ul fiind practic un spațiu ce stochează date temporar pentru aplicații și sisteme de operare.

Sistemele de operare moderne folosesc o metodă de extindere a memoriei RAM, numită ”memorie virtuală”. Pentru a înțelege mai bine, gândiți-vă la memoria hard disk-ului ce are alocată o partiție numită ”scratch”. Dacă avem un computer cu 2 gb de memorie RAM și unul alocat pe o partiție a scratch a hard disk-ului, avem de fapt 3 gb de memorie RAM disponibilă. Când sistemul rămâne fără spațiu disponibil pe memoria RAM, acesta încarcă date pe hard disk temporar până se eliberează cea RAM. Acest procedeu îngreunează practic viteza de reacție a computerului pentru că hard disk-ul este mult mai lent față de RAM.

Computerele și sistemele integrate au un proces numit ”shadowing”. Uneori, în contextul unei memorii ROM lente, datele sunt copiate pentru a putea fi citite/scrise pe o perioadă scurtă de timp. ROM-ul este atunci dezactivat în timp ce locația memoriei este introdusă în aceeași adresă. Ca exemplu, avem BIOS-ul ce este un element comun în toate computerele, având o opțiune numită ”use shadow BIOS” sau ceva asemănător. Când este activată, datele bazate pe memoria ROM a BIOS-ului va folosi în schimb locația DRAM-ului. Această funcție diferă de la sistem la sistem și nu crește neapărat performanța computerului putând cauza totodată incompatibilități. Dacă funția este folosită, anumite componente de exemplu riscă să nu mai poată fi accesate de către sistemul de operare. Memoria liberă este redusă de mărimea funcției shadow ROM.

Până de curând cercetătorii lucrau la o nouă memorie nevolatilă ce salva informațiile atunci când nu mai sunt alimentate. Tehnologia folosită includea nanotuburi de carbon și folosea efectul de tub magnetic. Aceștia au abandonat proiectul în urma apariției SSD-urilor (solid state drive) în 2006. SSD-urile ajungând la o suprafață de stocare de până la 256 gb având o performanță ridicată, diferența ca viteză de scriere/citire față de hard disk-ul obișnuit fiind dramatică.

Un alt concecpt de memorie este EcoRAM-ul, această formă de memorie este folosită pentru servere unde consumul de energie este mult mai important spre deosebire de performanță.

Memoriafolosită pentru microcontrolere poate fi sub formă de:

FeRAM

NOR Flash

OTP ROM

FeRAM-ul a fost descoperit de către un masterand al MIT (Massachusetts Institute of Technology) pe nume Dudley Allen Buck în 1952.

FeRAM-ul (Ferroelectric RAM) este o memorie similară celei de tip DRAM, dar care folosește un strat feroelectric în locul unuia dielectric pentru a putea fi nevolatilă. FeRAM-ul este una dintre alternativele memoriei de tip flash.

Avantajele acestui tip de memorie este consumul redus de energie, viteza mare de scriere și un număr mult mai mare de cicluri de scriere-ștergere.

Dezavantajul este că spațiul de stocare este mult mai mic și au un cost mult mai mare.

Memoria DRAM convențională constă într-o rețea de condensatori și tranzistori de mici dimensiuni și conexiunile acestora. Fiecare celulă de stocare constă într-un singur condensator și un singur tranzistor. Datele dintr-un DRAM sunt stocate ca prezența sau lipsa unei sarcini electrice în condensator. Scrierea fișierelor in FeRAM se realizează aplicând un câmp peste stratul feroelectric încărcând plăcile pe fiecare parte a acestuia, forțând atomii din interior să se miște în sus sau în jos în funcție de polaritatea sarcinii aplicate, depozitând astfel valori de 1 sau 0. Totuși, citirea datelor de pe FeRAM este diferită față de DRAM în sensul că tranzistorul forțează celula dându-i valoarea 0. Dacă celula deja este setată ca fiind 0, memoria nu va afișa nimic. Dacă celula are valoarea 1, reorientarea atomilor va cauza un puls de curent către ieșire.

Principalul determinant al costului unei astfel de memorii este densintatea componentelor folosite. Componente mai mici și mai puține înseamnă mai multe celule ce pot fi intregrate într-un singur cip, însemnând că pot fi produse mai multe simultan din aceeași cantitate de siliciu. O altă limitare este aceea a mărimii materialelor folosite, acestea încetând a fi feroelectrice dacă au o dimensiune prea mică. Avantajul FeRAM-ului față de DRAM apare la ciclurile de citire și scriere a datelor. În DRAM sarcinile depozitate pe plăcile de metal se ”scurg” peste stratul izolator și tranzistorul de control, dispărând efectiv. Astfel, fiecare celulă trebuie rescrisă periodic ceea ce implică un consum mult mai mare de energie. În teorie FeRAM-ul ar fi mult mai rapid pentru că se bazează pe mișcarea fizică a atomilor ca răspuns al aplicării unui câmp extern.

Performanța DRAM-ului este limitată practic de timpul în care celulele pot fi scurse (pentru citirea datelor) sau încărcate (pentru scrierea datelor). Se definește practic capabilitatea de a controla tranzistoarele, de a transporta energie câtre celule și căldura care generează energie.

Memoria de tip flash (NOR și NAND) a fost inventată de către Dr. Fujio Masuko în 1980 în timp ce lucra pentru compania Toshiba. Cei de la Intel au vâzut potențialul acestui tip de memorie și au lansat pe piață în 1988 memoria NOR. Această memorie permite scrierea și citirea de date de mai multe ori furnizând adrese complete, permițând accesarea oricărei locații a unei date. Memoria NOR urmărind să o înlocuiască pe cea de tip ROM. Stick-urile (memoria flash) s-a bazat pe memoria NOR la început însă la scurt timp a apărut cea NAND care este mult mai accesibilă din punct de vedere financiar. NAND-ul a redut și mai mult timpul de scriere/citire a datelor, având și o densitate mai mare a spațiului de stocare ajungând la un cost mai mic pentru fiecare bit. De aici memoria NAND s-a dezvoltat făcând posibilă apariția hard disk-ului, a unităților optice, a cardurilor de memorie și așa mai departe. Memoria flash stochează datele într-o matrice alcătuită din celule. Dispozitivele flash simple, se axează pe un singur nivel de celule numit SLC (single-level cell), unde fiecare celulă stochează un singur bit de informație. Flash-urile moderne au mai multe nivele de celule, numit MLC (multi-level cell) care pot stoca mai mulți biți pe o singură celulă.

În NOR Flash, fiecare celulă are o împământare și o conexiune cu linia de biți. Aceast aranjament se numește NOR Flash pentru că acționează ca o poartă de tip NOR: când este furnizat un semnal mare (high) către celulă, aceasta acționează tranzistorul al cărui spațiu de stocare furnizează către ieșire un semnal ”low”.

Cele mai multe microporecesoare pot folosi memoria NOR flash pentru că poate accesa datele direct din NOR fără a mai fi nevoie să le copieze în memoria RAM înainte de a fi citite. Programarea constă în schimbarea biților logici 0 în 1. Biți ce sunt deja 0 rămân neschibați. Ștergerea datelor din memorie se va face la nivel de bloc, necesitând ștergerea a câte un bloc de celule o dată, setând astfel toți biții blocului cu valoarea 1. Blocurile pot avea mărimi de 64, 128 sau 256 Kb.

OTP ROM-ul a apărut în 1956, fiind inventat de către Wen Tsing Chow din New York. OTP ROM-ul mai este cunoscut și sub denumirea de PROM (programmable read-only memory). Acest tip de memorie a fost creat la cererea forțelor aeriene americane ce aveau nevoie de o memorie mai securizată și mai flexibilă pentru computerele sale. Din acest motiv patentul și tehnologia respectivă au fost ținute secret câțiva ani de zile.

Această formă digitală de stocare a datelor avea fiecare bit blocat de către o sigurață sau o antisiguranță. Asta însemna că fiecare element de date era scris permanent și nu putea fi modificat. Practic stochează setări ce nu pot fi șterse. Aceste setări numite firmware erau introduse în cip de către producător după ce produsul era terminat din punct de vedere fizic. Cipurile PROM goale, fără date în ele, sunt programate cu ajutorul unei interfețe numită ”PROM programmer”. Acest tip de memorie este întâlnită frecvent în microcontrolere, telefoane, console, dispozitive medicale independente, interfețe HDMI, computerele autoturismelor etc.

PROM-ul vine cu toți biții setați ca 1. Arzând practic acea siguranță a bit-ului atunci când memoria este programată va face ca bitul respectiv să fie citit ca 0. Programarea memoriei PROM se reazlizează o singură dată și este ireversibilă pentru că are la bază arderea efectivă a siguranțelor biților. Arderea siguranței deschide practic o conexiune în timp ce antisiguranța o închide. Având în vedere că este imposibil să schimbăm conținutul deja scris pentru că am ars siguranțele biților, putem să modificăm totuși informația scrisă în memorie prin arderea altor siguranțe ale altor biți nescriși încă. Adică folosim spațiul nescris încă dacă ne mai rămane liber suficient. Deci biți rămași încă 1 îi setăm ca 0. Odată ce toți biți sunt 0 nu mai putem programa nimic pe placă.

Capitolul 2.3. Diferența dintre microprocesor și microcontroler

În acest capitol încerc am să încerc să înlătur confuziile cu privire la funcționalitatea procesoarelor și a microcontrolerelor pentru că sunt dispozitive diferite.

Microprocesorul cunoscut și ca CPU (central processing unit) este creierul computerului. Microprocesorul pentru a înțelege mai bine, este alcătuit practic doar din nucleu, o unitate centrală de proces. Este un dispozitiv cronometrat ce poate fi programat acceptând date și informații în sistem binar ca intrări, procesează și prelucrează datele conform instrucțiunilor programate șioferă rezultatul mai apoi către ieșire. CPU-ul utilizează module separate externe precum memoria (fie pentru date, fie pentru program), dispozitive de stocare și sisteme periferice de intrare și ieșire.

Componentele tipice pe care le găsim în interiorul procesorului sunt registrele, elemntele de procesare și decodare a datelor etc.

Primul microprocesor a fost lansat pe piață de către compania Intel în 1971 și purta numele de Intel 4004. Microprocesoarele sunt folosite de la cel mai slab netbook până la cele mai performante servere. În figura 2.1 avem schema bloc a unui procesor.

Microcontrolerul este un circuit integrat ce conține un procesor mai mic cu un singur nucleu, o memorie pentru date și pentru program dar și dispozitive de intrare și ieșire periferice. Microcontrolerele sunt dedicate anumitor aplicații în timp ce microprocesoarele au un scop general. Ideea folosirii microcontrolerelor este de a folosi cât mai puține componente externe și a integra practic totul.

Deci, microcontrolerul are integrat totul, de la memorii până la porturi, timere, UART și alte elemente. În figura 2.2 avem schema arhitecturii interne a unui microcontroler.

Difernța între cele două dispozitive este că microprocesorul este mult mai rapid și mai scump față de un microcontroler deși acestea au început să devină din ce în ce mai rapide.

Microprocesorul este doar un procesor, un CPU în timp ce microcontrolerul include mai multe dispozitive de o performanță mai slabă dar incluse pe un singur cip.

Atunci când ne achiziționăm un microprocesor suntem liberi să alegem ce componente vrem să folosim împreună cu acesta, ce tip de memori, ce unități de stocare etc. Când achiziționăm un microcontroler gama din care putem alege este destul de limitată.

Capitolul 2.3. Limbajul de programare C++

Acest limbaj a fost creat de către cercetătorul danez Bjarne Stroustrup în 1979.

C-ul a fost dezvoltat din nevoie unui limbaj de programare pentru soft-urile complexe pentru că cel existent denumit BCPL nu conținea elementele necesare unui software performant.

În 1983 denumirea limbajului a fost modificată devenind C++ (++ este operatorul de incrementare folosit în limbaj). Au fost adăugate noi funcții precum cele virtuale, referințe, constante, funții precum ”new” și ”delete”, a fost înbunătățită funcția de ”type checking” cât și opțiunea de a adăuga comentarii prin introducerea a două slash-uri ”//” înaintea textului ce trebuie comentat.

În 1989, a fost lansată versiunea 2.0cuprinzândierarhizarea multiplă, clase abstracte, funcția numerelor statice și funcții ale membrilor. Aceast proiect urmând să devină un standard în viitor. Mai târziu apărând noi funcții precum excepțiile, namespaces, un nou tip de boolean și altele.

Limbajul a evoluat încetul cu încetul de-a lungul timpului introducându-se librăriile în 2011. Aceste librării ofereau programatorilor noi posibilități de dezvoltare a soft-urilor.

Acest limbaj de programare denumit C++ este cel mai folosit ora actuală în programarea microcontrolerelor.

C++ este un limbaj de programare ce poate fi adaptat și folosit aproape pentru orice dispozitiv sau soft. Acesta conține funcții generice și orientate pe obiecte. C-ul este folisit adesea în softurile aplicațiilor de tip desktop, server, platforme mobile etc. C++ este un limbaj compilat fiind furnizat de mai mulți mari producători de software precum Microsoft, Intel, LLVM, FSF etc.

Fiind foarte popular, C-ul a fost standardizat de către ISO (International Organization for Standardization) cu ultima versiune în 2014 denumită ISO/IEC 14882:2014. Multe alte programe au fost dezvoltate după apariția C-ului, programe precum C#, Java și alte versiuni mai noi a C-ului.

Pe parcursul evoluării limbajului acesta a urmat un set de regului precum:

Acesta era dezvoltat în funcție de problemele actuale iar rezultatul trebuia folosit imediat de către publicul larg;

Fiecare funcție nouă trebuia să fie ușor de implementat;

Fiecare programator să poată scrie codul în propriul stil iar limbajul să suporte asta;

Permiterea folosirii unei funcții utile era mai importantă decât prevenirea erorilor ce ar putea apărea în urma acesteia;

Trebuie să furnizeze facilitatea de a organiza structura programului prin secvențe bine definite ce pot comunica între ele;

Nu trebuie să corupă sistemul în care este folosit;

Performanța să fie influențată doar de către funcțiile folosite în program;

Să nu existe un limbaj mai performant excepție făcând limbajul mașină;

C++ să poată fi compatibil și cu celelalte limbaje de programare nefăcând parte din acestea.

C++ include peste 35 de operatori incluzând conversii aritmetice, comparații, operatori logici etc. Aproape toți operatorii pot fi supraîncărcați fiind definți de către utilizator, excepție făcând operatorii ”.” și ”.*” precum și operatorii de condiționare. Operatorii supraîncărcați sunt o parte importantă a tehnicii de programare în C++ la fel ca și pointerii inteligenți.

Stocarea obiectelor poate fi de patru tipuri:

Statică

Dinamică

Automată

Subiectivă

Stocarea statică a obiectelor se inițializează înaintea funcției ”main()” și este ștearsă în ordine inversă atunci când programul iese din funcția ”main()”. Pentru a le furniza utilizatorilor un grad mai mare de libertate nu a fost definită o oridine exactă a instrucțiunilor.

Inițializarea stocării statice a obiectelor se face în doua etape:

Inițializarea statică, necesită ca toate obiectele să fie mai întâi inițializate cu valoarea zero.

Inițializarea dinamică, are ca rol ordonarea declarațiilor obiectelor ce au fost finalizate în etapa anterioară.

Obiectele stocate cu o durată de viață dinamică sunt create cu ajutorul unei funcții de apelare și sunt șterse cu o funcție implicită.

Durata subiectivă de stocare a datelor are o caracteristică similară celei de durată statică diferența constând în faptul că perioada de timp în care este creată este prioritară.

Stocarea obiectelor cu o durată automată de viață este cea mai utilizată în C++ conținând:

Variabile locale în interiorul unei funcții sau a unui bloc

Variabile temporare

Variabilele locale sunt create după ce programul a parcurs secțiunea de declarații.

Acestea urmând a fi declarate în interiorul unei funcții iar când se iese din funcția respectivă variabila va fi ștearsă. Este practic o variabilă locală.

Variabilele temporare sunt create când se evaluează o expresie și sunt șterse ulterior, după parametrul ”;” ce declară sfârșitul expresiei.

În C++ spre deosebire de C, găsim programarea orientată pe obiecte. Furnizând posibilitatea de a folosi clasele, ne sunt oferite patru noi funcții precum abstractizarea, încapsularea, polimorfismul și moștenirea.

Încapsularea ascunde practic anumite informații pentru a ne asigura că anumite structuri de date și operatori sunt folosiți așa cum intenționăm. În interiorul unei clase, un membru poate fi declarat ca fiind public, privat sau protejat. Un membru public poate fi accesa din orice funcție. Un membru privat poate fi accesat doar din interiorul funcției din care face parte.

În practică toate datele se declară ca fiind private sau protejate făcând publice doar funcțiile necesare asigurării unei interfețe pentru untilizatori. Ascunzând aceste date utilizatorul poate modifica funcția programului fără a îi modifica interfața.

O altă funcție importantă a C-ului este ”moștenirea”, funcție ce permite unui tip de date să preia proprietățile unui alt tip de date. Moștenirea proprietăților unei clase de bază pot fi declarate de asemenea ca fiind publice, private sau protejate. Declarându-le astfel putem limita accesul altor date sau funcții către ele. De regulă moștenirea se referă la datele cu caracter public. Celelalte două caracteristici fiind mai puțin folosite. Dacă datele nu sunt declarate ca fiind publice, private sau protejate, cele de tip ”class„ vor fi automat declarate ca fiind private în timp ce acelea de tip ”struct” sunt publice.

Moștenirea virtuală se referă la clasele de date ce sunt declarate ca fiind virtuale. Acestă proprietate virtuală evită problemele de ambiguitate atunci când avem mai multe moșteniri, aceasta asigurându-se că există doar o singură moștenire.

O funcție ce se găsește doar în limbajul de programare al C++ este moștenirea multiplă care perminte unei clase să fie derivată din mai multe clase de bază putându-se astfel realiza o relaționare mult mai elaborată. În celelalte limbaje de programare precum C# sau Java putem realiza moșteniri doar dintr-o singură clasă de bază.

Polimorfismul ne permite folosirea unei singure interfețe comune pentru mai multe implementări și pentru a permite obiectelor să se comporte diferit în funcție de circumstanțe. Polimorfismul poate fi de două tipuri: static și dinamic.

Polimorfismul static are o funcție de supraîncărcare ce permite programelor să declare mai multe funcții cu același nume dar care să se comporte diferit. Aceste funcții fiind deosebite prin numărul sau tipul parametrilor săi. Deci, o funcție cu același nume se poate comporta diferit în funcție de contextul în care este pusă aceasta. Când programatorul declară o funcție, acesta poate specifica unul sau mai mulți parametri ca fiind ”default”, adică prestabiliți. Când o funcție ce are mai puține argumente decât parametri este apelată, argumentele respective sunt asociate parametrilor într-o ordine de la stânga la dreapta astfel încât parametrilor rămași liberi li se atribuie argumente default (prestabilite).

Funcția de supraîncărcare se obține prin stabilirea ca default a mai multor argumente din aceeași funcție.

Pointeri variabili din C++ se referă la obiectele din orice clasă derivată din acel tip față de obiectele ce se potrivesc perfect aceluiași tip. Acest lucru permite practic matricelor sau oricărui altă formă de stocare să memoreze pointeri câtre obiecte de diferite tipuri. Pentru că setarea unei valori pentru o variabilă necesită timp, C++ ne furnizează un operator denumit ”dynamic_cast” ce permite soft-ului să convertească un obiect simplu într-unul mai specific. Obiectele cunoscute ca având un tip anume pot fi de asemenea specificate ca ”static_cast” în obiecte ce nu mai necesită RTTI (run-time type information).

Atunci când o funcție se află într-o clasă derivată și suprascrie o altă funcție în clasa de bază, aceasta este aleasă după tipul obiectului respectiv. O funcție dată este rescrisă atunci când nu există nici o diferență între numărul sau tipul parametrilor dintre cele două. Funțiile virtuale ale unui membru permit apelarea implentărilor unei funcții. Dacă tipul obiectului este necunoscut, acesta poate fi sărit prin precedarea unui nume de clasă calificat înainte de a fi apelat.

În funcțiile standard ale membrilor, operatorul de supraîncărcare și destructorul poate fi virtualizat. O regulă a C-ului spune că atunci când avem o funcție virtuală într-o clasă, destructorul ar trebui și el să fie virtual. Dacă la momentul compilării se cunoaște tipul obiectului, constructorul nu poate fi virtualizat. O funcție a unui membru poate fi virtualizată prin declararea sa ca 0 (=0). O clasă ce conține o funcție virtuală pură (=0) se numește ”abstract data type” (dată de tip abstract). Obiectele pot doar deriva din aceasta, neputând fii create în interiorul său.

Manipularea excepțiilor este folosită pentru a semnala existența unei probleme la rulare sau a unei erori. Aceasta se desfășoară într-o manieră uniformă și separată de codul sursă. Putem adăuga o eroare dorită menționând-o ca excepție. Excepțiile sunt tratate separat în blocuri numite ”catch”.

Limbajul standard al C++-ului este compus din două părți: limbajul propriu-zis și librăriile. Aceste librării oferă unelte precum containerele (liste și vectori), algoritmi pentru căutare și sortare și iteratori ce oferă containere cu matrice de acces. De asemenea sunt furnizate hărți și seturi ce pot fi exportate. Este permisă folosirea template-urilor pentru a realiza algoritmi ce pot lucra cu orice container sau secvență. Precum în C, pentru a adăuga o librărie în C++, folosim comanda ”#include” (de exemplu #include<iostream.h>, comandă ce include în program fișierul ”iostream.h”).

De-a lungul timpului s-au dezvoltat mai multe compilatoare de C ajungându-se astăzi la o versiune de compilator C++ ce poate compila orice cod de C. C++ este considerat ca fiind un compilator superior C-ului însă nu este întotdeauna așa. Compilarea anumitor secvențe de cod în C pot fi compilate diferit în C++, de exemplu: C-ul permite conversia implicită a funcției ”void*„ către alte tipuri de pointeri, iar C++ nu. Avem în C++ comenzi noi precum ”new” sau ”class”, ce pot fi folosite ca identificatori în C. C-ul poate confunda comentariile marcate prin ”//” cu codul sursă.

Capitolul 3. Canale de cumunicații

Capitolul 3.1. Noțiuni generale privind comunicațiile

Termenul de ”canal de comunicație” se referă la un mediu de transmitere a datelor fie prin cablu ori radio. Mai exact, canalul este folosit pentru a transmite o informație sub forma unui semnal de la unul sau mai mulți emițători către unul sau mai mulți receptori. Emițătorii sunt aceia ce transmit/generează o informație (de exemplu: o persoană care vorbește la telefon) iar receptorii sunt cei care primesc informația respectivă (de exemplu: o persoană care ascultă la telefon ceea ce îi spune cealaltă). Capacitatea unui canal de a transmite informații este măsurată de către bandă în Hz sau de către rata de transfer în biți pe secundă.

Transmiterea unei informații dintr-o locație necesită o formă de rută către destinație. Transmiterea unei informații se poate realiza prin cablu ori fibră optică sau poate fi transmisă prin satelit, unde radio, infraroșu sau microunde.

Un canal de comunicație poate fi modelat prin calcularea procesului fizic de transmitere a semnalului. De exemplu, canalele de comunicații wireless pot fi modelate prin calcularea reflectării semnalului de către fiecare obiect din mediun exterior respectiv. Aceste calcule pot fi simulate prin introducerea unor valori aleatorii. Modelul unui canal de comunicații poate fi digital sau analogic.

Transmiterea semnalelor digitale este realizată cu ajutorul unui strat de protocoale și reguli. Această tehnică de folosire a protocoalelor este înlocuită cu un model simplificat ce poate reflecta performanța mediului de transfer precum întârzierile, viteza biților, erori etc.

Exemple de modele digitale ale canalelor:

Canalul binar simetric (BSC – binary symmetric channel), este un canal discret fără memorie cu o mare probabilitate de apariție a erorilor;

Canal de ștergere binar (BEC – binary erasure channel);

Canal de variație arbitrară (AVC – arbitrarily varying channel), comportamentul și starea canalului se pot modifica arbitrar;

Rafele binare de erori, este un model cu memorie;

Semnalele modelate analogic pot fi liniare sau neliniare, continue sau discrete, fără memorie sau dinamice, variate sau nevariate în timp, baseband, semnale RF, având valori reale sau complexe.

Modelul analogic poate reflecta următoarele deficiențe de canal:

Zgomote (noise model) ce pot fi:

Zgomote de fază;

Un model liniar continu fără memorie numit canal AWGN (additive white Gaussian noise);

Interferențe

Distorsiuni

Frecvența de răspuns

Delay-ul

Modelul frecvenței de propagarea undelor radio

Zgomotele sunt o caracteristică comună tuturor circuitelor electrice. Acestea sunt defapt niște semnale ce fluctuează fiind considerate ca e fiind erori sau semnale nedorite ce influențează calitatea semnalului de interes.

Zgomotul de fază reprezintă domeniul de frecvență pe termen scurt, rapid, fluctuații aleatorii sub formă de undă cauzate de către instabilitatea domeniului în timp.

Canalul AWGN este un model simplu de zgomot ce are ca rol imitarea zgomotelor produse aleatoriu în natură.

Interferența este considerată ca fiind orice semnal nedorit ce își modifică forma perturbând semnalul de interes parcurgând tot drumul de la emitor la receptor.

Distorsiunea poate apărea la transmiterea unei unde de semnal, unui obiect, imagine, clip video etc.

Frecvența de răspuns este cantitatea măsurabilă a unui spectru de ieșire al unui sistem ca răspuns al unui stimul.

Delay-ul este practic timpul de întârziere a furnizării unui semnal de ieșire față de timpul parcurs în mod normal pentru aceeași sarcină.

Modelul frecvenței de propagare a undelor radio se referă la pierderile de semnal atunci când întâmpinăm obiecte solide între receptor și emitor când folosim unde radio.

Tipuri de canale de comunicație:

Digitale sau analogice;

Baseband sau passband – baseband-ul poate transmite semnale de o frecvență foarte mică, apropiată de zero. Passband-ul se referă la o gamă de frecvențe ce poate trece printr-un filtru stabilit.

Mediu de transmitere – se referă la un mediu ce poate fi gazos, lichid, solid sau plasmă ce permite propagarea de unde electromagnetice;

Canal multiplex – atunci când mai multe semnale analogice sunt grupate și transmise ca fiind unul singur;

Rețele virtuale;

Comunicațiile simplex și duplex – cele simplex transmit informații într-un singur sens iar cele duplex în ambele sensuri;

Canale de broadcast, unicast sau multicast – broadcast-ul este folosit pentru transmiterea informațiilor de la radio sau televiziune. Unicast-ul transmite date către o singură adresă. Multicast-ul transmite date către mai multe computere dintr-un grup simultan.

Canale uplink sau downlink – uplink se referă la datele transmise de la sol către un satelit iar downlink transmite date de la satelit către sol;

Capitolul 3.2. Semnale GSM

Termenul de GSM (Global System for Mobile Communications) reprezintă un standard ce a fost dezvoltat de către ETSI (European Telecommunications Standards Institute) cu rolul de a defini protocoalele generației a doua de rețele celulare cunoscută sub denumirea de 2G, fiind folosită și astăzi de către toți operatorii de telefonie mobilă.

Dezvoltarea acestui nou standard digital de comunicație a început în 1982 atunci când cei de la CEPT (Conferința Europeană pentru Poștă și Telecomunicații) au înființat comitetul ”Groupe Special Mobile” ce putea furniza suport permanent dintr-un sediu central aflat în Paris. Cinci ani mai târziu, reprezentanții a treisprezece tări Europene au semnat o înțelegere în Copenhaga pentru a dezvolta un sistem de telefonie mobilă standard de-a lungul Europei. Comisia Europeană propune în 1986 ca spectrul de bandă de 900 MHz să fie rezervat serviciilor de telecomunicații.

Primul apel telefonic a fost făcut de către prim-ministrul Finlandei Harri Holkeri către primarul orașului Tampere, Kaarina Suonio pe 1 iulie 1991 folosind o rețea dezvoltată de către Telenokia și Siemens. Mai târziu, în 1992, a fost trimis primul SMS (text message) și operatorii Vodafone UK și Telecom Finlanda au semnat primul tratat pentru servicii de roaming.

Dezvoltarea frecvenței de bandă a fost continuată astfel că în 1993 s-a început folosirea bandei cu frecvență de 1800 MHz.

În 1995, odată cu lansarea bandei de frecvență de 1900 MHz a fost posibilă și apariția fax-ului, sms-ul si transmiterea de date devenind disponibile publicului larg. Cartelele pre-plătite au fost disponibile pentru utilizatori în 1996, numărul acestora depășind 100 de milioane.

MMS-ul (Multimedia Messaging Service) a devenit operațional în 2000 folosindu-se de bada cu frecvența 800 MHz, evolouând în 2003 la serviciul EDGE (Enhanced Data Rates for GSM Evolution). Tehnologia 3G a apărut în 2007.

Rețelele de telefonie 2G, înlocuiesc prima generație de rețele 1G fiind de tip analogic, astfel, cele de 2G sunt rețele digitale. Fiind dezvoltată în timp, această rețea a permis transferul de pachete de date cu ajutorul GPRS (General Packet Radio Services) și EDGE (Enhanced Data rates for GSM Evolution).

Ulterior, a apărut rețeaua 3G bazată pe standardele UMTS (Universal Mobile Telecommunication System) urmată de cea 4G bazată pe standardele avansate ale LTE (Long Term Evolution).

În ziua de astăzi, un utilizator al oricărei rețele de telefonie mobilă beneficiază de funcțiile:

Apel – utilizatorul poate efectua apeluri către oricare alt număr de telefon indiferent de locația acestuia;

SMS – utilizatorul poate trimite mesaje de tip text către orice număr;

MMS – posibilitatea de a trimi imagini, înregistrări video sau audio către un număr prin intermediul unui SMS multimedia;

3G – oferă utilizatorului posibilitatea de a naviga pe internet la o viteză destul de bună;

4G (opțional) – oferă utilizatorului o conexiune la internet de mare viteză. Fiind o tehnologie nouă, nu toți operatorii furnizează un astfel de serviciu.

Rețelele GSM sunt structurare astfel:

Subsistemul stației de bază;

Subsistemul de rețea și swith-uri;

Rețeaua GPRS;

Sistemul de suport pentru operațiuni;

Subsistemul stației de bază (BSS) este o ramura rețelei de telefonie celulară ce răspunde de traficul și semnalul dintre două telefoane mobile și sistemul de swith-uri. Transportă practic informația de la un dispozitiv la altul.

Stația de emisie-recepție (BTS – base transceiver station) conține echipamente pentru transmiterea și primirea semnalelor radio, antene și echipamente de criptare respectiv decriptare ale canalelor de comunicație cu stație cu controler (BSC – base station controller).

GSM-ul este o rețea celulară, ceea ce înseamnă că telefoanele mobile se conectează la acesta prin conectarea la cea mai apropiată celulă găsită.

Celulele GSM sunt de cinci dimensiuni :

-macro;

– micro;

– pico;

– femto;

– umbrella;

Aria de acoperire a fiecărei celule variază în funcție de mediul în care aceasta este aplasată.

Celulele macro sunt folosite în antenele ce se găsesc deasupra clădirilor, pe acoperiș.

Micro celulele se folosesc pentru antenele ce nu depășesc înălțimea unei clădiri, fiind amplasate la un nivel inferior, acestea se folosesc în marile orașe.

Pico celulele sunt celule mici ce au o rază de acțiune de câțiva zeci de metri, fiind folosite în interior.

Femto celulele sunt proiectate pentru a fi folosite în zone mici rezidențiale sau în sedii de birouri, conectându-se la rețeaua furnizorului prin intermediul unei conexiuni la internet de bandă largă.

Celulele de tip ”umbrella” sunt folosite pentru a acoperi zonele moarte în care celelalte celule nu ajung.

Raza de acțiune a celulelor variază în funcție de înălțimea antenei, puterea acesteiea și mediul în care semnalul se propagă de la câțiva zeci de metri la câteva sute de km. Cea mai mare distanță la care o antenă poate ajunge este de 35 km.

Folosind o antenă cu pico celule sau un repetor de interior, putem mări raza de acțiune a semnalului GSM în interior acolo unde este cazul, de exemplu într-un mall sau aeroport.

Subsistemul rețelei de switch-uri are rolul de a coordona mobilitatea utilizatorilor, astfel ca un telefon mobil ce este aflat într-o altă țară să poată efectua apeluri chiar dacă nu este abonat al rețelei la care este conectat, această funcție având numele de roaming.

Nucleul rețelei GPRS (general packet radio service) permite rețelelor de tipul 2G, 3G sau WCDMA să transmită pachete de date către rețele externe precum internetul. GPRS-ul fiind o componentă integrată a subsistemului rețelei de switch-uri.

GTP-ul (GPRS tunnelling protocol) este protocolul de definire al IP-ului pentru rețeaua centrală a GPRS-ului. Acesta este mai întâi de toate un protocol ce permite utilizatorilor finali ai unei rețele GSM sau WCDMA să își modifice poziția georgrafică rămânând conectați la internet ca și când nu s-ar fi deconectat niciodată.

Acest protocol are trei forme:

GTP-U;

GTP-C;

GTP’;

Astfel, GTP-U este folosit pentru a transfera datele utilizatorului prin tuneluri separate în contextul fiecărui protocol al pachetelor de date.

GTP-C-ul are rolul de control ce include: setarea și detectarea protocoalelor pachetelor de date, verificarea razelor de acțiune a nodurilor de rețea și update-uri precum conectarea la alte noduri de rețea ale utilizatorului datorită modificării poziției geografice a acestuia.

GTP’ asigură transferul datelor ce trebuiesc încărcate către funcția de încărcare.

Nodurile de rețea mai sunt cunoscute și sub numele de GSN (GPRS support node) ce suportă folosirea transferului de pachete de date prin GPRS în rețeaua GSM.

Access point-ul este definit ca fiind:

O rețea de IP-uri la care un terminal mobil se poate conecta;

Un set de instrucțiuni folosite pentru această rețea;

Anumite setări în meniul unui telefon mobil;

Sistemul de suport este un sistem computerizat folist în serviciile de telecomunicații pentru a coordona rețelele din care acesta face parte. Acesta oferă funcții de asistență precum indexarea rețelei, aprovizionarea acesteia, oferind totodată funcția de management al erorilor și problemelor apărute.

Pentru ca un utilizator să se poată conecta cu un telefon mobil sau orice alt dispozitiv ce poate accesa o rețea de telefonie mobilă la una din rețele, acesta are nevoie de o cartelă SIM.

SIM-ul (subscriber identification module) este un circuit integrat alcătuit din contacte și semiconductori, fiind montat pe o plăcuță din pvc. SIM-ul este folosit pentru ca rețeaua să știe ce utilizator s-a conectat la aceasta și când, practic pentru identificare.

Conceptul de SIM când a apărut purta numele de TS 11.11, fiind dat de către Institutul European de Standarde în Telecomunicații. Având definit comportamentul acestui prim SIM, atât fizic cât și logic, sarcina de a realiza acest proiect a revenit celor de la 3GPP (3rd Generation Partnership Project), adică unui grup de parteneri în telecomunicații. 3GPP au dezvoltat mai departe SIM-urile ce poartă numele de TS 51.011 și USIM (TS 31.102).

Primul SIM a fost realizat la Munich în 1991 de către compania Giesecke & Devrient, ce a vândut primele 300 de SIM-uri produse operatorului Radiolinja.

SIM-urile au fost concepute pentru a putea fi ușor de transferat de la un dispozitiv la altul. Primele cartele telefonice aveau dimensiunea unui card de credit, însă odată cu micșorarea dimensiunilor telefoanelor mobile s-au redus și dimensiunile plăcilor pvs, cipul de la baza acestora păstrându-și dimensiunea originală.

Fiecare SIM deține un cod unic de înregistrare, un CNP dacă vreți, și două coduri de siguranță precum cel PIN solicitat la pornirea dispozitivului și cel PUK necesar reactivării cartelei.

Conform standardului ISO/IEC 7816-3, SIM-urile sunt calificate pe trei clase A, B și C în funcție de voltaj, astfel că cele din clasa A au 5V, clasa B 3V și clasa C 1.8V. Cardurile moderne suportă toate aceste tensiuni. În figura 3.1 este definită structura unui SIM.

figura 3.1

Un SIM conține informații precum numărul de urgență ce poate fi apelat chiar dacă telefonul este blocat sau nu are credit, cheia de autentificare la rețea, identitatea rețelei din care face parte etc. Dimensiunile acestor cipuri variază de la 32 KB la 128 KB cele moderne. Toate acestea permit stocarea a 250 de contacte și un număr limitat de mesaje, cele de 32 KB având spațiul necesar pentru stocarea a 33 de operatori de telefonie mobilă ca preferați atunci când utilizatorul intră în zona de roaming și 80 de operatori pentru cele de 64 KB. Această opțiune perminte practic operatorului să aleagă rețeaua de telefonie mobilă cu care aceasta are contract atunci când utilizatorul final pleacă din țară. Această funcție nu este o limitare, dacă rețelele disponibile nu se regăsesc în acea listă, dispozitivul va selecta automată cea mai apropiată rețea.

Identitatea fiecărui SIM este inscripționată pe fața sau spatele acestuia, acel număr de înregistrare fiind unic în lume și este format din 22 de cifre.

Fiecare SIM are un număr unic la care poate fi apelat.

Numărul de telefon al unui SIM este alcătuit astfel:

Primele trei cifre reprezintă țara din care acesta face parte;

Următoarele două sau trei cifre reprezintă codul de identificare al operatorului;

Următoarele cifre reprezintă identitatea utilizatorului; formatul numerelor de telefon diferă de la o țară la alta.

Fiecare operator de telefonie mobilă își poate bloca terminalele vândute de către aceștia astfel încât să funcționeze doar în rețeaua acestora. De asemenea un utilizator poate solicita blocarea SIM-ului atunci când acesta și-a pierdut telefonul mobil sau a fost furat.

Capitolul 4. Sistem Inteligent pentru Clădiri

Controlat prin Semnal GSM

Capitolul 4.1. Planul proiectului

Se va proiecta și se va realiza un sistem inteligent pentru clădiri ce va putea controla diverse dispozitive electrice și electronice prin primirea unui semnal GSM de tip SMS.

Dispozitivul va trebui să poată fi alimentat cu o tensiunde cuprinsă între 7V și 9V având o intensitatea de 2A.

Acesta trebuie să fie capabil să acceseze o rețea de telefonie mobilă, să stabilească o conexiune stabilă cu operatorul și să poată primi mesaje de tip text (SMS).

Pe baza acestor SMS-uri primite, acesta va emite o tensiune slabă pe porturile de ieșire, conform cu parametrii setați în codului sursă. Tensiunea de ieșire va fi cuprinsă între 3V și 5V, fără să depășească 5V.

Pentru a simula comportamentul acestui dispozitiv ce poate fi amplasat în structura unei clădiri, am construit macheta unei case simulând astfel comportamentul acestuia pentru un utilizator final într-o locuință.

În acest proiect, am simulat comenzi precum aprinderea becurilor dintr-o încăpere, deschiderea ușii unui garaj, automatizarea unei centrale termice și a unui sistem de supraveghere bazat pe senzori de proximitate.

Am simulat aprinderea becurilor dintr-o încăpere folosind o placă cu patru relee, fiecare releu acționând pentru o singură cameră.

Pentru simularea deschiderii unei uși de garaj am folosit un motor de tip stepper ULN2003.

Folosind un senzor de proximitate HC-SR04 și un buzzer am realizat un sistem de securitate ce poate fi amplasat în holul de la intrare, fiind activat pe timp de noapte și funcționând într-un interval de timp setat, având totodată și un regim de funcționare manual.

Cu ajutorul unui senzor de temperatură DHT11, am simulat comportamentul unui sistem de aer condiționat ce poate fi pornit/oprit automat atunci când temperatura din încăperea unde este poziționat senzorul atinge o anumită valoare.

Proiectul are la bază două elemente principale:

Microcontroler ATmega328;

Sim900, element ce realizează conexiunea cu rețeaua globală GSM.

Având realizată partea codului sursă, costul de producție al acestui sistem nu depășește suma de 700 ron.

Capitolul 4.2. Echipamentele folosite

În lista de mai jos se regăsesc toate elementele folosite la realizarea proiectului actual.

ATmega328, utilizat cu ajutorul unei plăci de dezvoltare Arduino UNO (figura 4.1).

figura 4.1

Având specificațiile:

Microcontroler ATmega328

Tensiune de operare 5V

Tensiune de alimentare recomandată 7 – 12V

Tensiune de alimentare limită 6 – 20V

Pini de intrare/ieșire digitali 14 (din care 6 oferă ieșire de tip

PWM)

Pini de intrare analogici 6

Intensitatea curentului pe pini de

intrare/ieșire 40 mA

Memorie flash 32KB

SRAM 2 KB

EEPROM 1 KB

Viteza ceasului 16 MHz

Greutate 25 g

SIM900, este un modul GSM/GPRS compatibil cu patru benzi (850/900/1800/1900 MHz) fiind folosit ca un shield (figura 4.2) pentru placa de dezvoltare Arduino UNO.

figura 4.2

Specificații:

Patru benzi 850/900/1800/1900 MHz;

Consum redus în modul sleep: 1.5 mA;

Temperatură de funcționare: -40⁰C – +85⁰C

Funcție GPRS de clasă 10 ;

Protocol TCP/UDP integrat;

Backup RTC;

PWM;

Jack microfon;

Jack ieșire audio;

Slot pentru SIM;

Pini de intrare/ieșire digitali;

Tensiune alimentare între 5V – 12V cu o intensitate de 2A;

Breadboard(figura 4.3);

figura 4.3

Specificații:

170 puncte;

Compatibil cabluri dupont;

ULN2003, driver motorstepper (figura 4.4);

figura 4.4

Specificații:

Tensiune necesară 5V;

Rată de reducție 1/64;

4 faze pentru motor (poate fi folosit și în 2);

Leduri ce indică pașii parcurși de motor;

BYJ48, motor stepper (figura 4.5);

figura 4.5

Specificații:

Tensiune necesară 5V;

4 faze;

Rata variației de viteză 1/64;

Frecvența 100 Hz;

Rezistența în curent continuu 50Ω+ 7% (25⁰C);

Cuplu 300 gf.m

Cabluri dupont (figura 4.6);

figura 4.6

Specificații:

Mamă – tată de 20cm (18 buc);

Tată – tată de 20cm (2 buc);

Cabluri alimentare (figura 4.7);

figura 4.7

Specificații:

Cu ajutorul celor două cabluri dupont și a două cabluri usb de alimentare defecte ale unui terminal iPhone, am realizat două astfel de cabluri necesare pentru alimentarea motorului stepper, plăcii cu relee și a tuturor led-urilor prin intermediul breadboard-ului.

Led-uri (figura 4.8);

figura 4.8

Specificații:

Dimensiune 3mm;

Tensiune 3,5V;

4 buc;

Cablu UTP (figura 4.9);

figura 4.9

Specificații:

Am folosit 2m de cablu UTP din nevoia de a acoperi o distanță mai mare de 20cm (cablu dupont) și pentru că acest cablu este alcătuit din patru perechi de fire de 1mm sortate pe culori putând folosi astfel culoarea solidă pentru ”+” și cea combinată cu alb pentru ”-”.

Sursă de curent;

Specificații:

Tensiune furnizată 7,5V;

Intensitatea curentului furnizat 2A;

Sursă de curent cu USB (figura 4.10);

figura 4.10

Specificații:

Tensiune furnizată 5V;

Intensitatea curentului furnizat 2,1A;

Intensitatea curentului furnizat 1A;

Senzor de măsurare a distanței HC-SR04 (figura 4.11);

figura 4.11

Specificații:

Tensiune de operare 5V;

Intensitatea curentului 15mA;

Frecvența de funcționare 40 Hz;

Rază maximă de acțiune 4m;

Rază minimă de acțiune 2cm;

Unghiul maxim la care operează 15⁰;

Echo output signal (semnal de ieșire transmis de către dispozitiv până la primul obiect întâmpinat după care se întoarce către dispozitiv);

Trigger input signal (primește semnalul trimis anterior pentru măsurarea distanței parcurse);

Buton cu impuls (figura 4.12);

figura 4.12

Specificații:

Buton cu impuls folosit pentru regimul manual al sistemului de alarmă al clădirii.

DHT11 (figura4.13);

figura 4.13

Specificații:

Tensiune necesară 3V – 5V;

Intensitate necesară 2,5mA;

Variația umidități pe care o poate citi este de 20% – 80% umitidate având o precizie de 2% – 5%;

Temperatura pe care o poate citi este de la -40⁰C la +125⁰C având o precizie de + 0,5⁰C;

Rata maximă de citire este o dată pe secundă;

Rezistențe (figura 4.14);

figura 4.14

Specificații:

10 Kohm;

2 buc;

Cooler laptop (figura 4.15);

figura 4.15

Specificații:

Tensiune de alimentare 5V;

Curent necesar 1A;

Placă relee (figura 4.16);

figura 4.16

Specificații:

Tensiune de alimentare a plăcii 5V;

4 relee ce suportă un curent de maxim 10A cu tensiune de 250V în curent alternativ;

Fiecare releu este izolat;

Indicator led de stare pentru poziția fiecărui releu;

Cablu USB (figura 4.17);

figura 4.17

Buzzer activ;

Capitolul 1.2. Schema bloc și schemele electrice

În schema logică (figura 4.18) se observă comportamentul sistemului din momentul în care pornește și își inițializează toate subsistemele și până când își efectuează rutina intrând practic într-un loop.

Sistemul Inteligent pentru Clădiri se comportă atunci când este alimentat, astfel: sistemul își inițializează toate subsistemele, după care citește temperatura urmând să ia o decizie astfel încât atunci când temperatura atinge o anumită valoare prag să pornească sistemul de climatizare. Ajungând mai apoi la condiționarea sistemului de alarmă, dacă acesta este pornit va începe monitorizarea mișcării din cameră urmând să pornească sau nu un buzzer activ, iar dacă alarma nu a fost activată se trece la etapa următoare. Următorul pas se referă la citirea mesajelor primite urmând să le compare mai apoi cu comenzile stabilite. În funcție de comanda primită, acesta poate acționa sistemul electric al ușii unui garaj, aprinde luminile dintr-o încâpere prin intermediul unei plăci cu relee și poate activa sistemul de securitate.

Datorită posibilității montării placilor cu relee ce suportăo tensiunde în curent alternativ de 220V, acest sistem poate fi adaptat la orice dispozitiv electric sau electronic.

figura 4.18

În schema bloc (figura 4.19) se observă modul în care dispozitivele sunt conectate. Astfel microcontrolerul ”Sim900” recepționează și analizează comanda primită prin semnal GSM sub forma unui SMS, urmând ulterior să execute o comandă dacă se referă la porturile GPIO sau să o trimită către celălalt microcontroler ”ATmega328” pentru porturile digitale.

Se observă in figură elementele principale ale ”Sistemul Inteligent pentru Clădiri Controlat prin Semnal GSM”, având o margine mai îngroșată.

figura 4.19

Urmărind schema bloc de mai sus, am realizat schema electrică a întregului sistem (figura 4.20).

În schema electrică a ”Sistemului Inteligent pentru Clădiri Controlat prin Semnal GSM” se regăsesc elementele menționate în capitolul 4.2.

Sistemul va fi alimentat astfel:

7,5V 2A pentru ATmega328 și Sim900;

5V 2,1A pentru B48YJ (motor stepper);

5V 800mA pentru placa cu relee;

Minim 3V 50mA pentru led-uri;

5V 2,5mA pentru DHT11 (senzor temperatură);

5V 15mA pentru HC-SR04 (senzor prox);

figura 4.20

Legendă:

VCC – pin alimentare curent continuu ”+”;

GND – masă ”-”;

Echo – semnal de ieșire pentru măsurarea distanței;

Trig – pin pentru semnalul de intrare ce a fost generat de ”Echo”;

RST – buton/pin pentru reset;

Vin – pin de intrare pentru tensiune (prin care se poate alimenta placa);

A0…A5 – pini de citire analogici;

0…13 – pini digitali de uz general;

Aref – pin de referință analogic;

TX – pin pentru transmitere date;

RX – pin pentru recepționare date;

GPIO 1…12 – pini digitali de uz general pentru Sim900;

IN1…IN7 – pini de intrare ce controlează bobinele unui motor stepper sau care

acționează mecanisme cu relee;

B48YJ – motor stepper;

M – motor ventilator.

Capitolul 4.4. Realizarea montajului fizic

Am realizat montajul fizic conform schemei bloc (figura 4.19) și a schemei electrice (figura 4.20). Astfel am montan placa de dezvoltare cu cip-ul Sim900 peste cea Arduino UNO cu microcontrolerul ATmega328 (figura 4.21). Totodată am conectat pini digitali ai lui Sim900 la placa de relee (pinii 4, 6, 8 și 10), un buzzer activ (pinul 1), pinii de uz general digitali ai lui ATmega328 i-am conectat la driver-ul motorul stepper (pinii 10, 11, 12 și 13), pinul 6 l-am folosit pentru citirea datelor furnizate de către dht11, pinii 5 și 6 sunt conectați la modulul senzorului de proximitate, iar pinul analogi A2 este conectat la un buton fără reținere pentru oprirea sistemului de alarmă.

figura 4.21

Pinii plăcii cu relee i-am conectat astfel (figura 4.22).

figura 4.22

În figura 4.23 se observă modul în care am conectat pinii ce controlează motorul și alimentarea acestuia.

figura 4.23

Am conectat motorul BYJ48 la driver-ul ULN2003, montându-l ulterior pe un perete din casă simulând astfel un sistem de acționare a ușii unui garaj. Pentru un efect vizual mai clar, am montat o roată din plastic pe axul motorului (figura 4.24).

figura 4.24

În living-ul machetei pe care am folosit-o pentru simularea unei locuințe, am montat un senzor de proximitate pentru simularea unui sistem de alarmă. Am atașat acestuia un buton fără reținere pentru a beneficia de un regim manual pentru oprirea sistemului de alarmă. Tot în această încăpere am montat un senzor de temperatură și un ventilator pentru a simula un sistem de climatizare automat (figura 4.25).

figura 4.25

În fiecare încăpere am montat câte un led pentru a simula sistemul de iluminat din fiecare cameră. Acestea sunt conectate la placa de relee și sunt alimentate prin intermediul plăcii breadboard. Încăperile se pot observa în figura 4.26.

figura 4.26

Buzzer-ul activ, l-am montat pe peretele exterior al clădiri asemenea sistemelor de securitate performante (figura 4.27).

figura 4.27

Breadboard-ul furnizează curent electric pentru toate dispozitivele excluzând sistemul principal format din ATmega328 și Sim900, alimentând astfel motorul stepper și driver-ul acestuia, placa de relee, sistemul de alarmă și sistemul de iluminat din clădire.

Conform schemei electrice, am realizat montajul practic (figura 4.28).

figura 4.28

Folosind câteva plăci de polistiren extrudat, bandă dublu-adezivă și colant, am realizat macheta unei case și am amplasat sistemul principal și celalte subsisteme conform figurii 4.29.

Am amplasat în afara acesteia placa de dezvoltare Arduino UNO și cea cu Sim900, breadboard-ul, placa cu relee și driver-ul ULN2003.

În garaj am amplasat motorul BYJ48, câte un led în fiecare încăpere, subsistemul de securitate ce include un senzor de proximitate și un buton pentru a-l putea opri în regim manual cât și un termometru cu un ventilor simulând sistemul de climatizare în living.

figura 4.29

Capitolul 4.5. Algoritmul și organigrama aplicației

Pentru a pune în funcțiune ”Sistemul Inteligent Controlat prin Semnal GSM” trebuiesc respectați următorii pași :

Conectați toate alimentările la o sursă de curent.

Convertorul de 7,5V 2A trebuie conectat la placa Arduino UNO;

Convertorul de 5V 2,1A trebuie conectat la breadboard în dreptul driver-ului ULN2003;

USB 5V 800mA trebuie conectat la breadboard în dreptul plăcii cu relee;

Pentru a monitoriza procesele efectuate în timpul funcționării sistemului este necesară conectarea cablului USB la un laptop și la placa de dezvoltare Arduino UNO.

Ține-ți apăsat butonul ”POWER” timp de 3 secunde de pe modulul GSM (Sim900).

Ține-ți apăsat butonul ”Reset” timp de 3 secunde de pe modulul GSM.

Având sistemul pornit și complet funcțional, puteți folosi comenzile din tabelul de mai jos (tabelul 4.1) pentru a controla dispozitivele din clădire:

tabelul 4.1

Subsistemul de securitate are un regim de funcționare inteligent astfel că acesta poate fi setat să se oprească după un anumit timp setat de către utilizator din codul sursă.

Odată pornit, sistemul de securitate se dezactivează singur după un timp dat, de ex îl setăm seara, înainte de culcare ca acesta să se oprescă în 6 ore, timp în care se face dimineață. Din interiorul locuinței acest sistem are un regim manual de oprire astfel că nu poate fi oprit de la distanță din motive ce privesc securitatea.

Practic, odată ajunși acasă, sistemul fiind activat, îl putem opri folosind comanda din interior. Această comandă reprezintă momentan un buton fără reținere ce trebuie ținut apăsat timp de 3 secunde.

Perioada de timp în care sistemul stă pornit odată ce a fost activat, poate fi modificată din următorii parametrii ce se găsesc în codul subsistemului de securitate:

”if (nralarma == 150)”

Se va modifica astfel numărul 150 cu un cod din tabelul 4.2 în funcție de durata pe care o doriți ca sistemul să rămână pornit:

tabelul 4.2

Acest subsistem urmează a fi dezvoltat mai amănunțit în viitor, punându-se momentan problema costului de producție crescut.

Subsistemul de acționare a ușii garajului include o funcție inteligetă ce salvează poziția ușii astfel încât să nu provoace pagube în momentul utilizării greșite.

Astfel, dacă ușa este deschisă iar utilizatorul trimite comanda ”Motor on” pentru a o deschide, ușa rămâne în aceiași poziție trimițând utilizatorului un SMS de informare. Aceiași metodă se aplică și în cazul în care ușa este deja închisă.

Subsistemul de climatizare poate fi setat de către utizilator din interiorul codului sursă ca acesta să pornească după ce temperatura din încăpere depășește o valoare prag.

Temperatura poate fi setată din codul subsistemului de climatizare din cadrulul următorilor parametrii:

”if (DHT.temperature >= 30)”

Unde numărul 30 reprezintă valoarea la care a fost setat să pornească sistemul de climatizare.

Securitatea propriu-zisă a sistemului a fost concepută astfel încât acesta să primească comenzi doar de la numerele de telefon bine stabilite în codul sursă evitând astfel ca orice altă persoană străină să poată activa sistemele din clădire.

Producătorul recomandă folosirea terminalelor Apple sau Samsung ce au un cititor de amprentă evitând folosirea telefonului și implicit a ”Sistemului Inteligent pentru Clădiri Controlat prin Semnal GSM” de către o persoană neautorizată.

Capitolul 4.6. Codul sursă și descrierea acestuia

La începutul codului am inițializat variabilele necesare tutoror sistemelor. Astfel avem următoarele:

#include <SoftwareSerial.h> //include librăria cu protocoalele de comunicare

#include <string.h>

#include <Stepper.h> //include librăria pentru motor stepper

#include <dht.h> //include librăria senzorului de temperatură

dht DHT; //declararea tipului de senzor

SoftwareSerial Sim900Serial(2, 3); //protocolul de comunicare între cele două controlere

byte buffer[64]; //se referă la alocarea datelor recepționate către

comunicația serială

int count=0; //variabilă de incrementare pentru comenzi

int pin6 = 6; //inițializare pini

int pin7 = 7;

int pin8 = 8;

int pin9 = 9;

int pin10 = 10;

int pin11 = 11;

int pin12 = 12;

int pin13 = 13;

int pinA0 =A0;

int pinA1 =A1;

int pinA2 =A2;

int pinA3 =A3;

#define trigPin 4 //definește pinul ce generează un semnal pentru măsurarea

distanței până la primul obstacol

#define echoPin 5 //definește pinul ce recepționează semnalul generat de trig

int duration, distance; //initializare durata și distanța senzorului de proximitate

int alarma=0; //inițializare condiție pornire alarmă cu 0

int nralarma=0; //timpul ce se setează pentru oprirea sistemului de alarmă

const int buttonPin = pinA2; //definire variabilă buttonPin ca fiind pinul A2 analogic

int buttonState = 0; //variabilă ce citește poziția butonului

#define DHT11_PIN pin6 //declarare pin pentru citire temperatură

int garajstatus=0; //inițializare variabilă ce reține poziția în care se află ușa

garajului

Am definit numărul de telefon ce poate trimite comenzi către sistem și am setat anumite variabile precum:

#define phonenumber "0726003649" //numărul de telefon ce poate trimite comenzi

void setup()

{

Sim900Serial.begin(19200); //baud rate-ul folosit de către Sim900

Serial.begin(19200); //baud rate-ul folosit de către ATmega328

delay(500); //întârziere 500ms

Sim900_Inti(); //pornire Sim900

pinMode(trigPin, OUTPUT); //setare trigPin ca ieșire pentru senzor proximitate

pinMode(echoPin, INPUT); //setare echoPin ca intrare pentru senzor proximitate

pinMode(pin6, INPUT); //setare pin6 ca intrare pentru citirea temperaturii

pinMode(pin7, OUTPUT); //setare ca ieșire pin(nr)

pinMode(pin8, OUTPUT);

pinMode(pin9, OUTPUT);

pinMode(pin10, OUTPUT);

pinMode(pin11, OUTPUT);

pinMode(pin12, OUTPUT);

pinMode(pin13, OUTPUT);

pinMode(pinA0, OUTPUT);

pinMode(pinA1, OUTPUT);

pinMode(buttonPin, INPUT); //setare intrare pentru butonul sistemului de securitate

pinMode(pinA3, OUTPUT);

Sim900Serial.println("AT+SGPIO=0,1,1,0");//inițializăm cu 0 buzzer-ul pentru a nu

porni singur la pornirea sistemului

Serial.println(DHT_LIB_VERSION); //afișează versiunea senzorului de temperatură

}

În void loop() găsim secvențe de cod precum citirea temperaturii în mod constant, condiționarea sistemului de securitate etc.

int chk = DHT.read11(DHT11_PIN); //citire temperatură

delay(2500); //timp între citirile termometrului, întarzie și

răspunsul comenzilor tot cu 2,5 sec

Serial.println(DHT.temperature,1); //afișează temperatura

if (DHT.temperature >= 30) //parametru ce setează temperatura la care pornește

sistemul de climatizare

{ digitalWrite(pin8, HIGH);} //pornește sistemul de climatizare

else

{digitalWrite(pin8, LOW);} //sistemul de climatizare rămâne oprit

while(alarma == 1){ //condiționare pornire sistem de securitate

buttonState = digitalRead(buttonPin); //citește valoarea butonului fără reținere

if (buttonState == HIGH) //condiție ca butonul să fie apăsat

{

alarma=0; //setează parametrul alarmă cu 0

buttonState = 0; //aduce butonul la starea inițială 0

Serial.println("Alarma a fost dezactivata !"); //afisșează mesaj

void loop(); //revine la bucla principală

}

digitalWrite(trigPin, HIGH); //citește valoarea generată de echo

delayMicroseconds(1000);

digitalWrite(trigPin, LOW); //generează un semnal pentru măsurare

duration = pulseIn(echoPin, HIGH);

distance = (duration/2) / 29.1; //setare rază de acțiune sistem de securitate

nralarma++; //incrementează nralarmă cu o unitate

if (distance >= 10 || distance <= 0) //dacă nu sesizează mișcare alarma rămâne oprită

{

Sim900Serial.println("AT+SGPIO=0,1,1,0");

Serial.println("Out of range");

}

else

{

Sim900Serial.println("AT+SGPIO=0,1,1,1");//pornește alarma atunci când

detectează mișcare

MesajAlarma(); //trimitere mesaj alarmă

}

delay(500);

if(nralarma==150) //numărul 150 reprezintă timpul la care alarma se va

dezactiva automat

{ alarma=0; //setează alarmă cu valoarea 0

nralarma=0; //setează parametru de repetare cu 0

Sim900Serial.println("AT+SGPIO=0,1,1,0"); //oprește buzzer-ul

void loop(); //întoarcere în bucla principală

}}

Pentru că sursa programului este voluminoasă am sa vă prezint doar un exemplu de comandă. Codul complet fiind disponibil în anexa[1].

void Cmd_Read_Act(void) //acestă funcție citește SMS-ul și ia o decizie în funcție de

comanda primită

{

char buffer2[64];

char comparetext[25]; //verifică corectitudinea numărului ce a trimis comanda

for (int i=0; i<count;i++)

{ buffer2[i]=char(buffer[i]);}

memcpy(comparetext,buffer2,25); //compară conținutul mesajului

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer2,"Motor on")) //conform comenzii, aceasta deschide ușa garajului

{

if (garajstatus == 0) //dacă ușa este închisă urmează deschiderea acesteia

{

int ture=0; //variabilă ce repetă codul de mai jos este egală cu 0

while (ture < 200) //numărul de repetări al cod-ului până când ușa este

deschisă complet

{

digitalWrite(pin10, LOW); //se pornește pe rând, în ordine fiecare bobină

digitalWrite(pin11, LOW); generând practic o mișcare de rotație a axului

digitalWrite(pin12, LOW); motorului în sensul de deschide a ușii.

digitalWrite(pin13, HIGH);

delay(10);

digitalWrite(pin10, LOW);

digitalWrite(pin11, LOW);

digitalWrite(pin12, HIGH);

digitalWrite(pin13, LOW);

delay(10);

digitalWrite(pin10, LOW);

digitalWrite(pin11, HIGH);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

delay(10);

digitalWrite(pin10, HIGH);

digitalWrite(pin11, LOW);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

delay(10);

ture++; //incrementează ”ture” cu o unitate pentru repetarea

procesului

};

delay (300);

digitalWrite(pin10, LOW); //când ușa este deschisă complet se opresc toți pinii

digitalWrite(pin11, LOW);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

Serial.println("Usa este deschisa !"); //mesaj de informare atunci când procesul este

delay(50); încheiat

garajstatus=1; //setare ușă ca fiind deschisă

GarajDeschis(); //trimite SMS pentru notificare

delay(500);

Serial.println("AT+CMGD=1,4");//golește memoria cartelei SIM

delay(500);

{return;}

void loop(); //revine în bucla principală

}

else

{ GarajInchis(); } //dacă ușa este deja deschisă trimite notificare

}

if (strstr(buffer2,"Alarm on")) //pornește sistemul de securitate

{

alarma = 1; //setează ”alarmă” cu valoarea 1

{return;}

void loop(); //revine în bucla principală

}

}

Repetând acest procedeu al predefinirii comenzilor ce pot fi efectuate am realizat și celalte comenzi conform capitolului 4.5. algoritmul și organigrama aplicației.

Codul sursă complet cât și explicarea acestuia sunt atașate în anexa[1].

Comenzi precum ”Serial.println("AT+CMGD=1,4");” sunt folosite după fiecare comandă primită pentru că memoria cartelei se încarcă după 20 de SMS-uri primite. Astfel după executarea fiecărei comenzi, această linie de cod șterge efectiv datele de pe cartela SIM.

Capitolul 4.7. Considerații privind fiabilitatea sistemului

Fiabilitatea se referă la funcționarea sistemului în parametrii impuși fără apariția unor probleme sau defecțiuni într-un interval de timp stabilit de către producător.

Datorită funcției de ștergere a mesajelor după executarea fiecărei comenzi, din punct de vedere software, ”Sistemul Inteligent pentru Clădiri Controlat prin Semnal GSM” este stabil pe o perioadă de timp îndelungată.

Din punct de vedere hardware, fiind testat într-o perioadă de 7 zile consecutive de funcționare, sistemul s-a menținut în parametrii impuși de către producător.

Utilizând o funcție de watchdog, acest sistem elimină problema fiabilității pe o perioadă și mai mare de timp.

În proiectul actual, nu a fost utilizată o astfel de funcție datorită depășirii costurilor impuse de producție.

Capitolul 5. Concluzii

Capitolul 5.1. Concluzii privind sistemul realizat

Pe parcursul proiectării ”Sistemului Inteligent pentru Clădiri Controlat prin Semnal GSM” am întâmpinat mai multe probleme precum:

Lipsa semnalului de rețea a cipului Sim900.

Am rezolvat această problemă prin creșterea curentului de intrare ce alimentează placa de dezvoltare cu microcontroler ATmega328 și cea pentru Sim900 astfel că la o tensiune inițială de 5V și 1A, microcontrolerul Sim900 nu își putea stabili semnalul GSM de rețea. Prin aplicarea unei tensiuni de alimentare de 7,5V și 2A am rezolvat această problemă.

Alimentarea prin intermediul plăcii de breadboard a motorului stepper, driverul acestuia cât și a plăcii cu relee cu o tensiune de 5V și o intensitate de 2,1A, punea problema funcționării celor trei subsisteme simultan.

Alimentând separat placa cu relee la o tensiune de 5V și 800mA, am rezolvat problema, putând astfel ca subsistemele menționate să funcționeze simultan fără a fi influențate de pornirea altor echipamente.

La programarea driver-ului ULN2003, am întâmpinat problema compatibilității între soft-ul driver-ului și versiunea programului plăcii de dezvoltare Arduino UNO.

Folosind versiunea de Arduino 1.0.5.-r2, am eliminat această problemă.

Având problema driver-ului rezolvată, am reușit să configurez subsistemul ce acționează ușa garajului însă nu puteam schimba sensul de rotație al motorului BYJ48.

Am rezolvat această problemă prin scrierea unei secvențe de cod repetitive pentru fiecare bobină a motorului.

Implementarea regimului manual de funcționare pentru sistemul de securitate s-a dovedit a fi problematică întrucât placa de dezvoltare citea rezistența firului și o interpreta drept semnal fără ca butonul ce dezactivează sistemul să fie apăsat.

Problema a fost rezolvată prin conectarea unei rezistențe între semnalul ce trece de buton (atunci când acesta este apăsat) și masă.

Având toate aceste probleme rezolvate, sistemul funcționează în parametri pe o durată mare de timp fără a genera probleme de tip hardware sau software.

Capitolul 6. Bibliografie

Carte: MicrocontrolereRISC si aplicatii– Sever Spânulescu

Carte: Circuite Integrate – Ion Spânulescu

Carte:FiabilitateaSistemelor Mecatronice – Ioana Armaș

Documentație: Sim900 Hardware Design v2.04

Documentație: Sim900 AT Command Manual v1.07

Documentație: ATmega 48A/PA/88A/PA/168A/PA/328/P Complete

Documentație: Arduino Microcontroller Guide ver.oct-2011

Documentație: HC-SR04 User Guide

http://en.wikipedia.org/wiki/System – accesat la data 10.02.2015

http://en.wikipedia.org/wiki/Building_automation – accesat la data 21.02.2015

http://en.wikipedia.org/wiki/Microcontroller – accesat la data 16.04.2015

http://en.wikipedia.org/wiki/C%2B%2B – accesat la data 20.04.2015

http://en.wikipedia.org/wiki/Channel_(communications)#See_also – accesat la data 27.04.2015

https://en.wikipedia.org/wiki/GSM- accesat la data 10.05.2015

ANEXĂ

Anexa[1]

Anexa[1] cuprinde codul sursă complet și explicat. Caracterul ”//” este urmat de comentariul liniei de cod în dreptul rândului respectiv.

#include <SoftwareSerial.h> //include librăria pentru Sim900

#include <string.h> //include librăria pentru diferite funcții

#include <dht.h> //include librăria senzorului de temperatură

dht DHT; //declarare tipului de senzor

SoftwareSerial Sim900Serial(2, 3); //setăm tipul de comunicație între Sim900 și

ATmega328 ca fiind de tip Software Serial

byte buffer[64]; // alocă datele către comunicația serială

int count=0; // numărător pentru buffer

int pin6 = 6; //declarăm pin(nr) ca fiind pinul(nr)

int pin7 = 7;

int pin8 = 8;

int pin9 = 9;

int pin10 = 10;

int pin11 = 11;

int pin12 = 12;

int pin13 = 13;

int pinA0 =A0;

int pinA1 =A1;

int pinA2 =A2;

int pinA3 =A3;

#include <Stepper.h> //include librăria motorului stepper

#define trigPin 4 //definesc pinul ce generează semnal pentru

măsurarea distanței până la primul obstacol

#define echoPin 5 //definesc pinul ce primește semnalul generat de trig

int duration, distance; // inițializez durata și distanța pentru semnalul

senzorului de proximitate

int alarma=0; // inițializez factorul ce condiționează pornirea

sistemului de securitate

int nralarma=0; //factor de umplere pentru oprirea sistemului de

securitate

const int buttonPin = pinA2; //definire variabilă buttonPin ca fiind A2 (pinul)

int buttonState = 0; //inițializare variabilă ce citește starea butonului

#define DHT11_PIN pin6 //declararea pinului prin care se citește temperatura

int garajstatus=0; //inițializare variabilă ce reține poziția în care se află

ușa garajului

#define phonenumber "0726003649" //se definește numărul de la care sistemul poate

primi comenzi

void setup() //inițializez funcția de setare a sistemului

{

Sim900Serial.begin(19200); //setăm baud rate-ul pe 19200 pentru Sim900

Serial.begin(19200); //setăm baud rate-ul pe 19200 pentru ATmega328

delay(500); //întârziere 500ms

Sim900_Inti(); //pornește Sim900

pinMode(trigPin, OUTPUT); //setăm trigPin ca ieșire

pinMode(echoPin, INPUT); //setăm echiPin ca intrare

pinMode(pin6, INPUT); //setăm ca intrare pinul 6 pentru citirea temperaturii

pinMode(pin7, OUTPUT); //setăm ca ieșire pin(nr)

pinMode(pin8, OUTPUT);

pinMode(pin9, OUTPUT);

pinMode(pin10, OUTPUT);

pinMode(pin11, OUTPUT);

pinMode(pin12, OUTPUT);

pinMode(pin13, OUTPUT);

pinMode(pinA0, OUTPUT);

pinMode(pinA1, OUTPUT);

pinMode(buttonPin, INPUT); //inițialize buttonPin ca intrare pentru a citi semnalul

generat de apăsarea butonului pentru oprirea sistemului de securitate

pinMode(pinA3, OUTPUT);

Sim900Serial.println("AT+SGPIO=0,1,1,0"); //inițializăm cu 0 buzzer-ul pentru a nu porni

singur la pornirea sistemului

Serial.println(DHT_LIB_VERSION); //afișează versiunea senzoruluide temperatură

}

void loop()

{

if (Sim900Serial.available()) //dacă datele provin din comunicația serială, atunci

provin de la dispozitivul Sim900

{

while(Sim900Serial.available()) //citește datele dacă sunt disponibile

{

buffer[count++]=Sim900Serial.read(); //incrementează numărul de comenzi

if(count == 64)break;

}

Serial.write(buffer,count); //dacă nu se încheie citirea datelor se trece la

comuniția hardware

Cmd_Read_Act(); //începe citirea comenzii din interiorul SMS-ului

clearBufferArray(); //eliberează memoria ce stochează comenzile

count = 0; //setează counter-ul cu valoarea 0

}

if (Serial.available()) //dacă datele provin din comunicarea hardware,

înseamnă că datele provin de la un computer

Sim900Serial.write(Serial.read()); //trimitere date către modulul Sim900

int chk = DHT.read11(DHT11_PIN); //citire temperatură

delay(2500); //timp între citirile termometrului

Serial.println(DHT.temperature,1); //afișează temperatura pe monitorul serial

if (DHT.temperature >= 30) //setăm cu valoarea 30, temperatura la care sistemul

de climatizare urmează să pornească

{

digitalWrite(pin8, HIGH); //pornește sistemul de climatizare

}

else //altfel

{

digitalWrite(pin8, LOW); //menține oprit sau oprește sistemul de climatizare

}

while(alarma == 1) //condiție ca sistemul de securitate să pornească

{

buttonState = digitalRead(buttonPin); //citește poziția butonului pentru oprirea sistemului

if (buttonState == HIGH) //dacă butonul este apăsat, execută

{

alarma=0; //setez parametrul alarma cu 0

buttonState = 0; //aduc butonul la starea inițială 0

Serial.println("Alarma a fost dezactivata !"); //afișează mesaj

void loop(); //revenire la bucla principală

}

digitalWrite(trigPin, HIGH); //generare semnal măsurare distanță

delayMicroseconds(1000); //întărziere 1000ms

digitalWrite(trigPin, LOW); //oprește semnalul generat

duration = pulseIn(echoPin, HIGH); //definire durata semnalului

distance = (duration/2) / 29.1; //definește distanța măsurată

nralarma++; //incrementează nralarma cu o unitate

if (distance >= 10 || distance <= 0) //dacă nu se află nimi în raza de acțiune execută

{

Sim900Serial.println("AT+SGPIO=0,1,1,0"); //buzzer-ul rămâne oprit

Serial.println("Out of range"); //afișează pe monitorul serial mesajul

}

else //altfel

{

Sim900Serial.println("AT+SGPIO=0,1,1,1"); //pornește buzzer-ul

MesajAlarma(); //apelează funcția

}

delay(500); //întârziere 500ms

if(nralarma==150) //numărul 150 reprezintă timpul în care sistemul de

securitate rămâne activ

alarma=0; //setează alarma cu valoarea 0

nralarma=0; //setează timpul alarmei cu 0

Sim900Serial.println("AT+SGPIO=0,1,1,0"); //oprește buzzer-ul

void loop(); //revenire la bucla principală

}

}

}

void clearBufferArray() //funcție ce curăță memoria ce salvează comenzile

{

for (int i=0; i<count;i++) //curăță tot folosind comanda NULL

{ buffer[i]=NULL;}

}

void Sim900_Inti(void) //începe interpretarea efectivă a SMS-urilor

{

Sim900Serial.println("AT+CMGF=1");

delay(500);

Sim900Serial.println("AT+CNMI=2,2");

delay(500);

}

void Cmd_Read_Act(void) //după interpretarea SMS-ului se execută comanda

conform comenzii primite

{

char buffer2[64];

char comparetext[25]; //compară mesajul și numărul de telefon

for (int i=0; i<count;i++)

{ buffer2[i]=char(buffer[i]);}

memcpy(comparetext,buffer2,25);

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer2,"Motor on")) //coamandă de deschidere a ușii garajului

{

if (garajstatus == 0) //dacă ușa este închisă, sistemul o va deschide

{

int ture=0; //inițializare ture cu 0 pentru repetarea secvenței

următoare până când ușa este complet deschisă

while (ture < 200) //cât timp ture este mai mic ca 200, continuă

acționarea motorului

{

digitalWrite(pin10, LOW); //secvența următoare pornește pe rând fiecare bobină

digitalWrite(pin11, LOW); generând efectul de rotație al axului motorului în

digitalWrite(pin12, LOW); ordine pentru a deschide ușa garajului

digitalWrite(pin13, HIGH);

delay(10); //întârziere între acțiuni

digitalWrite(pin10, LOW);

digitalWrite(pin11, LOW);

digitalWrite(pin12, HIGH);

digitalWrite(pin13, LOW);

delay(10);

digitalWrite(pin10, LOW);

digitalWrite(pin11, HIGH);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

delay(10);

digitalWrite(pin10, HIGH);

digitalWrite(pin11, LOW);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

delay(10);

ture++; //incrementează ture cu o unitate

};

delay (300); //întârziere 300ms

digitalWrite(pin10, LOW); //oprește toate cele 4 bobine

digitalWrite(pin11, LOW);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

Serial.println("Usa este deschisa !"); //afișează pe monitorul serial mesajul

delay(50);

garajstatus=1; //setează garajstatus cu 1 pentru a reține poziția

GarajDeschis(); //apelează funcția

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

{return;}

void loop(); //revenire la bucla principală

}

else

{

GarajDeschis(); //dacă ușa este deja deschisă apelează funcția

}

}

if (strstr(buffer2,"Alarm on")) //dacă SMS-ul conține Alarm on pornește sistemul

de securitate

{

alarma = 1; //pornește sistemul de securitate

{return;} //acest parametru oprește efectiv codul aici pentru a

nu parcurge segvențele următoare

void loop(); //revenire la bucla principală

}

}

char buffer5[64]; //interpretează comanda nr 5

for (int i=0; i<count;i++)

{ buffer5[i]=char(buffer[i]);}

memcpy(comparetext,buffer5,25);

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer5,"Motor off")) //comandă de închidere a ușii garajului

{

if (garajstatus == 1) //dacă ușa este deschisă execută

{

int ture1=0; //setează numărul de ture necesare pentru

deschiderea ușii garajului cu 0

while (ture1 < 200) //cât timp ture1 este mai mic ca 200 repetă secvența

{

digitalWrite(pin10, HIGH); //secvența următoare pornește pe rând fiecare bobină

digitalWrite(pin11, LOW); generând efectul de rotație al axului motorului în

digitalWrite(pin12, LOW); ordine pentru a închide ușa garajului

digitalWrite(pin13, LOW);

delay(10); //întârziere între acțiuni

digitalWrite(pin10, LOW);

digitalWrite(pin11, HIGH);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

delay(10);

digitalWrite(pin10, LOW);

digitalWrite(pin11, LOW);

digitalWrite(pin12, HIGH);

digitalWrite(pin13, LOW);

delay(10);

digitalWrite(pin10, LOW);

digitalWrite(pin11, LOW);

digitalWrite(pin12, LOW);

digitalWrite(pin13, HIGH);

delay(10);

ture1++; //incrementează cu o unitate ture1

};

delay(300); //întârziere 300ms

digitalWrite(pin10, LOW); //dezactivează toate bibinele

digitalWrite(pin11, LOW);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

Serial.println("Usa este inchisa !"); //afișează un mesaj pe monitorul serial

delay(50);

garajstatus=0; //setează garajstatus cu 0 pentru că ușa este închisă

GarajInchis(); //apelează funcția

delay(500);

Serial.println("AT+CMGD=1,4"); //golește memoria cartelei SIM

delay(500);

{return;}

void loop(); //întoarcere la bucla principală

}

Else //altfel

{

GarajInchis(); //apelează funcția dacă ușa garajului este deja închisă

}

}

char buffer3[64]; //citire comandă

for (int i=0; i<count;i++)

{ buffer3[i]=char(buffer[i]);}

memcpy(comparetext,buffer3,25);

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer3,"Sterge toate mesajele")) //comandă ce șterge toate mesajele de pe

cartela SIM

{

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(100);

Serial.println("Mesajele au fost sterse"); //afișează mesaj pe monitorul serial

{return;}

void loop(); //revenire la bucla principală

}

if (strstr(buffer3,"Opreste tot")) //comandă ce oprește toate subsistemele

{

digitalWrite(pin7, LOW); //setează pin(nr) ca fiind LOW (oprit)

digitalWrite(pin8, LOW);

digitalWrite(pin9, LOW);

digitalWrite(pin10, LOW);

digitalWrite(pin11, LOW);

digitalWrite(pin12, LOW);

digitalWrite(pin13, LOW);

Sim900Serial.println("AT+SGPIO=0,4,1,0"); //setează GPIO 4 ca fiind LOW

delay(300);

Sim900Serial.println("AT+SGPIO=0,6,1,0");//setează GPIO 6 ca fiind LOW

delay(300);

Sim900Serial.println("AT+SGPIO=0,8,1,0");//setează GPIO 8 ca fiind LOW

delay(300);

Sim900Serial.println("AT+SGPIO=0,10,1,0");//setează GPIO 10 ca fiind LOW

delay(300);

Sim900Serial.println("AT+SGPIO=0,1,1,0");//setează GPIO 1 ca fiind LOW

delay(300);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

OpresteTot(); //apelează funcția

delay(500); //întârziere 500ms

{return;}

void loop(); //revenire la bucla principală

}

}

char buffer4[64]; //citire comandă

for (int i=0; i<count;i++)

{ buffer4[i]=char(buffer[i]);}

memcpy(comparetext,buffer4,25);

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer4,"Living off")) //comandă pentru oprirea sistemului de iluminat din

living

{

Sim900Serial.println("AT+SGPIO=0,4,1,0"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

if (strstr(buffer4,"Living on")) //comandă pentru pornirea sistemului de

iluminat din living

{

Sim900Serial.println("AT+SGPIO=0,4,1,1"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

}

char buffer6[64]; //citire comandă

for (int i=0; i<count;i++)

{ buffer6[i]=char(buffer[i]);}

memcpy(comparetext,buffer6,25);

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer6,"Dormitor off")) //comandă pentru oprirea sistemului de

iluminat din dormitor

{

Sim900Serial.println("AT+SGPIO=0,6,1,0"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

if (strstr(buffer4,"Dormitor on")) //comandă pentru pornirea sistemului de

iluminat din dormitor

{

Sim900Serial.println("AT+SGPIO=0,6,1,1"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

}

char buffer7[64]; //citire comandă

for (int i=0; i<count;i++)

{ buffer7[i]=char(buffer[i]);}

memcpy(comparetext,buffer7,25);

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer7,"Dormitor2 off")) //comandă pentru oprirea sistemului de

iluminat în dormitorul nr 2

{

Sim900Serial.println("AT+SGPIO=0,8,1,0"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

if (strstr(buffer7,"Dormitor2 on")) //comandă pentru pornirea sistemului de

iluminat în dormitorul nr2

{

Sim900Serial.println("AT+SGPIO=0,8,1,1"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

}

char buffer8[64]; //citire comandă

for (int i=0; i<count;i++)

{ buffer8[i]=char(buffer[i]);}

memcpy(comparetext,buffer8,25);

if (strstr(comparetext,phonenumber))

{

if (strstr(buffer8,"Baie off")) //comandă pentru oprirea sistemul de iluminat

în baie

{

Sim900Serial.println("AT+SGPIO=0,10,1,0"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

if (strstr(buffer8,"Baie on")) //comandă pentru pornirea sistemului de

iluminat în baie

{

Sim900Serial.println("AT+SGPIO=0,10,1,1"); //acționează placa cu relee

delay(500);

Serial.println("AT+CMGD=1,4"); //șterge toate mesajele de pe cartela SIM

delay(500);

void loop(); //revenire la bucla principală

}

}

}

}

void MesajAlarma() //definire funcție pentru notificările sistemului

de securitate

{

Sim900Serial.print("AT+CMGF=1\r"); //trimite SMS sub formă de text

delay(100);

Sim900Serial.println("AT + CMGS = \"0726003649\"");//numărul către care este trimis

mesajul

delay(100);

Sim900Serial.println("ATENTIE! Alarma a fost declansata! ");//conținutul mesajului

delay(100);

Sim900Serial.println((char)26); //dimensiunea mesajului

delay(100);

Sim900Serial.println(); //trimitre

}

void GarajDeschis() //definire funcție pentru notificarea

utilizatorului atunci când ușa garajului este

deschisă

{

Sim900Serial.print("AT+CMGF=1\r"); //trimite SMS sub formă de text

delay(100);

Sim900Serial.println("AT + CMGS = \"0726003649\"");//numărul către care este trimis

mesajul

delay(100);

Sim900Serial.println("Usa garajului este deschisa !");//conținutul mesajului

delay(100);

Sim900Serial.println((char)26); //dimensiunea mesajului

delay(100);

Sim900Serial.println(); //trimitere

}

void GarajInchis() //definire funcție pentru notificarea

utilizatorului atunci când ușa garajului este închisă

{

Sim900Serial.print("AT+CMGF=1\r"); //trimite SMS sub formă de text

delay(100);

Sim900Serial.println("AT + CMGS = \"0726003649\"");//numărul către care este trimis

mesajul

delay(100);

Sim900Serial.println("Usa garajului este inchisa !");//conținutul mesajului

delay(100);

Sim900Serial.println((char)26); //dimensiunea mesajului

delay(100);

Sim900Serial.println(); //trimitere

}

void OpresteTot() //definire funcție pentru notificare utilizatorului

atunci când dezactivează toate sistemele

{

Sim900Serial.print("AT+CMGF=1\r"); //trimite SMS sub formă de text

delay(100);

Sim900Serial.println("AT + CMGS = \"0726003649\"");//numărul către care este trimis

mesajul

delay(100);

Sim900Serial.println("ATENTIE ! \nToate sistemele au fost dezactivate !");//conținutul

mesajului

delay(100);

Sim900Serial.println((char)26); //dimensiunea mesajului

delay(100);

Sim900Serial.println(); //trimitere

}

Similar Posts