Bitte um Durchsicht wegen Übersichtlichkeit

So, der erste Teil ist jetzt mal funktionstüchtig.

Könnte sich bitte jemand den Code, den ich mir aus Schnipseln, Beispielen und Überlegen gebastelt habe, mal durchsehen, ob es auch "sauber" ist? Bzw. welche Verbesserungs- Vereinfachungsvorschläge gibt es, bevor ich weitermache?

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <DHT.h>
#include <DS3232RTC.h>
#include <Time.h>

DHT dht;

OneWire ds18(8);                          //Anschluss der beiden DS18B20 an PIN 8 (4k7 zwischen Plus und Data)

DallasTemperature sensors(&ds18);

LiquidCrystal lcd(12, 11, 4, 5, 6, 7);    //Achtung, nicht an PINs 2 und 3 wegen zusätzlicher SDA und SCL Funktion

DeviceAddress Probe01 = { 0x28, 0xFF, 0x82, 0xEF, 0x35, 0x16, 0x03, 0x9C };     //Adressen der beiden DS18B20
DeviceAddress Probe02 = { 0x28, 0xFF, 0x83, 0x62, 0x35, 0x16, 0x03, 0x15 }; 

unsigned long previousMillis = 0;         //Delay ohne ausbremsen des Codes
unsigned long interval  = 2000;           // 2s Delay

void setup(){ //***********************************************************************************Set Up

  setSyncProvider(RTC.get);               //Uhrzeit der RTC auslesen
  
  sensors.begin();                        //Library starten
  sensors.setResolution(Probe01, 12);     //Auflösung auf 12bit (0,0625°C) einstellen
  sensors.setResolution(Probe02, 12);     //kleinstmögliche Auflösung, delay min. 750ms
 
  lcd.begin (20,4);                       //Start des LCD, 20 Zeichen, 4 Zeilen
  lcd.print("Initialisierung....");
  delay(1000);
  lcd.clear();                            //Löschen des Displays

  dht.setup(9);                           //Anschluss des DHT22 an PIN 9
}

void loop(){  //***********************************************************************************Loop

  printClock();                           //Uhrzeit anzeigen
  tempAuslesen();                         //Temperaturen und Feuchte anzeigen
  
  lcd.setCursor(0, 0);                    //Einrichten der Beschreibungen in der ersten Zeile
  lcd.print("T1: ");
  lcd.setCursor(5, 0);
  lcd.print("T2: ");
  lcd.setCursor(10, 0);
  lcd.print("T3: ");
  lcd.setCursor(15, 0);
  lcd.print("RelF");
}
//*************************************************************************************************Print Clock
void printClock() {                       //Uhrzeit im Format HH:MM:SS ausgeben
    lcd.setCursor(12,3);                  //Anzeige der Uhrzeit rechts unten im Display
    print_Digits(hour());
    lcd.print(":");
    print_Digits(minute());
    lcd.print(":");
    print_Digits(second());
}
//*************************************************************************************************Print Digits
void print_Digits(int digits) {           //Bei der Uhrzeit
    if(digits < 10)                       //führende Null bei Zahlen >10 anzeigen
      lcd.print('0');
    lcd.print(digits);
}
//*************************************************************************************************TempAuslesen
void tempAuslesen(){                      //Temperaturen des DHT und DS18B20 auslesen
  
    unsigned long currentMillis = millis();     //Delay einstellen
    if ( currentMillis - previousMillis >= interval ){
       previousMillis = currentMillis;
  
       float humidity = dht.getHumidity();          //Feuchte des DHT auslesen
       float temperature = dht.getTemperature();    //Temperatur des DHT auslesen 
       sensors.requestTemperatures();               //Auslesen Temperaturen der DS18B20 am Bus auslesen

       lcd.setCursor(0,1);                          //Ausgabe der Temperaturen und Feuchte in der zweiten Zeile
       printTemperature(Probe01);                   //Anzeige der oberen Temperatur DS18B20
       lcd.setCursor(5,1);  
       lcd.print(temperature, 1);                   //Anzeige der Temperatur unten DHT22
       lcd.setCursor(10,1);
       printTemperature(Probe02);                   //Anzeige der Temperatur Mitte DS18B20
       lcd.setCursor(15, 1);
       lcd.print(humidity, 1);                      //Anzeige der Feuchte DHT22
      }
}
//*************************************************************************************************PrintTemperaturen
void printTemperature(DeviceAddress deviceAddress){ //Anzeige der Temperaturen DS18B20

    float tempC = sensors.getTempC(deviceAddress); 
    lcd.print(tempC,1); 
}

Also ich mach das immer nach dem Schema:

  • Code funktioniert und macht das was ich möchte?
  • Code passt ohne Probleme in den Speicher?

Wen 2x "ja" dann ist der Code gut.

An und für sich 2x ja, aber ich bin erstens noch nicht fertig, es geht also weiter mit diesem Code und ich möchte natürlich selbst auch besser werden. Wenn ich mal etwas für Batterieanwendungen programmiere, muss ich auch auf die Ressourcen achten, deshalb möchte ich natürlich auch dies nicht außer Acht lassen und den Code anpassen.

da du die LC Anzeige ständig überschreibst, habe ich die Pause mal in die Loop gepackt

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <DHT.h>
#include <DS3232RTC.h>
#include <Time.h>

DHT dht;

OneWire ds18(8);                          //Anschluss der beiden DS18B20 an PIN 8 (4k7 zwischen Plus und Data)

DallasTemperature sensors(&ds18);

LiquidCrystal lcd(12, 11, 4, 5, 6, 7);    //Achtung, nicht an PINs 2 und 3 wegen zusätzlicher SDA und SCL Funktion

DeviceAddress Probe01 = { 0x28, 0xFF, 0x82, 0xEF, 0x35, 0x16, 0x03, 0x9C };     //Adressen der beiden DS18B20
DeviceAddress Probe02 = { 0x28, 0xFF, 0x83, 0x62, 0x35, 0x16, 0x03, 0x15 };


void setup(){ //***********************************************************************************Set Up

  setSyncProvider(RTC.get);               //Uhrzeit der RTC auslesen
 
  sensors.begin();                        //Library starten
  sensors.setResolution(Probe01, 12);     //Auflösung auf 12bit (0,0625°C) einstellen
  sensors.setResolution(Probe02, 12);     //kleinstmögliche Auflösung, delay min. 750ms
 
  lcd.begin (20,4);                       //Start des LCD, 20 Zeichen, 4 Zeilen
  lcd.print("Initialisierung....");
  delay(1000);
  lcd.clear();                            //Löschen des Displays

  dht.setup(9);                           //Anschluss des DHT22 an PIN 9
}

void loop(){  //***********************************************************************************Loop
  static uint32_t millis_alt;
  const uint16_t interval  = 2000;           // 2s Delay
  printClock();                           //Uhrzeit anzeigen
  if (millis() - millis_alt > interval)
  tempAuslesen();                         //Temperaturen und Feuchte anzeigen
  if (millis() - millis_alt > (interval*2)
  {
  lcd.setCursor(0, 0);                    //Einrichten der Beschreibungen in der ersten Zeile
  lcd.print("T1: ");
  lcd.setCursor(5, 0);
  lcd.print("T2: ");
  lcd.setCursor(10, 0);
  lcd.print("T3: ");
  lcd.setCursor(15, 0);
  lcd.print("RelF");
  millis_alt = millis();
  }
}
//*************************************************************************************************Print Clock
void printClock() {                       //Uhrzeit im Format HH:MM:SS ausgeben
    lcd.setCursor(12,3);                  //Anzeige der Uhrzeit rechts unten im Display
    print_Digits(hour());
    lcd.print(":");
    print_Digits(minute());
    lcd.print(":");
    print_Digits(second());
}
//*************************************************************************************************Print Digits
void print_Digits(int digits) {           //Bei der Uhrzeit
    if(digits < 10)                       //führende Null bei Zahlen >10 anzeigen
      lcd.print('0');
    lcd.print(digits);
}
//*************************************************************************************************TempAuslesen
void tempAuslesen(){                      //Temperaturen des DHT und DS18B20 auslesen
    
       float humidity = dht.getHumidity();          //Feuchte des DHT auslesen
       float temperature = dht.getTemperature();    //Temperatur des DHT auslesen
       sensors.requestTemperatures();               //Auslesen Temperaturen der DS18B20 am Bus auslesen

       lcd.setCursor(0,1);                          //Ausgabe der Temperaturen und Feuchte in der zweiten Zeile
       printTemperature(Probe01);                   //Anzeige der oberen Temperatur DS18B20
       lcd.setCursor(5,1); 
       lcd.print(temperature, 1);                   //Anzeige der Temperatur unten DHT22
       lcd.setCursor(10,1);
       printTemperature(Probe02);                   //Anzeige der Temperatur Mitte DS18B20
       lcd.setCursor(15, 1);
       lcd.print(humidity, 1);                      //Anzeige der Feuchte DHT22
      }
}
//*************************************************************************************************PrintTemperaturen
void printTemperature(DeviceAddress deviceAddress){ //Anzeige der Temperaturen DS18B20

    float tempC = sensors.getTempC(deviceAddress);
    lcd.print(tempC,1);
}

Danke, macht Sinn.

Wobei, da du ja bei der ersten Zeile (T1:, T2: etc.) die doppelte Pause nimmst, wenn ich es richtig interpretiere, wäre es dann nicht ohnehin besser, diesen Teil in das Setup zu verschieben? Da ändert sich ja nichts. Oder ist es wegen dem Überschreiben der anderen Zeilen besser so?

oder
void loop(){ //***********************************************************************************Loop
static uint32_t millis_alt;
const uint16_t interval = 2000; // 2s Delay
if (millis() - millis_alt > interval && (millis() - millis_alt <( interval2))
printClock(); //Uhrzeit anzeigen
if (millis() - millis_alt > (interval
2))
{
beschreibung();
tempAuslesen(); //Temperaturen und Feuchte anzeigen
millis_alt = millis();
}
void beschreibung()
{
lcd.setCursor(0, 0); //Einrichten der Beschreibungen in der ersten Zeile
lcd.print("T1: ");
lcd.setCursor(5, 0);
lcd.print("T2: ");
lcd.setCursor(10, 0);
lcd.print("T3: ");
lcd.setCursor(15, 0);
lcd.print("RelF");
}

}
}

Danke, hilft mir weiter.