Wake-up light arduino need help

I need to create a wake-up light, and the code is the problem. I've been dealing with this for a few weeks now and nothing seems to work. As well as the buttons and the screen. I use an arduino uno, 4 buttons and an LCD screen, and a buzzer. The big problem is the code because the build was successful. If anyone has any ideas please. As long as I have the code to make an alarm clock, I'm happy

Beste Ruben,
Je hebt gepost in het engelstalige deel van het forum.
Stel je vraag hier in het engels of laat je post verplaatsen naar het NL deel door op het vlaggetje te drukken.
Post de code die je hebt geschreven en vertel erbij tegen welke problemen je aanloopt. (Compiler messages, code doet iets snders dan de bedoeling us etc.)
Post een schema van hoe je alles hebt aangesloten (mag gewoon met pen en papier, foto maken, posten). Zet er info bij over jouw lcd, buzzer, etc.
Post een foto van je probeersel.

Alleen dan kunnen we je helpen.

Could you post the code, so that we could look for the error?

Ik ben hier Nieuw en heb geen idee hoe ik dat zou moeten doen

Wat zou moeten doen? Begin eens How to get the best out of this forum (opnieuw?) te lezen. Het geeft instructies hoe je je programma kan tonen op het forum met gebruik van zogenaamde code tags. Een schema kan eenvoudig een foto zijn van een tekening met pen/potlood op papier;

Doorgaan met de discussie van Wake-up light arduino need help:



Je post is inmiddels verplaatst naar NL deel. Dus dat is gelukt.
De foto is er, nu nog code en schema...

Dat is altijd zo vaag. Compilatie problemen? Upload problemen? Of doet je programma niet wat je verwacht dat het zou moeten doen?

Heb je de individuele stukjes al getest? Knop lezen en de status via de seriele monitor tonen; een I2C lcd voorbeeld om wat tekst op de LCD te zetten.

Nog steeds hetzelfde draadje :wink: Een moderator had je draadje al verplaatst naar de Nederlandse sectie.

Ik ben met een project bezig dat (min of meer) dezelfde componenten gebruikt; het verschil is Uno vs Nano en geen LCD met ingebouwde I2C interface maar standaard LCD met aparte backpack.

Je kunt zien dat ik slechts twee draadjes per knop gebruik, geel voor verbinding met de Arduino en de andere voor GND. Er worden geen weerstanden gebruikt, het onderstaande programma schakelt de pullup weerstand die in the 328P processor zit in.

// aanpassen naar je behoefte
const uint8_t btnPin = 2;

void setup()
{
  Serial.begin(115200);

  pinMode(btnPin, INPUT_PULLUP);
}

void loop()
{
  if(digitalRead(btnPin) == LOW)
  {
    Serial.println("Knop ingedrukt");
  }
  else
  {
    Serial.println("Knop niet ingedrukt");
  }

  delay(1000);
}

Verwacht niet dat iemand de code voor je gaat schrijven. Wij zijn hier om je te helpen...

In eerste instantie had ik ook maar 2 draden gebruikt voor de knoppen. Echter werd aangeraden om 3 draden te gebruiken. 1 voor de stroom, een naar de ground en 1 voor het signaal.

Ja de code lijkt niet te werken terwijl ik meerdere dingen heb geprobeerd, zo heb ik al wel alle componenten getest of ze werken en ze doen het allemaal. De code lijkt niet te werken omdat er altijd wel een foutje inzit en die ik dan niet kan verhelpen

Nee nee, dat begrijp ik, ik raadpleegde dit platform meer als richtlijn/hulp om de wake-up light kunnen maken.

Laat de code maar zien, zoals al een paar keer is gevraagd.

Om het gemakkelijk te maken zit er een "copy for forum" optie in het "edit" menu van de IDE. Daar op klikken en vervolgens hier in een nieuw bericht plakken. En anders de "How to get the best ..." nog eens lezen :wink:

This what we have for now:
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>

#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2

#define BUTTON1_PIN A0
#define BUTTON2_PIN A2
#define BUTTON3_PIN A1
#define BUTTON4_PIN A3

#define DEBOUNCE_DELAY 50
#define LONG_PRESS_DELAY 5000
#define NO_BUTTON_PRESS_TIMEOUT 5000

LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);

volatile bool button1Pressed = false;
volatile bool button2Pressed = false;
volatile bool button3Pressed = false;
volatile bool button4Pressed = false;
unsigned long lastButtonPressTime = 0;

void button1ISR();
void button2ISR();
void button3ISR();
void button4ISR();
void handleButtonActions();

void setup() {
lcd.init();
lcd.backlight();

// Adjust contrast (you may need to adjust this value)
lcd.setContrast(50);

setTime(0, 0, 0, 1, 1, 2020);

pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
pinMode(BUTTON3_PIN, INPUT_PULLUP);
pinMode(BUTTON4_PIN, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(BUTTON1_PIN), button1ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON2_PIN), button2ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON3_PIN), button3ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON4_PIN), button4ISR, CHANGE);

}

void loop() {
static unsigned long lastUpdateTime = 0;
unsigned long currentTime = millis();

if (currentTime - lastUpdateTime >= 1000) {
    lastUpdateTime = currentTime;
    if (!button3Pressed) {
        adjustTime(1);
    }
}

int h = hour();
int m = minute();
int s = second();

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(h < 10 ? "0" : "");
lcd.print(h);
lcd.print(":");
lcd.print(m < 10 ? "0" : "");
lcd.print(m);
lcd.print(":");
lcd.print(s < 10 ? "0" : "");
lcd.print(s);

handleButtonActions();

}

void button1ISR() {
if (!button3Pressed) return; // Button 1 only works after button 3 has been pressed
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button1Pressed = true;
lastButtonPressTime = millis();
}

void button2ISR() {
if (!button3Pressed) return; // Button 2 only works after button 3 has been pressed
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button2Pressed = true;
lastButtonPressTime = millis();
}

void button3ISR() {
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button3Pressed = true;
lastButtonPressTime = millis();
}

void button4ISR() {
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button4Pressed = true;
lastButtonPressTime = millis();
}

void handleButtonActions() {
static bool button3LongPressed = false;

unsigned long currentTime = millis();

if (button1Pressed) {
    adjustTime(10); // Adjust by 10 minutes
    button1Pressed = false;
}

if (button2Pressed) {
    adjustTime(-10); // Adjust by -10 minutes
    button2Pressed = false;
}

if (button3Pressed) {
    if ((currentTime - lastButtonPressTime) >= LONG_PRESS_DELAY) {
        button3LongPressed = true;
    }
} else {
    if (button3LongPressed) {
        // Implement alarm setting logic here
        button3LongPressed = false;
    }
}

if (button4Pressed) {
    // Implement buzzer stopping logic here
    button4Pressed = false;
}

}

Deze code hebben we voor nu
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>

#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2

#define BUTTON1_PIN A0
#define BUTTON2_PIN A2
#define BUTTON3_PIN A1
#define BUTTON4_PIN A3

#define DEBOUNCE_DELAY 50
#define LONG_PRESS_DELAY 5000
#define NO_BUTTON_PRESS_TIMEOUT 5000

LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);

volatile bool button1Pressed = false;
volatile bool button2Pressed = false;
volatile bool button3Pressed = false;
volatile bool button4Pressed = false;
unsigned long lastButtonPressTime = 0;

void button1ISR();
void button2ISR();
void button3ISR();
void button4ISR();
void handleButtonActions();

void setup() {
lcd.init();
lcd.backlight();

// Adjust contrast (you may need to adjust this value)
lcd.setContrast(50);

setTime(0, 0, 0, 1, 1, 2020);

pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
pinMode(BUTTON3_PIN, INPUT_PULLUP);
pinMode(BUTTON4_PIN, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(BUTTON1_PIN), button1ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON2_PIN), button2ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON3_PIN), button3ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON4_PIN), button4ISR, CHANGE);

}

void loop() {
static unsigned long lastUpdateTime = 0;
unsigned long currentTime = millis();

if (currentTime - lastUpdateTime >= 1000) {
    lastUpdateTime = currentTime;
    if (!button3Pressed) {
        adjustTime(1);
    }
}

int h = hour();
int m = minute();
int s = second();

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(h < 10 ? "0" : "");
lcd.print(h);
lcd.print(":");
lcd.print(m < 10 ? "0" : "");
lcd.print(m);
lcd.print(":");
lcd.print(s < 10 ? "0" : "");
lcd.print(s);

handleButtonActions();

}

void button1ISR() {
if (!button3Pressed) return; // Button 1 only works after button 3 has been pressed
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button1Pressed = true;
lastButtonPressTime = millis();
}

void button2ISR() {
if (!button3Pressed) return; // Button 2 only works after button 3 has been pressed
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button2Pressed = true;
lastButtonPressTime = millis();
}

void button3ISR() {
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button3Pressed = true;
lastButtonPressTime = millis();
}

void button4ISR() {
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button4Pressed = true;
lastButtonPressTime = millis();
}

void handleButtonActions() {
static bool button3LongPressed = false;

unsigned long currentTime = millis();

if (button1Pressed) {
    adjustTime(10); // Adjust by 10 minutes
    button1Pressed = false;
}

if (button2Pressed) {
    adjustTime(-10); // Adjust by -10 minutes
    button2Pressed = false;
}

if (button3Pressed) {
    if ((currentTime - lastButtonPressTime) >= LONG_PRESS_DELAY) {
        button3LongPressed = true;
    }
} else {
    if (button3LongPressed) {
        // Implement alarm setting logic here
        button3LongPressed = false;
    }
}

if (button4Pressed) {
    // Implement buzzer stopping logic here
    button4Pressed = false;
}

}

Kun je je post wijzigen met de juiste code tags?
En in de IDE druk ctrl-t. Dan wordt je code automatisch goed onder elkaar gezet (of juist niet, en dan weet je waar je een { of } teveel of te weinig hebt...

Wat doet je code?
Wat wil je dat de code doet?
Of heb je een compiler error? Zo ja, welke...

Even tussendoor: ISR's zouden hier niet nodig moeten zijn...

Hmm, bij mijn weten werkt dat alleen op de pinnen 2 en 3 van de Uno. Als je zonodig interrupts wilt gebruiken zul je PinChange Interrupts moeten gebruiken.

Zoals al aangegeven in het vorige antwoord zou het gebruik van (enig type) interrupts niet nodig moeten zijn; interrupts zijn bedoeld voor zaken die niet kunnen wachten (snelle signalen) en ik weet vrij zeker dat het je niet zoveel uitmaakt of je lamp 50 ms later reageert op de knop of niet.

Ja ik gebruik nu de normale pinnen in plaats van de pinnen met de A(cijfer)

#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.

En nu graag met code tags. Bewerk je antwoord #19 (er zou een potloodje onder dat antwoord moeten staan, klik daar op), selecteer alle code en click de <CODE/> knop. Sla vervolgens je antwoord op.

Er zijn redenen waarom dat gevraagd wordt en dat is niet omdat we moeilijk willen doen. Het maakt het makkelijker om het programma te lezen, gemakkelijker om het programma te copieren en zorgt ervoor dat de forum software het goed weergeeft.