/*
Forum: https://forum.arduino.cc/t/real-time-clock-in-menu-hinzufugen/1189915
Wokwi: https://wokwi.com/projects/381572374518920193
*/
//Menü//////////////////////////////////////////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
const byte upButtonPin = 35;
const byte downButtonPin = 39;
const byte rightButtonPin = 30;
const byte leftButtonPin = 32;
const byte tweeterPin = 9;
const byte ledPin = 13;
const byte ledPin_fade = 10;
int fade = 0;
int L_Haus = 41;
int L_Rot = 43;
int ROT = 24;
int GELB = 22;
int GRUEN = 26;
int F_ROT = 33;
int F_GRUEN = 45;
int TasterLesen;
int lastState = LOW;
int currentState;
int Sensorwert;
int L_GRUEN = 13;
int L_ROT = 31;
int SPU = 2048;
Stepper Motor(SPU, 3, 5, 4, 6);
String MenuItems[9] = {
"1.Solarenergie",
"2.Windenergie",
"3.Garagentor",
"4.Luftqualitaet",
"5.Strassenlaternen",
"6.LED Haus",
"7.Ampel",
"8.Akkustand",
"9.Uhrzeit/Datum",
};
////////////////////////////////////////////////////////////
//RealTimeClock/////////////////////////////////////////////
//#include <TimeLib.h>
//#include <DS1307RTC.h>
#include <RTClib.h>
////////////////////////////////////////////////////////////
RTC_DS1307 rtc;
boolean showTheTime = false;
void setup()
{
Serial.begin(9600);
///////////////Buttons//////////////////////
pinMode(upButtonPin, INPUT_PULLUP);
pinMode(downButtonPin, INPUT_PULLUP);
pinMode(rightButtonPin, INPUT_PULLUP);
pinMode(leftButtonPin, INPUT_PULLUP);
////LCD/////////////////////////////////////
lcd.init();
lcd.backlight();
////RealTimeClock///////////////////////////
while (!Serial) ;
delay(200);
Serial.println("RTC Read Test");
Serial.println("-------------------");
/////////////////////////////////////////////
pinMode(L_Haus, OUTPUT);
pinMode(ROT, OUTPUT);
pinMode(GELB, OUTPUT);
pinMode(GRUEN, OUTPUT);
pinMode(F_ROT, OUTPUT);
pinMode(F_GRUEN, OUTPUT);
pinMode(0, INPUT);
Motor.setSpeed(5);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
}
//////MENU/////////////////////////////////////////////////
void menuFunctions(int menu, byte right, byte left) // funktionen einfügen, verbessern(also die aufteilung), nochmal genau durchlesen damit ich des programm versteh etc.
{
if (menu == 1)
{
if (right == 1)
{
lcd.setCursor(0, 2);
lcd.print("Stromstaerke=");
lcd.setCursor(0, 3);
lcd.print("Spannung=");
digitalWrite(ledPin, HIGH);
}
}
if (menu == 2)
{
if (right == 1)
{
lcd.setCursor(0, 2);
lcd.print("Stromstaerke=");
lcd.setCursor(0, 3);
lcd.print("Spannung=");
digitalWrite(ledPin, HIGH);
}
}
if (menu == 3)
{
if (right == 1)
{
lcd.setCursor(0, 3);
lcd.print("Closed ");
lcd.setCursor(10, 3);
lcd.print("Open <<");
Motor.step(2048);
delay(1000);
}
if (left == 1)
{
lcd.setCursor(0, 3);
lcd.print("Closed <<");
lcd.setCursor(10, 3);
lcd.print("Open ");
Motor.step(-2048);
delay(1000);
}
}
if (menu == 4)
{
if (right || left == 1)
{
lcd.setCursor(0, 2);
lcd.print("Luftqulitaet=");
Sensorwert = analogRead(0);
Sensorwert = (Sensorwert / 6);
Serial.println("Luftqualität : ");
Serial.println(Sensorwert, DEC);
Serial.println();
if (Sensorwert >= 50)
{
lcd.setCursor(14, 2);
lcd.print("SCHLECHT");
}
else(Sensorwert <= 49);
{
lcd.setCursor(14, 2);
lcd.print("GUT");
}
}
}
if (menu == 5)
{
if (right == 1)
{
lcd.setCursor(0, 3);
lcd.print("Off ");
lcd.setCursor(10, 3);
lcd.print("On <<");
digitalWrite(ledPin, HIGH);
}
if (left == 1)
{
lcd.setCursor(0, 3);
lcd.print("Off <<");
lcd.setCursor(10, 3);
lcd.print("On ");
digitalWrite(ledPin, LOW);
}
}
if (menu == 6)
{
if (right == 1)
{
lcd.setCursor(0, 3);
lcd.print("Off ");
lcd.setCursor(10, 3);
lcd.print("On <<");
digitalWrite(L_Haus, HIGH);
}
if (left == 1)
{
lcd.setCursor(0, 3);
lcd.print("Off <<");
lcd.setCursor(10, 3);
lcd.print("On ");
digitalWrite(L_Haus, LOW);
}
}
if (menu == 7)
{
if (right || left == 1) //Überlegen was man hinschreiben könnte; Zeit anzeigen lassen wie lange die Ampel noch dauert
{
lcd.setCursor(0, 3);
lcd.print("druecken <<");
delay(3000);
digitalWrite(GRUEN, LOW);
digitalWrite(GELB, HIGH);
delay(1000);
digitalWrite(GELB, LOW);
digitalWrite(ROT, HIGH);
delay(3000);
digitalWrite(F_ROT, LOW);
digitalWrite(F_GRUEN, HIGH);
delay(6000);
digitalWrite(F_GRUEN, LOW);
digitalWrite(F_ROT, HIGH);
delay(1000);
digitalWrite(GELB, HIGH);
delay(1000);
digitalWrite(ROT, LOW);
delay(500);
digitalWrite(GELB, LOW);
digitalWrite(GRUEN, HIGH);
}
}
if (menu == 8)
{
if (right == 1)
{
lcd.setCursor(0, 2);
lcd.print("Akkustand=");
}
}
if (menu == 9)
{
showTheTime = true;
}
if (menu != 9) { showTheTime = false;};
}
template< typename T, size_t NumberOfSize >
size_t MenuItemsSize(T (&) [NumberOfSize]) {
return NumberOfSize;
}
int numberOfMenuItems = MenuItemsSize(MenuItems) - 1;
int currentMenuItem = 0;
int previousMenuItem = 1;
byte button_flag = 0;
unsigned long previousMillis = millis();
const int note = 4699;
void beepsOnce()
{
tone(tweeterPin, note, 125);
delay(60);
noTone(tweeterPin);
}
void print2Digits(int no){
if (no >= 0 && no <10){
lcd.print("0");
}
lcd.print(no);
}
void showTime(){
DateTime now = rtc.now();
lcd.setCursor(0, 2);
lcd.print("Uhrzeit:");
print2Digits(now.hour());
lcd.print(':');
print2Digits(now.minute());
lcd.print(':');
print2Digits(now.second());
lcd.setCursor(0, 3);
lcd.print("Datum:");
print2Digits(now.day());
lcd.print('/');
print2Digits(now.month());
lcd.print('/');
lcd.print(now.year());
}
void loop()
{
if (showTheTime){
showTime();
}
//////////MENU/////////////////////////////////////////////////////////////////////////////////////////
if (digitalRead(rightButtonPin) == LOW && button_flag == 0)
{
menuFunctions(currentMenuItem + 1, 1, 0);
button_flag = 1;
previousMillis = millis();
beepsOnce();
}
if (digitalRead(leftButtonPin) == LOW && button_flag == 0)
{
menuFunctions(currentMenuItem + 1, 0, 1);
button_flag = 1;
previousMillis = millis();
beepsOnce();
}
if (digitalRead(upButtonPin) == LOW && button_flag == 0)
{
++currentMenuItem;
if (currentMenuItem > numberOfMenuItems )
{
currentMenuItem = numberOfMenuItems ;
}
button_flag = 1;
previousMillis = millis();
beepsOnce();
}
else if (digitalRead(downButtonPin) == LOW && button_flag == 0)
{
currentMenuItem--;
if (currentMenuItem < 0)
{
currentMenuItem = 0;
}
button_flag = 1;
previousMillis = millis();
beepsOnce();
}
if (currentMenuItem != previousMenuItem)
{
lcd.clear();
lcd.setCursor(2, 0);
lcd.print(MenuItems [currentMenuItem]);
menuFunctions(currentMenuItem + 1, 0, 0);
previousMenuItem = currentMenuItem;
}
if (millis() - previousMillis >= 400)
{
previousMillis = millis();
button_flag = 0;
}
}