Senzor gibanja, piskač, LCD in LED dioda

Naloga predstavlja krmiljenje LCD prikazovalnika, piskača in LED diode v odvisnosti od gibanja v dometu senzorja gibanja.

Senzor gibanja (PIR - pasivni infra rdeči senzor) ima odzivnost 0,3 do 18 sekund, odvisno od nastavitve. Za delovanje uporabljajo infrardečo energijo, signal ki sproži izhod senzorja ob premikajoči osebi. Domet senzorja je okoli 7 m, zaznavni kot pa znaša 120°.

 

Slika 1: Priključitev elementov na razvojno ploščo Intel Galileo.

Program naj deluje po naslednjih zahtevah:

Po vklopu naprave se naj v prvi vrstici LCD prikazovalnika izpiše SERS, v drugi vrstici pa Maribor. Po 1,5 sekunde se napis na LCD prikazovalniku spremeni, tako da v prvi vrstici prikazuje Jesenska sola, v drugi pa elektronike. Ta napis naj bo prikazan 2 sekundi. Sledi neprestano preverjanje gibanja.

Senzor ne zazna gibanja:

Če senzor gibanja ne zazna gibanja v svojem dometu, se na LCD prikazovalniku izpiše v prvi vrstici Senzor ne zazna in v drugi vrstici gibanja.

Senzor zazna gibanje:

V kolikor senzor zazna gibanje, se na LCD prikazovalniku izpiše v prvi vrstici POZOR!, v drugi vrstici pa Zaznano gibanje!. Hkrati se naj vklopi opozorilna LED dioda in začne piskati piskač v intervalih 5-krat po 100 ms.

Program za krmiljenje LED diode, piskača in LCD prikazovalnika v odvisnosti od senzorja gibanja:

/*

 V kolikor senzor gibanja zazna gibanje, vklopi LED dioda, piskač nekajkrat zapiska, na

LCD prikazovalniku se prikaže ustrezen napis. Če senzor gibanja ne zazna, to prikaže z

ustreznim napisom na LCD prikazovalniku.

Program iz glavne funkcije void loop() kliče druge funkcije, namenjene posameznim opravilom.

Avtor: Milan Ivič, oktober 2014

*/

 #include <LiquidCrystal.h>  //Vključitev knjižnice za LCD

 /*

 Pini za LCD display:

 RS: Pin 2

 EN: Pin 3

 D4: Pin 5

 D5: Pin 6

 D6: Pin 8

 D7: Pin 9

 */

 int LED_Pin = 12;

 int Senzor_Gibanja = 13;

 int Piskac_Pin = 11;

 LiquidCrystal lcd(2,3,5,6,8,9);     //Priključki LCD na pine Arduino, inicializacija

 void setup()

 {

   //Določitev vhodnih in izhodnih pinov:

   pinMode(LED_Pin, OUTPUT);

   pinMode(Senzor_Gibanja, INPUT);

   pinMode(Piskac_Pin, OUTPUT);

 

   lcd.begin(16,2);             //LCD 16x2 => dve vrstici, vsaka po 16 znakov

   lcd.setCursor(5,0);        //Nastavitev kurzorja

   lcd.print("SERS");         //Izpis v prvi vrstici LCD prikazovalnika

   lcd.setCursor(4,1);

   lcd.print("Maribor");       //Izpis v drugi vrstici LCD prikazovalnika

   delay(1500);                 //Zakasnitev 1,5 sekunde

   lcd.setCursor(1,0);

   lcd.print("Jesenska sola");   //Izpis v prvi vrstici LCD prikazovalnika

   lcd.setCursor(2,1);

   lcd.print("elektronike");        //Izpis v drugi vrstici LCD prikazovalnika

   delay(2000);                       //Počakaj 2 sekundi

   lcd.clear();

 }

 void loop()        //Glavna funkcija (zanka) in katere kličemo druge funkcije

 {

   //Klicanje funkcij:

   Senzor_Gibanja_Zaznavanje();

   Vklop_Alarma();

   LCD_Alarm();

   LCD_Napis();  

 }

 void Senzor_Gibanja_Zaznavanje()

 {

   if(digitalRead(Senzor_Gibanja) == HIGH)    //Ali je zaznano gibanje?

   {

     digitalWrite(LED_Pin, HIGH);                  //Gibanje je zaznano, vklopi LED diodo

   }

   else

   {

     digitalWrite(LED_Pin, LOW);                 //Ni gibanja, izklopi LED diodo

   }

 }

 void Vklop_Alarma()

 {

   if(digitalRead(Senzor_Gibanja) == HIGH)    //Ali je zaznano gibanje?

   {                                                             //Ja, senzor je zaznal gibanje

     for (int i = 0; i < 5; i++)

     {

       digitalWrite(Piskac_Pin, HIGH);        //Vklopi piskač

       delay(100);                                     //Počakaj 100 ms

       digitalWrite(Piskac_Pin, LOW);        //Izklopi piskač

       delay(100);                                     //Počakaj 100 ms

     }

   }

   else                                                   //Senzor ni zaznal gibanja

   {

     digitalWrite(Piskac_Pin, LOW);          //Izklopi piskač

   }  

 }

 void LCD_Alarm()

 {

   if(digitalRead(Senzor_Gibanja) == HIGH)    //Ali je zaznano gibanje?

   {                                                             //Ja, senzor je zaznal gibanje

     lcd.begin(16,2);                                //LCD prikazovalnik: 2 vrstici po 16 znakov

     lcd.setCursor(5,0);

     lcd.print("POZOR!");                         //V prvo vrstico izpiši POZOR!

     lcd.setCursor(0,1);

     lcd.print("Zaznano gibanje!");            //V drugo vrstico izpiši Zaznano gibanje!

     delay(1500);

     lcd.clear();

   }

 }

 void LCD_Napis()        //Funkcija LCD_Napis() se izvaja, ko senzor ne zaznava gibanja

 {

     lcd.setCursor(0,0);

     lcd.print("Senzor ne zazna");

     lcd.setCursor(4,1);

     lcd.print("gibanja!");

     delay(10);    


}

V programu je za intervalno piskanje piskača uporavljena zanka for. Zanka for ima tri dele:

for (vstopni_izraz; pogoj_delovanja; izraz_povečevanja) res_blok

Slika 3: Prikaz delovanja zanke for.

Vstopni izraz predstavlja v našem primeru lokalna spremenljivka i tipa int, ki ji je dodeljena vrednost 0. Pogoj delovanja predstavlja i < 5 kar pomeni, da se bo zanka (blok med zavitim oklepajem in zavitim zaklepajem) izvajala talo dolgo, dokler bo i manjši od 5. Izraz povečanja i++, ki se izvede po vsakem prehodu zanke pomeni, da se po vsakem prehodu zanke vrednost i poveča za 1. Ob vsakem prehodu zanke se za 100 ms vklopi piskač in za 100 ms izklopi. Piskač bo torej zapiskal 5-krat.

Električna shema priključitve elementov na razvojno plošči Intel Galileo:

Slika 2: Shema povezav elementov in priključitve na razvojno ploščo Intel Galileo.

Slika 2: Prikaz sestave na eksperimentalni ploščici in povezava z razvojno ploščo Intel Galileo.