#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // objekt lcd s parametrami(Adr,stl, riad)
volatile bool int0_triggered = false; // indikator PCI0 prerušenia
volatile bool int1_triggered = false; // indikator PCI1 prerušenia
volatile bool int2_triggered = false; // indikator PCI2 prerušenia
unsigned long startTime = 0; // medzicas
#define set0(r,b) r&=~(1<<b)
#define set1(r,b) r|=(1<<b)
#define test(r,b) (r&(1<<b))
void setup() {
// vstupy pre tlacidla
DDRB &= ~(1 << 2); // button biely 2bit port B
PORTB |= (1 << 2) ; // pull-up rezistor
DDRD &= ~(1 << 7); // button modry 3bit port D
PORTD |= (1 << 7) ; // pull-up rezistor
DDRC &= ~(1 << 0); // button cerveny 3bit port C
PORTC |= (1 << 0) ; // pull-up rezistor
set1(PCICR,PCIE0); //povolenie PCI na porte B
set1(PCMSK0,PCINT2); //povolenie PCINT2 biely na pine 10
set1(PCICR,PCIE1); //povolenie PCI na porte C
set1(PCMSK1,PCINT0); //povolenie PCINT0 na pine A0
set1(PCICR,PCIE2); //povolenie PCI na porte D
set1(PCMSK2,PCINT7); //povolenie PCINT7 cierny na pine 7
SREG |=(1<<7); //povolenie glob preruseni
servo.attach(9); // Pripojenie serva na pin9
servo.write(0); // nastavenie do 0-vej pozície
lcd.begin(16,2); // Inicializácia LCD s 16x2 znakmi
lcd.backlight(); // Zapnutie podsvietenia LCD
lcd.setCursor(0, 0); // Nastavenie kurzora na začiatok prvého riadka
lcd.print("Uhol: "); // Výpis textu "Uhol: " na LCD displej
}
void loop() {
if (int0_triggered) { //zlty
if (millis() - startTime < 2000) {
set0(PCMSK1,PCINT11); // zakazanie PCINT11 cerveny A0
set0(PCMSK2,PCINT19); // zakazanie PCINT19 modry 7
servo.write(45); // Servo 45 stupňov
lcd.setCursor(6, 0); // Kurzor na pozíciu 6,0
lcd.print("45"); // Výpis 45
} else {
servo.write(0); // Nastavenie pozície 0 stupňov
lcd.setCursor(6, 0); // Kurzor na pozíciu 6,0
lcd.print(" "); // Mazanie
set1(PCMSK1,PCINT11); // povolenie PCINT11 cerveny A0
set1(PCMSK2,PCINT19); // povolenie PCINT19 modry 7
int0_triggered = false; // Resetovanie indikatora prerušenia PCI0
}
}
if (int1_triggered) { //zeleny
if (millis() - startTime < 2000) {
set0(PCMSK0,PCINT2); // zakazanie PCINT2 biely 10
set0(PCMSK2,PCINT19); // zakazanie PCINT19 modry 7
servo.write(180); // Servo 180 tupňov
lcd.setCursor(6, 0); // Kurzor na pozíciu 6,0
lcd.print("180"); // Výpis 180
} else {
servo.write(0); // Nastavenie pozície 0 stupňov
lcd.setCursor(6, 0); // Kurzor na pozíciu 6,0
lcd.print(" "); // Mazanie
set1(PCMSK0,PCINT2); // povolenie PCINT2 biely 10
set1(PCMSK2,PCINT19); // povoleniePCINT19 modry 7
int1_triggered = false; // Resetovanie indikatora PCI1
}
}
if (int2_triggered) { //cierny
if (millis() - startTime < 2000) {
set0(PCMSK0,PCINT2); // zakazanie PCINT2 biely 10
set0(PCMSK1,PCINT11); // zakazanie PCINT11 cerveny A0
servo.write(90); // Servo 90 stupňov
lcd.setCursor(6, 0); // Kurzor na pozíciu 6,0
lcd.print("90"); // Výpis 90
} else {
servo.write(0); // Nastavenie pozície 0 stupňov
lcd.setCursor(6, 0); // Kurzor na pozíciu 6,0
lcd.print(" "); // vymaže to
set1(PCMSK0,PCINT2); // povolenie PCINT2 biely 10
set1(PCMSK1,PCINT11); // povolenie PCINT11 cerveny A0
int2_triggered = false; // Resetovanie indikatora PCI2
}
}
}
// Vektor prerušenia pre PCI0 PCI1 PCI2
ISR(PCINT0_vect) {
if( test(PINB,2) == 0) //biele
int0_triggered = true; // Aktivácia PCI0 indikacie prerušenia
startTime = millis(); // Uloženie aktualneho času
}
ISR(PCINT1_vect) {
if( test(PINC,0) == 0) // cervene
int1_triggered = true; // Aktivácia PCI1 indikacie prerušenia
startTime = millis(); // Uloženie aktualneho času
}
ISR(PCINT2_vect) {
if( test(PIND,7) == 0) //modre
int2_triggered = true; // Aktivácia PCI2 indikacie prerušenia
startTime = millis(); // Uloženie aktualneho času
}