#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ustawienie adresu ukladu na 0x27
byte pl_L[8] = { // Znak Ł
B10000,
B10000,
B10100,
B11000,
B10000,
B10000,
B11111,
B00000
};
#define sw 7
#define power 13
#define pir 8
#define LED1 10
#define LED2 11
#define LED3 12
int thr, foto, c = 0;
unsigned long actualTime, mem = 0;
void setup() {
pinMode(sw, INPUT_PULLUP);
pinMode(pir, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(power, OUTPUT);
lcd.begin(16,2); // Okreslanie rozmiaru wyswietlacza
lcd.backlight(); // Wlaczenie podswietlenia
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inicjalizacja...");
lcd.setCursor(0,1);
lcd.print(" UEA 2023 ");
delay(2000);
lcd.clear();
lcd.createChar(0,pl_L); // Dodanie do slownika znaku Ł
}
void swOutput(int state);
void LEDon(int state);
void mode(int m, int state);
void loop() {
lcd.createChar(0,pl_L); // Dodanie do slownika znaku Ł
thr = analogRead(A2);
foto = analogRead(A1);
if(digitalRead(sw) == LOW){
c++;
lcd.clear();
delay(100);
if(c > 3) {
lcd.noBacklight();
}
else {
lcd.backlight();
}
}
switch(c) { // Wybor trybu pracy
case 0: // Tryb wylaczony
LEDon(0);
swOutput(LOW);
lcd.setCursor(13,1);
lcd.print("WY");
lcd.setCursor(15,1);
lcd.print((char)0);
lcd.noBacklight();
break;
case 1: // Tryb wlaczony manualnie
swOutput(HIGH);
LEDon(1);
mode(0,1);
break;
case 2: // Tryb automatyczny natezenie swiatla
LEDon(2);
if (foto > thr) {
swOutput(HIGH);
mode(1,1);
}
else {
swOutput(LOW);
mode(1,0);
}
break;
case 3: // Tryb automatyczny natezenie swiatla + PIR
LEDon(3);
if(foto > thr and digitalRead(pir) == HIGH) {
swOutput(HIGH);
mode(2,1);
}
else {
swOutput(LOW);
mode(2,0);
}
break;
case 4: // Przejscie na poczatek
c=0;
break;
}
actualTime = millis();
if(actualTime - mem > 15000UL) {
mem = actualTime;
lcd.noBacklight();
}
}
void swOutput(int state) { // Funkcja przelaczajaca styk wyjscia
if(state == HIGH) {
digitalWrite(power, HIGH);
}
else {
digitalWrite(power, LOW);
}
}
void LEDon(int state) { // Funkcja przelacajaca diody sygnalizujace tryby pracy
if(state == 0) { // Jesli stan 0 diody wylaczane
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
}
else if(state == 1) { // Jesli stan 1, dioda 1 wlaczana
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
}
else if(state == 2) { // Jesli stan 2, dioda 2 wlaczana
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
}
else if(state == 3) { // Jesli stan 3, dioda 3 wlaczana
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
}
else {}
}
void mode(int m, int state) { // Funkcja wyswietlajaca tryb pracy
lcd.setCursor(0,0); // Pierwsza linijka
if(m == 0) {
lcd.print("MANUAL ");
}
else if(m == 1) {
lcd.print("AUTO FOTO");
}
else {
lcd.print("AUTO FOTO+PIR");
}
lcd.setCursor(0,1); // Druga linijka
if(state == 0) {
lcd.print("STAN: WY");
lcd.setCursor(15,1);
lcd.print((char)0);
}
else {
lcd.print("STAN: W");
lcd.setCursor(15,1);
lcd.print((char)0);
}
}