Platforma Online de Control al Unui Dispozitiv Programabil
Platforma online de control
al unui dispozitiv programabil
TEMA PROIECTULUI
Se va programa un dispozitiv Arduino ce își va lua comenzile conectându-se la un site web.
Comenzile sunt citite și interpretate dintr-un fișier text aflat pe site, făcând astfel o comunicare unidirecțională, fiind limitată de condițiile de prezentare a proiectului.
Fișierul este modificat de către utilizator accesând pagina web și alegând comenzile.
Se va elabora și o parte de automatizare, ce va acționa diferite dispozitive în funcție de anumite evenimente prestabilite.
Se va realiza o planșă / machetă a obiectivului controlat pe care se vor putea vedea vizual comenzile primite prin internet.
INTRODUCERE
Pentru a putea pune în practică proiectul dorit a fost nevoie de cunoașterea și folosirea mai multor tehnologii și concepte generale, cum ar fi automatizarea, internetul, dispozitive electronice, tehnologii software și hardware open-source.
În prezent toți indicatorii ne arată că în viitor tehnologia se va dezvolta exponențial, din ce în ce mai mult. Sunt de așteptat din ce mai multe descoperiri de noi metode și tehnici ce vor înlesni folosirea dispozitivelor inteligente la scară largă. Vor face parte din viața noastră și ne vor ajuta să fim mai productivi.
După cum se cunoaște, automatizarea constă, în principal, în atribuirea de sarcini unor mașinării (roboți). Aceste sarcini erau inițial realizate de către oameni, dar nevoia unei productivități mari a impus adaptarea acestora. Totodată, automatizarea înseamnă și un sistem complex compus din mai multe subansamble ce se pot auto-guverna. Acest mod revoluționar de a crește randamentul a apărut încă din anii 1940 în industria auto, fiind azi folosit în toate domeniile posibile.
Istoria Internetului începe odată cu apariția calculatoarelor în anii 1950. Acesta se dezvoltă rapid fiind accesibil și folositor comunicării la distanță. Folosind Internetul voi putea accesa de oriund dispozitivul creat.
Trebuie să menționez și multitudinea de dispozitive cu care putem accesa internetul, de la calculatoare și laptopuri până la smartphone-uri, tablete. Astfel o conexiune la internet a devenit facilă și nu este limitată de dispozitiv sau locație.
Programarea stă la baza interconectivității om-mașină. Prima formă de programare a apărut în 1843. Au apărut limbajele Fortran, Lisp, Cobol, Pascal. În 1972 a apărut limbajul ce este și azi în topul celor mai răspândite, denumit “C”. Din acest limbaj se derivă și altele precum C++, Java sau PHP.
Ansamblul construit și programat pentru această lucrare își propune să atingă și să exemplifice cât mai multe situații în care să se poată observa că un astfel de concept de sistem inteligent poate fi ușor de procurat, folosit și de adaptat.
Scopul acestui proiect este de a crea un sistem inteligent dar accesibil, destinat utilizatorilor casnici dar aplicabil și în medii industriale.
CAP 1 – DISPOZITIVUL PROGRAMABIL
Având tema proiectului înțeleasă și structura pregătită am ales dispozitivul programabil. Acesta este o platformă open-source numită Arduino ce a fost creată cu scopul de a putea folosi un microcontroller ce se poate interfața cu o multitudine de senzori și traductoare și poate controla componente externe (led-uri, motoare etc.).
Platforma Arduino este relativ nouă, fiind dezvoltată în anul 2005. În prezent platforma Arduino este foarte folosită fiind accesibilă și având în spate o comunitate activă de utilizatori și dezvoltatori. Este un exemplu foarte bun în ceea ce privește folosirea unor tehnologii software și hardware ce au fost inițial create pentru armată sau medii private, astăzi ajungând la îndemâna tuturor.
1.1 – NOȚIUNI GENERALE
La bază, dispozitivul Arduino constă într-o placă dotată cu un microcontroller ce poate fi programat cu un limbaj asemanător limbajului “C”. Pe lânga microcontroller avem mai multe contacte programabile.
Placa Arduino poate fi alimentată prin intermediul conexiunii USB sau cu o sursă de alimentare externă. Sursa de alimentare este selectată automat.
Sursele externe de alimentare (non-USB) pot fi, fie un adaptor AC-DC sau o baterie. Adaptorul poate fi conectat printr-un conector de 2.1mm cu centru-pozitiv în mufa de alimentare de pe placă. Traseele de la baterie pot fi introduse în pinii GND și V-in ai conectorului de alimentare.
Placa poate funcționa cu o sursă externă de 6-20 volți. Dacă este alimentată cu mai puțin de 7V, atunci pinul de 5V scoate o tensiune mai mica de 5V și placa poate deveni instabilă. Dacă se utilizează mai mult de 12V, regulatorul de tensiune se poate supraîncălzi și deteriora placa. Intervalul recomandat este de 7-12 volți.
Echipa de dezvoltare a plăcii Arduino a pus la dispoziție și un software open-source pentru programarea dispozitivului. Acesta se conectează la placă printr-un port USB. Programarea este stocată pe memoria flash existentă iar în cazul în care memoria flash nu este încăpătoare, se poate folosi un modul ce facilitează conectarea unui card de memorie. Cardul, pe lânga faptul că poate extinde memoria de programare, poate stoca și accesa fișiere create de noi.
Microcontrolerul de pe placa Arduino vine cu un program de butare (bootloader) care vă permite încărcarea unui program nou fără a utiliza un compilator extern. Acesta comunică folosind protocolul STK500 original.
Din perspectiva programării, există o parte de setări unde se pot defini porturile plăcii, contactele programabile sau librării ce vor fi rulate la inițializarea plăcii. A doua parte constă dintr-o buclă ce rulează în continuu, atât timp cât dispozitivul funcționează. Aici se vor introduce toate comenzile de bază ce au nevoie să fie rulate în continuu. În afara acestor două secțiuni se pot crea funcții ce mai apoi vor fi chemate în buclă.
Odată terminată programarea, software-ul poate verifica corectitudinea codului și urmează copierea programării în memoria plăcii. Cu fiecare acțiune de programare nouă, se va șterge vechea programare.
1.2 – TEHNOLOGII EXISTENTE
Circumstanțele în care ne găsim astăzi în domeniul microcontrollerelor au avut începuturile în dezvoltarea tehnologiei circuitelor integrate. Această dezvoltare a făcut posibilă înmagazinarea a sute de mii de tranzistoare într-un singur cip. Aceasta a fost o premiză pentru producția de microprocesoare, și primele calculatoare au fost făcute prin adăugarea perifericelor precum memorie, linii intrare-ieșire, timeri și altele.
Următoarea creștere a volumului capsulei a dus la crearea circuitelor integrate. Aceste circuite integrate conțin atât procesorul cât și perifericele.
La modul general un controller este o structură electronică destinată controlului unui proces sau a unei interacțiuni caracteristice cu mediul exterior, fără să fie necesară intervenția operatorului uman.
Primele controllere au fost realizate în tehnologii pur analogice, folosind componente electronice discrete și/sau componente electromecanice (de exemplu relee). Cele care fac apel la tehnica numerică modernă au fost realizate inițial pe baza logicii și a unei electronici analogice uneori complexe, motiv pentru care se remarcau prin dimensiuni mari, consum energetic pe măsură și, nu de puține ori, o fiabilitate care lasă de dorit.
Apariția și utilizarea microprocesoarelor de uz general a dus la o reducere consistentă a costurilor, dimensiunilor, consumului și o îmbunătățire a fiabilității.
Printre opțiunile cele mai cunoscute în comunitatea hardware și software se regăsesc dispozitivele denumite Arduino, RaspberryPi și BeagleBone. Acestea furnizează resurse importante ce le fac să fie prima alegere pentru proiecte mai mari și pretențioase.
RaspberryPi este un dispozitiv destul de ieftin care înglobează specificații puternice. Acesta are un procesor Broadcom BCM2835, un procesor grafic și o memorie de 512 MB. Conținutul se stochează pe un card de memorie. Acesta are un preț mic având în vedere resursele oferite.
BeagleBone este practic un micro-computer ca și RaspberryPi. Are un procesor ARM A8 Cortex și o memorie de 256 MB. Acesta funcționează cu Linux, astfel se poate crea soft pentru el în mai multe limbaje de programare: C, C ++, Java, Python, Ruby, PHP, Javascript, Node.js. Diferența dintre acesta și RaspberryPi este prețul, ceva mai mare la BeagleBone.
Există desigur și opțiuni mai puțin cunoscute cum ar fi:
Nanode, ce este asemănător Arduino, fiind gândit pentru proiecte ce necesită conexiune internet. Ce îl diferențiază în mod negativ este prețul mai mare și nevoie de a fi asamblat de la zero.
Pinguino are un preț și un aspect asemanător Arduino, doar că nu are o comunitate în spate, fiind greu de primit informații specifice proiectelor tale.
STM32 Discovery oferit de STMicroelectronics este o altă alternativă ieftină ce vine cu un procesor pe 32 de biți ARM Cortex M3 și o memorie de 8kB. Această memorie este simțitor mai mare față de cea a unui Arduino standard. Singura problemă în acest moment este lipsa documentației și lipsa unei comunități.
Motivele pentru care am ales platforma Arduino sunt urmatoarele: prețul de achiziție bun, varietate mare de module ce se pot folosi pentru a extinde funcționalitatea acestuia, limbajul de programare răspândit și comunitatea mare.
1.3 – MODEL DISPOZITIV
Printre modelele de Arduino comercializate amintesc: Arduino Uno, Arduino Leonardo, Arduino Mega 2560, LilyPad Arduino, Arduino Pro. Acestea sunt diferențiate în principal de procesor și de numărul de contacte ce se pot seta ca și intrări / ieșiri. Aceste contacte se mai denumesc și pini în terminologia aferentă.
Modelul ales de mine este Arduino Mega 2560. Acesta are un număr extins de pini, astfel că poate fi folosit în mai multe tipuri de proiecte.
Fig. 1 – Placă Arduino Mega 2560
Această placă are un procesor ATmega2560, 54 de pini digitali de intrare sau ieșire, 16 pini analogici de intrare, un cristal oscilator de 16MHz, un port USB și o mufă de alimentare.
Dintre cei 54 de pini, 15 au o funcționalitate extinsă. Aceștia au posibilitatea de a modula frecvența impulsurilor. Astfel putem controla intensitatea curentului trimis către un anumit dispozitiv. Cel mai bun exemplu în acest sens este faptul că se poate controla intensitatea luminoasă a unui led.
Valorile de intrare pot fi de 7-12 volți. Valorile minime și maxime admise sunt de 6 – 20 volți. Curentul continuu ce trece printr-un singur pin este de 40mA la o valoare de 5 volți maxim.
Alimentarea se poate face concomitent de la modulul USB și de la mufa de alimentare. Placa iși va alege automat sursa de curent dintre cele două. Diferența este că modulul USB furnizează 5 volți pe când mufa de alimentare poate furniza orice valoare cuprinsă între 7 și 12 volți.
Placa vine echipată cu un modul de protecție pentru mufa USB în caz de scurt-circuit, astfel că orice curent mai mare de 500mA ce duce către calculator prin mufa USB va declanșa o siguranță.
Memoria flash este de 256KB, iar procesorul are o viteză setată la 16MHz.
Comunicarea cu un calculator sau cu alte micro-controllere se poate face prin patru pini de 5 volți, realizându-se o comunicare serială. Software-ul Arduino are inclus un modul serial prin care poate citi informațiile trimise prin această cale.
1.4 – MODULE DE EXTENSIE
Așa cum am menționat mai sus, unul din motivele pentru care am ales acest dispozitiv este multitudinea de module ce se pot adăuga. Toate aceste module au documentația bine pusă la punct.
Spre exemplu, Arduino GSM Shield este un modul ce se conectează la placa Arduino și poate fi setat să comunice date prin GPRS sau prin SMS-uri printr-o cartelă SIM funcțională. O slăbiciune este că depinde de semnal și poate avea costuri de folosire. Deasemenea comenzile date sunt limitate și durează ceva mai mult pentru a fi trimise și primite.
Arduino Ethernet Shield este un modul ce crează o conexiune pe fir cu un router sau calculator. Astfel, odată adăugat modulul, se poate seta să se conecteze la o rețea locală și ulterior la internetcro-controllere se poate face prin patru pini de 5 volți, realizându-se o comunicare serială. Software-ul Arduino are inclus un modul serial prin care poate citi informațiile trimise prin această cale.
1.4 – MODULE DE EXTENSIE
Așa cum am menționat mai sus, unul din motivele pentru care am ales acest dispozitiv este multitudinea de module ce se pot adăuga. Toate aceste module au documentația bine pusă la punct.
Spre exemplu, Arduino GSM Shield este un modul ce se conectează la placa Arduino și poate fi setat să comunice date prin GPRS sau prin SMS-uri printr-o cartelă SIM funcțională. O slăbiciune este că depinde de semnal și poate avea costuri de folosire. Deasemenea comenzile date sunt limitate și durează ceva mai mult pentru a fi trimise și primite.
Arduino Ethernet Shield este un modul ce crează o conexiune pe fir cu un router sau calculator. Astfel, odată adăugat modulul, se poate seta să se conecteze la o rețea locală și ulterior la internet. Este un modul relativ ieftin, având o slăbiciune faptul că trebuie cablat până la router, iar router-ul trebuie setat.
Arduino WiFi Shield este un modul asemănător lui Arduino Ethernet Shield, doar că este setat să se conecteze manual la o rețea wireless, aparținând unui router wireless sau unui hotspot 3G, după caz.
Arduino SD Shield este un modul ce crează posibilitatea adăugării unui card de memorie ce poate extinde memoria existentă și poate stoca informații.
Arduino USB Host Shield este un modul ce înglobeaza o mufa USB astfel putând conecta un dispozitiv USB direct la placa Arduino cum ar fi spre exemplu o tastatură, mouse, stick de memorie sau stick 3G.
1.4.1 – MODUL WIRELESS FOLOSIT
Modulul folosit în acest proiect este făcut de o firmă terță și se numește Iduino Yun Shield. Acesta este un modul compatibil cu plăcile Arduino și reușește să combine următoarele module într-unul singur: Arduino Ethernet Shield, Arduino WiFi Shield, Arduino USB Host Shield și Arduino SD Shield.
Fig. 2 – Modul Iduino Yun Shield
Pe lângă faptul că îmbină mai multe funcționalități, prețul de achiziție este mult mai mic în comparație cu alternativa de a cumpăra mai multe module separate. Acesta ocupă și mai puțin spațiu și este ușor de asamblat.
Modulul vine cu un procesor de 400MHz, o memorie flash de 16MB, memorie RAM de 64MB.
Alimentarea poate varia între 4.75V~23V iar aceasta provine direct de la placa Arduino, neavând mufă de alimentare separată.
Mufa de Ethernet (RJ45) are ca specificații 10M/100M fiind potrivită pentru majoritatea proiectelor ce se pot realiza cu un Arduino.
Modulul Wifi are 150Mb și încorporează tehnologie 802.11 b/g/n, fiind conectabil cu o gamă variată de dispozitive
Portul USB înglobat poate primi un stick de memorie sau un modem 3G, ce se poate configura pentru acces internet.
Modulul Iduino Yun Shield are și o interfață web de setare, putând configura în detaliu modul de funcționare. Aceasta este accesibilă prin orice browser.
Acest modul este indicat pentru proiecte complexe. Modulul se poate conecta la internet prin trei moduri diferite. Prin fir, se conectează la un router și se poate seta să acceseze astfel internetul. Prin comunicare wireless se poate conecta la un router wireless sau la un hotspot 3G iar dacă în cazul în care se întâmplă să avem probleme cu conexiunea de internet, avem ca back-up a treia conexiune, printr-un modem 3G conectat la portul USB.
Fig. 3 – Interconectivitatea Internet – Arduino
Din cauză că această conexiune 3G este practic complet diferită de sursa de internet furnizată de către router, putem spune că o astfel de soluție are puțini timpi de lipsă conexiune.
CAP 2 – PLATFORMA ONLINE
În continuare am ales metoda de comunicare cu dipozitivul meu Arduino. Comunicarea se va face printr-un site web ce va fi disponibil tot timpul și pe o multitudine de dispozitive.
Site-ul va avea o interfață intuitivă prin care putem face modificări ce vor fi preluate de dispozitivul nostru Arduino. Acesta este gândit să ne ofere cât mai multe posibilități în ceea ce privește comenzile. Voi detalia aceste setări pe parcursul acestei lucrări.
2.1 – NOȚIUNI GENERALE
Un site web constă din niște fișiere salvate pe un server cu o conexiune la internet, setat să propage site-ul prin mai multe servere și domenii, astfel încât să fie accesabil de oriunde.
Browser-ul se conectează la pagină folosindu-se de URI și HTTP, apoi o interpretează conform formatării paginii și o prezintă utilizatorului pe un monitor.
Unul dintre principiile web-ului este tipologia client-server, browser-ul fiind aplicația client, iar serverul HTTP fiind aplicația server. Pentru a putea interpreta și furniza informațiile sub forma hipertextului, browserul apelează la limbajul HTML.
S-a constatat în timp că diversele firme ce creează browsere vor avea întotdeauna viziuni diferite, astfel ajungându-se la mici diferențe în vizualizarea aceluiași conținut. Asta face realizarea acestor site-uri dificilă fiind necesară verificarea tuturor diferențelor și modificarea lor.
Primul browser din lume, folosit la vremea lui în proporție de peste 90%, este Netscape Navigator, apărut în 1994.
În 1995 firma Microsoft a scos un rival pentru Netscape Navigator, denumit Internet Explorer inițiind ceea ce azi se numește "primul război al browserelor". Acesta a fost ușor câștigat de către Microsoft deoarece au inclus browserul lor în sistemul de operare Windows, până în anul 2002 acesta ajungând la 95% din piața specifică.
“În 1998 Netscape a lansat ceea ce avea să devină Fundația Mozilla, într-un efort de a aduce pe piață un browser de tip open source. Browserul se va materializa în cele din urmă în browserul Firefox. În aprile 2010 Firefox avea o cotă de piață de 25%.”
“Browserul Opera a apărut în 1996 și a atins o cotă de 2% a pieței în aprilie 2010, intrând mult și pe piața smartphone-urilor fiind preinstalat pe mai mult de 40 de milioane de telefoane mobile. “
“Apple Safari este browserul principal folosit în dispozitivele firmei Apple, și avea o piață de sub 5 % în 2010.“
Cel mai nou browser este Google Chrome, cu o piață de 7% în 2010.
În ziua de azi, deși cumulat Google Chrome ocupă prima poziție, nu deține cel mai popular browser pe niciunul dintre cele două segmente ale pieței, PC și dispozitive mobile. Astfel, cel mai utilizat browser pentru PC este în continuare Internet Explorer, cu o cotă de piață de 43%, față de 31% pentru Chrome.
Fig. 4 – Browsere uzuale
Pe dispozitive mobile conduce browserul Safari al Apple cu 59% din căutări, reflectând poziția puternică a iPhone pe piața smartphone.
Google conduce pe ansamblu, întrucât Internet Explorer are o cotă foarte redusă pe piața dispozitivelor online, iar Safari nu are o prezență semnificativă pe PC-uri.
Fig. 5 – Listă cu browsere în comparație cu sistemele de operare
2.2 – TEHNOLOGII FOLOSITE
Browserele web funcționează pe baza anumitor protocoale ce îl leagă pe utilizator de paginile stocate pe servere web specializate. Cele mai des folosite protocoale web sunt HTTP, HTTPS și FTP.
Un browser este alcătuit dintr-un set de programe ce permite afișarea și manevrarea informațiilor bazate pe text, imagini și sunet precum și rularea unor programe pe care site-urile web și documentele le pot include (applet-uri, scripturi). Fiecare browser are o casetă de text unde utilizatorul poate introduce adresa documentului sau a site-lui dorit, adresă care este unică pe lume, numită URL.
În cazul în care utilizatorul nu cunoaște adresa exactă, el poate căuta cu ajutorul unui motor de căutare cuvintele cheie dorite. Aces motor de căutare verifică în multitudinea de documente sau site-uri respectivul text, oferind apoi un rezultat în formă de listă de adrese ce conțin textul căutat.
Internetul reprezintă totalitatea site-urilor și a documentelor ce sunt legate între ele prin link-uri (hipertext), ce pot fi accesate prin rețeaua mondială de Internet.
Internetul a fost inventat în 1989 la Centrul European de Cercetări Nucleare (CERN) din Geneva, Elveția. A apărut ca o necesitate, în urma problemelor de comunicare pe care le întâmpinau echipele de cercetători ce foloseau centrul, chiar și folosind poșta electronică.
În 1994 CERN și M.I.T. au format Consorțiul World Wide Web. Acesta are drept obiectiv dezvoltarea continua a webului, standardizarea protocoalelor și încurajarea legăturilor dintre site-uri.
La baza funcționării webului stau 3 standarde și anume HTTP, ce este o stivă de protocoale OSI prin care serverul web și browserul utilizatorului comunică între ele, HTML ce este un standard de definire și prezentare a paginilor web și URI ce este un sistem universal acceptat folosit pentru a identifica și regăsi paginile web aflate oriunde în lume, pe diferite servere.
Următoarele standarde sunt definite mai târziu din nevoia de a evolua modul de interacțiune și afișare: CSS, JavaScript, HTTPS.
2.2.1 – HTML
HTML este acronimul de la HyperText Markup Language și reprezintă un limbaj pentru crearea și marcarea (formatare, aranjare) unui document astfel încât să poată fi publicat pe World Wide Web și vizualizat cu ajutorul unui browser.
Termenul de hipertext înseamnă un material sub formă de text și imagine, interconectat într-o manieră complexă, nesecvențială, în care utilizatorul poate naviga, căuta informații referitoare la un obiect. Hipertextul trebuie interpretat ca un text care semnalează o legatură la o altă informație web, de obicei un alt document web, și este identificat prin subliniere sau culoare, pentru a-l deosebi de textul simplu.
Desigur modul de afișare a-l acestui hipertext se poate modifica și stiliza după bunul plac prin stiluri CSS.
Hipermedia este un termen aproape sinonim celui de hipertext, singura deosebire fiind faptul că subliniază prezența unor elemente care nu sunt de tip text, cum ar fi animații, secvențe sonore sau secvențe video.
HTML se utilizeaza din 1990, cunoscând câteva versiuni de dezvoltare, fiecare dintre acestea îmbunătățind performanțele limbajului. HTML5 este ultima versiune a limbajului de marcare HTML aducând multe inovații în domeniu. Versiunea 5 este un upgrade care promite o interactivitate mai mare pentru fișierele de timp media (video, audio), introducând tag-uri separate pentru acestea.
Odată cu implementarea HTML5, rolul platformei Flash a scăzut foarte mult pentru că nu mai este necesar în redarea clipurilor video (aceasta fiind principala sa funcționalitate). Același lucru se va întâmpla și cu alte programe pe care HTML le va găsi înlocuitori făcând procesul mai ușor de redat și programat.
Exemplu practic, regăsit și în lucrarea de față, de cod HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dan Raducanu's Smart Device</title>
<link rel="stylesheet" href="css/css.css" />
<script src="js/js.js"></script>
</head>
<body id="body">
</body>
</html>
2.2.2 – CSS
CSS-ul este un limbaj de stilizare al elementelor HTML, al tagurilor HTML. Denumirea CSS provine din expresia Cascading Style Sheets. În Web Design-ul modern, pentru stilizarea paginilor web se folosește numai CSS. Acest lucru înseamnă că, de la culoarea literelor și a background-ului până și la poziționarea elementelor de pe o pagină web, totul este stilizat prin CSS. Astfel, stilurile folosite pe o pagină pot fi încorporate în pagina respectivă sau pot fi chemate din fișiere externe, fișiere css.
Stilurile pentru o pagină pot fi definite în partea de “head” a documentului HTML, pot fi definite într-un fișier CSS extern, pe care îl putem chema tot din partea de “head” a paginii, sau putem aplica un stil în partea “body” a fișierului HTML, la fiecare tag în parte. Observăm că avem la dispoziție trei tipuri de folosire a stilurilor CSS.
Cu ajutorul acestor stilurilor putem să stilizăm site-uri întregi dintr-un singur fișier. Asta rezultă în mai puțin cod scris, care va face paginile să se încarce mai repede. Dacă în viitor vrem să facem o modificare pe site, nu va trebui să edităm fiecare pagină sau articol în parte, ci vom modifica un singur fișier, fișierul css extern.
Exemplu practic, regăsit și în lucrarea de față, de cod CSS conținut de un fișier extern “.css”:
#body {
margin-top:20px;
}
#macheta { width:800px; height:500px; overflow:hidden;
background-image:url(../macheta/background-site.jpg);
background-repeat:no-repeat;
background-size:contain;
}
2.2.3 – PHP
PHP reprezintă un limbaj ce permite modificarea paginilor web înainte ca acestea să fie transmise de server către browser. PHP poate insera text într-un fișier HTML deja definit, poate defini un fișier HTML de la zero, poate să afișeze o imagine sau să redirecționeze utilizatorul către altă pagină. În cadrul acestui proces, PHP poate consulta baze de date, fișiere externe sau orice altă resursă, poate trimite email-uri sau executa comenzi ale sistemului de operare.
Modul în care PHP modifică / definește o pagină ce va fi afisată de browser este prin instrucțiunile scrise de programator și delimitate de etichetele “<?php” și “?>”.
Astfel, orice se află între aceste tag-uri va fi executat de interpretorul PHP și înlocuit cu rezultatul execuției. Ce este în afara lor rămâne neschimbat și este transmis către browser.
PHP este un limbaj de programare de tip interpretat, asta însemnând că fișierele ce conțin cod PHP sunt interpretate ca atare în timpul execuției. Practic, în execuția unei porțiuni de cod sursă, nu este necesară modificarea lui într-o formă intermediară ( cod binar ), și este folosit exact așa cum a fost scris.
Codul PHP poate face aproape aceleași lucruri pe care le face și un sistem avansat de programare, precum C/C++ sau Java.
Exemplu practic, regăsit și în lucrarea de față, de cod PHP conținut de un fișier extern “.php”:
if ( isset($_POST['led13']) || isset($_POST['led12']) ) {
$data = "\n" . $_POST['led20'] . "\n"
$put = file_put_contents('arduino.txt', $data);
}
else { echo "Nu s-a ales nicio opțiune";
}
2.2.4 – SQL
Limbajul structurat de interogare SQL (Structured Query Language) este limbajul standard pentru bazele de date relaționale definit de ANSI în 1986 și adoptat ulterior ca standard internațional de către ISO (1992). Peste 100 de sisteme de gestiune a bazelor de date (SGBD) acceptă / recunosc limbajul SQL.
Ca orice limbaj de baze de date, SQL permite:
• Crearea bazei de date relaționale și structurarea relațiilor prin componenta sa de definire a datelor
• Efectuarea operațiilor elementare asupra BD (inserare, ștergere, modificare a datelor) și a interogărilor asupra BD, prin componenta de manipulare a datelor
Limbajul SQL conține comenzi de definire și regăsire a datelor (CREATE TABLE, SELECT TABLE, DELETE, INSERT etc.) dar nu conține instrucțiuni pentru controlul fluxului datelor (IF … THEN … ELSE, GO TO, DO etc.).
SQL este un limbaj neprocedural cu format liber deoarece precizează ce rezultate sunt necesare și nu procedura prin care se obțin acestea.
Prima implementare comercială a unui SGBD relațional bazat pe SQL a fost realizată de corporația ORACLE. Ulterior au apărut sute de produse de BD bazate pe SQL și dialecte ale acestuia.
SQL, ca standard pentru bazele de date, a fost inclus ca și componentă în arhitecturile de aplicații de baze de date dezvoltate de marile firme producătoare de soft, cum este IBM, și adoptate pentru prelucrarea informațiilor în sistemul federal al SUA.
Limbajul SQL folosește termenii de tabele, coloane și rânduri în locul celor de relații, atribute și înregistrări.
instrucțiunea SQL include cuvinte rezervate și cuvinte definite de utilizator pentru a denumi tabelele, atributele, indexuri etc., nefiind sensibilă la formatul literei.
Exemplu practic, regăsit și în lucrarea de față, de cod SQL ce creeaza tabelul ce stă la baza sistemului de login implementat în site:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` char(64) COLLATE utf8_unicode_ci NOT NULL,
`salt` char(16) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
2.2.5 – JAVASCRIPT
JavaScript este un limbaj de programare folosit pentru a face pagini web interactive. Acesta rulează pe calculatorul vizitatorilor dvs. și nu are nevoie de download-uri constante. Javascript este adesea utilizat pentru a crea sondaje, chestionare și pentru a genera conținut dinamic.
Javascript este suportat de aproape toate marile browsere web. În cazul în care vizitatorii site-ului utilizează browsere web care acceptă Javascript (majoritatea îl suportă) și au Javascript-ul activat (această opțiune este deobicei activată în mod implicit), atunci Javascript va rula corect afișând pagina exact cum a fost intenționat să fie afișată.
Javascript este un limbaj interpretat, deci nu este necesară folosirea unui program special pentru a scrie codul. Orice editor simplu de text cum ar fi Notepad (unul dintre accesoriile Windows) este destul de satisfăcător pentru a putea scrie acest cod. Acestea fiind spuse, un editor care să coloreze codul pentru a face mai ușor identificarea erorilor, a structurii și a componentelor codului este indicat. Printre astfel de editoare se numără Notepad++, Eclipse, Sublime etc.
Există o asemănare între Javascript si PHP în felul în care funcționează, iar diferența majoră dintre ele este că PHP este un program server-side, adică rulează direct pe server, utilizatorul neavând acces la el, pe când Javascript rulează direct în browser, fiind mai ușor de accesat.
Exemplu practic, regăsit și în lucrarea de față, de cod PHP conținut de un fișier extern “.php”:
function changeroomled13() {
if ( document.getElementById("ledon13").checked == true) {
document.getElementById("pin13").style.borderColor = "green";
}
else if (document.getElementById("ledoff13").checked == true) {
document.getElementById("pin13").style.borderColor = "red";
}
else {
// NU FACE NIMIC
}
}
2.3 – EXEMPLE DIFERITE DE ABORDARE
Există și alte modalități de trimitere / primire de comenzi de la un dispozitiv Arduino, pe lângă crearea unui site, și anume crearea unei aplicații pentru smartphone.
2.3.1 – APLICATIE SMARTPHONE
Trăim într-o lume în care comunicarea este din ce în ce mai importantă în viețile noastre, iar nevoia de a fi în contact cu ceilalți se manifestă în toate activitățile curente. Tehnologia modernă sprijină această nevoie, iar dispozitivele mobile reprezintă probabil exponentul cel mai de seamă al acestei tehnologii. Telefoanele inteligente (smartphones) dotate cu sisteme de operare din ce în ce mai avansate tind să înglobeze în ele tot mai multe tehnologii.
O aplicație mobilă este un program software, conceput pentru a putea fi rulat pe smartphoneuri, tablete și alte dispozitive mobile.
Un mediu de dezvoltare destul de mare la ora actuală este Android, creat de cei de la Google.
Android este o platformă software și un sistem de operare pentru dispozitive și telefoane mobile bazată pe nucleul Linux, dezvoltată inițial de compania Google.
Android permite dezvoltatorilor să scrie cod gestionat în limbajul Java, controlând dispozitivul prin intermediul bibliotecilor Java dezvoltate de Google. Aplicațiile scrise în C și în alte limbaje pot fi compilate în cod mașină ARM și executate, dar acest model de dezvoltare nu este sprijinit oficial de către Google.
Lansarea platformei Android la 5 noiembrie 2007 a fost anunțată prin fondarea Open Handset Alliance, un consorțiu de 48 de companii de hardware, software și de telecomunicații, consacrat dezvoltării de standarde deschise pentru dispozitive mobile. Google a lansat cea mai mare parte a codului Android sub licența Apache, o licență de tip free-software și open source.
Astfel se poate crea o aplicație mobilă pe una din cele trei platforme de devoltare mai importante, Android, iOs și Windows Mobile, ce poate comunica cu dispozitivul Arduino în mare măsură la fel cum o facem prin intermediul site-ului web.
Fig. 6 – Principalele sisteme de operare mobile (Android, iOs, Microsoft, Blackberry)
Va fi necesar, pe lângă aplicația propriu-zisă, de un dispozitiv inteligent (smartphone sau tabletă) ce se poate conecta la internet prin 3G sau wireless la site-ul creat pentru controlul plăcii Arduino.
2.3.2 – MODUL ARDUINO GSM / SMS
Modulul Arduino GSM se conectează la Internet folosind rețeaua wireless GPRS. Se conectează la Arduino, se introduce o cartelă SIM valabilă și aceasta se folosește de rețeaua 3G/4G să trimită și să primească semnale de la utilizatori, sau de rețeaua GSM pentru a primi și pentru a iniția apeluri tip voce, sau de aceeași rețea GSM pentru a trimite și pentru a primi SMS-uri ce pot conține comenzi, pe care dispozitivul să le ruleze.
Parte a acestei funcționalități este prezentă și în modulul Wireless Yun folosit în această lucrare și anume partea de conectare 3G/4G printr-un stick modem cuplat la intrarea USB a dispozitivului.
După cum am mai menționat, lipsa conectivității cu rețeaua proprie poate fi una din slăbiciunile acestei metode, așa cum în cazul lipsei internetului din motive tehnice duce la probleme de conectare temporare.
CAP 3 – CONTROLUL ȘI FUNCȚIONAREA DISPOZITIVULUI
În această lucrare practică, voi conecta modulul Arduino la internet. Pentru acest lucru am nevoie de modulul de extensie Wireless Yun și de o sursă de internet la care acesta să se conecteze.
Următorul pas este de a crea un site web ce va fi găzduit online. Acesta va primi conexiunea de la modulul Arduino și îi va oferi datele necesare controlului acționărilor setate în Arduino. Pentru a putea fi realizabil în condițiile prezentării sistemului în fața comisiei de licență, acesta este gândit să lucreze în mod web client. Astfel acesta nu are nevoie de setarea unui router pentru a accesa internetul, ci doar de prezența unei surse de internet.
Metoda de rulare tip web server necesită conectarea dispozitivului la un router (pe fir sau wireless) și setarea routerului astfel încât dispozitivul să fie vizibil în afara rețelei locale create de acel router. Prin această metodă, placa Arduino poate trimite semnale pe internet, vizibile de către utilizator. Astfel putem vedea exact ce pini sunt activați și ce pini nu sunt activați.
Se recomandă folosirea modului web server pentru aplicații practice deoarece oferă mai multe opțiuni de utilizare, realizându-se o comunicare bidirecțională.
3.1 – PREZENTARE SISTEM
În continuare voi prezenta fiecare componentă majoră a proiectului și o voi descrie în contextul interconectivității cu restul de componente.
3.1.1 – DISPOZITIVUL ARDUINO CU MODUL WIRELESS / GSM
Dispozitivul este un Arduino Mega 2560 cu 54 de intrări / ieșiri ce are conectat și un modul wireless model Iduino Yun Shield.
Pentru început se conectează Arduino la acest modul wireless. Acesta fiind compatibil cu placa Arduino, are pinii gândiți pentru a se înfige ușor deasupra plăcii. Astfel pinii ocupați prin această alipire sunt regăsiți pe modulul wireless, fiind posibil să îi folosim în continuare.
Alimentarea se face de la un alimentator sau o sursă de 12 volți prin mufa de alimentare specifică plăcii Arduino. Modulul wireless iși ia necesarul de tensiune direct din placa Arduino.
Fig. 7 – Alimentare dispozitiv
Comunicarea cu placa Arduino nu se va mai face prin portul USB odată ce instalăm modulul wireless. Astfel va trebui să șuntăm pinii ce fac posibilă comunicarea USB denumită UART ce face posibilă comunicarea, pentru a nu influența comunicarea dintre placa Arduino și acest modul.
Fig. 8 – pini UART
Având fiecare modul câte un procesor, iar în cazul nostru acestea sunt și diferite din punct de vedere al construcției, este necesară setarea unei căi de comunicație între cele două.
Astfel se va apela la o librărie specifică Arduino, găsită chiar în software-ul de programare furnizat de către cei ce au creat placa Arduino, numită librărie Bridge. Denumirea este de la sine înțeleasă, fiind tradusă ca o punte / pod.
Înainte de a începe scrierea de cod către placa Arduino, va trebui setat modulul wireless. Acesta are o interfață web pe care putem face diferite setări.
Modulul vine presetat cu adresa de IP 192.168.240.1 și ne vom conecta la acesta printr-un patch-cord UTP direct din calculator / laptop, până vom face setările de bază. Deasemenea acesta are și o parola presetată ce poate fi modificată.
Din setările modulului putem modifica numele modulului, ce apare când software-ul de programare va căuta placa Arduino. Tot în setări este necesar să alegem ce tip de placă Arduino avem, pentru a facilita o comunicare solidă.
Fig. 9 – Software programare Arduino
Se mai alege modul de operare, ca fiind Arduino Bridge, astfel încât să putem folosi librăria Bridge.
Librăria Bridge este responsabilă de comunicarea între cele două procesoare diferite. Practic, aceasta face “traducerea” între cele două.
Pentru a accesa librăria în cauză și pentru a putea să îi folosim funcțiile, se apelează înainte de codul propriu-zis, prin:
#include <Bridge.h>
urmând ca mai apoi să se pornească comunicarea între cele două procesoare prin apelarea comenzii: Bridge.begin(), în partea de setări a programării: void setup() { }.
Trebuie știut că durează aproximativ 4-6 secunde pentru a crea conexiunea, odată ce comanda a fost citită.
Modul de programare al plăcii Arduino este compus din mai multe părți. Are o parte de început unde se pot defini diversele librării folosite. Dacă nu menționăm aceste librării dar folosim în cadrul codului comenzi ce țin de o librărie aparte, programul va da erori de compilare.
După prima parte unde includem librăriile, ca în exemplul de mai sus cu librăria Bridge, urmează partea de setări. Practic, aceasta parte este rulată o singură dată, pregătind bazele codului.
Următoarea parte este void loop() { }. După cum îi spune și numele, în această secțiune se pune codul pe care placa Arduino îl va rula într-o buclă. Astfel, după ce trece de partea de setări nu se va mai întoarce la ea, ci va rula bucla la nesfârșit sau până când vom opri dispozitivul.
Ultima parte o putem numi secțiunea de funcții deoarece putem scrie funcțiile în afara buclei, dar le putem rula în buclă făcând referire la ele. Astfel vom avea un cod mai curat și mai ușor de înțeles și scris.
Pentru a crea legătura dintre placa Arduino si site-ul web este nevoie de o librărie capabilă să trimită comenzi de conectare și citire fișiere. Vom folosi două librării, dintre care una specifică dispozitivului YUN.
Librăria <YunClient.h> și librăria <HttpClient.h>. Cu aceste două librării putem crea din dispozitivul nostru un client ce odată conectat la internet poate accesa un site de unde poate să copieze fișierul cu instrucțiuni:
HttpClient client;
client.get("www.danraducanu.ro/arduino.txt");
Odată ce își salvează fișierul respectiv în memoria flash, acesta îl va citi bit cu bit și îi va procesa conform programării, astfel putând să interpreteze textul creând comenzi din acesta, cum ar fi:
client.parseInt();
client.read();
Urmează ca placa Arduino să efectueze comenzile primite din acest fișier.
digitalWrite(pin,value);
digitalWrite(13,0);
În exemplul de mai sus, odată ce va citi fișierul va extrage pinul 13 cu valoarea 0 iar acesta va da o comandă de schimbare a acestui pin 13 într-o stare de lipsă tensiune, reprezentată de valoarea 0. Dacă în schimbul acestei valori ar fi fost valoarea 1, atunci pinul respectiv ar fi primit tensiune.
Tensiunea la ieșirea pinilor este de 5 volți, 40 mA. Această tensiune, ce este dată mai departe către un releu sau alt dispozitiv, se poate mări cu ajutorul unui tranzistor, creând astfel 12 volți.
După ce și-a terminat comanda, placa Arduino este setată să aștepte două secunde și să își ia din nou fișierul găsit pe site. Va executa aceiași pași iar dacă va găsi aceleași setări la anumiți pini, acesta nu va mai fi nevoit să schimbe ceva.
Astfel până când fișierul de pe site nu va avea alte valori, placa Arduino nu va opera nicio schimbare.
Pentru a seta pinii avuți la dispoziție ca intrări sau ca ieșiri, se vor folosi următoarele comenzi:
pinMode(13, OUTPUT);
pinMode(13, INPUT);
Aceste comenzi se vor face în partea de setări a programării, pentru a nu le accesa de fiecare dată în buclă.
Dând un exemplu practic ce se poate întâmpla într-o situție de uz normal, dacă placa Arduino se conectează la internet, iar site-ul web este accesibil, va prelua comenzile disponibile la acel moment. Dacă se întâmplă mai apoi ca legătura la internet să pice din cauze externe, modulul va păstra ultimile comenzi primite.
Dar dacă se întâmplă ca în același timp să se restarteze modulul, atunci acesta după ce va reporni, nu va mai avea setări cunoscute. Astfel el se va conecta la internet și va încerca să își ia comenzile. Dacă internetul este tot inaccesibil, acesta nu va mai controla niciun circuit, neprimind aceste setări.
Din această cauză, toate elementele controlabile de către acest circuit vor fi gândite să funcționeze normal închis. Astfel atunci când apar situații neprevăzute, sistemul controlat va funcționa normal, doar că nu va mai putea fi controlat de la distanță.
În scenariul în care ar fi fost invers, adică normal deschis, ar însemna că dispozitivul nostru ar fi închis circuitele dând tensiuni / semnale. Odată picat sistemul, toate aceste elemente s-ar opri din funcționare.
Desigur fiecare element trebuie analizat pentru că există și situații când trebuie lăsat sistemul pe normal deschis. Aici mă refer la dispozitive ca electrovana de apă, care, dacă ar rămâne deschisă, ar putea provoca inundații și implicit daune.
3.1.2 – ECHIPAMENTE CONTROLATE
Avem la dispoziție o gamă largă de echipamente ce pot fi utilizate în aplicația noastră, începând de la led-uri, relee, benzi luminoase, becuri la 230V, echipamente de automatizare cum ar fi poartă de garaj, siguranțe de putere, vane de apă sau gaz, sirene cu flash etc.
Toate aceste echipamente pot fi controlate de la distanță prin placa Arduino sau pot fi acționate manual din diverse întrerupătoare.
Există și o a treia opțiune, aceea de a le controla automat. Astfel putem crea o automatizare în care în urma unor semnale primite de la diverși senzori și traductoare, sau pe baza de orar, aceste echipamente să fie automat controlate, fără a fi nevoie de intervenția utilizatorului.
Și aici putem folosi o gamă variată de senzori și traductoare. Amintesc de senzori de fum și temperatură, senzori de gaz CO2, senzori de umiditate sau de mișcare. Semnalele trimise de către acești senzori pot fi interpretate și se pot programa acțiuni pe care placa Arduino să le facă.
Traductoarele sunt elemente de automatizare care sesizează și transformă mărimea de măsurat într-un semnal mai convenabil, de obicei de altă natură fizică. În practica industrială sunt acceptate două interpretări asupra noțiunii de traductor: una în care traductorul este echivalentul senzorului (detectorului, elementului primar sau sensibil), cealaltă în care traductorul este echivalentul ansamblului senzor-adaptor.
Pentru exemplificare, se poate instala într-o bucătărie un senzor de gaz. Acest senzor odată declanșat când simte gazul respectiv trimite un semnal la placa Arduino. Aceasta, fără să mai aștepte intervenția unui utilizator, trimite un semnal la un releu sau contactor pus înainte de siguranța prin care trece circuitul electric în bucătărie și va întrerupe curentul pentru a putea limita daunele.
Toate aceste evenimente imprevizibile se pot întâmpla fără ca noi să fim de față, astfel fiind necesară automatizarea obiectivului pentru a-și lua singur măsurile de siguranță.
Pe lângă nevoia de a controla un spațiu din motive de siguranță, mai putem folosi astfel de metode și din motive de confort sau financiare.
Spre exemplu, putem părăsi locația controlată de dispozitivul nostru Arduino și să uităm lumini aprinse, aragazul deschis sau apa pornită. Acestea sunt posibile cauze de dezastre și pentru a le putea preveni mai ușor și mai comod le putem transmite comenzi de la distanță sau le putem programa ca în baza unui orar, acestea să se oprească sau să pornească.
3.2 – PROGRAMAREA ȘI CONTROLUL LOCAL
Pentru a primi comenzi și pentru a crea un sistem automat, placa Arduino trebuie programată în prealabil. Astfel am programat în mai multe părți sistemul.
Am început prin a crea o conexiune la internet pentru a putea primi comenzi de la distanță, aspect pe care îl descriu în următoarea secțiune.
A urmat partea de automatizare a sistemului. Pentru a putea lucra mai ușor, am creat planșa de lucru ce desemnează locația ce se vrea controlată. Aceasta reprezintă un Resort format din mai multe încăperi dar și spațiu exterior.
Resort-ul este compus din mai multe dormitoare, o bucătarie, spații de luat masa, o piscină, grădină și un garaj. Am ales acest exemplu pentru a putea avea mai multe scenarii ce necesită mai multe tipuri de echipamente și soluții.
Fig. 10 – Parte din planșa prezentată
Astfel am putut proiecta în sistem detectori de fum pentru dormitoare, detectori de gaz pentru bucătărie și garaj, vane de apă în încăperile unde avem băi sau chiuvete, butoane de panică pentru zona de piscină în caz de incidente, sirene cu flash pentru atenționare în caz de incendiu, inundație sau probleme la piscină, o ușă de garaj automată ce vine cu un modul ce poate primi semnale de la placa noastră Arduino.
În acest scenariu printre elementele controlate de către dispozitiv sunt electrovanele de apă în caz de inundație. Acestea sunt amplasate în fiecare cameră pentru a nu perturba toată instalația de apă din cauza unui singur incident.
Astfel, când avem o posibilă inundație în bucătărie, detectorul de inundație simte acest lucru odată ce ia contact cu apa și transmite un semnal către dispozitiv. Acesta va lua ca măsură închiderea electrovanei de apă din bucătărie. Acesta trimite practic un semnal electric continuu către electrovană, aceasta schimbându-și starea și oprind apa. Am mai gândit sistemul, ca atunci când se întâplă un astfel de evenimet, să oprească și curentul din bucătărie, acționând releul ce controlează siguranța respectivă.
Semnalul dat continuu se oprește dacă detectorul de inundație nu mai simte apă, dacă se întrerupe conexiunea fizică cu placa Arduino sau dacă placa Arduino este scoasă de la sursa de energie.
Fig. 11 – Detector inundație
Dacă scoatem placa Arduino de la sursa de energie și o recuplăm, iar semnalul dat de detectorul de inundație este în continuare activ, electrovana se va reactiva, oprind apa.
Dispozitivul, după cum am mai menționat, poate controla și alimentarea cu energie. Distribuția de curent a fost făcută astfel încât siguranțele să fie distribuite uniform pentru a putea controla pe zone tot Resort-ul. Deoarece este un Resort și nu avem nevoie ca prizele să funcționeze tot timpul în tandem cu lumina, putem controla lumina și prizele prin același circuit de bază.
Sunt mai multe situații când acest circuit al unui dormitor de exemplu trebuie oprit, din rațiuni de siguranță dar și financiare.
Primul scenariu ar fi acela în care detectorul de fum instalat în dormitor simte începutul unui incendiu. Odată activat detectorul, acesta trimite un semnal către placa Arduino, iar aceasta, ca primă măsură, oprește siguranța ce alimentează respectivul dormitor.
Fig. 12 – Detector de fum
A doua măsură este să dea un semnal către sirena exterioară, pentru a anunța angajații și clienții de posibilul incendiu. Aceste semnale sunt date atât timp cât detectorul simte fumul. Odată aerisit, acesta nu mai trimite semnale, iar curentul repornește și sirena se oprește.
Fig. 13 – Sirena cu flash
Siguranța este oprită prin amplasarea unui releu sau contactor înaintea ei în circuit. Odată ce releul sau contactorul își schimbă starea, oprește curentul ce intră în siguranță. Astfel, putem preciza că de fapt siguranța nu sare, ci nu mai primește curent. Odată cu revenirea la normal, aceasta își primește curentul în mod automat, nefiind necesară intervenția unui utilizator să ridice siguranța.
În anumite situații se pot pune încă două relee pe circuitele separate ale dormitorului, putând opri în mod independent lumina față de prize.
În proiect am prevăzut o siguranță amplasată în tabloul electric general pentru fiecare zonă, și încă un set de două siguranțe amplasate local în fiecare zonă, pentru a putea împărți lumina de prize. Dar contactorul / releul există doar în tabloul general.
Fig. 14 – Parte din schema bloc, reprezentând tabloul electric general
Pentru acționarea releelor de dinaintea siguranțelor vor trebui folosite niște tranzistoare, deoarece placa Arduino furnizează pe fiecare ieșire o tensiune de 5V și un curent de maxim 40mA. Astfel va trebui să facem o tensiune de 12V pentru a putea controla respectivele relee / contactoare.
Fig. 15 – Schema bloc control siguranță
Având un releu de 12 volți și măsurându-i rezistența între capetele bobinate putem deduce intensitatea curentului de care avem nevoie pentru a-l putea acționa și putem verifica dacă este îndeajuns ce ne furnizează placa Arduino.
Urmează ca mai apoi să calculăm valoarea rezistenței ce trebuie folosită pentru a nu arde tranzistorul.
O altă variantă mai simplă ar fi să folosim un releu de 5V / 230VAC cu un consum de sub 40 mA, astfel putând fi controlat direct de către placa Arduino. Circuitul va fi același, fiind indicat să folosim în continuare un tranzistor.
Siguranța folosită trebuie să fie în mod normal o siguranță diferențială. Diferența dintre o siguranță normală și una diferențială este că cea diferențială compară doi curenți dintr-un circuit electric: cel care pleacă de la sursă și cel care se întoarce la sursa de alimentare.
Acești doi curenți într-un mod normal de funcționare trebuie să fie egali în limita unor toleranțe general acceptate. În momentul când curentul care se întoarce la sursă nu mai este comparabil egal cu cel care pleacă, există posibilitatea ca datorită unui defect de izolație al conductoarelor circuitului un curent de defect să se inchidă pe alt traseu prin carcase puse la împământare sau prin atingerea corpului uman pus în legatură cu pământul sau sistemul de punere la pământ.
Tranzistorul este un dispozitiv electronic din categoria semiconductoarelor care are cel puțin trei terminale (borne sau electrozi), care fac legătura la regiuni diferite ale cristalului semiconductor. Este folosit mai ales pentru a amplifica și a comuta semnale electronice și putere electrică.
Tranzistorul este o componentă fundamentală a dispozitivelor electronice moderne și este omniprezent în sistemele electronice. Ca urmare a dezvoltării sale la începutul anilor 1950, tranzistorul a revoluționat domeniul electronicii și a deschis calea pentru echipamente electronice mai mici si mai ieftine cum ar fi aparate de radio, televizoare, telefoane mobile, calculatoare de buzunar, computere și altele.
Tranzistorul a fost inventat la Bell Telephone Laboratories din New Jersey la 6 decembrie 1947.
Fig. 16 – Tranzistor PNP bipolar
Releul este un aparat care, sub acțiunea mărimii de intrare, realizează o variație în salt (de multe ori prin comutarea unor contacte) a mărimii de ieșire, în scopul comenzii altor elemente (contactoare, etc.).
Principiul de funcționare al unui releu electromagnetic este foarte simplu: când bobina electromagnetului este alimentată în curent continuu sau alternativ, ea exercită asupra armăturii mobile o forță de atracție care pune în mișcare această armătură în cazul în care forța de atracție a resortului antagonist este depășită.
În mișcarea sa, armătura mobilă închide (sau deschide, după caz) o pereche sau mai multe contacte electrice, închizând (sau deschizând) un circuit electric de acționare a unui anumit dispozitiv.
Aminteam mai devreme că trebuie avut grijă când planificăm circuitul obiectivului de controlat pentru că putem avea și elemente care în mod normal nu trebuie să funcționeze când dispozitivul Arduino nu funționează.
Cel mai simplu exemplu este cel cu electrovanele de apă deoarece unele vor fi gândite să funcționeze în mod normal-deschis iar altele în mod normal-închis.
Cele care trebuie să funcționeze în mod normal-închis sunt vanele de apă din incinte (dormitoare, bucătărie, living-room etc.). Am prevăzut în proiect și o serie de trei vane de apă amplasate în exterior, ce vor facilita udatul grădinii. Acestea nu vor lăsa apa să treacă în modul normal de funționare (normal-deschis), ci vor fi acționate doar când utilizatorul vrea să ude grădina.
Aici trebuie luată în considerare și presiunea apei din zonă. De aceea am împărțit în trei locuri partea de udat a grădinii, putând să le activăm pe rând în funcție de debitul de apă la care avem acces.
Există de asemenea posibilitatea de a adăuga senzori de debit la fiecare vană de apă, care să transmită datele la placa Arduino iar acesta în funcție de ce valori are la dispoziție, iar acesta să fie programat să își aleagă singur la câte vane de apă poate da drumul, astfel încât împărțirea debitului să fie egală și îndeajuns.
Fig. 17 – Electrovană apă
Așadar vor trebui luate două tipuri de electrovană de apă. Unele cu normal-închis pentru încăperi, iar altele cu normal-deschis pentru sistemul de udat grădina.
Modulul de acționare a ușii de garaj vine odată cu echipamentul ce se prinde pe ușa rulantă și are mai multe moduri de funcționare. Acesta poate primi un semnal de la placa Arduino și va deschide ușa, lasând-o deschisă până când va primi din nou același semnal, închizându-se. Aceasta se poate închide și singură după un anumit timp.
3.3 – CONTROL LA DISTANȚĂ
Controlul la distanță este condiționat de existența legăturii dintre dispozitivul Arduino și Internet. Pe lângă această legătură este necesară și existența unui site web găzduit online, pe care se va găsi fișierul de comenzi la care se va conecta direct dispozitivul nostru.
3.3.1 – GĂZDUIRE
Site-ul este găzduit contra cost la un provider de hosting. Acesta garantează că site-ul va fi online fără întreruperi astfel putând fi accesat în orice situație.
Site-ul web va fi compus din mai multe pagini interconectate între ele. Pagina de început va avea numele de fișier index.html și va cuprinde o scurtă descriere a proiectului împreună cu mai multe link-uri către proiect. Această pagină este accesibilă fără restricții și se poate accesa tastând în browser următoarea adresă: www.danraducanu.ro.
De menționat că acest site va fi disponibil doar pe durata prezentării proiectului.
Restul de pagini din cadrul site-ului vor fi accesibile cu user și parolă. Acestea se pot crea de către oricine, dar fiecare user va trebui adăugat manual de către administratorul site-ului într-o listă ce le dă acces doar la anumite pagini.
Odată ce încercăm să intrăm pe pagina de control al dispozitivului ne va cere să ne logăm. Dacă user-ul creat este adăugat și în lista ce ne poate da acces, atunci ne va direcționa către pagina de control, ce se află la adresa: www.danraducanu.ro/arduino.php
3.3.2 – COD HTML / CSS / PHP / JAVASCRIPT
Fișierul se numește arduino.php și conține o parte importantă din cod și începe prin verificarea dacă user-ul care s-a logat este admis pe pagina respectivă.
Acest lucru se face prin cod PHP ce verifică user-ul salvat în zona de cookies a browser-ului cu lista de useri agreați. Dacă userul nu face parte din listă vom fi redirecționați să ne logăm din nou.
if ( ( $_SESSION['user']['username'] != ‘user-acceptat’ ) )
{
header("Location: slogin/login.php");
}
Folderul în care am pus fișierele ce se ocupă de managementul userilor se numește “slogin”. Toate fișierele care se regăsesc în acest folder vor putea fi accesate prin adăugarea folder-ului înaintea paginii, ca în exemplul de mai sus:
slogin/login.php
Urmează partea de cod HTML a paginii:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dan Raducanu's Smart Device</title>
<link rel="stylesheet" href="css/css.css" />
<link rel="stylesheet" href="css/vaneapa.css" />
<link rel="stylesheet" href="css/lumina.css" />
<script src="js/js.js"></script>
</head>
Declarăm pentru început ce fel de pagină web este, prin prima linie de cod de mai sus. Urmează partea de <html> ce conține practic tot site-ul. Tot codul ce urmează a fi scris trebuie să fie conținut între aceste etichete <html>.
În partea de <head> se vor regăsi setările site-ului, cum ar fi declarații despre în ce limbă este site-ul web, ce titlu are, dar și legături făcute către alte fișiere.
Codul de forma: <link rel="stylesheet" href="css/css.css" /> face legătura între fișierul declarat și pagina noastră. Astfel fișierul de stiluri CSS își va face efectul și pe pagina noastră.
Am creat mai multe fișiere de stiluri CSS pentru a-mi fi mai ușor să organizez tot codul dar și fișiere externe de tip Javascript: <script src="js/js.js"></script>.
Urmează partea de comenzi. Aceste comenzi sunt de fapt opțiuni ale unui formular. Odată primite comenzile, sunt salvate într-un fișier text numit “arduino.txt”. Acest fișier este cel citit de către dispozitiv și conține comenzi pentru activarea și dezactivarea pinilor plăcii.
Toate aceste comenzi sunt plasate peste o poză de fundal ce reprezintă planul resortului. Am încercat să le plasez exact peste zonele pe care le controlează pentru a fi ușor de înțeles.
Fig. 18 – Print-screen site – butoane de tip radio găsite în primul formular
Formularul conține mai multe butoane de tip radio, fiecare activare având două opțiuni, deshis și închis.
<form action="arduino.php" method="POST">
În pagina discutată am programat mai multe formulare. Primul, și cel mai complex, își are codul pe care trebuie să îl ruleze chiar pe această pagină. Restul de formulare au trebuit mutate către pagini separate din cauze tehnice. Nu pot rula mai multe formulare cu trimitere la aceeași pagină.
<form action="c2.php" method="POST">
Fișierul c2.php conține codul PHP rulat de către al doilea formular. În total sunt 12 formulare, deoarece am vrut să adaug cât mai mult control utilizatorului.
După cum am menționat, primul formulare face trimitere la codul PHP ce se găsește chiar pe pagina arduino.php și este mai complex deoarece are multe opțiuni din care putem alege. Conține toate comenzile pe care le-am putea da plăcii Arduino, iar aceste comenzi se pot da și separat, nefiind nevoie să le bifăm pe toate.
Odată ce bifăm una din selecții, aceasta este setată să iși schimbe culoarea bordurii ce o înconjoară.
Fig. 19 – Print-screen site – butoane de tip radio bifate
Avem culoarea verde când selectem ON pentru o electrovană de apă, albastru când selectăm ON pentru siguranță de lumină și prize sau roșu când selectăm OFF la oricare din selecții.
Aceste modificări sunt posibile prin folosirea tehnologiei Javascript.
function changeroomled13() {
if (document.getElementById("ledon13").checked == true) {
document.getElementById("pin13").style.borderColor = "green";
}
else if (document.getElementById("ledoff13").checked == true) {
document.getElementById("pin13").style.borderColor = "red";
}
else {
// DO NOTHING
}
}
Funcția ce are rolul de a face aceste schimbări pinului 13 are codul de mai sus. Practic, se verifică daca butonul radio ON este bifat și i se dă prin modificarea stilurilor CSS culoarea verde. Dacă nu e bifat, se verifică butonul OFF. Acestuia i se dă culoarea roșu dacă se găsește bifat. Dacă nu e niciunul bifat nu se întâmplă nimic.
Fiecare pin are funcția lui specifică, deoarece acestea pot fi diferite și au nevoie de culori separate.
Tot codul Javascript se găsește în fișierul js.js din folderul js. Astfel adresa lui când facem referire la fișier este: js/js.js
Odată selectate cu ON sau OFF putem apăsa butonul TRIMITE pentru a trimite comenzile selectate în formular, către fișierul text.
Fig. 20 – Butonul ce trimite comenzile către fișierul text
Pentru a prezenta și partea de setări ale butoanelor radio, vom lua ca exemplu pinul 13.
<div id="pin13">
<input type="radio" name="led13" id="ledon13" value="13/1" onClick="changeroomled13()"><div class="ON">ON</div> <br />
<input type="radio" name="led13" id="ledoff13" value="13/0" onClick="changeroomled13()"><div class="OFF">OFF</div> <br />
</div>
Eticheta <div> reprezintă o diviziune în cadrul codului HTML. Astfel o putem considera o secțiune ce poate fi ușor editată și aranjată în pagină. În cadrul aceste secțiuni găsim cele două butoane radio ON și OFF. Acestea, pentru a funționa împreună, au același nume name="led13". Având același nume, nu se pot apăsa amândouă în același timp.
După ce am scris toate opțiunile, în cadrul aceluiași formular, trebuie setat și butonul ce preia comenzile și le transmite către fișierul text meționat mai devreme.
<div id="trimite">
Selectează toate opțiunile de pe planșă și: <br />
<input type="submit" name="submit" value="Trimite" style="height:50px; width:100px;">
</div>
În cadrul butonului am setat și stiluri CSS în linie. style="height:50px; width:100px; ce setează înălțimea și lățimea butonului.
Codul PHP rulat de acest formular este:
<?php
if ( isset($_POST['led13']) )
$data = "\n" . $_POST['led13'] . "\n" ;
$put = file_put_contents('arduino.txt', $data);
if($put == false) {
die('Nu s-a putut conecta la Sistem');
}
else {
echo "Date trimise cu succes";
}
}
else {
echo "Nu s-a ales nicio optiune";
}
Se verifică dacă opțiunea ledului 13 este bifată. Dacă este, atunci există conținut în variabila preluată din formular $_POST['led13'] și se concatenează cu restul de comenzi, dacă acestea sunt disponibile.
Se crează o variabilă $put ce are funcția de a pune date în fișierul text declarat. Dacă nu se poate găsi și salva fișierul va da o eroare. Dacă nu s-a bifat nicio secțiune atunci ne va spune acest lucru, iar fișierul text va rămâne neschimbat.
3.3.3 – PANOU COMANDĂ
În partea dreaptă a imaginii de fundal se află un panou de comandă ce conține mai multe comenzi ce se pot salva în fișierului text.
Fig. 21 – Panoul de comandă regăsit pe site
Opțiunile aduse de acest panou de comandă sunt explicate chiar prin denumire și aduc un plus de ajutor pentru utilizator. Sunt practic niște comenzi rapide.
Butonul rapid “Dezactivează toate opțiunile” se poate folosi în situații extreme când vrei să ai totul închis. Acesta nu trimite semnale către ușa garajului.
Butonul “Dezactivează vane apă” se referă doar la electrovanele din interiorul încăperilor. Pentru vanele exterioare se folosesc comenzile dedicate pentru fiecare din cele trei acționări.
Fiind pe pagini separate codul PHP al formularelor, acesta conține în fruntea paginii o comandă de redirecționare către pagina arduino.php, fără de care ne-ar fi deschis o pagină goală. Comanda se face prin folosirea funcției header.
header("Location: arduino.php");
Trebuie reținut că această funcție rulează corect doar atunci când este declarată înainte de orice cod HTML sau PHP.
3.3.4 – ALIMENTAREA DISPOZITIVULUI
Dispozitivul Arduino se va alimenta din sursă separată de energie ce nu se poate dezactiva de la distanță. Pe același circuit este indicat să se pună și partea de aparatură ce furnizează internetul, pentru a nu întrerupe legătura la internet.
3.4 – SCHEMA BLOC
Legendă:
C = Contactor / Releu
S = Siguranță
H2O = Electrovană apă
P = Priză
B = Bec
F+G = Detector fum + gaz
INU = Detector inundație
USĂ = Modul ușă garaj
CAP 4 – CONCLUZII
Importanța Internetului în zilele noastre este deja cunoscută iar exploatarea oportunitaților oferite de acesta trebuie să fie o prioritate pentru oricine.
La baza proiectului de control al unui dispozitiv Arduino stă conexiunea acestuia la internet și programarea ce îl face pe acesta un sistem automatizat și inteligent.
Sistemul creat este maleabil, potrivindu-se cu diverse situații complexe sau mai puțin complexe. Ceea ce îl face ideal este costul de achiziție și ușurința de punere în practică, aducând un plus de comoditate și siguranță.
Există deasemenea posibilități de dezvoltare continuă. Acest proiect ce se axează pe controlul unui obiectiv de tip “Resort” poate fi folosit în mai multe situații, cum ar fi:
Automatizarea unei case
Automatizarea unui birou
Automatizarea unei fabrici
Protejarea unui spațiu pe o perioadă scurtă de timp
ANEXA A. Programarea în mare a dispozitivului
/*
PLATFORMA ONLINE DE CONTROL AL UNUI DISPOZITIV
by RADUCANU GEORGE DANIEL
*/
#include <Bridge.h>
#include <YunClient.h>
#include <HttpClient.h>
void setup() {
// setare intrari / iesiri
// în cazul de fata de la pinnul 2 la 20 inclusiv
setpinmode();
// pornire Bridge
// led-urile sunt doar pentru semnalizare incepere
digitalWrite(13, LOW);
Bridge.begin();
digitalWrite(13, HIGH);
delay(5000);
digitalWrite(13, LOW);
}
void loop() {
// rulare functie de citire fisier de pe un anume site
connect2site();
}
void connect2site() {
// creare client
HttpClient client;
// download fisier de pe site
client.get("www.danraducanu.ro/arduino.txt");
// citire fisier bit cu bit
// cand citeste un spatiu
while (client.read() == '\n')
{
// creaza doua obiecte
int pin, value;
// prima variabila, pin ia valoarea ce se citeste pana în..
pin = client.parseInt();
// momentul în care citeste un 'slash'
if (client.read() == '/')
{
// variabila urmatoare citeste dupa 'slash' ce a mai ramas pana
// la urmatorul spatiu
value = client.parseInt();
}
// cand ajunge la spatiu, pana să inceapa din nou creaza o comanda
digitalWrite(pin,value);
}
// asteapta 2 secunde dupa ce termina de citit fisierul
// pentru situatii unde consumul de internet este o problema
// se va alege un delay mai mare
delay(2000);
}
void setpinmode() {
// se creaza valori de minim si maxim
int inMin = 2;
int inMax = 20;
// o functie FOR în care se ia fiecare pin din interval
// si i se seteaza valoarea OUTPUT
for(int i=inMin; i<=inMax; i++)
{
pinMode(i, OUTPUT);
}
}
ANEXA B. Programarea în mare a platformei online
arduino.php
<?php
// se ruleaza setarile pentru modulul de LOGIN
require("slogin/common.php");
if ( ($_SESSION['user']['username'] != 'danraducanu') )
{
// daca userul salvat dupa logare nu este cel pe care il vrem, redirectionam catre LOGIN
header("Location: slogin/login.php");
die("Redirecting to login.php");
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dan Raducanu's Smart Device</title>
<link rel="stylesheet" href="css/css.css" />
<link rel="stylesheet" href="css/vaneapa.css" />
<link rel="stylesheet" href="css/lumina.css" />
<script src="js/js.js"></script>
</head>
<body id="body">
<div id="macheta">
</div> <!– macheta –>
<form action="arduino.php" method="POST">
<div id="pin13">
<input type="radio" name="led13" id="ledon13" value="13/1" onClick="changeroomled13()"><div class="ON">ON</div> <br />
<input type="radio" name="led13" id="ledoff13" value="13/0" onClick="changeroomled13()"><div class="OFF">OFF</div> <br />
</div>
<div id="pin12">
<input type="radio" name="led12" id="ledon12" value="12/1" onClick="changeroomled12()"><div class="ON">ON</div> <br />
<input type="radio" name="led12" id="ledoff12" value="12/0" onClick="changeroomled12()"><div class="OFF">OFF</div> <br />
</div>
<div id="trimite">
Selectează toate opțiunile de pe planșă și: <br />
<input type="submit" name="submit" value="Trimite" style="height:50px; width:100px;">
</div> <!– trimite –>
</form>
<div id='formdata' >
<?php
if ( isset($_POST['led13']) || isset($_POST['led12']) ) {
$data = "\n"
.
$_POST['led13'] . "\n"
.
$_POST['led12'] . "\n"
}
$put = file_put_contents('arduino.txt', $data);
if($put == false) {
die('Nu s-a putut conecta la Sistem');
}
else {
echo "Date trimise cu succes";
}
}
else {
echo "Nu s-a ales nicio optiune";
}
?>
</div> <!– formdata –>
<div id="panou">
<strong>Panou comandă</strong>
</div> <!– panou –>
<form action="c2.php" method="POST">
<div id="dezactiveazatoate">
Sau dezactivează toate opțiunile:<br />
<input type="submit" name="submit" value="Dezactivează toate opțiunile" style="height:50px; width:200px;">
</div> <!– dezactiveazatoate –>
</form> <!– form dezactiveazatoate –>
<div id="back">
<a href="/slogin/private.php">Înapoi la pagina de administrare cont!</a>
</div>
</body>
</html>
common.php
<?php
$username = "securyta_arduino";
$password = "jl0jl0jl0a1";
$host = "localhost";
$dbname = "securyta_arduino";
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try
{
$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
}
catch(PDOException $ex)
{
die("Failed to connect to the database: " . $ex->getMessage());
}
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
{
function undo_magic_quotes_gpc(&$array)
{
foreach($array as &$value)
{
if(is_array($value))
{
undo_magic_quotes_gpc($value);
}
else
{
$value = stripslashes($value);
}
}
}
undo_magic_quotes_gpc($_POST);
undo_magic_quotes_gpc($_GET);
undo_magic_quotes_gpc($_COOKIE);
}
header('Content-Type: text/html; charset=utf-8');
session_start();
css.css
#body {
margin-top:20px;
}
#macheta {
width:800px;
height:500px;
overflow:hidden;
background-image:url(../macheta/background-site.jpg);
background-repeat:no-repeat;
background-size:contain;
}
#back {
background-color:cadetblue;
border:solid;
border-color:#640102;
width:100px;
height:30px;
font-size:11px;
text-align:center;
position:absolute;
margin-left: 595px;
margin-top: -51px;
padding-top: 3px;
}
a:link {
color:white;
text-decoration:none;
}
a:visited {
color:white;
text-decoration:none;
}
a:hover {
color:black;
text-decoration:none;
}
#led13 {
border:solid;
}
.ON {
background-color:#01A814;
font-size:9px;
float:left;
margin-top: 4px;
margin-left: 4px;
}
.OFF {
background-color:#A60909;
font-size:9px;
float:left;
clear:right;
margin-top: 4px;
}
#panou {
border: solid;
border-color: #640102;
/* margin-top: -501px; */
/* margin-left: 689px; */
width: 220px;
height: 520px;
text-align: center;
padding-top: 5px;
position: absolute;
margin-top: -515px;
margin-left: 698px;
background-color: cadetblue;
border-radius: 27px;
}
Js.js
function changeroomled13() {
if (document.getElementById("ledon13").checked == true) {
document.getElementById("pin13").style.borderColor = "green";
}
else if (document.getElementById("ledoff13").checked == true) {
document.getElementById("pin13").style.borderColor = "red";
}
else {
// DO NOTHING
}
}
function changeroomled18() {
if (document.getElementById("ledon18").checked == true) {
document.getElementById("pin18").style.borderColor = "blue";
}
else if (document.getElementById("ledoff18").checked == true) {
document.getElementById("pin18").style.borderColor = "red";
}
else {
// DO NOTHING
}
}
Login.php
<?php
require("common.php");
$submitted_username = '';
if(!empty($_POST))
{
$query = "
SELECT
id,
username,
password,
salt,
FROM users
WHERE
username = :username
";
$query_params = array(
':username' => $_POST['username']
);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}
$login_ok = false;
$row = $stmt->fetch();
if($row)
{
$check_password = hash('sha256', $_POST['password'] . $row['salt']);
for($round = 0; $round < 65536; $round++)
{
$check_password = hash('sha256', $check_password . $row['salt']);
}
if($check_password === $row['password'])
{
// If they do, then we flip this to true
$login_ok = true;
}
}
if($login_ok)
{
unset($row['salt']);
unset($row['password']);
$_SESSION['user'] = $row;
header("Location: private.php");
die("Redirecting to: private.php");
}
else
{
print("Login Failed.");
$submitted_username = htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8');
}
}
?>
ANEXA A. Programarea în mare a dispozitivului
/*
PLATFORMA ONLINE DE CONTROL AL UNUI DISPOZITIV
by RADUCANU GEORGE DANIEL
*/
#include <Bridge.h>
#include <YunClient.h>
#include <HttpClient.h>
void setup() {
// setare intrari / iesiri
// în cazul de fata de la pinnul 2 la 20 inclusiv
setpinmode();
// pornire Bridge
// led-urile sunt doar pentru semnalizare incepere
digitalWrite(13, LOW);
Bridge.begin();
digitalWrite(13, HIGH);
delay(5000);
digitalWrite(13, LOW);
}
void loop() {
// rulare functie de citire fisier de pe un anume site
connect2site();
}
void connect2site() {
// creare client
HttpClient client;
// download fisier de pe site
client.get("www.danraducanu.ro/arduino.txt");
// citire fisier bit cu bit
// cand citeste un spatiu
while (client.read() == '\n')
{
// creaza doua obiecte
int pin, value;
// prima variabila, pin ia valoarea ce se citeste pana în..
pin = client.parseInt();
// momentul în care citeste un 'slash'
if (client.read() == '/')
{
// variabila urmatoare citeste dupa 'slash' ce a mai ramas pana
// la urmatorul spatiu
value = client.parseInt();
}
// cand ajunge la spatiu, pana să inceapa din nou creaza o comanda
digitalWrite(pin,value);
}
// asteapta 2 secunde dupa ce termina de citit fisierul
// pentru situatii unde consumul de internet este o problema
// se va alege un delay mai mare
delay(2000);
}
void setpinmode() {
// se creaza valori de minim si maxim
int inMin = 2;
int inMax = 20;
// o functie FOR în care se ia fiecare pin din interval
// si i se seteaza valoarea OUTPUT
for(int i=inMin; i<=inMax; i++)
{
pinMode(i, OUTPUT);
}
}
ANEXA B. Programarea în mare a platformei online
arduino.php
<?php
// se ruleaza setarile pentru modulul de LOGIN
require("slogin/common.php");
if ( ($_SESSION['user']['username'] != 'danraducanu') )
{
// daca userul salvat dupa logare nu este cel pe care il vrem, redirectionam catre LOGIN
header("Location: slogin/login.php");
die("Redirecting to login.php");
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dan Raducanu's Smart Device</title>
<link rel="stylesheet" href="css/css.css" />
<link rel="stylesheet" href="css/vaneapa.css" />
<link rel="stylesheet" href="css/lumina.css" />
<script src="js/js.js"></script>
</head>
<body id="body">
<div id="macheta">
</div> <!– macheta –>
<form action="arduino.php" method="POST">
<div id="pin13">
<input type="radio" name="led13" id="ledon13" value="13/1" onClick="changeroomled13()"><div class="ON">ON</div> <br />
<input type="radio" name="led13" id="ledoff13" value="13/0" onClick="changeroomled13()"><div class="OFF">OFF</div> <br />
</div>
<div id="pin12">
<input type="radio" name="led12" id="ledon12" value="12/1" onClick="changeroomled12()"><div class="ON">ON</div> <br />
<input type="radio" name="led12" id="ledoff12" value="12/0" onClick="changeroomled12()"><div class="OFF">OFF</div> <br />
</div>
<div id="trimite">
Selectează toate opțiunile de pe planșă și: <br />
<input type="submit" name="submit" value="Trimite" style="height:50px; width:100px;">
</div> <!– trimite –>
</form>
<div id='formdata' >
<?php
if ( isset($_POST['led13']) || isset($_POST['led12']) ) {
$data = "\n"
.
$_POST['led13'] . "\n"
.
$_POST['led12'] . "\n"
}
$put = file_put_contents('arduino.txt', $data);
if($put == false) {
die('Nu s-a putut conecta la Sistem');
}
else {
echo "Date trimise cu succes";
}
}
else {
echo "Nu s-a ales nicio optiune";
}
?>
</div> <!– formdata –>
<div id="panou">
<strong>Panou comandă</strong>
</div> <!– panou –>
<form action="c2.php" method="POST">
<div id="dezactiveazatoate">
Sau dezactivează toate opțiunile:<br />
<input type="submit" name="submit" value="Dezactivează toate opțiunile" style="height:50px; width:200px;">
</div> <!– dezactiveazatoate –>
</form> <!– form dezactiveazatoate –>
<div id="back">
<a href="/slogin/private.php">Înapoi la pagina de administrare cont!</a>
</div>
</body>
</html>
common.php
<?php
$username = "securyta_arduino";
$password = "jl0jl0jl0a1";
$host = "localhost";
$dbname = "securyta_arduino";
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try
{
$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
}
catch(PDOException $ex)
{
die("Failed to connect to the database: " . $ex->getMessage());
}
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
{
function undo_magic_quotes_gpc(&$array)
{
foreach($array as &$value)
{
if(is_array($value))
{
undo_magic_quotes_gpc($value);
}
else
{
$value = stripslashes($value);
}
}
}
undo_magic_quotes_gpc($_POST);
undo_magic_quotes_gpc($_GET);
undo_magic_quotes_gpc($_COOKIE);
}
header('Content-Type: text/html; charset=utf-8');
session_start();
css.css
#body {
margin-top:20px;
}
#macheta {
width:800px;
height:500px;
overflow:hidden;
background-image:url(../macheta/background-site.jpg);
background-repeat:no-repeat;
background-size:contain;
}
#back {
background-color:cadetblue;
border:solid;
border-color:#640102;
width:100px;
height:30px;
font-size:11px;
text-align:center;
position:absolute;
margin-left: 595px;
margin-top: -51px;
padding-top: 3px;
}
a:link {
color:white;
text-decoration:none;
}
a:visited {
color:white;
text-decoration:none;
}
a:hover {
color:black;
text-decoration:none;
}
#led13 {
border:solid;
}
.ON {
background-color:#01A814;
font-size:9px;
float:left;
margin-top: 4px;
margin-left: 4px;
}
.OFF {
background-color:#A60909;
font-size:9px;
float:left;
clear:right;
margin-top: 4px;
}
#panou {
border: solid;
border-color: #640102;
/* margin-top: -501px; */
/* margin-left: 689px; */
width: 220px;
height: 520px;
text-align: center;
padding-top: 5px;
position: absolute;
margin-top: -515px;
margin-left: 698px;
background-color: cadetblue;
border-radius: 27px;
}
Js.js
function changeroomled13() {
if (document.getElementById("ledon13").checked == true) {
document.getElementById("pin13").style.borderColor = "green";
}
else if (document.getElementById("ledoff13").checked == true) {
document.getElementById("pin13").style.borderColor = "red";
}
else {
// DO NOTHING
}
}
function changeroomled18() {
if (document.getElementById("ledon18").checked == true) {
document.getElementById("pin18").style.borderColor = "blue";
}
else if (document.getElementById("ledoff18").checked == true) {
document.getElementById("pin18").style.borderColor = "red";
}
else {
// DO NOTHING
}
}
Login.php
<?php
require("common.php");
$submitted_username = '';
if(!empty($_POST))
{
$query = "
SELECT
id,
username,
password,
salt,
FROM users
WHERE
username = :username
";
$query_params = array(
':username' => $_POST['username']
);
try
{
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}
$login_ok = false;
$row = $stmt->fetch();
if($row)
{
$check_password = hash('sha256', $_POST['password'] . $row['salt']);
for($round = 0; $round < 65536; $round++)
{
$check_password = hash('sha256', $check_password . $row['salt']);
}
if($check_password === $row['password'])
{
// If they do, then we flip this to true
$login_ok = true;
}
}
if($login_ok)
{
unset($row['salt']);
unset($row['password']);
$_SESSION['user'] = $row;
header("Location: private.php");
die("Redirecting to: private.php");
}
else
{
print("Login Failed.");
$submitted_username = htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8');
}
}
?>
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Platforma Online de Control al Unui Dispozitiv Programabil (ID: 150121)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
