#include <LiquidCrystal.h>
// Zdefiniowanie makr dla pinow
#define BUTTON 7
#define RELAY 3
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
// Stany przekaźnika
enum RelayStates {
RELAY_ON,
RELAY_OFF
};
// Zmienne przechowujace dane o czasie, stanie przycisku i aktualnej diodzie
unsigned long timer;
RelayStates nextState = RELAY_OFF;
byte previousButtonState = HIGH;
// Utworzenie liter polskiego alfabetu
byte zWithLine[8] = {
0b00010,
0b00100,
0b11111,
0b00011,
0b00100,
0b01000,
0b11000,
0b11111
};
byte lWithLine[8] = {
0b1100,
0b0100,
0b0110,
0b0100,
0b1100,
0b0100,
0b1110,
};
byte aWithDot[8] = {
0b00000,
0b01110,
0b00001,
0b01111,
0b10001,
0b01111,
0b00010,
};
// Funkcja zmieniajaca diode oraz tekst
void switchState() {
lcd.clear();
switch(nextState) {
case RELAY_ON:
lcd.setCursor(0, 0);
lcd.print("Przeka");
lcd.write("\x01");
lcd.print("nik:");
lcd.setCursor(0, 9);
lcd.print("za");
lcd.write("\x02");
lcd.write("\x03");
lcd.print("czony");
Serial.println("Przekaźnik: załączony");
digitalWrite(RELAY, HIGH);
nextState = RELAY_OFF;
break;
case RELAY_OFF:
lcd.setCursor(0, 0);
lcd.print("Przeka");
lcd.write("\x01");
lcd.print("nik:");
lcd.setCursor(0, 9);
lcd.print("wy");
lcd.write("\x02");
lcd.write("\x03");
lcd.print("czony");
Serial.println("Przekaźnik: wyłączony");
digitalWrite(RELAY, LOW);
nextState = RELAY_ON;
break;
default:
lcd.print("B");
lcd.write("\x03");
lcd.write("\x04");
lcd.print("d, wracamy");
nextState = RELAY_OFF;
return;
}
}
void setup() {
lcd.createChar(1, zWithLine);
lcd.createChar(2, lWithLine);
lcd.createChar(3, aWithDot);
// Skonfigurowanie pinów
pinMode(RELAY, OUTPUT);
pinMode(BUTTON, INPUT);
// Nawiazujemy polaczenie poprzez port szeregowy
Serial.begin(115200);
lcd.begin(16, 2);
// Pierwsze zapisanie licznika czasu oraz zapalenie diody
switchState();
timer = millis();
}
void loop() {
unsigned long currentTime = millis();
byte buttonState = digitalRead(BUTTON);
// Zmiana stanu z ochroną przed drganiami stykow oraz przetrzymaniem przycsku
if (millis() - timer > 50 && buttonState != previousButtonState) {
timer = millis();
if (buttonState == HIGH && previousButtonState == LOW) {
switchState();
}
previousButtonState = buttonState;
}
}