delay durch millis ersetzen aber wie ?

delay durch millis ersetzen aber wie ?

#include "DHT.h"               // DHT Bibliothek
#include <Wire.h>            // Wire Bibliothek
#include <LCD.h>            // LCD Bibliothek
#include <LiquidCrystal_I2C.h> ; // NewLiquidCrystal_1.5.1          // für den I2C Chipsatz Bibliothek
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);        // LCD ansprechen
#define DHTPIN1 4                                                              // PIN4  DHT 1
#define DHTPIN2 6                                                              // PIN4  DHT 1
#define DHTTYPE DHT11                                                     // DHTType 11
#define DHTTYPE DHT22                                                      // DHTType 22

int zeit;                                      //Zeit definition
int fan;                                       // Lüfter definition
DHT dht1(DHTPIN1, DHT11);            
DHT dht2(DHTPIN2, DHT22);

unsigned long previousMillis = 0;          // speichert den Zeitpunkt an dem zuletzt geschalten wurde
unsigned long startMillis = 0;               // Starft zeit
const long sensorpause1 = 2000;        // Pausenlänge sensor 1
const long sensorpause2 = 2000;        // Pausenlänge sensor 2

void setup() {
  lcd.begin(16, 2);                         //16 zeichen 2 Zeilen
  dht1.begin();                             // Sensor 1
  dht2.begin();                             // Sensor 2
  pinMode(13, OUTPUT);                // Lüfter / LED an PIN13
  //startMillis = millis();                  //initial start time 
}

void loop() {
  zeit = (millis()/60000) % 60;             // Zeitberechung für 1Std in Millis
  unsigned long currentMillis = millis();              // Aktuelle Zeit wird in currentMillis gespeichert
  if (currentMillis - previousMillis >= sensorpause1) { // Falls mehr als 2000 ms vergangen sind
    previousMillis = currentMillis;                    // Zeitpunkt der letzten Schaltung wird festgehalten 
  }
{ 
  // sensor 1 auslesen und auf Display ausgeben wenn Fehler dann "Fehler sensor sonst weiter mit den Daten
  
  int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();
  if (isnan(h1) || isnan(t1)) {
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
  }
}
  lcd.setCursor(0, 0);
  lcd.print("H1: ");
  lcd.print(h1);
  lcd.print("% ");
  lcd.setCursor(9, 0);
  lcd.print("T1: ");
  lcd.print(t1);
  lcd.print("C ");
 
//Sensor 2 zeit geben um daten zuliefern

 unsigned long currentMillis = millis();              // Aktuelle Zeit wird in currentMillis gespeichert
  if (currentMillis - previousMillis >= sensorpause2) { // Falls mehr als 2000 ms vergangen sind
    previousMillis = currentMillis;                    // Zeitpunkt der letzten Schaltung wird festgehalten
  
{ 
  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
  }
}
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
  int vergl = h1-h2;
  if (vergl >= 5 || vergl <= -5){               // ZTeit vergleichen kleiner grösser 5 
    fan = 1;
  }
  if (fan == 1){
    if (vergl > 1 || vergl < -1){
      fan = 1;
    }else{
      fan = 0;
    }
  }
  
   if (fan == 1 || h1 < 63 || h2 < 63 || zeit >= 55 ){  // Lüfter nach 55 Min einschalten oder bei unterschreitung von wert h1 und h2
    digitalWrite(13, HIGH);
  }else{
    digitalWrite(13, LOW);
  } 
}

Soweit der Plan
Lade ich den Sketch so hoch kommt h1 nicht definiert warum ?
Hab ich doch hier gemacht

int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();

Schreibe ich das ganze hingegen, nur der Ausschnitt der millis läufts scheinbar:

unsigned long previousMillis = 0;          // speichert den Zeitpunkt an dem zuletzt geschalten wurde
const long sensorpause = 2000;

// Pause zum Sensor auslesen 2sec.

void loop(){
  unsigned long currentMillis = millis();              // Aktuelle Zeit wird in currentMillis gespeichert
  if (currentMillis - previousMillis >= sensorpause) { // Falls mehr als 2000 ms vergangen sind
    previousMillis = currentMillis;

Jetz frag ich mich muss ich delay beides mal durch millis ersetzen, oder reicht einmal und wie sieht es mit dem überlauf nach 49,xx Tagen aus ? müsste const long sensorpause durch unsigned long ersetzt werden ? oder kann man per Software alle 7 oder 10 Tagen einen Resett ausführen ?

Hatte ich vergessen hier der orginal Code mit delay. Delay kann ich leider nicht brauchen, da noch Funktionen eingefügt werden sollen, die Zeit abhängig sind z.b. Displaybacklight zeit gesteuert ein aus auf tastendruck. bei delkay müsste ich ja immer versuchen vor oder nach den 2 sec. zuschalten.

#include "DHT.h"
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> ; // NewLiquidCrystal_1.5.1
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define DHTPIN1 4
#define DHTPIN2 6
#define DHTTYPE DHT11
#define DHTTYPE DHT22
int zeit;
int fan;
DHT dht1(DHTPIN1, DHT11);
DHT dht2(DHTPIN2, DHT22);

void setup() {
  lcd.begin(16, 2);
  dht1.begin();  
  dht2.begin();
  pinMode(13, OUTPUT);
}

void loop() {
  zeit = (millis()/60000) % 60; 
  delay(2000);
  int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();
  if (isnan(h1) || isnan(t1)) {
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
  }
  lcd.setCursor(0, 0);
  lcd.print("H1: ");
  lcd.print(h1);
  lcd.print("% ");
  lcd.setCursor(9, 0);
  lcd.print("T1: ");
  lcd.print(t1);
  lcd.print("C ");
  delay(2000);
  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
  }
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
  int vergl = h1-h2;
  if (vergl >= 5 || vergl <= -5){
    fan = 1;
  }
  if (fan == 1){
    if (vergl > 1 || vergl < -1){
      fan = 1;
    }else{
      fan = 0;
    }
  }
  
   if (fan == 1 || h1 < 63 || h2 < 63 || zeit >= 55 ){
    digitalWrite(13, HIGH);
  }else{
    digitalWrite(13, LOW);
  } 
}

senseman: Soweit der Plan

Einen Plan sehe ich nicht.

Gruß

Gregor

senseman: ..... Lade ich den Sketch so hoch kommt h1 nicht definiert warum ? Hab ich doch hier gemacht

int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();

.....

Du hast "h1" innerhalb eines Codeblocks definiert, diese Definition gilt dann nicht mehr außerhalb.

In deinem fall solltest du "h1" als globale Variable definieren. Das gilt auch für "t1".

@gregorss

Der Plan war das PRogramm so besser ?

Also müsste ich das ganzte so schreiben richtig verstanden ?

#include <DHT.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> ; // NewLiquidCrystal_1.5.1
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define DHTPIN1 4
#define DHTPIN2 6
#define DHTTYPE DHT11
#define DHTTYPE DHT22
int zeit;
int fan;

unsigned long previousMillis = 0;          // speichert den Zeitpunkt an dem zuletzt geschalten wurde
const long sensorpause = 2000;            // Länge der Pause in ms

DHT dht1(DHTPIN1, DHT11);
DHT dht2(DHTPIN2, DHT22);

void setup() {
  lcd.begin(16, 2);
  dht1.begin();  
  dht2.begin();
  pinMode(7, OUTPUT);
  pinMode(13, OUTPUT);
  
}

void loop() {
  zeit = (millis()/60000) % 60; // Hier füllen wir die Variable zeit mit einem Wert. Die Funktion millis() gibt die Millisekunden aus seit dem das Programm gestartet wurde. 
  //Die Millisekunden rechnen wir um in Minuten um den Lüfter später einmal pro Stunden laufen zu lassen. 
  
  // Sensorwerte Auslesen
  int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();
  

  // Pause zum Sensor auslesen 2sec.

  unsigned long currentMillis = millis();              // Aktuelle Zeit wird in currentMillis gespeichert
  if (int currentMillis - previousMillis >= sensorpause1) { // Falls mehr als 2000 ms vergangen sind
    previousMillis = currentMillis;                    // Zeitpunkt der letzten Schaltung wird festgehalten
  }
  if (isnan(h1) || isnan(t1))
  {
    digitalWrite(7, HIGH); 
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
  }
 else
{
  lcd.setCursor(0, 0);
  lcd.print("H1: ");
  lcd.print(h1);
  lcd.print("% ");
  lcd.setCursor(9, 0);
  lcd.print("T1: ");
  lcd.print(t1);
  lcd.print("C ");
 }

  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  
if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
  }
  else
  {
 
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
  }

  int vergl = h1-h2;
  if (vergl >= 5 || vergl <= -5){
    fan = 1;
  }

  if (fan == 1){
    if (vergl > 1 || vergl < -1){
      fan = 1;
    }else{
      fan = 0;
    }
  }

   if (fan == 1 || h1 < 63 || h2 < 63 || zeit >= 55 ){
    digitalWrite(13, HIGH);
  }else{
    digitalWrite(13, LOW);
  } 
}

was mach ich nun mit dem zweiten sensor ? über nimmt der das vom ersten von der Pause weil

const long sensorpause1 = 2000;            // Länge der Pause in ms
const long sensorpause2 = 2000;
und danach 

  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  unsigned long currentMillis = millis();              // Aktuelle Zeit wird in currentMillis gespeichert
  if (currentMillis - previousMillis >= sensorpause2) { // Falls mehr als 2000 ms vergangen sind
    previousMillis = currentMillis;
...

ergibt folgenden Fehler im Copiller

redeclaration of ‘long unsigned int currentMillis’

Du musst dir mal die Markierung in der IDE ansehen, wenn der Fehler gemeldet wird. Dann siehst du auch, wo der Fehler steckt.

Das hast du doppelt drin:

unsigned long currentMillis = millis();

Und für den 2. Sensor musst du das natürlich auch machen.

Hallo,

Theseus erklärt millis()

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

Schreibe sinnvolle Funktionen die dann aufgerufen werden und klopp nicht alles sturr in die loop rein.

void setup(void) {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(void) {

  ausgabe(2000);
  
  heartbeat(500);
}


// ****** Funktionen ******

void ausgabe (const unsigned int interval)         
{
  static unsigned long last_ms = 0;
      
  if (millis() - last_ms >= interval) {
    last_ms = millis();

    Serial.print(F("Ich schreibe aller "));
    Serial.print(interval);
    Serial.println(F(" ms."));
  }
}


void heartbeat (const unsigned int interval)      // Kontrolle ob Sketch blockiert
{
  static unsigned long last_ms = 0;
  static bool state = LOW;
    
  if (millis() - last_ms >= interval) {
    last_ms = millis();
    state = !state;
    digitalWrite(LED_BUILTIN, state);
  }
}

HotSystems: Du musst dir mal die Markierung in der IDE ansehen, wenn der Fehler gemeldet wird. Dann siehst du auch, wo der Fehler steckt.

Das hast du doppelt drin:

unsigned long currentMillis = millis();

Und für den 2. Sensor musst du das natürlich auch machen.

Also heist das nun für mich das ich bei dem 1. Sensor schreibe

unsigned long currentMillis = millis();              // Aktuelle Zeit wird in currentMillis gespeichert
  if (currentMillis - previousMillis1 >= sensorpause1) { // Falls mehr als 2000 ms vergangen sind
    previousMillis1 = currentMillis;                    // Zeitpunkt der letzten Schaltung wird festgehalten
  }
  // Sensorwerte Auslesen
  
  ......

und beim 2. kann ich das unsigned long currentMillis = millis(); weg lassen so das nur noch

if (currentMillis - previousMillis2 >= sensorpause2) { // Falls mehr als 2000 ms vergangen sind
    previousMillis2 = currentMillis; 

   .....

schreibe richtig verstanden ?

@Doc Arduino das mit den Funktionen verstehe ich leider überhaupt nicht.

Also dein Programm.

void loop(void) {  // Warum dort nochmals (void)

  ausgabe(2000);          // ausgabe 2000 millis warten ?
  
  heartbeat(500);          // Funktion mit 500 millis ? warten
void heartbeat (const unsigned int interval)      // Kontrolle ob Sketch blockiert
{
  static unsigned long last_ms = 0;
  static bool state = LOW;                
    
  if (millis() - last_ms >= interval) {
    last_ms = millis();
    state = !state;
    digitalWrite(LED_BUILTIN, state);
  }
}

der heartbeat versteh ich gar nicht ich schalte etwas auf Low ok bei dir die LED und was soll ich am Sensor Low schalten

Die Links zu den Millis hab ich mir durch gelesen soweit so klar mit einer LED nur komm ich mit dem erklären und dem Umsetzen des ganzen nicht klar. Das ich das ganze für die Sensoren nutzen kann. eigentlich das selbe Problem wie beim Heartbeat.

Das sieht bis dahin gut aus und was sagt jetzt der Compiler ?

Lief durch ohne Probleme. Scheinen sich nur etwas Zeit versetzt zu aktualisieren. Sensor 1 zu 2

Hab mich nun mal an die Funktionen versucht leider mit einem Ernüchternden Ergebnis ein Sensor wird angezteigt der zweite nicht :(.

#include "DHT.h"
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> ; // NewLiquidCrystal_1.5.1
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define DHTPIN1 4
#define DHTPIN2 6
#define DHTTYPE DHT11
#define DHTTYPE DHT22

int zeit;
int fan;

DHT dht1(DHTPIN1, DHT11);
DHT dht2(DHTPIN2, DHT22);

void setup(void) {
  lcd.begin(16, 2);
  dht1.begin();  
  dht2.begin();
 // pinMode(13, OUTPUT);
}

void loop(void) {


  sensorpause_1(2000);
  sensorpause_2(2000);
 
// sensorvergleichen();  
  
 // heartbeat(500);
}


// ****** Funktionen ******

void sensorpause_1 (const unsigned int interval)        // das const unsigned interval erschliest sich mir nicht
{
  static unsigned long last_ms = 0;
      
  if (millis() - last_ms >= interval) {
    last_ms = millis();


{
  int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();
  if (isnan(h1) || isnan(t1)) {
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
  }
  lcd.setCursor(0, 0);
  lcd.print("H1: ");
  lcd.print(h1);
  lcd.print("% ");
  lcd.setCursor(9, 0);
  lcd.print("T1: ");
  lcd.print(t1);
  lcd.print("C ");     
  
 
  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
 
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
    }
  }
  }  }

ich hab beide in eine Funktion gepackt leider wird nur sensor 1 angezeigt
das ganze als zweite Funktion mit sensor 2

void sensorpause_2 (const unsigned int interval2)        // das const unsigned interval als interval2     geht leider auch nicht 
{
  static unsigned long last_ms = 0;
      
  if (millis() - last_ms >= interval2) {
    last_ms = millis();


  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
 
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
    }
  }

er mekert dann ‘sensorpause_2’ was not declared in this scope ich tippe drauf das wieder was doppelt ist. könnte ja dann nur foldendes sein

static unsigned long last_ms = 0;
      
  if (millis() - last_ms >= interval2) {
    last_ms = millis();

Hallo,

ist das wirklich so schwer? Statt intervallmäßig eine LED blinken zu lassen fragst du mit dem gleichen Grundgerüst intervallmäßig deine Sensoren ab. Alles ohne Blockierung der loop.

ja ist leider so schwer ich steh irgendwie auf dem Schlauch. wie ich es machen würdfe hatte ich ja gepostet nur leider muss ich noch nen verständnis fehler haben sonst sollte es ja so gehen weil ja einfach aber an scheinend ehr nicht so einfach. was ich verstanden und wie hab hab ich ja kommentiert.

Hallo,

void vorm Funktionsnamen > es gibt keinen Rückgabeparameter void hinter Funktionsnamen > es gibt keinen Übergabeparameter, man kann auch eine leere Klammer schreiben

Die 2000 und 500 sind demzufolge Übergabeparameter an den Funktionsaufruf. Was damit passiert sieht man in den Funktionen.

Und über die Sichtbarkeit und Überdeckung von Variablen solltest du dich auch mal aufschlauen. Du definierst t1 einmal global, ein 2. Mal local. Das ist mit Sicherheit nicht, was du willst.

So mal in Funktionen versucht

  #include "DHT.h"
  #include <Wire.h>
  #include <LCD.h>
  #include <LiquidCrystal_I2C.h> ; // NewLiquidCrystal_1.5.1
  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  #define DHTPIN1 4
  #define DHTPIN2 5
  #define DHTTYPE DHT11
  #define DHTTYPE DHT22
  int zeit;
  //int minute;
  int fan;
  
  unsigned int StartMillis1= 0;          // speichert den Zeitpunkt an dem zuletzt geschalten wurde
  unsigned int StartMillis2= 0;          // speichert den Zeitpunkt an dem zuletzt geschalten wurde
  
  const long sensorpause1 = 2000;            // Länge der Pause in ms // const oder unsigned long
  const long sensorpause2 = 2000;
  
  DHT dht1(DHTPIN1, DHT11);
  DHT dht2(DHTPIN2, DHT22);
  
  void setup() {
  lcd.begin(16, 2);
  dht1.begin();  
  dht2.begin();
  pinMode(9, OUTPUT);
  }
  void loop(){
  
  //minute = (millis() / 60000) % 60; 
  
  sensor_auslesen();
  
  }
  
  void sensor_auslesen(){
    
  zeit = (millis() / 60000) % 60; 
  /* Hier füllen wir die Variable zeit mit einem Wert. Die Funktion millis() gibt die Millisekunden aus seit dem das Programm gestartet wurde. 
  Die Millisekunden rechnen wir um in Minuten um den Lüfter später einmal pro Stunden laufen zu lassen. 
  
   Pause zum Sensor auslesen 2sec.
  */
  
  unsigned long currentMillis = millis();              // Aktuelle Zeit wird in currentMillis gespeichert
  if (currentMillis - StartMillis1 >= sensorpause1) { // Falls mehr als 2000 ms vergangen sind
    StartMillis1 = currentMillis;  
  } 
  
  int h1  = dht1.readHumidity();
  int t1 = dht1.readTemperature();
  if (isnan(h1) || isnan(t1)) {
    lcd.setCursor(0, 0);
    lcd.print("Fehler Sensor 1!");
  }
  lcd.setCursor(0, 0);
  lcd.print("H1: ");
  lcd.print(h1);
  lcd.print("% ");
  lcd.setCursor(9, 0);
  lcd.print("T1: ");
  lcd.print(t1);
  lcd.print("C ");
  
  
  if (currentMillis - StartMillis2 >= sensorpause2) { // Falls mehr als 2000 ms vergangen sind
    StartMillis2 = currentMillis;
  }
    
  int h2  = dht2.readHumidity();
  int t2 = dht2.readTemperature();
  
  if (isnan(h2) || isnan(t2)) {
    lcd.setCursor(0, 1);
    lcd.print("Fehler Sensor 2!");
  }
  lcd.setCursor(0, 1);
  lcd.print("H2: ");
  lcd.print(h2);
  lcd.print("% ");
  lcd.setCursor(9, 1);
  lcd.print("T2: ");
  lcd.print(t2);
  lcd.print("C ");
  
  
  // Sensorwerte  vergleichen
  int vergl = h1 - h2;                      // Sensorwerte vergleichen ohne Kommastellen
  if (vergl >= 5 || vergl <= -5)
  {
    fan = 1;
  }
  if (fan == 1) {
    if (vergl > 1 || vergl < -1)
    {
      fan = 1;
    } else {
      fan = 0;
    }
  }
  
  if (fan == 1 || h1 < 40 || h2 < 40 || zeit >= 55 )        // Schaltschwelle für den Lüfter
  {
    digitalWrite(2, HIGH);                              // Fan ON
    digitalWrite(9, HIGH);                             // LED ROT kontrolle FAN
    //lcd.setCursor(0, 4);                               // zeichen 1 zeile 4
    //lcd.print("Fan: ON");                               // FAN off Display
  } 
  else
  {
    digitalWrite(2, LOW);                                 // Fan OFF
    digitalWrite(9, LOW);                                 //LED ROT kontrolle FAN
    //lcd.setCursor(0, 4);                                // setze Cursor zeichen 1 zeile 4
    //lcd.print("Fan: OFF");    // Fan On Display
  }
  }

irgendwie schaltet jetzt der Lüfter nicht mehr ab :(.

Kannst du mir das definieren mit t1 mal näher erläutern ? global lokal ist mir ein Begriff nur leider weis ich nicht wie ich es besser machen sollte. ICh sehe es so das ich nur Lokal t1 definiert habe nicht global.

Hallo,

wie wäre es denn wenn du für deine Pins sprechende Namen verwenden würdest. Ganz unten im Code kann man erahnen das an Pin 9 eine Led hängt und an Pin 2 ein Lüfter. Nur blöd wenn man nur Pin 9 als Ausgang schaltet und Pin 2 fürs Display verwendet.

Vorschlag o.ä. und dann konsequent im Code verwenden.

const byte pinLED = 8;
const byte pinFAN = 9;

Die Displayinitialisierung stimmt aber? Sind mir für I2C irgendwie zu viele Pins? Warum nimmst du nicht die Standard IDE Lcd Lib?

Das Display läuft wie es soll alles im Grünenbereich, da war was ich glaube die einzige lib die so lief wie ich es brauche, weil beim Display soll noch das Backlight geschaltet werden per taster.