#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;
volatile int fialoveTlacidlo = 0;
volatile int oranzoveTlacidlo = 0;
volatile int cerveneTlacidlo = 0;
long poslednyCas = 0;
int aktualnyUhol = 0; // Aktuálny uhol serva
int predchadzajuciUhol = 0; // Predchádzajúci uhol serva
ISR(PCINT0_vect) {
if ((PINB & (1 << PINB0)) == 0) {
fialoveTlacidlo = 1; // indikácia prerušenia pre fialové tlačidlo
Serial.println("PCINT0");
}
}
ISR(PCINT1_vect) {
if ((PINC & (1 << PINC1)) == 0) {
oranzoveTlacidlo = 1; // indikácia prerušenia pre oranžové tlačidlo
Serial.println("PCINT9");
}
}
ISR(PCINT2_vect) {
if ((PIND & (1 << PIND6)) == 0) {
cerveneTlacidlo = 1; // indikácia prerušenia pre červené tlačidlo
Serial.println("PCINT22");
}
}
void setup() {
Serial.begin(9600);
myservo.attach(9);
myservo.write(0);
lcd.init(); // inicializácia lcd
lcd.backlight(); // zapnúť podsvietenie
lcd.setCursor(0, 0);
lcd.print("Uhol: 0"); // Výpis počiatočného textu na LCD displej
// Nastavenie vstupov pre tlačidlá
DDRB &= ~(1 << 0); // fialové tlačidlo 0bit port B (PB0, pin 8)
PORTB |= (1 << 0); // pull-up rezistor
DDRC &= ~(1 << 1); // oranžové tlačidlo 1bit port C (A1, PC1)
PORTC |= (1 << 1); // pull-up rezistor
DDRD &= ~(1 << 6); // červené tlačidlo 6bit port D (PD6, pin 6)
PORTD |= (1 << 6); // pull-up rezistor
// Povolenie prerušenia
PCICR |= (1 << PCIE0) | (1 << PCIE1) | (1 << PCIE2);
PCMSK0 |= (1 << PCINT0); // maska pre fialové tlačidlo (PB0)
PCMSK1 |= (1 << PCINT9); // maska pre oranžové tlačidlo (PC1)
PCMSK2 |= (1 << PCINT22); // maska pre červené tlačidlo (PD6)
// Povolenie globálnych prerušení pomocou SREG
SREG |= (1 << 7);
}
void loop() {
if (fialoveTlacidlo == 1) { // fialové tlačidlo
poslednyCas = millis();
aktualnyUhol = 45;
myservo.write(aktualnyUhol);
fialoveTlacidlo = 0;
}
if (oranzoveTlacidlo == 1) { // oranžové tlačidlo
poslednyCas = millis();
aktualnyUhol = 90;
myservo.write(aktualnyUhol);
oranzoveTlacidlo = 0;
}
if (cerveneTlacidlo == 1) { // červené tlačidlo
poslednyCas = millis();
aktualnyUhol = 180;
myservo.write(aktualnyUhol);
cerveneTlacidlo = 0;
}
if (millis() - poslednyCas >= 2000) {
aktualnyUhol = 0;
myservo.write(aktualnyUhol);
}
// Aktualizácia LCD iba ak sa zmenil uhol
if (aktualnyUhol != predchadzajuciUhol) {
lcd.setCursor(6, 0);
lcd.print(" "); // Vymazanie predchádzajúcej hodnoty
lcd.setCursor(6, 0);
lcd.print(aktualnyUhol);
predchadzajuciUhol = aktualnyUhol;
}
}