#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Bijwerken naar de nieuwe pinnummers voor de knoppen
const int btnIncreaseTime = 7; // Verhoogt de tijd
const int btnDecreaseTime = 5; // Verlaagt de tijd
const int btnSetEditMode = 6; // Schakelt tussen bewerkingsmodi
const int btnToggleAlarm = 4; // Zet het alarm aan of uit, stopt het alarm
int alarmHour = 0;
int alarmMinute = 0;
bool alarmEnabled = false;
bool isInSettingMode = false;
int settingMode = 0; // 0: Geen instelling, 1: Uren instellen, 2: Minuten instellen
void setup() {
pinMode(btnIncreaseTime, INPUT_PULLUP);
pinMode(btnDecreaseTime, INPUT_PULLUP);
pinMode(btnSetEditMode, INPUT_PULLUP);
pinMode(btnToggleAlarm, INPUT_PULLUP);
lcd.init();
lcd.backlight();
// Initialize time as an example, this will be overwritten by the actual timekeeping logic
setTime(8, 0, 0, 1, 1, 2024);
}
void loop() {
static unsigned long previousMillis = 0;
if (millis() - previousMillis >= 1000) {
previousMillis += 1000;
secondTick();
}
checkButtons();
displayTimeAndAlarm();
}
void checkButtons() {
// Debounce mechanism is omitted for brevity, remember to implement it in a real scenario
if (digitalRead(btnSetEditMode) == LOW) {
while(digitalRead(btnSetEditMode) == LOW); // Eenvoudige debounce
settingMode = (settingMode + 1) % 3; // Wissel modus
}
if (settingMode == 1 && digitalRead(btnIncreaseTime) == LOW) { // Uren instellen
while(digitalRead(btnIncreaseTime) == LOW); // Eenvoudige debounce
alarmHour = (alarmHour + 1) % 24;
} else if (settingMode == 2 && digitalRead(btnIncreaseTime) == LOW) { // Minuten instellen
while(digitalRead(btnIncreaseTime) == LOW); // Eenvoudige debounce
alarmMinute = (alarmMinute + 1) % 60;
}
if (settingMode == 1 && digitalRead(btnDecreaseTime) == LOW) { // Uren verlagen
while(digitalRead(btnDecreaseTime) == LOW); // Eenvoudige debounce
alarmHour = (alarmHour - 1 + 24) % 24;
} else if (settingMode == 2 && digitalRead(btnDecreaseTime) == LOW) { // Minuten verlagen
while(digitalRead(btnDecreaseTime) == LOW); // Eenvoudige debounce
alarmMinute = (alarmMinute - 1 + 60) % 60;
}
if (digitalRead(btnToggleAlarm) == LOW) {
while(digitalRead(btnToggleAlarm) == LOW); // Eenvoudige debounce
if (alarmEnabled && hour() == alarmHour && minute() == alarmMinute) {
// Als het alarm afgaat, zet het uit
alarmEnabled = false;
} else {
// Toggle alarm status
alarmEnabled = !alarmEnabled;
}
}
}
void secondTick() {
// Tijd verhogen per seconde
time_t currentTime = now();
setTime(hour(currentTime), minute(currentTime), second(currentTime) + 1, day(currentTime), month(currentTime), year(currentTime));
}
void displayTimeAndAlarm() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
printDigits(hour());
lcd.print(":");
printDigits(minute());
lcd.setCursor(0, 1);
lcd.print("Alarm: ");
if (alarmEnabled) {
printDigits(alarmHour);
lcd.print(":");
printDigits(alarmMinute);
} else {
lcd.print("OFF");
}
}
void printDigits(int digits) {
if (digits < 10) lcd.print('0');
lcd.print(digits);
}
Deze code heb ik nu. Hij zit nu op de display een tijd en begint vanaf 0 te tellen. Elke keer als er 1 knop wordt ingedrukt wordt die gereset. De tijd. Ik wil dat je op de displaytje de actuele tijd ziet zonder gebruik van RTC. Bovendien moet de eerste knop de uren met 1 verhogen, en de tweede knop de minuut verhogen met 1, de 3de knop moet ik edit modus gaan om de alarm te kunnen zetten. En de 4de knop moet het alarm uit kun zitten. En als het kan een rgb lamp die circa 10 minuten voor dat het alarm af gaat geleidelijk lichter wordt en als de werker gaat op het felst is, en als de 4de knop wordt ingedrukt de rgb ook uit gaat.