#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define set0(r,b) r&=~(1<<b)
#define set1(r,b) r|=(1<<b)
#define test(r,b) (r&(1<<b))
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
void setup() {
//PCINT8 portC 0
DDRC &= ~(1 << 0); // A0
PORTC |= (1 << 0);
SREG |=(1<<7); //povolenie globálnych prerušení
set1(PCICR,PCIE1); //povolenie preruseni na porte D
set1(PCMSK1,PCINT8); //povolenie prerusenia na PCINT22, resp Arduino pin 6
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
}
}
}
ISR(PCINT1_vect) //prerusenie reaguje len dobeznu hranu
{
if( test(PINC,0) == 0)
{
int0_triggered = true; // indikacia INT0 prerušenia
startTime = millis(); // Uloženie aktuálneho času
}
}