LCD Dispaly dimmbar

Hallo Miteinander,
mein Name ist Marco und bin neu im Thema Arduino.
Ich habe einen Arduino UNO 4 und ein LCD Display mit I2C Schnittstelle das ich gerne Dimmen würde mit einen digitalen Lichtsensor. Ich habe einen bc557 Transistor mit einem 1k Widerstand davor. Sobald das lcd Display gedimmt wird kann ich es nicht mehr beschreiben. Mache ich etwas falsch? Chat GPT hilft mir auch nicht weiter :(. Hier ist mein code

 `#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>

#define LIGHT_SENSOR_PIN 2

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

const int LCD = 3;

// Definiere ein gefülltes Zeichen (8x5 Pixel)
byte fullBlock[8] = {
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111
};

void clearScreen() {
    for (int row = 0; row < 4; row++) {
        for (int col = 0; col < 20; col++) {
            lcd.setCursor(col, row);
            lcd.print(" ");  // Löscht das Zeichen
        }
    }
}

void zeit(){
  DateTime now = rtc.now();
    lcd.setCursor(0, 0);
    lcd.print(now.hour());
    lcd.print(":");
    if (now.minute() < 10) lcd.print("0");  // Führende Null für Minuten
    lcd.print(now.minute());
}
void licht() {
  bool istHell = digitalRead(LIGHT_SENSOR_PIN); // Lichtstatus lesen

  if (istHell) {
    analogWrite(LCD, 50);
   Serial.print("dunkel");  // Dunkle Helligkeit
  } else {
    Serial.print("hell");
    analogWrite(LCD, 255); // Helle Helligkeit
  }
}
void setup() {
    Serial.begin(9600);
    pinMode(LCD, OUTPUT);
    analogWrite(LCD, 255);
    pinMode(LIGHT_SENSOR_PIN, INPUT);
    lcd.begin();
    lcd.backlight();

    // Speichere das Custom-Zeichen in Speicherplatz 0
    lcd.createChar(0, fullBlock);

    // Zeilensteuerung (von außen nach innen)
    for (int row = 0; row < 4; row++) {
        if (row % 2 == 0) {  // GERADE Zeilen (0 & 2)
            for (int col = 0; col < 20; col++) {
                lcd.setCursor(col, row);         // Oben: Links → Rechts
                lcd.write(byte(0));

                lcd.setCursor(19 - col, 3 - row); // Unten: Rechts → Links
                lcd.write(byte(0));

                delay(25);
            }
        } else {  // UNGERADE Zeilen (1 & 3)
            for (int col = 19; col >= 0; col--) {
                lcd.setCursor(col, row);         // Oben: Rechts → Links
                lcd.write(byte(0));

                lcd.setCursor(19 - col, 3 - row); // Unten: Links → Rechts
                lcd.write(byte(0));

                delay(25);
            }
        }
    }

    // Wenn das Display voll ist -> 1x Blinken mit Rechtecken
    clearScreen();

    // RTC-Initialisierung
    if (!rtc.begin()) {
        Serial.println("RTC nicht gefunden!");
        lcd.setCursor(0, 0);
        lcd.print("RTC ERROR!");
        while (1);  // Endlosschleife, wenn kein RTC erkannt wird
    }

    // Falls die Zeit noch nicht gesetzt wurde, einmal setzen (nur beim ersten Start nötig)
    if (rtc.lostPower()) {
        Serial.println("RTC verlor Strom, setze Zeit...");
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // Setzt Zeit auf Kompilierungszeit
    }
}

void loop() {
    Serial.print("1");
    delay(2000);
    licht();
    delay(2000); 
    Serial.print("2");
        delay(2000);
    zeit(); 
    Serial.print("3");
        delay(2000);
    Serial.print("4");
 
  delay(2000);
}`

und das ist mein layout:

kann mir irgendjemand helfen?

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Vielen dank, ich habe versucht es in deutsch und nicht in international/deutsch zu stellen. ist es schon verschoben?

Ja, ich habe es bereits für Sie verschoben:

Schaltest du dem LCD da das GND weg wenn du dimmst??

Wenn du die Spannung des gesamten LCD dimmen willst, geht es nicht. Da damit der I2C Baustein nicht mehr arbeitet.
Diese LCD haben üblicherweise auf der I2C-Zusatzplatine einen Jumper für die Beleuchtungs-Led, da kannst du an dem Pin zur Led die Dimmspannung anschließen.
Das geht ohne zusätzlichen Transistor.
Miss es vorher aus, damit du den richtigen Pin verwendest und nichts zerstörst. Und du musst darauf achten, dass nicht mehr wie 20mA zur Led gelangen, damit der Pin des Arduino nicht überfordert wird.

Nachtrag:
Der Arduino hat doch analoge Eingänge, da kannst du auch einen LDR direkt anschließen und damit deine zusätzliche Platine sparen.

1 Like

So sieht die Rückseite aus, ich weiß nicht wo da das Jumper Kabel hin soll oder es das überhaupt hat, habe da halt nur den Poti an dem ich den Kontrast einstellen kann :confused:

Das Kabel zum Dimmen kommt an die gegenüberliegende Seite vom Anschlusskabel. Da ist der Jumper, den du dann entfernen musst.
Dann messen, welcher Pin die 5Volt hat und du nimmst den anderen Pin für die Dimmspannung.

Ich hab diesen Schaltplan gefunden:

Wenn ich das richtig sehe, kannst du an dem Jumper die Versorgungsspannung für die Beleuchtung einspeisen.

Da der Uno R4 aber nicht so viel Strom an seinen Pins abgeben kann, würde ich aber nicht direkt von einem Pin einspeisen.

Du bräuchtest da noch eine Schaltung mit PNP Transistor.

2 Likes

Was kann der denn liefern ?
Ich habe diesen Exoten noch nicht verwendet.

Laut 9.3 Pin Current -> 8 mA

Ja danke, auch grad gelesen.
Also wenn direkt, nicht mehr wie 8 mA oder einen richtigen Uno nehmen.

Es kann so einfach sein, also ich habe es jetzt mit dem Jumper hinbekommen, es lässt sich dimmen und er zeigt ganz normal die Uhrzeit an :D. Wenn es so funktioniert brauche ich den pnp überhaupt oder kann es auf längerer probleme geben? Lese mir die Datasheeds morgen nochmal durch. Vielen Dank für eure schnelle und hilfreichen Antworten!!!

Du musst den Strom messen, der in die Leds fließt. Wenn es mehr wie 8mA sind ist es kritisch bis hin zum Ausfall des Controller pins.

allright, das wird dann am Wochenende gemacht, bin momentan in meiner Studenten WG und habe kein Messgerät da :confused: Vielen Vielen Dank, saß den ganzen Abend dran

Alles klar und gerne.
Viel Erfolg.