#include <TimerOne.h>
#define ResistorPin A0
const int RedPinNo = 13;
const int YellowPinNo = 12;
const int GreenPinNo = 11;
volatile unsigned int Value;
const unsigned int SensorReadPeriod = 20000;
void TimerISR(){
Value = analogRead(ResistorPin);
Value /= 2;
//constrain value
Value = constrain(Value,0,255);
}
void setup() {
//Set pins directions
pinMode(RedPinNo,OUTPUT);
pinMode(YellowPinNo,OUTPUT);
pinMode(GreenPinNo,OUTPUT);
//Set pins init values
digitalWrite(RedPinNo,LOW);
digitalWrite(YellowPinNo,LOW);
digitalWrite(GreenPinNo,LOW);
//Init timer
Timer1.initialize(SensorReadPeriod);
Timer1.attachInterrupt(TimerISR);
}
void loop() {
//Always green because Value is
//always greater than 0
digitalWrite(GreenPinNo,HIGH);
if(Value > 255/3){
digitalWrite(YellowPinNo,HIGH);
if(Value > 255*2/3){
digitalWrite(RedPinNo,HIGH);
}
else{
digitalWrite(RedPinNo,LOW);
}
}
else{
digitalWrite(YellowPinNo,LOW);
}
}
/*
OBJAŠNJENJE
Sistem koristi fotootpornik (LDR) za merenje intenziteta svetlosti.
Analogna vrednost sa senzora se očitava u Timer prekidnoj rutini
na svakih 20 ms.
Dobijena vrednost (0–1023) se skalira na opseg 0–255 kako bi se
lakše poređivala i koristila u logici programa.
Na osnovu vrednosti promenljive Value određuje se koje diode će biti uključene:
- Za male vrednosti (slaba svetlost) uključena je samo zelena dioda
- Kada vrednost pređe 1/3 maksimuma uključuje se i žuta dioda
- Kada vrednost pređe 2/3 maksimuma uključuje se i crvena dioda
Na taj način broj uključenih dioda raste sa intenzitetom svetlosti.
Timer omogućava da se očitavanje senzora vrši nezavisno od glavne petlje,
što omogućava stabilan i kontinuiran rad sistema bez korišćenja delay funkcije.
Promenljiva Value je deklarisana kao volatile jer se menja unutar prekidne rutine.
*/