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

From DT^2
Jump to: navigation, search
m
m
Line 86: Line 86:
 
== Pre pokročilých ==
 
== Pre pokročilých ==
 
* upravte program tak, aby nevydával monotónny zvuk, ale aby hral nejakú melódiu.
 
* upravte program tak, aby nevydával monotónny zvuk, ale aby hral nejakú melódiu.
 +
 +
Príklad:
 +
 +
<syntaxhighlight lang="C" line='line'>
 +
for (int i = 0; i < 2; i++)
 +
{
 +
  tone(262, 8, 200);
 +
  delay(200);
 +
  tone(330, 8, 200);
 +
  delay(200);
 +
 +
  tone(262, 8, 200);
 +
  delay(200);
 +
  tone(330, 8, 200);
 +
  delay(200);
 +
 +
  tone(392, 8, 400);
 +
  delay(400);
 +
 +
  tone(392, 8, 400);
 +
  delay(400);
 +
}
 +
</syntaxhighlight>

Revision as of 09:46, 30 July 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.

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.

Príklad:

 1 for (int i = 0; i < 2; i++)
 2 {
 3   tone(262, 8, 200);
 4   delay(200);
 5   tone(330, 8, 200);
 6   delay(200);
 7 
 8   tone(262, 8, 200);
 9   delay(200);
10   tone(330, 8, 200);
11   delay(200);
12 
13   tone(392, 8, 400);
14   delay(400);
15 
16   tone(392, 8, 400);
17   delay(400);
18 }