Arduino radionica: Kućni alarm v1.0

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.

buzzer

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.

4x4keypad

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.

4x4-matrix-keypad

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.

20160618_195500

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:

sema

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! 🙂

 

2 мишљења на „Arduino radionica: Kućni alarm v1.0

Постави коментар