Difference between revisions of "Arduino - projekt 2 - Poplašné zariadenie"

From DT^2
Jump to: navigation, search
(Created page with "V tomto projekte zostrojíme rôzne verzie poplašného zariadenia, ktoré stráži trezor. Využijeme svetelný IR senzor na zaznamenávanie prekážok, ktorý bude sledovať...")
(No difference)

Revision as of 01:30, 30 July 2018

V tomto projekte zostrojíme rôzne verzie poplašného zariadenia, ktoré stráži trezor. Využijeme svetelný IR senzor na zaznamenávanie prekážok, ktorý bude sledovať intenzitu svetla. V prípade, že sa zmení, spustí alarm.

Ir obstacle.jpg

Pripojme IR senzor na zaznamenávanie prekážok na nejaký digitálny pin, napr. 12, zároveň pripojíme zem (GND na GND) a napájanie (VCC na V).

Senzor má malý trimer (premenlivý odpor), ktorým sa dá nastaviť jeho citlivosť. Na svojom výstupe neustále oznamuje buď logickú nulu, ak niečo zaznamená v blízkosti (prípadne do neho zasvieti silné svetlo), alebo logickú jednotku, ak nič nevidí.

Upravme tretí program (03_cyklus_led) tak, že svetelný signál KITT zobazí až vtedy, keď sa k senzoru niekto priblíži, (uložme tento program do nového súboru 05_poplach).

Do funkcie setup() pridáme nastavenie pinu 12 na vstupný:

1   pinMode(12, INPUT);

na začiatok funkcie loop() doplňme cyklus while(), ktorý bude snímať senzor a kým bude senzor hlásiť logickú jednotku, bude len čakať. V okamihu, keď senzo zahlási logickú nulu, zobrazí svetelný efekt.

 1 void loop() {
 2   while (digitalRead(12) == 1) 
 3   { 
 4     // nerobime nic, len cakame  
 5   }
 6 
 7   while (digitalRead(12) == 0)
 8   {
 9     for (int i = 2; i < 8; i++)
10     {
11       digitalWrite(i, HIGH);
12       delay(300);
13       digitalWrite(i, LOW);
14     }
15   }
16 }

Všimnime si ako sa používa cyklus while():

1   while (podmienka) 
2   {
3     prikazy, ktore sa opakuju, kym je podmienka splnena
4   }

Pripojme teraz k Arduinu zvukovú sirénu, ktorá je malý jednochý reproduktor, ktorý sa dá pripojiť aj priamo k Arduinu (výkonnejšie zariadenia - ako sú napríklad jednosmerné motorčeky, alebo viaceré silnejšie LED nesmieme pripájať priamo, pretože môžu mať pre Arduino príliš veľký odber prúdu).

Sirenka.jpg

Jeden pin je označený +, ten pripojíme na niektorý digitálny pin (napr. D8) a druhý pin pripojíme na niektorú zem (G).

Zvuk vzniká kmitaním membrány v siréne, ktorou pohybuje elektromagnet. Preto musíme na pine 8 veľmi rýchlo (typicky niekoľko-sto-krát za sekundu meniť hodnoty 0 a 1 - čím rozkmitáme membránu sirény, ktorá vydá zvuk. Čím rýchlejšie budeme kmitať (vyšší kmitočet = frekvencia), tým vyšší tón siréna vydá.

Napríklad tón malé A má známu frekvenciu 440 Hz (pozri frekvencie ostatných tónov). Za 1 sekundu = 1000000 mikrosekúnd sa kmitnutie na jednu aj druhú stranu zopakuje 440-krát. Koľko mikrosekúnd treba počkať vždy po preklopení membrány na jednu stranu a potom znovu na druhú?

1000000 / 440 = 2273 (približne), čo je celá perióda, čiže polovica periódy je 1000000 / 440 / 2 = 1136.

Najpriamejší spôsob je teda striedať logickú 0 a 1 na výstupnom pine a vždy počkať 1136 mikrosekúnd.

 1 void setup() {
 2   pinMode(8, OUTPUT);
 3 }
 4 
 5 void loop() {
 6   digitalWrite(8, HIGH);
 7   delayMicroseconds(1136);
 8   digitalWrite(8, LOW);
 9   delayMicroseconds(1136);
10 }

Všimnime si, že doteraz sme na čakanie používali funkciu delay(), ktorá používala čas v milisekundách. Tisíckrát presnejšia je funkcia delayMicroseconds(), ktorá používa čas v mikrosekundách (miliontinách sekundy).

Arduino ale poskytuje viacero spôsobov, ako môžeme na výstupnom pine generovať kmitavý signál. Jednak je to funkcia

tone(pin, frekvencia) - ktorá začne v pozadí kmitať na zadanom pine, hoci pokračuje ďalej. Môžeme uviesť aj tretí argument - dĺžku trvania tónu v milisekundách: tone(pin, frequency, duration). Ak tretí argument neuvedieme, zvuk musíme zastaviť pomocou funkcie noTone().

Úloha pre vás: upravte program 05_poplach, aby súčasne počas svetelného efektu (ale len počas neho) vydával zvuk.

Pre pokročilých

  • upravte program tak, aby nevydával monotónny zvuk, ale aby hral nejakú melódiu.