Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul curent reprezintă implementarea unei alarme de casă. Scopul proiectului a fost crearea unei aplicații care să aibă o tentă practică, să exemplifice legarea și controlarea diferitelor dispozitive periferice la microcontroler (tastatură, senzori, lcd, buzzer) și folosirea acestora într-o aplicație de tip ”finite state machine”.
Proiectul este util deoarece arată cum anume poate fi creată o aplicație interesantă, folosind un nivel nu foarte avansat de cunostințe; de asemenea, se pot observa toți pașii care au fost făcuți în realizarea acestia: design-ul inițial, cumpărarea pieselor, montarea acestora și scrierea codului.
Componentele principale ale proiectului sunt: placa de baza (cea din etapa 1), tastatura, lcd-ul, buzzer-ul, senzorul de distanță și microswitch-urile (pe post de senzori suplimentari). Alarma se poate afla in trei stari: NOT ARMED, ARMED INTRUSION și ALARM. Diagrama de stari si tranzitii este urmatoarea:
Schema bloc a proiectului este:
Initial alarma se află în stadiul de NOT ARMED (lucru evidențiat de LCD). Pentru a o arma, se introduce, folosind tastatura, codul de alarmă. Pentru aceasta se folosesc tastele 0-9
ale tastaturii, tasta *
fiind delete (se șterge ultima cifră introdusă). Pentru memorarea codului și trecerea în starea ARMAT se apasă tasta #
. După aceasta se produce un timeout de 10 secunde, evidentiat de clipirea LED-ului.
În acest moment alarma se află în stadiul ARMED. Senzorii devin activi, iar orice declanșare a acestora trece alarma în modul INTRUSION. Acest mod, care dureaza 15s, activeaza buzzer-ul pentru intervale scurte și îi da voie utilizatorului să introducă codul pentru dezactivarea alarmei. Dacă dupa 15 secunde utilizatorul nu a făcut acest lucru, alarma trece în modul ALARM, si buzzer-ul începe să sune încontinuu. Și în această stare, dacă utilizatorul introduce codul de verificare, alarma trece în modul NOT ARMED.
Lista de componente folosite | ||||
---|---|---|---|---|
Nume | De unde a fost cumparata | Cost / bucata | Numar bucati | Cost total |
LCD | Conex Electronic | 27 | 1 | 27 |
Tastatura 16 taste | Conex Electronic | 30 | 1 | 30 |
Microswitch | Conex Electronic | 4 | 2 | 8 |
Buzzer | Conex Electronic | 6 | 1 | 6 |
Cablu UTP | Conex Electronic | 1.5 | 2 | 3 |
Placa test 150×100 | Conex Electronic | 12 | 1 | 12 |
Fludor | Conex Electronic | 20 | 1 | 20 |
Bareta 36 pini tata | Conex Electronic | 1.5 | 1 | 1.5 |
Bareta 20 pini mama | Conex Electronic | 2.5 | 3 | 7.5 |
Senzor distanta | Okazii.ro | 14 | 1 | 14 |
Varnis | Conex Electronic | 1 | 1 | 1 |
Pe post de senzor de distanță am cumpărat un senzor HC-SR04. Acesta are doi pini cu care se face măsurarea distanței: unul de trigger și altul de echo. Dupa ce se trimite un impuls pe pinul de trigger, se măsoara durata impulsului de răspuns de pe echo, iar depinzând de aceasta, se determină cât de departe e obiectul din fața senzorului. Schemă de folosire:
Implementarea propriu-zisă a alarmei este de fapt un automat cu mai multe stări, tranzițiile dintre stări fiind determinate de apariția unor evenimente.
Pentru lucrul cu LCD-ul am folosit fișierele lcd.h/lcd.c puse la dispozitie în cadrul laboratorului.
Verificarea apăsării unui buton al tastaturii se face trimițând un impuls pe rândul butonului respectiv, și apoi verificând pe rând coloanele tastaturii. Dacă vreuna este activă, atunci butonul determinat de (rand, coloana) a fost apăsat. Atunci cand un buton este apăsat el se contorizează o singură dată, programul ciclând atunci cât timp acesta este apăsat.
Comanda buzzerului și aflarea stării senzorilor se face setând pinii asociați pe 1, respectiv verificând dacă sunt 0.
Implementarea timeout-ului se face folosind timere și întreruperi. Timerul 1 este setat să genereze o întrerupere la fiecare secundă atunci când alarma este într-unul din modurile ARMED, INTRUSION sau ALARM. In modul ARMED, întreruperea timerului verifică dacă s-a apăsat vreun senzor (aceasta este o verificare suplimentara, pe lângă cea din main, pentru a evita cazul în care utilizatorul ține un buton de la tastatura apasat la infinit, ceea ce ar impiedica declanșarea senzorului). În modul INTRUSION, întreruperea timerului activează buzzer-ul pentru 100ms și apoi îl oprește (pentru a se genera un piuit); de asemenea, la 15 astfel de întreruperi se trece în modul ARMED. În modul ARMED, întreruperea activează LCD-ul cu mesajul ”ALARM!!” pentru 200 ms - astfel generându-se o clipire a acestuia.
Citirea senzorului de distanță se face tot folosind timere: o dată ce a fost trimis un impuls pe pinul TRIGGER, se declanseaza un timer cu un prag de 50 us, care va verifica starea pinului ECHO. La final, pe baza acestuia se va determina cât de mare a fost durata răspunsului.
A fost o experienta intresantă :). Am învațat, pe lângă programarea microcontroller-ului, să lipesc componente pe placă, să fac și un design hardware al proiectului și să știu de ce piese am nevoie și de unde să le cumpăr. Pentru mine, a fost un proiect reușit (chiar dacă nu a fost foarte greu sau spectaculos), pe care am reușit să îl duc până la capăt.