Der Code basiert auf einem UNO R3 ATmega328p Board und der C++-Sprache unter Verwendung der Arduino IDE App. Benötigte Bibliotheken: - LiquidCrystal_I2C (von Frank de Brabander) Code: /* * LCD2004 Display 20x4 – Blau mit I2C (PCF8574) * Board: Arduino UNO R3 (ATmega328p) * * Pinbelegung (I2C): * - VCC -> 5V * - GND -> GND * - SDA -> A4 (bei UNO R3) * - SCL -> A5 (bei UNO R3) * * I2C-Adresse: * - Standard: 0x27 (häufig) * - Alternative: 0x3F (bei manchen Modulen) * - Im Code wird 0x27 verwendet, kann bei Bedarf angepasst werden * * Display-Abmessungen: * - 20 Zeichen pro Zeile * - 4 Zeilen */ #include // I2C-Adresse des LCDs (0x27 oder 0x3F) #define I2C_ADDR 0x27 // Display-Größe #define LCD_COLS 20 #define LCD_ROWS 4 // LCD-Objekt erstellen LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLS, LCD_ROWS); // Variable für den Durchlauf-Zähler int durchlauf = 0; void setup() { // Serielle Kommunikation starten Serial.begin(9600); // LCD initialisieren lcd.init(); // Hintergrundbeleuchtung einschalten lcd.backlight(); // LCD löschen lcd.clear(); // Begrüßung anzeigen lcd.setCursor(0, 0); // Spalte 0, Zeile 0 lcd.print("LCD2004 I2C Test"); lcd.setCursor(0, 1); lcd.print("Board: UNO R3"); lcd.setCursor(0, 2); lcd.print("Adresse: 0x27"); lcd.setCursor(0, 3); lcd.print("Initialisiert!"); Serial.println("LCD2004 Display initialisiert"); Serial.println("I2C-Adresse: 0x27"); Serial.println("-----------------------------------"); delay(2000); } void loop() { // Zähler erhöhen durchlauf++; // LCD löschen lcd.clear(); // 1. Zeile: Titel mit Zähler lcd.setCursor(0, 0); lcd.print("Durchlauf: "); lcd.print(durchlauf); // 2. Zeile: Datum/Uhrzeit (Simuliert) lcd.setCursor(0, 1); lcd.print("Test Nr.: "); lcd.print(durchlauf); // 3. Zeile: Fortschrittsbalken lcd.setCursor(0, 2); lcd.print("Fortschritt: ["); // Balken berechnen (20 Zeichen insgesamt, 2 für Klammern = 18 für Balken) int balkenLaenge = (durchlauf % 20) + 1; // 1-20 durchlaufen for (int i = 0; i < balkenLaenge; i++) { if (i < 18) { lcd.print("#"); } } // Rest mit Leerzeichen füllen for (int i = balkenLaenge; i < 18; i++) { lcd.print(" "); } lcd.print("]"); // 4. Zeile: Statusmeldung (abwechselnd) lcd.setCursor(0, 3); switch (durchlauf % 4) { case 0: lcd.print("Status: Bereit "); break; case 1: lcd.print("Status: Verarbeite "); break; case 2: lcd.print("Status: Lade... "); break; case 3: lcd.print("Status: Fertig! "); break; } // Serielle Ausgabe Serial.print("Durchlauf: "); Serial.println(durchlauf); // 1 Sekunde warten delay(1000); // Nach 20 Durchläufen Spezialeffekte zeigen if (durchlauf == 20) { specialEffects(); durchlauf = 0; // Zähler zurücksetzen } } /* * Spezialeffekte für das LCD */ void specialEffects() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("*** SPEZIAL ***"); lcd.setCursor(0, 1); lcd.print(" EFFEKTE "); lcd.setCursor(0, 2); lcd.print(" WERDEN GELADEN"); lcd.setCursor(0, 3); lcd.print(" Bitte warten... "); delay(2000); // 1. Blinken (Hintergrundbeleuchtung aus/ein) for (int i = 0; i < 5; i++) { lcd.noBacklight(); delay(300); lcd.backlight(); delay(300); } // 2. Text von rechts nach links scrollen lcd.clear(); String scrollText = " LCD2004 I2C Display mit Arduino UNO R3 "; for (int pos = 0; pos < scrollText.length() - 20; pos++) { lcd.setCursor(0, 1); lcd.print(scrollText.substring(pos, pos + 20)); delay(150); } // 3. Alle Zeichen anzeigen lcd.clear(); lcd.setCursor(0, 0); lcd.print("ABCDEFGHIJKLMNOPQRST"); lcd.setCursor(0, 1); lcd.print("UVWXYZ0123456789!?#"); lcd.setCursor(0, 2); lcd.print("abcdefghijklmnopqrst"); lcd.setCursor(0, 3); lcd.print("uvwxyz()[]{}<>/&%$"); delay(3000); // 4. Zahlen zählen (alle 4 Zeilen) lcd.clear(); for (int i = 0; i < 20; i++) { lcd.setCursor(0, 0); lcd.print("Zeile 0: "); lcd.print(i); lcd.setCursor(0, 1); lcd.print("Zeile 1: "); lcd.print(i * 2); lcd.setCursor(0, 2); lcd.print("Zeile 2: "); lcd.print(i * 3); lcd.setCursor(0, 3); lcd.print("Zeile 3: "); lcd.print(i * 4); delay(300); } // 5. Rahmen zeichnen (mit Zeichen) lcd.clear(); // Oberer Rand lcd.setCursor(0, 0); lcd.print("+"); for (int i = 0; i < 18; i++) { lcd.print("-"); } lcd.print("+"); // Seitenränder for (int row = 1; row < 3; row++) { lcd.setCursor(0, row); lcd.print("|"); lcd.setCursor(19, row); lcd.print("|"); } // Unterer Rand lcd.setCursor(0, 3); lcd.print("+"); for (int i = 0; i < 18; i++) { lcd.print("-"); } lcd.print("+"); // Text in der Mitte lcd.setCursor(2, 1); lcd.print("LCD2004 I2C"); lcd.setCursor(5, 2); lcd.print("Display"); delay(3000); // 6. Menü-Simulation lcd.clear(); lcd.setCursor(0, 0); lcd.print(">> Hauptmenu <<"); lcd.setCursor(0, 1); lcd.print("1. Einstellungen"); lcd.setCursor(0, 2); lcd.print("2. Daten anzeigen"); lcd.setCursor(0, 3); lcd.print("3. Systeminfo"); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print(">> Einstellungen"); lcd.setCursor(0, 1); lcd.print(" Helligkeit: 100%"); lcd.setCursor(0, 2); lcd.print(" Kontrast: 80%"); lcd.setCursor(0, 3); lcd.print(" Zuruck <--"); delay(3000); // Zurück zur Hauptschleife lcd.clear(); lcd.setCursor(0, 0); lcd.print("Zuruck zur"); lcd.setCursor(0, 1); lcd.print("Hauptschleife..."); lcd.setCursor(0, 2); lcd.print("Durchlauf: 1"); lcd.setCursor(0, 3); lcd.print("------------------"); delay(2000); }