Ardui­no UNO R4 WiFi Display zeigt nix an

Moin,

ich möchte eine Steuerung für eine Kühlung im Honiglager machen.
Die Temperatur wird im seriellen Monitor angezeigt und die Relais schalten.
Nur bein Display (20 x 4) zeigt nix an. Ein Scan ergab die Adresse 0x27.

Lg Dirk

[code]
/******************************************
 *        Steuerung für ein Honiglager                          *
 *                                                                                      *
 *          (c) Dirk Unverzagt                                            *
 *                                                                                      *
 *  Display 4 X 20                                                           *
 *  Anschlüsse:                                                               *
 *  DHT 1    Pin 7                                                            *
 *  DHT 2    Pin 8                                                            *
 *  Relais1  Pin 2                                                            *
 *  Relais2  Pin 4                                                            *
 *                                                                                     *
 ******************************************/

#include <LCD.h>
#include "DHT.h"
#include "WiFiS3.h"
#include "NTP.h"
//#include "LCDIC2.h"
#include "Arduino_LED_Matrix.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Stellen Sie die LCD-I2C-Adresse auf UNO 
                                                               // SDA A4,  SCL A5

ArduinoLEDMatrix Matrix;

int maxtmp = 15;
int mintmp = 14;
float Temperatur  = 0;
float Temperatur2 = 0;
float Luftfeuchtigkeit  = 0;
float Luftfeuchtigkeit2 = 0;

String Zeit = "";
String kulung = "aus";


#define RELAY1_PIN 4
#define RELAY2_PIN 2



// Pin der Sensoren
int SENSOR_DHT = 7; // innen
int SENSOR_DHT2 = 8;// aussen


//Sensor temp
#define SensorTyp DHT22
#define SensorTyp2 DHT22

// Sensor einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);
DHT dht2(SENSOR_DHT2, SensorTyp2);

// SSID und Passwort des Routers
char Router[] = "routername";
char Passwort[] = "nanananana";

WiFiUDP wifiUdp;
NTP ntp(wifiUdp);

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// alle 60 Sekunden aktualisieren, kann angepasst werden
int Intervall = 60000;

WiFiServer WiFiServer(80);
WiFiClient WiFiClient;


//------------------------------------------------------------
void setup()
{
lcd.begin(20, 4); 
lcd.clear();

Serial.begin (9600);


   Matrix.begin();
    
  pinMode(RELAY1_PIN, OUTPUT);      // Für 220 Volt Wechselstrom Motor
  digitalWrite(RELAY1_PIN, LOW);    // 2 Relais damit beide Pole
  pinMode(RELAY2_PIN, OUTPUT);      // geschaltet werden können
  digitalWrite(RELAY2_PIN, LOW);    //
  
  while (!Serial) {
                   ;
                  }

  delay(1000);

  // Verbindung aufbauen
  WiFi.begin(Router, Passwort);
  while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
      }

  Serial.print("Verbindung aufbauen mit ");
  Serial.println(Router);

  // IP des Servers/des verbundenen Computers anzeigen
  Serial.print("Server: ");
  Serial.println(WiFi.SSID());

  // IP des Arduino anzeigen
  Serial.print("IP Adresse Arduino ");
  Serial.println(WiFi.localIP());

  // Webserver starten
  WiFiServer.begin();

  /*
    Zeitzone
    CEST: Central European Summertime
    Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden
  */
  ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120);

  // CET: Central European Time
  // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde
  ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60);

  // ntp starten
  ntp.begin();

  // Zeit holen
  ntp.update();

  dht.begin();
  dht2.begin();
  // beim Start Daten ausgeben
  // Serieller Monitor
  Temperatur = dht.readTemperature();
 
  Serial.print("Temperatur:");
  Serial.println(String(Temperatur) + " °C");

  // Luftfeuchtigkeit
  Luftfeuchtigkeit = dht.readHumidity();
  
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(String(Luftfeuchtigkeit) + " %");

  lcd.setCursor(0, 0);

  switch (ntp.weekDay()) {
                          case 0:
                            Serial.print("Sonntag");
                            lcd.print("So");
                            break;
                           case 1:
                              Serial.print("Montag");
                              lcd.print("Mo");
                              break;
                            case 2:
                              Serial.print("Dienstag");
                              lcd.print("Di");
                               break;
                            case 3:
                              Serial.print("Mittwoch");
                              lcd.print("Mi");
                              break;
                            case 4:
                              Serial.print("Donnerstag");
                              lcd.print("Do");
                              break;
                            case 5:
                              Serial.print("Freitag");
                              lcd.print("Fr");
                              break;
                            case 6:
                              Serial.print("Samstag");
                              lcd.print("Sa");
                              break;
                            }

  Serial.print(", ");

  // Zeit mit formatedTime() anzeigen:
  // %d = Tag, %m = Monat, %Y = Jahr, %T = Zeit in Stunden, Minuten, Sekunden
  Serial.println(ntp.formattedTime("%d.%m.%Y Uhrzeit: %T"));

  lcd.setCursor(4, 0);
  String Zeit = ntp.formattedTime("%d.%m.%Y %T");
  // String Zeit nch Minuten kürzen
  lcd.print(Zeit.substring(0, Zeit.indexOf(":") + 3));
  lcd.setCursor(0, 1);
  lcd.print(String(Temperatur) + " \337C" + "  " + String(Luftfeuchtigkeit) + " % Innen");
  lcd.setCursor(0, 2);
  lcd.print(String(Temperatur2) + " \337C" + "  " + String(Luftfeuchtigkeit2) + " % Außen");

  // Cursor "verstecken"
  //lcd.setCursor(false);
  
 
  
}//ende setup

 void flocke() {
    byte PfeilLinks[8][12] = 
    {
      { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, 
      { 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 },
      { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0 },
      { 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
      { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
      { 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
      { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0 },
      { 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }
      };
      Matrix.renderBitmap(PfeilLinks, 8, 12);
 }
void matrixAus() {
    byte PfeilLinks[8][12] = 
    {
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
      };
      Matrix.renderBitmap(PfeilLinks, 8, 12);
 } 
//...................................................................

void loop()
{
  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall)
  {
    lcd.clear();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;

    // Zeit holen
    ntp.update();
    
    Serial.println("Temperatur und Luftfeuchtigkeit messen");
    Serial.println("Letzte Messung: ");

    // formatedTime() zeigt Wochentage in englischer Sprache
    // -> müssen einzeln abgefragt werden

    lcd.setCursor(0, 0);
    switch (ntp.weekDay())
    {
      case 0:
        Serial.print("Sonntag");
        lcd.print("So");
        break;
      case 1:
        Serial.print("Montag");
        lcd.print("Mo");
        break;
      case 2:
        Serial.print("Dienstag");
        lcd.print("Di");
        break;
      case 3:
        Serial.print("Mittwoch");
        lcd.print("Mi");
        break;
      case 4:
        Serial.print("Donnerstag");
        lcd.print("Do");
        break;
      case 5:
        Serial.print("Freitag");
        lcd.print("Fr");
        break;
      case 6:
        Serial.print("Samstag");
        lcd.print("Sa");
        break;
    }//ende switch

    Serial.print(", ");
    Serial.println(ntp.formattedTime("%d.%m.%Y Uhrzeit: %T"));

// Temperatur
    Temperatur = dht.readTemperature(); // im Kühlraum
    Temperatur2 = dht2.readTemperature(); // ausserhalb
    
    Serial.print("Temperatur innen:");
    Serial.println(String(Temperatur) + " °C");

// Luftfeuchtigkeit
    Luftfeuchtigkeit = dht.readHumidity();
    Luftfeuchtigkeit2 = dht2.readHumidity();
     
    Serial.print("Luftfeuchtigkeit innen: ");
    Serial.println(String(Luftfeuchtigkeit) + " %");
    Serial.print("Temperatur aussen:");
    Serial.println(String(Temperatur2) + " °C");
    Serial.print("Luftfeuchtigkeit aussen: ");
    Serial.println(String(Luftfeuchtigkeit2) + " %");
    Serial.println("Die Kühlung ist " + kulung);
    Serial.println("Maximale Temperatur: " + String(maxtmp) );
    Serial.println();
    
// Kühlung ein aus schalten
    if (Temperatur > maxtmp ) {
        digitalWrite(RELAY1_PIN, HIGH);
        digitalWrite(RELAY2_PIN, HIGH);
        kulung ="an";
        flocke();
      }
    if (Temperatur < mintmp ) {
        digitalWrite(RELAY1_PIN, LOW );
        digitalWrite(RELAY2_PIN,LOW );
        kulung ="aus";
        matrixAus();
      }
      
    
// Ausgabe LCD
    Zeit = ntp.formattedTime("%d.%m.%Y %T");
    lcd.setCursor(4, 0);
    // String Zeit nch Minuten kürzen
    lcd.print(Zeit.substring(0, Zeit.indexOf(":") + 3));
    lcd.setCursor(0, 1);
    lcd.print(String(Temperatur) + " \337C" + "  " + String(Luftfeuchtigkeit) + " % Innen");
    lcd.setCursor(0, 2);
    lcd.print(String(Temperatur2) + " \337C" + "  " + String(Luftfeuchtigkeit2) + " % Außen");
    lcd.setCursor(0, 3);
    lcd.print("Kühlung ist " + kulung);
    
  }//ende if startzeit

  // auf WiFiClienten warten ...
  WiFiClient = WiFiServer.available();
  if (WiFiClient)
  {
    // Seite aufbauen wenn SeiteAufbauen true ist
    boolean SeiteAufbauen = true;

    // solange der WiFiClient verbunden ist ...
    while (WiFiClient.connected())
    {
      if (WiFiClient.available())
      {
        // Anforderung vom WiFiClienten lesen ...
        char Zeichen = WiFiClient.read();

        // wenn als Zeichen neue Zeile (\n) übergeben wird
        // SeiteAufbauen true ist -> Seite anzeigen
        if (Zeichen == '\n' && SeiteAufbauen)
        {
          
          WiFiClient.println("HTTP/1.1 200 OK");
          WiFiClient.println("Content-type:text/html");

          // Leerzeile zwingend erforderlich
          WiFiClient.println();

WiFiClient.println( " <!DOCTYPE html>");
WiFiClient.println( "<html lang=\"de\">");
WiFiClient.println( "  <head>");
WiFiClient.println( "    <meta charset=\"utf-8\">");
WiFiClient.println( "    <meta http-equiv=\"refresh\" content=\"90\" />");
WiFiClient.println( "    <title>Temperatur im Honiglager</title>");
WiFiClient.println( "  </head>");
WiFiClient.println( "  <body>");

WiFiClient.println( "  " + Zeit + " <br>");
WiFiClient.println( " Temperatur im Kühlraum " + String(Temperatur) + " °C <br>");
WiFiClient.println( " Temperatur ausserhalb Kühlraum " + String(Temperatur2) +"  <br>");
WiFiClient.println( " Luftfeuchtigkeit im Kühlraum " + String(Luftfeuchtigkeit) +" % <br>");
WiFiClient.println( " Luftfeuchtigkeit ausserhalb Kühlraum " + String(Luftfeuchtigkeit2) +" <br>");
WiFiClient.println( "  <br>");

WiFiClient.println( "  </body>");
WiFiClient.println( " </html>");          
          
         
          // HTTP-Antwort endet mit neuer Zeile
          WiFiClient.println();

          // Seite vollständig geladen -> loop verlassen
          break;
        }//ende if (Zeichen == '\n' && SeiteAufbauen)
        
        // neue Zeile -> SeiteAufbauen auf true setzen
        if (Zeichen == '\n') SeiteAufbauen = true;

        // die aktuelle Zeile enthält ein Zeichen
        else if (Zeichen != '\r') SeiteAufbauen = false;
      }
    }// ende while wificonnect

    delay(1);

    WiFiClient.stop();

  }  //ende if wificlient
  
}
[/code]

Aber sonst funktioniert der LCD?

Kontrast kann ich hell dunkel stellen. Bei hell sehe ich nur ausgefüllte Kästchen

Lg Dirk

Also verstehe das so das dein Display funktioniert nicht auch mit Beispielen aus der LCD Lib.
versuche mall die Lib vom @noiasca

https://werner.rothschopf.net/202009_arduino_liquid_crystal_intro.htm
Musst nur Setup und Header anpassen, der UNO R4 ist ein komisches ding macht öfters Probleme. außer dem sind die Pins benutzt?

SDA - D14; SCL - D15. <---- ist falsch!
Na ja mall wird geschrieben A4, A5 mal 14,15.

In der Doku vom dem Board ist Fehler nach Pin Out ist A4, A5 was ist = D18 , D19

1 Like
lcd.begin(20, 4); 

imho passt das nicht zusammen.

je nach dem, welche Library du genau verwendest (es gibt einige

LiquidCrystal_I2C.h

daher braucht es da eine genau Angabe was du genau hast).
Ein 40x4 sind sozusagen zwei LCD 40 x 2 in einem Gehäuse und daher haben sie auch zwei Enable-Eingänge (für die oberen 2 Zeilen und für die unteren 2 Zeilen).

Ja meine LCD Lib sollte wie schon erwähnt mit 40x4 umgehen können:

https://werner.rothschopf.net/microcontroller/202012_arduino_liquid_crystal_4004_en.htm

Bitte beachte genau darauf, wie die Pins übergeben werden müssen. Es gibt einen entsprechenden Beispiel-Sketch. Ein Versuch wäre es wert.

Habe mal ein par Bilder gemacht



Lg Dirk

Wurde das Display mit den Beispielen getestet?
Bei sowas muss man den Fehler erst finden danach mit eigentlichen Sketch arbeiten.
auf den Fotos ist schlecht zu erkenne wie, wo die SCL, SDA ist angeklemmt.

Ne hab ich nicht getestet. welches Beispiel würde den passen ?

Scl hab ich auf A5
SDA auf A4

Lg Dirk

Lade dei Lib vom noiasca runter dan teste das mal

 
/******************************************
 *        Steuerung für ein Honiglager                          *
 *                                                                                      *
 *          (c) Dirk Unverzagt                                            *
 *                                                                                      *
 *  Display 4 X 20                                                           *
 *  Anschlüsse:                                                               *
 *  DHT 1    Pin 7                                                            *
 *  DHT 2    Pin 8                                                            *
 *  Relais1  Pin 2                                                            *
 *  Relais2  Pin 4                                                            *
 *                                                                                     *
 ******************************************/

//#include <LCD.h>
#include "DHT.h"
#include "WiFiS3.h"
#include "NTP.h"
//#include "LCDIC2.h"
#include "Arduino_LED_Matrix.h"
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>


//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Stellen Sie die LCD-I2C-Adresse auf UNO 
#include <NoiascaLiquidCrystal.h>      // download library from https://werner.rothschopf.net/202009_arduino_liquid_crystal_intro.htm 
#include <NoiascaHW/lcd_PCF8574.h>     // include the proper IO interface

const byte cols = 20;                  // columns/characters per row
const byte rows = 4;                   // how many rows
const byte addr = 0x27;                // set the LCD address to 0x3F or 0x27
 
LiquidCrystal_PCF8574 lcd(Wire, addr, cols, rows);               // create lcd object - with support of special characters

                                                             // SDA A4,  SCL A5

ArduinoLEDMatrix Matrix;

int maxtmp = 15;
int mintmp = 14;
float Temperatur  = 0;
float Temperatur2 = 0;
float Luftfeuchtigkeit  = 0;
float Luftfeuchtigkeit2 = 0;

String Zeit = "";
String kulung = "aus";


#define RELAY1_PIN 4
#define RELAY2_PIN 2



// Pin der Sensoren
int SENSOR_DHT = 7; // innen
int SENSOR_DHT2 = 8;// aussen


//Sensor temp
#define SensorTyp DHT22
#define SensorTyp2 DHT22

// Sensor einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);
DHT dht2(SENSOR_DHT2, SensorTyp2);

// SSID und Passwort des Routers
char Router[] = "routername";
char Passwort[] = "nanananana";

WiFiUDP wifiUdp;
NTP ntp(wifiUdp);

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// alle 60 Sekunden aktualisieren, kann angepasst werden
int Intervall = 60000;

WiFiServer WiFiServer(80);
WiFiClient WiFiClient;


//------------------------------------------------------------
void setup()
{
lcd.begin( ); 
lcd.backlight();
lcd.clear();

Serial.begin (9600);


   Matrix.begin();
    
  pinMode(RELAY1_PIN, OUTPUT);      // Für 220 Volt Wechselstrom Motor
  digitalWrite(RELAY1_PIN, LOW);    // 2 Relais damit beide Pole
  pinMode(RELAY2_PIN, OUTPUT);      // geschaltet werden können
  digitalWrite(RELAY2_PIN, LOW);    //
  
  while (!Serial) {
                   ;
                  }

  delay(1000);

  // Verbindung aufbauen
  WiFi.begin(Router, Passwort);
  while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
      }

  Serial.print("Verbindung aufbauen mit ");
  Serial.println(Router);

  // IP des Servers/des verbundenen Computers anzeigen
  Serial.print("Server: ");
  Serial.println(WiFi.SSID());

  // IP des Arduino anzeigen
  Serial.print("IP Adresse Arduino ");
  Serial.println(WiFi.localIP());

  // Webserver starten
  WiFiServer.begin();

  /*
    Zeitzone
    CEST: Central European Summertime
    Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden
  */
  ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120);

  // CET: Central European Time
  // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde
  ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60);

  // ntp starten
  ntp.begin();

  // Zeit holen
  ntp.update();

  dht.begin();
  dht2.begin();
  // beim Start Daten ausgeben
  // Serieller Monitor
  Temperatur = dht.readTemperature();
 
  Serial.print("Temperatur:");
  Serial.println(String(Temperatur) + " °C");

  // Luftfeuchtigkeit
  Luftfeuchtigkeit = dht.readHumidity();
  
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(String(Luftfeuchtigkeit) + " %");

  lcd.setCursor(0, 0);

  switch (ntp.weekDay()) {
                          case 0:
                            Serial.print("Sonntag");
                            lcd.print("So");
                            break;
                           case 1:
                              Serial.print("Montag");
                              lcd.print("Mo");
                              break;
                            case 2:
                              Serial.print("Dienstag");
                              lcd.print("Di");
                               break;
                            case 3:
                              Serial.print("Mittwoch");
                              lcd.print("Mi");
                              break;
                            case 4:
                              Serial.print("Donnerstag");
                              lcd.print("Do");
                              break;
                            case 5:
                              Serial.print("Freitag");
                              lcd.print("Fr");
                              break;
                            case 6:
                              Serial.print("Samstag");
                              lcd.print("Sa");
                              break;
                            }

  Serial.print(", ");

  // Zeit mit formatedTime() anzeigen:
  // %d = Tag, %m = Monat, %Y = Jahr, %T = Zeit in Stunden, Minuten, Sekunden
  Serial.println(ntp.formattedTime("%d.%m.%Y Uhrzeit: %T"));

  lcd.setCursor(4, 0);
  String Zeit = ntp.formattedTime("%d.%m.%Y %T");
  // String Zeit nch Minuten kürzen
  lcd.print(Zeit.substring(0, Zeit.indexOf(":") + 3));
  lcd.setCursor(0, 1);
  lcd.print(String(Temperatur) + " \337C" + "  " + String(Luftfeuchtigkeit) + " % Innen");
  lcd.setCursor(0, 2);
  lcd.print(String(Temperatur2) + " \337C" + "  " + String(Luftfeuchtigkeit2) + " % Außen");

  // Cursor "verstecken"
  //lcd.setCursor(false);
  
 
  
}//ende setup

 void flocke() {
    byte PfeilLinks[8][12] = 
    {
      { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, 
      { 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 },
      { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0 },
      { 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
      { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
      { 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1 },
      { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0 },
      { 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }
      };
      Matrix.renderBitmap(PfeilLinks, 8, 12);
 }
void matrixAus() {
    byte PfeilLinks[8][12] = 
    {
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
      };
      Matrix.renderBitmap(PfeilLinks, 8, 12);
 } 
//...................................................................

void loop()
{
  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall)
  {
    lcd.clear();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;

    // Zeit holen
    ntp.update();
    
    Serial.println("Temperatur und Luftfeuchtigkeit messen");
    Serial.println("Letzte Messung: ");

    // formatedTime() zeigt Wochentage in englischer Sprache
    // -> müssen einzeln abgefragt werden

    lcd.setCursor(0, 0);
    switch (ntp.weekDay())
    {
      case 0:
        Serial.print("Sonntag");
        lcd.print("So");
        break;
      case 1:
        Serial.print("Montag");
        lcd.print("Mo");
        break;
      case 2:
        Serial.print("Dienstag");
        lcd.print("Di");
        break;
      case 3:
        Serial.print("Mittwoch");
        lcd.print("Mi");
        break;
      case 4:
        Serial.print("Donnerstag");
        lcd.print("Do");
        break;
      case 5:
        Serial.print("Freitag");
        lcd.print("Fr");
        break;
      case 6:
        Serial.print("Samstag");
        lcd.print("Sa");
        break;
    }//ende switch

    Serial.print(", ");
    Serial.println(ntp.formattedTime("%d.%m.%Y Uhrzeit: %T"));

// Temperatur
    Temperatur = dht.readTemperature(); // im Kühlraum
    Temperatur2 = dht2.readTemperature(); // ausserhalb
    
    Serial.print("Temperatur innen:");
    Serial.println(String(Temperatur) + " °C");

// Luftfeuchtigkeit
    Luftfeuchtigkeit = dht.readHumidity();
    Luftfeuchtigkeit2 = dht2.readHumidity();
     
    Serial.print("Luftfeuchtigkeit innen: ");
    Serial.println(String(Luftfeuchtigkeit) + " %");
    Serial.print("Temperatur aussen:");
    Serial.println(String(Temperatur2) + " °C");
    Serial.print("Luftfeuchtigkeit aussen: ");
    Serial.println(String(Luftfeuchtigkeit2) + " %");
    Serial.println("Die Kühlung ist " + kulung);
    Serial.println("Maximale Temperatur: " + String(maxtmp) );
    Serial.println();
    
// Kühlung ein aus schalten
    if (Temperatur > maxtmp ) {
        digitalWrite(RELAY1_PIN, HIGH);
        digitalWrite(RELAY2_PIN, HIGH);
        kulung ="an";
        flocke();
      }
    if (Temperatur < mintmp ) {
        digitalWrite(RELAY1_PIN, LOW );
        digitalWrite(RELAY2_PIN,LOW );
        kulung ="aus";
        matrixAus();
      }
      
    
// Ausgabe LCD
    Zeit = ntp.formattedTime("%d.%m.%Y %T");
    lcd.setCursor(4, 0);
    // String Zeit nch Minuten kürzen
    lcd.print(Zeit.substring(0, Zeit.indexOf(":") + 3));
    lcd.setCursor(0, 1);
    lcd.print(String(Temperatur) + " \337C" + "  " + String(Luftfeuchtigkeit) + " % Innen");
    lcd.setCursor(0, 2);
    lcd.print(String(Temperatur2) + " \337C" + "  " + String(Luftfeuchtigkeit2) + " % Außen");
    lcd.setCursor(0, 3);
    lcd.print("Kühlung ist " + kulung);
    
  }//ende if startzeit

  // auf WiFiClienten warten ...
  WiFiClient = WiFiServer.available();
  if (WiFiClient)
  {
    // Seite aufbauen wenn SeiteAufbauen true ist
    boolean SeiteAufbauen = true;

    // solange der WiFiClient verbunden ist ...
    while (WiFiClient.connected())
    {
      if (WiFiClient.available())
      {
        // Anforderung vom WiFiClienten lesen ...
        char Zeichen = WiFiClient.read();

        // wenn als Zeichen neue Zeile (\n) übergeben wird
        // SeiteAufbauen true ist -> Seite anzeigen
        if (Zeichen == '\n' && SeiteAufbauen)
        {
          
          WiFiClient.println("HTTP/1.1 200 OK");
          WiFiClient.println("Content-type:text/html");

          // Leerzeile zwingend erforderlich
          WiFiClient.println();

WiFiClient.println( " <!DOCTYPE html>");
WiFiClient.println( "<html lang=\"de\">");
WiFiClient.println( "  <head>");
WiFiClient.println( "    <meta charset=\"utf-8\">");
WiFiClient.println( "    <meta http-equiv=\"refresh\" content=\"90\" />");
WiFiClient.println( "    <title>Temperatur im Honiglager</title>");
WiFiClient.println( "  </head>");
WiFiClient.println( "  <body>");

WiFiClient.println( "  " + Zeit + " <br>");
WiFiClient.println( " Temperatur im Kühlraum " + String(Temperatur) + " °C <br>");
WiFiClient.println( " Temperatur ausserhalb Kühlraum " + String(Temperatur2) +"  <br>");
WiFiClient.println( " Luftfeuchtigkeit im Kühlraum " + String(Luftfeuchtigkeit) +" % <br>");
WiFiClient.println( " Luftfeuchtigkeit ausserhalb Kühlraum " + String(Luftfeuchtigkeit2) +" <br>");
WiFiClient.println( "  <br>");

WiFiClient.println( "  </body>");
WiFiClient.println( " </html>");          
          
         
          // HTTP-Antwort endet mit neuer Zeile
          WiFiClient.println();

          // Seite vollständig geladen -> loop verlassen
          break;
        }//ende if (Zeichen == '\n' && SeiteAufbauen)
        
        // neue Zeile -> SeiteAufbauen auf true setzen
        if (Zeichen == '\n') SeiteAufbauen = true;

        // die aktuelle Zeile enthält ein Zeichen
        else if (Zeichen != '\r') SeiteAufbauen = false;
      }
    }// ende while wificonnect

    delay(1);

    WiFiClient.stop();

  }  //ende if wificlient
  
}
 

Das script läuft aber das Display schweigt :frowning:

Lg Dirk

bitte nimm mal den hallo world sketch aus der Lib, ergänze ein Blinken des backlight und schau was das Display macht.

/*******************************************************************************
   Hello World I2Cexp

   LCD with PCF8574 - 8-Bit I/O Expander with I2C Interface

   Hardware:
   LCD with PCF8574 Backpack should be wired as follows:

   LCD          PCF8574
   --------------------------
   VSS    GND   GND
   VDD    5V    Vin
   V0           -             contrast - connect a poti to GND
   RS           P0 RS
   RW           P1 RW
   E            P2 EN
   DB0          -
   DB1          -
   DB2          -
   DB3          -
   D4           P4 DB4
   D5           P5 DB5
   D6           P6 DB6
   D7           P7 DB7
   LEDA   GND   P3 Backlight circuitry (HIGH signal enables backlight using a simple NPN transistor)
   LEDK   5V

   by noiasca
   2021-08-24   base class 3302/317
   2021-05-16   base class 3300/317
   2020-09-05   base class 3530/319
   2022-06-23   base class 3384/327
   2023-08-09   base class 3380/327
   *******************************************************************************/

#include <Wire.h>                      // needed for the I2C interface
#include <NoiascaLiquidCrystal.h>      // download library from https://werner.rothschopf.net/202009_arduino_liquid_crystal_intro.htm 
#include <NoiascaHW/lcd_PCF8574.h>     // include the proper IO interface

const byte cols = 20;                  // columns/characters per row
const byte rows = 4;                   // how many rows
const byte addr = 0x27;                // set the LCD address, mostly 0x3F or 0x27

LiquidCrystal_PCF8574 lcd(addr, cols, rows);               // create lcd object - with support of special characters

void setup() {
  Wire.begin();                        // start I2C library
  lcd.init();                          // initialize the LCD (.init() is according to the LCD API 1.0, .begin() will also work)
  lcd.backlight();                     // turn on backlight
  lcd.setCursor(1, 0);
  lcd.print("Hello, world!");
  lcd.setCursor(0, 1);
  lcd.print("αβμΣ°÷∞←→äöüßÄÖÜ");     // show some special character entered in UTF-8
  if (rows > 2) {
    lcd.setCursor(0, 2);
    lcd.print("Noiasca LC I2C 2022");
    lcd.setCursor(2, 3);
    lcd.print("Powered by noiasca");
  }
}

void loop() {
  lcd.backlight();
  delay(500);
  lcd.noBacklight();
  delay(1000);
  
 /*
    delay(1000);
    lcd.setCursor(0, 1);
    lcd.print(millis()/1000);
 */
}

Spiel mal das drauf

#include <Wire.h>
#include <NoiascaLiquidCrystal.h>      // download library from https://werner.rothschopf.net/202009_arduino_liquid_crystal_intro.htm 
#include <NoiascaHW/lcd_PCF8574.h>     // include the proper IO interface

const byte cols = 20;                  // columns/characters per row
const byte rows = 4;                   // how many rows
const byte addr = 0x27;                // set the LCD address to 0x3F or 0x27
 
LiquidCrystal_PCF8574 lcd(Wire, addr, cols, rows);               // create lcd object - with support of special characters



void setup() {
  Serial.begin(115200);
  Wire.begin();
  lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Ich lebe");
}

void loop() {
  // put your main code here, to run repeatedly:

}

Ich würde mal behaupten, dass die Adresse 0x3F ist, weil bei dem I2C Adapter alle Adressjumper offen sind.

Hängt vom PCF, meiner hat auch alle offen und 0x27.
Wollte auch das vorschlagen nach dem Test so wie die Drähte tauschen

Tja .. bei meinem ist es 0x3F :slight_smile:

Hat 0x27,
meiner 1602 hat dafür 0x3F ist aber anderer PCF8574 verbaut

Bei mir sieht der Chip so aus:

Meiner hat T am ende

nee das funzt auch nicht

ich hoffe bei solchen Angaben muss man die Adresse nicht erneut hinterfragen: