#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <HCSR04.h>
#include <I2C_RTC.h>
int resetD; // resetowanie wyswitlacza w przypadku zmiany danych
int resetZ;
long start;
byte tryb; // zmiana trybu
int daySet; // do nastwu daty z Serial Monitora
int monthSet;
int yearSet;
int weekSet;
int hourSet; // godzina z Serial Monitora
int minuteSet;
int secondSet;
float distance; //czujnik odległości
const byte trigPin = 3;
const byte echoPin = 2;
int valueA;
String serialDane;
static DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
HCSR04 hc(trigPin, echoPin);
///////////////////////
String dniTyg[] =
{
"null", "Pn", "Wt", "Sr", "Czw", "Pt", "Sb", "Ndz"
};
String mies[] =
{
"null", "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip",
"Sie", "Wrz", "Paz", "Lis", "Gru"
};
byte sun[] =
{
B00010,
B00001,
B01110,
B01110,
B01110,
B10000,
B01000,
B00000
};
byte night[] =
{
B00011,
B00011,
B00000,
B01010,
B01110,
B01110,
B10100,
B01100
};
byte clockC[] =
{
B00000,
B01110,
B10111,
B11011,
B11111,
B01110,
B00000,
B00000
};
byte date[] =
{
B11111,
B11111,
B11011,
B10011,
B11011,
B10001,
B11111,
B11111
};
byte distSens[] =
{
B01110,
B00101,
B10000,
B00100,
B00010,
B01000,
B00100,
B01110
};
void setup()
{
Wire.begin();
lcd.init();
lcd.backlight();
rtc.begin();
Serial.begin(9600);
start = millis();
lcd.createChar(0, sun);
lcd.createChar(1, night);
lcd.createChar(2, clockC);
lcd.createChar(3, date);
lcd.createChar(4, distSens);
Serial.println("---------------------");
Serial.println("Podaj Date i Godzine!");
Serial.println("Zgodnie z wzorem: DD.MM.YYYY.W-H:M:S");
Serial.println(">>>> Przykład: 21.11.2023.1-16:57:32 <<<<");
}
void loop()
{
valueA = analogRead(A0);
valueA = map(valueA,0,1023,1023,0);
if(valueA <200)
{
configFx();
tryb = 1;
}
else if (valueA >= 200 && valueA < 400)
{
tryb = 2;
menuFx();
}
else if(valueA >= 400 && valueA < 600)
{
tryb = 3;
dataFx();
}
else if (valueA >= 600 && valueA < 800)
{
tryb = 4;
zegarFx();
}
else if (valueA >= 800 && valueA < 1000)
{
tryb = 5;
sensorFx();
}
else
{
tryb = 6;
koniecFx();
}
}
void configFx()
{
if (tryb != 1)
{
lcd.clear();
}
if (Serial.available()>0)
{
serialDane = Serial.readStringUntil('\n');
daySet = serialDane.substring(0,2).toInt();
monthSet = serialDane.substring(3,5).toInt();
yearSet = serialDane.substring(6,10).toInt();
weekSet = serialDane.substring(11,12).toInt();
hourSet = serialDane.substring(13,15).toInt();
minuteSet = serialDane.substring(16,18).toInt();
secondSet = serialDane.substring(19,21).toInt();
rtc.setDay(daySet);
rtc.setMonth(monthSet);
rtc.setYear(yearSet);
rtc.setWeek(weekSet);
rtc.setHours(hourSet);
rtc.setMinutes(minuteSet);
rtc.setSeconds(secondSet);
}
lcd.setCursor(0,0);
lcd.print("> Konfiguracja!");
lcd.setCursor(0,1);
lcd.print(">Serial Monitor<");
}
void menuFx()
{
int delta = millis() - start;
if(tryb != 2)
{
lcd.clear();
}
lcd.setCursor(0,0);
lcd.print("Dostepne opcje:");
if(delta < 1500)
{
lcd.setCursor(0,1);
lcd.print("> ");
lcd.setCursor(2,1);
lcd.write(byte(3));
lcd.print(" ");
lcd.print("Kalendarz");
lcd.print(" ");
}
else if (delta >= 1500 && delta < 3000)
{
lcd.setCursor(0,1);
lcd.print("> ");
lcd.setCursor(2,1);
lcd.write(byte(2));
lcd.print(" ");
lcd.print("Zegar");
lcd.print(" ");
}
else if (delta >= 3000 && delta < 4500)
{
lcd.setCursor(0,1);
lcd.print("> ");
lcd.setCursor(2,1);
lcd.write(byte(4));
lcd.print(" ");
lcd.print("Czujnik");
lcd.print(" ");
}
else
{
start = millis();
}
}
/////////////////
void dataFx()
{
resetD = rtc.getDay();
if(abs(resetD - rtc.getDay())>1 || tryb != 3)
{
lcd.clear();
resetD = rtc.getDay();
}
lcd.setCursor(0,0);
lcd.print("<<<<<<Data>>>>>>");
lcd.setCursor(0,1);
lcd.print(rtc.getDay());
lcd.print(" ");
lcd.print(mies[rtc.getMonth()]);
lcd.print(".");
lcd.print(rtc.getYear());
lcd.print("r");
lcd.print(" ");
lcd.print(dniTyg[rtc.getWeek()]);
lcd.print(" ");
}
//////////////////
void zegarFx()
{
resetZ = rtc.getSeconds();
if(abs(resetZ - rtc.getSeconds())>1 || tryb != 4)
{
lcd.clear();
resetZ = rtc.getSeconds();
}
lcd.setCursor(0,0);
lcd.print("<<<<Godzina>>>>");
lcd.setCursor(0,1);
if(rtc.getHours()< 18 && rtc.getHours()> 6)
{
lcd.print(" ");
lcd.write(byte(0));
lcd.print(" ");
}
else
{
lcd.print(" ");
lcd.write(byte(1));
lcd.print(" ");
}
lcd.setCursor(3,1);
if(rtc.getHours()<10)
{
lcd.print("O");
lcd.print(rtc.getHours());
lcd.print(":");
}
else
{
lcd.print(rtc.getHours());
lcd.print(":");
}
if(rtc.getMinutes()<10)
{
lcd.print("0");
lcd.print(rtc.getMinutes());
lcd.print(":");
}
else{
lcd.print(rtc.getMinutes());
lcd.print(":");
}
if(rtc.getSeconds()<10)
{
lcd.print("0");
lcd.print(rtc.getSeconds());
}
else{
lcd.print(rtc.getSeconds());
}
lcd.setCursor(11,1);
lcd.print(" ");
lcd.setCursor(14,1);
lcd.print("EU");
}
////// Sensor
void sensorFx()
{
distance = hc.dist();
if(abs(distance - hc.dist())>2 || tryb != 5)
{
lcd.clear();
distance = hc.dist();
}
lcd.setCursor(0, 0);
lcd.print("<<<<Dystans>>>>");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.print(distance);
lcd.print(" Cm");
}
void koniecFx()
{
if(tryb != 6)
{
lcd.clear();
}
lcd.setCursor(0,0);
lcd.print("Zrobione przez:");
lcd.setCursor(0,1);
lcd.print(" B@rXtZ@ $. ");
}