Nano und LCD 4x20

Ich habe den code von Wolle etwas erweitert und einen LDR mit Widerstandsteiler an A0. Der Wert wird auch ausgegeben , aber die Hintergrundbeleuchtung schaltet nicht ein.


```cpp
#include <Wire.h>
#include <RTClib.h>             // Adafruit library for the DS3231
#include <LiquidCrystal_I2C.h>  // library for the LCD display

RTC_DS3231 rtc;                      // create RTC_DS3231 object
LiquidCrystal_I2C lcd(0x27, 20, 2);  // create display object (address, columns, rows)
unsigned long startTime = 0;         //Hier merken wir uns nach jedemr Messung die Zeit in Millisekunden (seit dem Start des Arduino)

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

  lcd.init();
  //lcd.backlight();
  lcd.clear();

  if (!rtc.begin()) {
    Serial.println(F("Couldn't find RTC"));
    while (1) {}
  }
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // set rtc to date/time of compilation
  rtc.disable32K();                 // stop signal at the 32K pin
  rtc.writeSqwPinMode(DS3231_OFF);  // stop signal at the SQW pin
}

void loop() {
  if (millis() % 1000 == 0) {  // update date/time every second
    printDateTime();
    delay(1);
  }
  if (millis() > (startTime + 10000)) { // alle 10 sek den A0 prüfen
    startTime = millis();
    if (analogRead(A0) < 500) {
      lcd.backlight();                  // das Licht schaltet nicht ein
      Serial.println((analogRead(A0))); // die Ausgabe erfolgt ??
      delay(1);
    }
  }
}
void printDateTime() {
  DateTime now = rtc.now();

  char datBuf[] = "DDD, DD.MM.YYYY";      // define the date format
  char timeBuf[] = "hh:mm:ss";            // define the time format
  Serial.println(now.toString(datBuf));   // print date
  Serial.println(now.toString(timeBuf));  // print time
  lcd.setCursor(0, 0);
  lcd.print(datBuf);  // display date
  lcd.setCursor(0, 1);
  lcd.print(timeBuf);  // display time
  lcd.setCursor(10, 1);
  lcd.print(rtc.getTemperature());
}

Eventuell hier den Kommentar wegnehmen:

//lcd.backlight();

Das paßt nicht zusammen, die letzte Zahl gibt die Zeilenzahl an, sollte 4 sein.

20x2 oder 20x4 spielt glaube ich nicht so eine große Rolle.Habe die Ausgabe der Temperatur trotz 20x2 einfügen können.Und im Setup mit bedacht lcd.backlight auskommentiert.Will das erst einschalten wenn der Wert an A0 einen Wert unterschreitet.Das simuliere ich durch abdunkeln des LDR `s.

Funktioniert das Backlight dann grundsätzlich, ohne deine Erweiterung?
Welche eine Library nutzt du für dein LCD ? Bitte Link posten.
Nicht alle können mit dem Backlight umgehen.

Ich habe das im Setup auskommentiert,dort hat es funktioniert.
habe dies aus dem Kopf der Lib//YWROBOT #ifndef LiquidCrystal_I2C_h #define LiquidCrystal_I2C_h

Hier ist ein Beispiel mit der Bibliothek hd44780, die deutlich leistungsfähiger ist. Ich hoffe, das hilft.

Im Simulationsmodus können Sie auf die LDR klicken, um den Wert auszuwählen.

Klicken, um den Code zu sehen
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>

hd44780_I2Cexp lcdDisplay;
const uint8_t spaltenAnzahl = 20;
const uint8_t zeilenAnzahl = 4;
const byte ldrAnalogerPin = A0;
const int ldrSchwelle = 512; // je kleiner, desto heller
const int ldrHysterese = 50;

enum HintergrundbeleuchtungZustand { HINTERGRUNDBELEUCHTUNG_AN, HINTERGRUNDBELEUCHTUNG_AUS };
HintergrundbeleuchtungZustand hintergrundbeleuchtungZustand = HINTERGRUNDBELEUCHTUNG_AN;

void setzeHintergrundbeleuchtung(bool beleuchtungAn) {
  if (beleuchtungAn) {
    lcdDisplay.backlight();
    hintergrundbeleuchtungZustand = HINTERGRUNDBELEUCHTUNG_AN;
  } else {
    lcdDisplay.noBacklight();
    hintergrundbeleuchtungZustand = HINTERGRUNDBELEUCHTUNG_AUS;
  }
}

void aktualisiereHintergrundbeleuchtung() {
  int ldrWert = analogRead(ldrAnalogerPin);
  switch (hintergrundbeleuchtungZustand) {
    case HINTERGRUNDBELEUCHTUNG_AUS:
      if (ldrWert > ldrSchwelle + ldrHysterese) setzeHintergrundbeleuchtung(true);
      break;

    case HINTERGRUNDBELEUCHTUNG_AN:
      if (ldrWert < ldrSchwelle - ldrHysterese) setzeHintergrundbeleuchtung(false);
      break;
  }
}

void setup() {
  Serial.begin(115200);
  int result = lcdDisplay.begin(spaltenAnzahl, zeilenAnzahl);
  if (result) {
    Serial.print("LCD-Initialisierung fehlgeschlagen: ");
    Serial.println(result);
    hd44780::fatalError(result);
  }
  lcdDisplay.clear();
  setzeHintergrundbeleuchtung(false);
  Serial.println("OK");
}

void loop() {
  aktualisiereHintergrundbeleuchtung();
  delay(100);
}

Das ist kein Link zu deiner Library.

Du hast ja die nicht eingeschaltet, dazu ist die Brücke hinten auf dem PCF drauf so genater Jumper

GitHub - johnrickman/LiquidCrystal_I2C: LiquidCrystal Arduino library for the DFRobot I2C LCD displays kommt wenn ich darauf tippe

Die Funktion zum Eischalten kennst du ja zum ausschalten ist

lcd.noBacklight();

Damit kannst du was bauen

was soll das ?
Was für MCU nutzt du UNO R3, Nano R3? bei den 8Bit AVR wird der mit Module gequellt.

Anstatt modulo wurde ich Sekunden vergleichen
zb.

if (Sekunde != sekundeALt){
 tue was...;)
 sekundeAllt = Sekunde
 }

Den Code habe ich Übernommen

aber der Tipp mit dem Jumper für's Backlight war Gold wert der ist beim hantieren abgefallen.

sieh dir noch mal ganz genau das Beispiel "Blink Without Delay" an und nutze wie dort eine Subtraktion von unsigned Variablen!

Und nutzte das gleiche Konzept für deinen "Sekundentimer".

P.S.: in der Tat macht bei einem 20 stelligen Display mit dieser Lib keinen Unterschied ob 2 oder 4 Zeilig, aber warum will man etwas falsch hinschreiben.


```cpp
#include <Wire.h>
#include <RTClib.h>             // Adafruit library for the DS3231
#include <LiquidCrystal_I2C.h>  // library for the LCD display

RTC_DS3231 rtc;                      // create RTC_DS3231 object
LiquidCrystal_I2C lcd(0x27, 20, 4);  // create display object (address, columns, rows)
// unsigned long startTime = 0;         //Hier merken wir uns nach jedemr Messung die Zeit in Millisekunden (seit dem Start des Arduino)
unsigned long verzMillis = 0;
unsigned long verz1Millis = 0;
void setup() {
  Serial.begin(115200);

  lcd.init();
  //lcd.backlight();
  lcd.clear();

  if (!rtc.begin()) {
    Serial.println(F("Couldn't find RTC"));
    while (1) {}
  }
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // set rtc to date/time of compilation
  rtc.disable32K();                 // stop signal at the 32K pin
  rtc.writeSqwPinMode(DS3231_OFF);  // stop signal at the SQW pin
}

void loop() {
  unsigned long aktMillis = millis();
  aktMillis = millis();  // werden zum berechnen der Verzögerungen genutzt
  // if (millis() % 1000 == 0) {  // update date/time every second
  if (aktMillis - verz1Millis >= 1000) {  // jede Sekunde
    verz1Millis = aktMillis;
    printDateTime();
    delay(1);
  }
  if (aktMillis - verzMillis >= 10000) {  // alle 10 sek den A0 prüfen
    verzMillis = aktMillis;
    //    if (millis() > (startTime + 10000)) {
    //   startTime = millis();
    if (analogRead(A0) < 500) {
      lcd.backlight();                   // das Licht schaltet nicht ein
      Serial.println((analogRead(A0)));  // die Ausgabe erfolgt ??
      delay(1);
    } else {
      lcd.noBacklight();
    }
  }
}
void printDateTime() {
  DateTime now = rtc.now();

  char datBuf[] = "DDD, DD.MM.YYYY";      // define the date format
  char timeBuf[] = "hh:mm:ss";            // define the time format
  Serial.println(now.toString(datBuf));   // print date
  Serial.println(now.toString(timeBuf));  // print time
  lcd.setCursor(0, 0);
  lcd.print(datBuf);  // display date
  lcd.setCursor(0, 1);
  lcd.print(timeBuf);  // display time
  lcd.setCursor(10, 1);
  lcd.print(rtc.getTemperature());  // Temperatur ausgeben
}

So besser ?
hab dann gleich das Modulo erschlagen !

Warum 2 mal?

Wozu?

Warum 2 mal?

Ist bei Strg & C und V dazugekommen bzw wollte die Ausgabe im Monitor erzwingen. Serial.println (analogRead(A0)

Schau dir das mal an

#include <Wire.h>
#include <RTClib.h>             // Adafruit library for the DS3231
#include <LiquidCrystal_I2C.h>  // library for the LCD display

RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Zeitsteuerung
unsigned long lastClockUpdate = 0;
unsigned long lastA0Check = 0;

// Konstanten
const unsigned long CLOCK_INTERVAL = 1000;     // 1 Sekunde
const unsigned long A0_INTERVAL = 10000;        // 10 Sekunden
const int A0_THRESHOLD = 500;                   // Schwellwert

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

  lcd.init();
  lcd.backlight();      // Backlight explizit einschalten
  lcd.clear();

  if (!rtc.begin()) {
    Serial.println(F("Couldn't find RTC"));
    while (1) {}
  }

  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // nur einmal bei Bedarf ausführen

  rtc.disable32K();
  rtc.writeSqwPinMode(DS3231_OFF);
}

void loop() {
  unsigned long nowMillis = millis();

  // Uhrzeit / Datum jede Sekunde aktualisieren
  if (nowMillis - lastClockUpdate >= CLOCK_INTERVAL) {
    lastClockUpdate = nowMillis;
    printDateTime();
  }

  // A0 alle 10 Sekunden prüfen
  if (nowMillis - lastA0Check >= A0_INTERVAL) {
    lastA0Check = nowMillis;

    int a0Value = analogRead(A0);
    Serial.print(F("A0: "));
    Serial.println(a0Value);

    if (a0Value < A0_THRESHOLD) {
      lcd.backlight();
    } else {
      lcd.noBacklight();
    }
  }
}

void printDateTime() {
  DateTime now = rtc.now();

  char dateBuf[20];
  char timeBuf[10];

  now.toString("DD.MM.YYYY", dateBuf);
  now.toString("hh:mm:ss", timeBuf);

  // Serielle Ausgabe
  Serial.println(dateBuf);
  Serial.println(timeBuf);

  // LCD-Ausgabe
  lcd.setCursor(0, 0);
  lcd.print(dateBuf);

  lcd.setCursor(0, 1);
  lcd.print(timeBuf);

  lcd.setCursor(10, 1);
  lcd.print(rtc.getTemperature());
  lcd.print((char)223);  // ° Symbol
  lcd.print("C ");
}

Kompiliert nicht

/tmp/.arduinoIDE-unsaved202607-2977-1wi7xve.udsq/sketch_jan7b/sketch_jan7b.ino: In function 'void printDateTime()':
/tmp/.arduinoIDE-unsaved202607-2977-1wi7xve.udsq/sketch_jan7b/sketch_jan7b.ino:66:37: error: no matching function for call to 'DateTime::toString(const char [11], char [20])'
   now.toString("DD.MM.YYYY", dateBuf);
                                     ^
In file included from /tmp/.arduinoIDE-unsaved202607-2977-1wi7xve.udsq/sketch_jan7b/sketch_jan7b.ino:2:0:
/home/walter/Arduino/libraries/RTClib/src/RTClib.h:153:9: note: candidate: char* DateTime::toString(char*) const
   char *toString(char *buffer) const;
         ^~~~~~~~
/home/walter/Arduino/libraries/RTClib/src/RTClib.h:153:9: note:   candidate expects 1 argument, 2 provided
/tmp/.arduinoIDE-unsaved202607-2977-1wi7xve.udsq/sketch_jan7b/sketch_jan7b.ino:67:35: error: no matching function for call to 'DateTime::toString(const char [9], char [10])'
   now.toString("hh:mm:ss", timeBuf);
                                   ^
In file included from /tmp/.arduinoIDE-unsaved202607-2977-1wi7xve.udsq/sketch_jan7b/sketch_jan7b.ino:2:0:
/home/walter/Arduino/libraries/RTClib/src/RTClib.h:153:9: note: candidate: char* DateTime::toString(char*) const
   char *toString(char *buffer) const;
         ^~~~~~~~
/home/walter/Arduino/libraries/RTClib/src/RTClib.h:153:9: note:   candidate expects 1 argument, 2 provided
exit status 1

Compilation error: no matching function for call to 'DateTime::toString(const char [11], char [20])'
 Habe dann Versucht dateBuf[11] ohne Erfolg

Versuche es mal so

char dateBuf[20] = "DDD, DD.MM.YYYY";      // define the date format
char timeBuf[10] = "hh:mm:ss";            // define the time format

now.toString(dateBuf);
now.toString(timeBuf);

#include <Wire.h>
#include <RTClib.h>             // Adafruit library for the DS3231
#include <LiquidCrystal_I2C.h>  // library for the LCD display

RTC_DS3231 rtc;                      // create RTC_DS3231 object
LiquidCrystal_I2C lcd(0x27, 20, 4);  // create display object (address, columns, rows)
// unsigned long startTime = 0;         //Hier merken wir uns nach jedemr Messung die Zeit in Millisekunden (seit dem Start des Arduino)

const char *weekday[] = {"MO", "DI", "MI", "DO", "FR", "SA", "SO"};

void setup()
{
  Serial.begin(115200);
  lcd.init();
  //lcd.backlight();
  lcd.clear();

  if (!rtc.begin())
  {
    Serial.println(F("Couldn't find RTC"));

    while (1) {}
  }

  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // set rtc to date/time of compilation
  rtc.disable32K();                 // stop signal at the 32K pin
  rtc.writeSqwPinMode(DS3231_OFF);  // stop signal at the SQW pin
}

unsigned long aktMillis;
void loop()
{
  aktMillis = millis();
  setDisplayBackGround();
  printDisplay();
}

void printDisplay()
{
  static unsigned long verzMillis = 0;

  if (aktMillis - verzMillis >= 1000)    // jede Sekunde
  {
    verzMillis = aktMillis;
    printDateTime();
  }
}

void setDisplayBackGround()
{
  static unsigned long verzMillis = 0;

  if (aktMillis - verzMillis >= 10000)    // alle 10 sek den A0 prüfen
  {
    verzMillis = aktMillis;
    Serial.println((analogRead(A0)));  // die Ausgabe erfolgt ??

    switch (analogRead(A0))
    {
      case 0 ... 480:
        lcd.backlight();                   // das Licht schaltet nicht ein
        break;

      case 481 ... 510:
        Serial.println(F("Hysterese"));
        break;

      default:
        lcd.noBacklight();
        break;
    }
  }
}

void printDateTime()
{
  DateTime now = rtc.now();
  char datBuf[] = "DDD, DD.MM.YYYY";      // define the date format
  char timeBuf[] = "hh:mm:ss";            // define the time format
  snprintf(datBuf, sizeof(datBuf), "%s, %02d.%02d.%04d", weekday[now.dayOfTheWeek()], now.day(), now.month(), now.year());
  snprintf(timeBuf, sizeof(timeBuf), "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  Serial.println(datBuf);   // print date
  Serial.println(timeBuf);  // print time
  lcd.setCursor(0, 0);
  lcd.print(datBuf);  // display date
  lcd.setCursor(0, 1);
  lcd.print(timeBuf);  // display time
  lcd.setCursor(10, 1);
  lcd.print(rtc.getTemperature());  // Temperatur ausgeben
}

von hier aus, würde ich weiter machen.
Keinen Spaghetticode....

// edit: Ausgabe für Datum und Zeit verfollständigt.