I ovog puta očekuje vas kreativan projekat! 🙂
Kratak pregled projekta:
U prethodnom projektu Arduino radionice pravili smo digitalni metar uz pomoć ultrazvučnog senzora, nadam se da ga niste trajno zalepili jer će nam i sada on trebati!
Potrebno:
- Arduino
- 4×4 matrična tastatura (matrix keypad)
- ultrazvučni senzor HC SR04
- buzzer (piezo zvučnik)
- 2 LED
- kratkospojnici
- lepak
- plastična kutija
- 330R i 100R otpornici
Alarm je osmišljen tako da ima tastaturu za unos šifre, senzor koji će da detektuje otvaranje vrata (ili određenog kretanja) i buzzer koji predstavlja sirenu.
Buzzer je piezoelektrični element koji radi kao jednostavan zvučnik, koristi se za signalizaciju pištanjem različitih frekvencija, veoma jednostavan za korišćenje. Drugi naziv – Biper (beeper). Ukoliko ne nađete gde biste kupili buzzer možete ga izvaditi iz starog PC kućišta, što će vam olakšati povezivanje jer već na sebi ima konektore. Ja sam koristio takav.
Više o piezo elementima
Oni se mogu primenjivati na 2 načina. Najčešće se koriste za merenje nekih vibracija ili pritiska, tada element pretvara mehaničku u električnu energiju. U našem slučaju radi obrnuto. Električnu energiju koju mu šaljemo, tj. signal, pretvara u mehaničku, tako što vrlo tanak disk osciluje u zadatim frekvencijama i stvara zvuk. Taj fenomen naziva se piezoelektrični efekat.
Buzzeri se koriste svuda oko nas:
– u PC-ju – kada pokrenemo PC dobijemo kratak “bip”
– u klima uređajima – kada joj pošaljemo neku komandu ona “bipne”
– u “svirajućim” čestitkama – kada se otvore počinje da svira neka melodija
itd…
Matrične tastature se koriste u pojedinim uređajima koji nemaju specijalno komplikovan korisnički interfejs, ili ga uopšte ni nemaju. Ja sam se odlučio za 4×4 tastaturu jer je ona sasvim dovoljna za potrebe ovog projekta, mogao sam odabrati i 4×3 tastaturu, koja poseduje samo brojčanik, znak * i znak #, jer sada nećemo koristiti ostale tastere sem tih.
Više o matričnim tastaturama
Matrične tastature su, prosto rečeno, mreža tastera koja je povezana na specifičan način. Glavna ideja matričnih tastatura je smanjivanje potrebnih vodova za korišćenje, jer kada se ne bi koristio ovakav način povezivanja tastera bilo bi potrebno napraviti vod za svaki taster, što bi bilo previše. Tastatura 4×4 koju koristimo povezuje se pomoću 8 vodova, od kojih 4 za kolone i 4 za redove. Na slici ispod vidi se šematski prikaz te mreže. Princip rada ove tastature je takav da se kolone (ili redovi, zavisno od povezivanja) pojedinačno, u vrlo kratkim vremenskim razmacima postavljaju na visok naponski nivo, dok se redovi (ili kolone, takodje zavisi od povezivanja) proveravaju da li je njihovo stanje visoko ili nisko. Ako je visoko znači da je neki taster u tom redu pritisnut. Kako ćemo znati koji je od njih 4? Jednostavno, ako već kontrolišemo kada ćemo dovesti visok nivo na kolonu, i ako znamo da je isčitavanje nekog reda visok naponski nivo, onda znamo koji je taster u pitanju, jer znamo koju kolonu smo aktivirali i koji red je aktivan (po istom principu može se koristiti I negativna logika). E sad, mi nećemo pisati ceo program koji će ovo odrađivati već ćemo koristiti napravljenu biblioteku koju sam našao na internetu.
Ovakve tastature koriste se:
– u PC tastaturama – s tim što su mnogo kompleksnije, ima ih više u jednoj tastaturi i poseduju sopstvene kontrolere kako bi moglo da se ukombinuje toliko tastera
– u tzv. “ABC” tastaturama koje se koriste na starijim mobilnim telefonima
– u alarmnim uređajima
– u daljinskim upravljačima
– u kontrolama pristupa
itd…
O korišćenju UZ možete pročitati i u OVOM tutorijalu Arduino radionice
Sada kada smo se upoznali malo sa hardverom možemo da počnemo sa sklapanjem! 🙂
Korak 1
Ono što je prvi korak, naravno pored samih priprema za rad i obezbeđivanja potrebnih materijala i modula, biće iscrtavanje graničnika na plastičnoj kutiji.
Pod iscrtavanjem graničnika mislio sam na spoljne dimenzije tastature na gornjoj površini kutije, kako biste znali gde tačno da je zalepite kasnije, nakon toga obeležite sa zadnje strane poklopca mesto gde treba napraviti rupu za vodove iz tastature. Pored toga, označite mesta gde ćete postaviti i zalepiti Arduino, gde treba da isečete otvor za USB (i/ili konektor za napajanje), za UZ senzor, za buzzer i LE diode.
Korak 2
Naredni korak je isecanje svih proreza i rupa. Pošto sam koristio, verovali ili ne, kutiju od štapića za uši, sečenje i bušenje sam uradio pomoći običnog skalpela i šrafcigera. 🙂 Budite oprezni u toku ovog koraka!
Korak 3
Nakon što su sve rupe i prorezi isečeni dolazi na red sklapanje i lepljenje. Za lepljenje sam koristio vrući lepak, jer on se vrlo lako može odlepiti kako bih ponovo mogao da koristim Arduino ploču koju sam zalepio, zbog čega sam na nju naneo najmanje lepka, za razliku od UZ senzora kog sam zalio lepkom.
Kada zalepite neki od elemenata potrebno je oko 1 minut da lepak očvrsne. Budite pažljivi sa pištoljem za lepljenje ako ne pazite možete ulepiti i ono što ne treba!
Korak 4
Sada kada je sve nalepljeno i pričvršćeno, treba da se povežu svi elementi. Za povezivanje koristiti sliku ispod:
Korak 5
I za kraj, korak bez koga ceo uređaj ne bi imao smisla, ubacivanje koda! Postavio sam link za download .zip fajla u kome se nalaze source kod kao i biblioteka koja vam je neophodna ukoliko ćete koristiti ovaj kod.
Fajl možete preuzeti OVDE.
Ili možete samo baciti pogled na kod. Objašnjenja su data u kodu.
#define c1 1 //predstavlja prvu cifru sifre #define c2 2 //drugu cifru sifre... #define c3 3 //predefinisana sifra cije se vrednosti u toku izvrsavanja programa ne mogu promeniti #define c4 4 //dakle pocetna sifra je * za brisanje prethodnog slucajno ostalog unosa,pa 1234 pa # za potvrdu unosa #include //**************************************[ deklarisanje potrebno za UZ ]*** int trigPin = 13; //UZ trig pin int echoPin = 11; //UZ echo pin float pingTime; //vreme za koje je potrebno da emitovan impuls stigne do prepreke i vrati se float targetDistance; //udaljenost od prepreke u inchima float speedOfSound = 776.5; //aproksimativna brzina zvuka u miljama float cm; //rezervisanje promenljive za udaljenost u cm void merenje(); //************************************[ deklarisanje potrebno za tastaturu ]*** const byte ROWS = 4; //4 reda tastature const byte COLS = 4; //4 kolone tastature char hexaKeys[ROWS][COLS] = { //definisanje simbola tastera matricne tastature 4x4 { '1', '2', '3', 'A' } , { '4', '5', '6', 'B' } , { '7', '8', '9', 'C' } , { '*', '0', '#', 'D' } }; byte rowPins[ROWS] = {9, 8, 7, 6}; //pinovi na koje su povezani redovi tastature sa arduinom byte colPins[COLS] = {5, 4, 3, 2}; //pinovi na koje su povezane kolone tastature sa arduinom Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //inicijalizacija customKeypad odredjenom funkcijom biblioteke Keypad.h int cifra[4] = {0, 0, 0, 0}; //pocetne vrednosti koje predstavljaju unete cifre sifre int brojac = 0; //brojac koji ce nam biti potreban u funkciji prijem() za brojanje cifara int unos = 0; //promenljiva koja predstavlja privremenu vrednost unosa koju cemo koristiti u funkciji provera(), jer tip podatka koji se dodeljuje customKey je char, a nama treba int (u slucaju da koristimo char onda moramo definisati sifru kao niz karaktera ili pojedinacno ascii vrednosti) int buzzPin = 10; //pin na koji je povezan buzzer (piezo zvucnik) int secLedPin = 12; //pin na koji je povezana crvena LED koja oznacava da li je security prekidac aktivan char customKey; void brisanje(); void uspeh(); void prijem(); void provera(); void cekanjeSifre(); boolean security = LOW; //predstavlja prekidac za to da li ce UZ biti osetljiv tj da li ce paliti alarm ili nece boolean secLed = LOW; //promenljiva koja ce da prati stanje security promenljive (prekidaca) i u odnosu na stanje upaliti ili ugasiti secLed (crvenu LED) boolean alarm = LOW; //predstavlja prekidac za samu signalizaciju alarma //******************************************** SETUP ********************* void setup() { pinMode(buzzPin, OUTPUT); pinMode(secLedPin, OUTPUT); digitalWrite(secLedPin, secLed); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); //Serial.begin(9600); moze nam biti potrebno ako zelimo odredjene medjurezultate ili rezultate da prikazujemo u terminalu } //******************************************* LOOP *********************** void loop() { digitalWrite(secLedPin, secLed); merenje(); //tok programa je koncipiran da se prvo proverava UZ (razdaljina), ako je osetljivost ukljucena (security promenljiva) onda ce se aktivirati prekidac "alarm" koji ce pokrenuti signalizaciju cekanjeSifre(); //pomocu ove funkcije vrsi se unos sifre, kojom se aktivira i deaktivira security mod, tj osetljivost UZ senzora, pocetne vrednosti ova 2 prekidaca su "deaktiviran" //dakle po aktiviranju prototipa alarm se nece upaliti ako se nesto priblizi na manje od 15cm, jer je osetljivost iskljucena, da se ona aktivira mora se uneti sifra, cijim se unosom takodje gasi osetljivosti (i alarm kada je aktiviran) if(alarm == HIGH){ tone(buzzPin,1000); } else{ noTone; } } void merenje() { digitalWrite(trigPin, LOW); //Set trigger pin low [deo koda za UZ preuzet sa interneta] delayMicroseconds(2000); //Let signal settle digitalWrite(trigPin, HIGH); //Set trigPin high delayMicroseconds(15); //Delay in high state digitalWrite(trigPin, LOW); //ping has now been sent delayMicroseconds(10); //Delay in low state pingTime = pulseIn(echoPin, HIGH); //pingTime is presented in microceconds pingTime = pingTime / 1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second) pingTime = pingTime / 3600; //convert pingtime to hourse by dividing by 3600 (seconds in an hour) targetDistance = speedOfSound * pingTime; //This will be in miles, since speed of sound was miles per hour targetDistance = targetDistance / 2; //Remember ping travels to target and back from target, so you must divide by 2 for actual target distance. targetDistance = targetDistance * 63360; //Convert miles to inches by multipling by 63360 (inches per mile) cm = targetDistance * 2.54; //Serial.println(cm); if (security == HIGH && cm <= 15) { //ako je prekidac za osetljivost aktivan i ako je iscitavanje UZ senzora manje ili = 15cm prekidac za alarm se aktivira alarm = HIGH; } } void cekanjeSifre() { customKey = customKeypad.getKey(); if (customKey == '*') { //komanda za brisanje unosa, trebalo bi je koristiti pre unosa sifre jer je mozda zaostao neki unos u nizu koji prima unete cifre tone(buzzPin,1000,50); //bip koji se cuje po pritisku svakog tastera koji cemo koristiti brisanje(); //brisanje unetih vrednosti u niz koji prima unete cifre, kao i resetovanje brojaca } if (customKey == '#') { //komanda za potvrdjivanje unosa tone(buzzPin,1000,50); if (brojac == 4) { //vrsi proveru da li je uneto 4 cifre, jer ako nije odmah odbija sifru i poziva funkciju brisanje() [4 linije ispod] if ((cifra[0] == c1) && (cifra[1] == c2) && (cifra[2] == c3) && (cifra[3] == c4)) { //proverava da li su sve 4 unete cifre jednake sa predefinisanim ciframa sifre [videti prve 4 linije koda] uspeh(); //ako je unos ispravan poziva se funkcija uspeh() koja daje zvucni signal kako cemo znati da je uneta sifra ispravna } } brisanje(); } if (customKey >= 48 && customKey <= 57) { //ako je uneta vrednosti izmedju 0 i 10 (ascii vrednosti tih karaktera, jer customKey predstavlja char ptomenljivu) provera(); //poziva se funkcija provera() } } void provera() { if (customKey == '0') { unos = 0; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '1') { unos = 1; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '2') { unos = 2; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '3') { unos = 3; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '4') { unos = 4; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '5') { unos = 5; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '6') { unos = 6; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '7') { unos = 7; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '8') { unos = 8; tone(buzzPin, 1000, 50); prijem(); } if (customKey == '9') { unos = 9; tone(buzzPin, 1000, 50); prijem(); } } void prijem() { if (brojac == 0) { cifra[brojac] = unos; brojac++; } else if (brojac == 1) { cifra[brojac] = unos; brojac++; } else if (brojac == 2) { cifra[brojac] = unos; brojac++; } else if (brojac == 3) { cifra[brojac] = unos; brojac++; } else { brisanje(); } } void brisanje() { cifra[0] = cifra[1] = cifra[2] = cifra[3] = 0; brojac = 0; } void uspeh() { tone(buzzPin,1000,50); delay(100); tone(buzzPin,1000,50); delay(100); tone(buzzPin,1000,50); delay(100); security = !security; secLed = security; alarm = LOW; }
Nadam se da vam se svideo i ovaj projekat! Pratite nove tutorijale putem FB stranice, pozdrav do novog projekta! 🙂
Samo kratko pitanje: ukupno 2 LED …..koja je funkcija LED povezane na 3.3V?
Свиђа ми сеСвиђа ми се
Nema neku posebnu svrhu, ukazuje da je sklop pod naponom. 🙂
Свиђа ми сеСвиђа се 1 person