#define set0(r,b) r &= ~(1<<b)
#define set1(r,b) r |= 1<<b
#define test(r,b) (r&(1<<b))
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool dvere[] = {true, true, true, true};
void setup() {
Serial.begin(9600);
// input-pullup
for(int i; i<8;i++){
set0(DDRD,i);
set1(PORTD,i);
}
// interupt setup
set1(SREG,7);
set1(PCICR,PCIE2);
set1(PCMSK2,PCINT23);
set1(PCMSK2,PCINT22);
set1(PCMSK2,PCINT21);
set1(PCMSK2,PCINT20);
lcd.begin(20, 4);
displaySetup();
doorStatus();
}
void loop() {
}
ISR(PCINT2_vect){
if( test(PIND,7) == 0 && dvere[0] == true)
{
dvere[0] = false;
doorStatus();
}
else if( test(PIND,7) != 0 && dvere[0] == false)
{
dvere[0] = true;
doorStatus();
}
if( test(PIND,6) == 0 && dvere[1] == true)
{
dvere[1] = false;
doorStatus();
}
else if( test(PIND,6) != 0 && dvere[1] == false)
{
dvere[1] = true;
doorStatus();
}
if( test(PIND,5) == 0 && dvere[2] == true)
{
dvere[2] = false;
doorStatus();
}
else if( test(PIND,5) != 0 && dvere[2] == false)
{
dvere[2] = true;
doorStatus();
}
if( test(PIND,4) == 0 && dvere[3] == true)
{
dvere[3] = false;
doorStatus();
}
else if( test(PIND,4) != 0 && dvere[3] == false)
{
dvere[3] = true;
doorStatus();
}
}
void displaySetup()
{
lcd.setCursor(0,0);
lcd.print("Komora c.1");
lcd.setCursor(0,1);
lcd.print("Komora c.2");
lcd.setCursor(0,2);
lcd.print("Komora c.3");
lcd.setCursor(0,3);
lcd.print("Komora c.4");
}
void doorStatus() {
for (int d = 0; d < 4; d++) {
lcd.setCursor(12, d);
lcd.print(" ");
lcd.setCursor(12, d);
if (!dvere[d]) {
lcd.print("Opened");
} else {
lcd.print("Closed");
}
}
}