Arduino - projekt 3 - Počítadlo návštevníkov

From DT^2
Revision as of 02:25, 30 July 2018 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

[ naspäť ]

Zostrojíme zariadenie, ktoré bude počítať návštevníkov, ktorí vstúpili cez turniket do obchodu. Budeme ich zachytávať pomocou ultrazvukového senzora na meranie vzdialenosti.

Hcsr04.png

Ultrazvukový senzor vysiela zvukovú vlnu vysokej frekvencie, ktorú človek nepočuje a zachytáva odraz od prekážky. Na základe času odrazu vypočítava vzdialenosť.

V datasheete k tejto súčiastke sa môžeme dočítať, akým spôsobom sa s ňou komunikuje. Pin TRIG pripojíme na výstupný pin Arduina a pin ECHO na vstupný pin Arduina. Na pine TRIG vytvoríme pulz dĺžky 10 mikrosekúnd a čakáme na odozvu na pine ECHO. Dĺžku odozvy vydelíme číslom 58 a získame vzdialenosť od prekážky v cm.

Meranie času môžeme uskutočniť pomocou funkcie micros(), ktorá nám vráti počet mikrosekúnd, ktoré uplynuli od štartu programu. Začnime takto (program 08_ultrazvuk):

 1 #define TRIG 9
 2 #define ECHO 10
 3 #define SIRENA 8
 4 
 5 void setup() {
 6   pinMode(TRIG, OUTPUT);
 7   pinMode(ECHO, INPUT);
 8   pinMode(SIRENA, OUTPUT);
 9 }
10 
11 int meraj()
12 {
13   digitalWrite(TRIG, HIGH);
14   delayMicroseconds(10);
15   digitalWrite(TRIG, LOW);
16   while (digitalRead(ECHO) == 0)
17   {
18      //cakame na zaciatok pulzu
19   }
20   long zaciatok = micros();
21   while (digitalRead(ECHO) == 1)
22   {
23     //cakame na koniec pulzu
24   }
25   long koniec = micros();
26 
27   int vzdialenost = (koniec - zaciatok) / 58;
28   return vzdialenost;
29 }
30 
31 void loop() {
32    
33   int d = meraj();
34   if (d < 50)
35   {
36     tone(SIRENA, 440);
37   }
38   else noTone(SIRENA);
39   delay(50);
40 }

V programe si zasa všimnime niekoľko noviniek:

  • čísla pinov sme pomocou definícií makier schovali do "konštánt" TRIG, ECHO, SIRENA - slúži na to príkaz #define
  • tento program okrem funkcií setup() a loop() obsahuje aj tretiu funkciu meraj() - táto funkcia ale v hlavičke nemá void ale int - pretože vracia hodnotu - celé číslo (po anglicky: integer). Návratový typ void totiž znamená, že funkcia žiadnu hodnotu nevráti
  • spôsob, ako funkcia môže vrátiť hodnotu, je pomocou príkazu return
  • hodnotu, ktorú funkcia vráti uložíme do premennej vzdialenost pomocou príkazu priradenia na riadku 33
  • v programe sme prvý raz použili podmienku, ktorá testuje, či nameraná vzdialenosť k prekážke je menej ako 50 cm - a zvuk vydá iba v takom prípade. Podmienka má takýto tvar:
1   if (podmienka)
2   {
3     príkazy, ktoré sa vykonajú ak podmienka platí
4   )
5   else 
6   (
7     príkazy, ktoré sa vykonajú, ak podmienka neplatí
8   }

pričom časť else je nepovinná.

Najskôr odskúšajme tento program a pokúsme ho vylepšiť tak, aby počítal zákazníkov prechádzajúcich cez turniket. Mal by fungovať takto:

  • kým senzor nezaznamenal žiaden predmet/osobu (do vzdialenosti 50cm), čaká
  • v okamihu, keď je osoba zaznamenaná, zvýši počet návštevníkov a počká chvíľu, kým osoba prejde
  • celý program sa opakuje

Nový program uložme do súboru 09_turniket:

 1 #define TRIG 9
 2 #define ECHO 10
 3 #define SIRENA 8
 4 
 5 int pocet;
 6 
 7 void setup() {
 8   pinMode(TRIG, OUTPUT);
 9   pinMode(ECHO, INPUT);
10   pinMode(SIRENA, OUTPUT);
11   pocet = 0;
12   Serial.begin(9600);
13   Serial.println("Program turniket, verzia 1.0");
14 }
15 
16 int meraj()
17 {
18   digitalWrite(TRIG, HIGH);
19   delayMicroseconds(10);
20   digitalWrite(TRIG, LOW);
21   while (digitalRead(ECHO) == 0)
22   {
23      //cakame na zaciatok pulzu
24   }
25   long zaciatok = micros();
26   while (digitalRead(ECHO) == 1)
27   {
28     //cakame na koniec pulzu
29   }
30   long koniec = micros();
31 
32   int vzdialenost = (koniec - zaciatok) / 58;
33   return vzdialenost;
34 }
35 
36 void loop() {
37   while (meraj() > 50)
38   {
39      // cakame na zakaznika
40   }
41   
42   // zapocitame ho
43   pocet++;
44   tone(SIRENA, 440, 150);
45   Serial.print("Pocet zakaznikov: ");
46   Serial.println(pocet);
47   
48   // dame mu sekundu na to, aby presiel
49   delay(1000);
50 }

Všimnime si novinky v tomto programe:

  • premenná, ktorá bola definovaná mimo funkciu je viditeľná vo všetkých funkciách (tzv. globálna premenná). Premenné, ktoré sú definované vnútri nejakej funkcie sú viditeľné iba tam. Premenné, ktoré sú definované vnútri hlavičky cyklu for() sú viditeľné iba v tele toho cyklu for().
  • prvý raz sme použili objekt Serial. Slúži na komunikáciu Arduina s PC, aby nás Arduino mohlo podrobne informovať - napríklad o nameranom počte zákazníkov, ktorí prešli cez turniket. Pomocou funkcií Serial.print() a Serial.println() môžeme vyslať informáciu z Arduina do PC. Na PC ju môžeme pozorovať v konzole (tzv. Serial monitore) - prípadne v akemkoľvek inom terminálovom programe, napr. Putty. Ak chceme objekt Serial v programe použiť, treba najskôr (najpraktickejšie je to vo funkcii setup()), zavolať jeho metódu Serial.begin(komunikačná_rýchlosť). Typická (pomalá) komunikačná rýchlosť je 9600, typická rýchla komunikačná rýchlosť je 115200. Komunikácia funguje pravdaže iba vtedy, keď je Arduino s PC spojené USB káblom - prípadne pomocou rádiového spojenia cez BlueTooth.
  • použili sme operátor ++, ktorý zvyšuje hodnotu premennej (pocet++)

Praktické cvičenie:

  • pokúste sa prepojiť PC s Arduinom cez BT (piny Rx,Tx treba krížovo prepojiť na piny Arduina 0,1 a samozrejme pripojiť zem a napájanie), na PC sa vytvorí nový virtuálny serióvy port. Cez BT sa Arduino programovať nedá, iba komunikovať. Naviac, pri uploadovaní programu teba BT odpájať!

Úloha pre vás:

  • pomocou funkcie Serial.available() vieme zistiť, či po sériovej linke neprišiel z PC nejaký znak (vtedy funkcia vráti nenulovú hodnotu), tento znak potom vieme prečítať pomocou funkcie Serial.read(). Upravte program tak, aby sa počet zákazníkov nevypisoval po každom ďalšom zákazníkovi, ale iba na vyzvanie operátora (program 10_komunikacia).

Pre pokročilých

  • zobrazujte počet návštevníkov na LED module v dvojkovej sústave :-)
  • rozbehajte softverovú seriovú komunikáciu cez BT na iných pinoch, aby sa nemusel odpájať pri uploadovaní programu