#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Objekt LCD s parametrami (Adresa, stĺpec, riadok)
volatile bool int0_triggered = false; // Indikátor PCI0 prerušenia
volatile bool int1_triggered = false; // Indikátor PCI1 prerušenia
volatile bool int2_triggered = false; // Indikátor PCI2 prerušenia
unsigned long startTime = 0; // Čas spustenia
#define set0(r,b) r &= ~(1 << b)
#define set1(r,b) r |= (1 << b)
#define test(r,b) (r & (1 << b))
void setup() {
//vstup pre červené
DDRB &= ~(1 << 3); // tlačidlo, port B tretí pin
PORTB |= (1 << 3); // Aktivácia pull-up rezistora
// vstup pre žlté
DDRC &= ~(1 << 4); // tlačidlo, 4. pin portu C
PORTC |= (1 << 4); // Aktivácia pull-up rezistora
//vstup pre modré
DDRD &= ~(1 << 5); // tlačidlo, 5 pin portu D
PORTD |= (1 << 5); // Aktivácia pull-up rezistora
set1(PCICR, PCIE0); // Povolenie PCI na porte B
set1(PCMSK0, PCINT2); // Povolenie PCINT2 červené na pine 10
set1(PCICR, PCIE1); // Povolenie PCI na porte C
set1(PCMSK1, PCINT11); // Povolenie PCINT11 modré na pine A3
set1(PCICR, PCIE2); // Povolenie PCI na porte D
set1(PCMSK2, PCINT20); // Povolenie PCINT20 žlté na pine 4
SREG |= (1 << 7); // Povolenie globálnych prerušení
servo.attach(8); // Pripojenie serva na pin 8
servo.write(0); // Nastavenie do 0-vej pozície
lcd.begin(16, 2); // Inicializácia LCD s 16x2 znakmi
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Uhol: ");
}
void loop() {
if (int0_triggered) { // Červené
if (millis() - startTime < 2000) {
set0(PCMSK1, PCINT11); // Zakázanie PCINT11 modré A3
set0(PCMSK2, PCINT20); // Zakázanie PCINT20 žlté 4
servo.write(45);
lcd.setCursor(6, 0);
lcd.print("45");
} else {
servo.write(0); // Nastavenie pozície 0 stupňov
lcd.setCursor(6, 0);
lcd.print(" ");
set1(PCMSK1, PCINT11); // Povolenie PCINT11 modré A3
set1(PCMSK2, PCINT20); // Povolenie PCINT20 žlté 4
int0_triggered = false; // Resetovanie indikátora prerušenia PCI0
}
}
if (int1_triggered) { // Modré
if (millis() - startTime < 2000) {
set0(PCMSK0, PCINT2); // Zakážanie PCINT2 červené 10
set0(PCMSK2, PCINT20); // Zakážanie PCINT20 žlté 4
servo.write(180);
lcd.setCursor(6, 0);
lcd.print("180");
} else {
servo.write(0); // Nastavenie pozície 0 stupňov
lcd.setCursor(6, 0);
lcd.print(" ");
set1(PCMSK0, PCINT2); // Povolenie PCINT2 červené 10
set1(PCMSK2, PCINT20); // Povolenie PCINT20 žlté 4
int1_triggered = false; // Resetovanie indikátora PCI1
}
}
if (int2_triggered) { // Čierne
if (millis() - startTime < 2000) {
set0(PCMSK0, PCINT2); // Zakázanie PCINT2 červené 10
set0(PCMSK1, PCINT11); // Zakázanie PCINT11 modré A3
servo.write(90);
lcd.setCursor(6, 0);
lcd.print("90");
} else {
servo.write(0); // Nastavenie pozície 0 stupňov
lcd.setCursor(6, 0);
lcd.print(" ");
set1(PCMSK0, PCINT2); // Povolenie PCINT2 červené 10
set1(PCMSK1, PCINT11); // Povolenie PCINT11 modré A3
int2_triggered = false; // Resetovanie indikátora PCI2
}
}
}
// Vektor prerušenia pre PCI0, PCI1, PCI2
ISR(PCINT0_vect) {
if (test(PINB, 2) == 0) // Červené
int0_triggered = true; // Aktivácia PCI0 indikátora prerušenia
startTime = millis(); // Uloženie aktuálneho času
}
ISR(PCINT2_vect) {
if (test(PIND, 3) == 0) // žlté
int2_triggered = true;
startTime = millis();
}
ISR(PCINT1_vect) {
if (test(PINC, 3) == 0) // Modré
int1_triggered = true;
startTime = millis();
}