#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Servo servo; // Vytvorenie objektu serva
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inicializácia LCD s I2C adresou 0x27
volatile bool int0_triggered = false; // Premenná pre indikáciu aktivovaného INT0 prerušenia
volatile bool int1_triggered = false; // Premenná pre indikáciu aktivovaného INT1 prerušenia
unsigned long startTime = 0; // Čas spustenia prerušenia
#define set0(r,b) r&=~(1<<b) //makro
#define set1(r,b) r|=(1<<b)
#define test(r,b) (r&(1<<b))
void setup() {
// Inicializácia pinov pre externé prerušenia
set0(DDRD,2); //6bit portu D - vstup
set1(PORTD,2); //aktivacia pull-up
set0(DDRD,3); //6bit portu D - vstup
set1(PORTD,3); //aktivacia pull-up
SREG |=(1<<7); //povolenie globálnych prerušení
servo.attach(9); // Pripojenie serva na pin 9
servo.write(0); // Nastavenie serva do pôvodnej pozície (0 stupňov)
// Inicializácia LCD
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() {
// Riadiaca logika programu
if (int0_triggered) {
if (millis() - startTime < 2000) {
EIMSK &= ~(1 << INT1); //zakazanie prerušenia INT1
servo.write(45); // Nastavenie uhla serva na 45 stupňov
lcd.setCursor(6, 0); // Nastavenie kurzora na pozíciu 6,0
lcd.print(45); // Výpis uhla na LCD displej
EIMSK |= (1 << INT1) ; //povolenie prerušenia INT1
} else {
servo.write(0); // Nastavenie serva do pôvodnej pozície (0 stupňov)
lcd.setCursor(6, 0); // Nastavenie kurzora na pozíciu 6,0
lcd.print(" "); // Vymazanie uhla z LCD displeja
int0_triggered = false; // nulovanie indikacie prerusenia
}
}
if (int1_triggered) {
if (millis() - startTime < 2000) {
EIMSK &= ~(1 << INT0);
servo.write(90);
lcd.setCursor(6, 0);
lcd.print(90);
EIMSK |= (1 << INT0) ;
} else {
servo.write(0);
lcd.setCursor(6, 0);
lcd.print(" ");
int1_triggered = false;
}
}
}
ISR(PCINT2_vect) //prerusenie reaguje len dobeznu hranu
{if( test(PIND,2) == 0) //testujem, ci prisla dobezna hrana
{
int0_triggered = true; // indikacia INT0 prerušenia
startTime = millis(); // Uloženie aktuálneho času}
}
}
ISR(INT1_vect) {
int1_triggered = true; // indikacia INT1 prerušenia
startTime = millis(); // Uloženie aktuálneho času
}