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
vstopni_izraz se izvede tik pred vstopom v zanko. Ponavadi nastavi začetne vrednosti spremenljivk, potrebnih za delovanje zanke.
pogoj_delovanja se preverja pred vsako izvedbo bloka. Če je resničen, se blok (ujet med zavitim oklepajem in zavitim zaklepajem) izvede, sicer se zanka prekine.
izraz_povečanja se izvede po vsakem prehodu zanke. Če je pogoj_delovanja neresničen že pri vstopu v zanko, se ta del nikoli ne izvede.
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.