Difference between revisions of "Arduino - projekt 2 - Poplašné zariadenie"
m |
|||
Line 109: | Line 109: | ||
} | } | ||
noTone(8); | noTone(8); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Priklad riesenia blikanie aj pipanie: | ||
+ | <syntaxhighlight lang=C line=line> | ||
+ | void setup() { | ||
+ | pinMode(8, OUTPUT); | ||
+ | } | ||
+ | |||
+ | |||
+ | void loop() { | ||
+ | while (digitalRead(12) == 1) | ||
+ | { | ||
+ | // nerobime nic, len cakame | ||
+ | } | ||
+ | |||
+ | while (digitalRead(12) == 0) | ||
+ | { | ||
+ | for (int i = 2; i < 8; i++) | ||
+ | { | ||
+ | digitalWrite(i, HIGH); | ||
+ | for (int j = 0; j < 66; j++) | ||
+ | { | ||
+ | digitalWrite(8, HIGH); | ||
+ | delayMicroseconds(1136); | ||
+ | digitalWrite(8, LOW); | ||
+ | delayMicroseconds(1136); | ||
+ | } | ||
+ | delay(150); | ||
+ | digitalWrite(i, LOW); | ||
+ | } | ||
+ | } | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 13:58, 6 August 2018
[ naspäť ]
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.
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).
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.
Príklad:
1 for (int i = 0; i < 2; i++)
2 {
3 tone(8, 262, 200);
4 delay(200);
5 tone(8, 330, 200);
6 delay(200);
7
8 tone(8, 262, 200);
9 delay(200);
10 tone(8, 330, 200);
11 delay(200);
12
13 tone(8, 392, 400);
14 delay(400);
15
16 tone(8, 392, 400);
17 delay(400);
18 }
19 noTone(8);
Priklad riesenia blikanie aj pipanie:
1 void setup() {
2 pinMode(8, OUTPUT);
3 }
4
5
6 void loop() {
7 while (digitalRead(12) == 1)
8 {
9 // nerobime nic, len cakame
10 }
11
12 while (digitalRead(12) == 0)
13 {
14 for (int i = 2; i < 8; i++)
15 {
16 digitalWrite(i, HIGH);
17 for (int j = 0; j < 66; j++)
18 {
19 digitalWrite(8, HIGH);
20 delayMicroseconds(1136);
21 digitalWrite(8, LOW);
22 delayMicroseconds(1136);
23 }
24 delay(150);
25 digitalWrite(i, LOW);
26 }
27 }
28 }