Arduino 2x DHT22 auslesen und Werte anzeigen

Hallo!

Ich bin absoluter Neuling und hab mich in den letzten Tagen in die Materie eingelesen.
Heute habe ich mal versucht ein Code zu erstellen, mit dem 2 DHT22 ausgelesen werden und die Werte des 1. Sensor und des 2. Sensors abwechselnd auf einem 16x2 LCD Display angezeigt werden.
So sieht mein Ansatz aus:

#include <DHT.h>

#define DHT1PIN 2
#define DHT2PIN 3

#define DHTTYPE DHT22

DHT dht1(DHT1PIN, DHTTYPE)  
DHT dht2(DHT2PIN, DHTTYPE)

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup()
{
  lcd.begin(16, 2);
  lcd.print("Hochfahren...");
  lcd.clear(); 

  dht1.begin();
  dht2.begin();
}

void loop() 

{  
  float h1 = dht1.readHumidity(); 
  float t1 = dht1.readTemperature(); 
  float h2 = dht2.readHumidity(); 
  float t2 = dht2.readTemperature(); 

   if (isnan(t) || isnan(h)) 
 {
  lcd.setCursor(0, 0);
  lcd.print("DHT22 konnte nicht ausgelesen werden");
 } 
 else
 {
   lcd.setCursor(0, 0);
   lcd.print("Temp. 1: ");
   lcd.print(t1);
   lcd.print(" °C");
  
   lcd.setCursor(0, 1);
   lcd.print("Rel.F 1: ");
   lcd.print(h1);
   lcd.print(" %");

   delay(10000);
  
   lcd.clear();

   lcd.setCursor(0, 0);
   lcd.print("Temp. 2: ");
   lcd.print(t2);
   lcd.print(" °C");
  
   lcd.setCursor(0, 1);
   lcd.print("Rel.F : ");
   lcd.print(h2);
   lcd.print(" %");
   
   delay(10000);
  
   lcd.clear();
 }
}

Ich wollte diese Library verwenden: GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors

Kurz zur Funktion:

Die 2 DHT22 werden ausgelesen. Zuerst werden die Werte des 1. Sensors angezeigt und noch 10 Sekunden wird das Display gecleared. Dann werden die Werte des 2. Sensors angezeigt und das Display wieder nach 10 Sekunden gecleared. Nun fängt es wieder von vorne an.

Ich konnte den Code noch nicht testen, da ich im Moment keinen Arduino habe. Deswegen wollte ich mal fragen, ob dieser Code so funktioniert oder was ich noch ändern müsste, damit er funktioniert. Schon mal Danke im voraus für die Antworten!

MfG Scopax

Ich würde sagen, dass der Code nicht mal kompiliert.

Fehlen Variablendefinitionen, etc.

Lcd.clean ist suboptimal, flackert u.U.
Delay ist Mist
....

Heißt, am besten neu anfangen?

Nein, Wenn du die Hardware hast, Fehler suchen und korrigieren. Mit wachsenden Kenntnissen dann den Sketch verbessern.
Delay geht für diesen Sketch, solange der Sketch keine weitere Funktionen bekommt.

Bring zuerst das Display mit einem Beispielsketch zum laufen, damit du die richtigen Initialisierungsparameter hast. Serielle Debug Ausgabe wäre ggf. auch nicht schlecht

Okay, danke für die schnelle Antwort.

Wenn der Arduino da ist, wird ich mich mal an die Verbesserung machen.

MfG Scopax

Eine Frage noch:

Warum kompiliert der Sketch eigentlich nicht?

Das hast du vergessen anzupassen:

if (isnan(t) || isnan(h))

Und generell sollte man bei LCD halt nicht das ganze Display löschen, sondern Texte und Zahlen auf eine konstante Breite formatieren und die alten direkt überschreiben. Dann flackert nichts.

Okay hab ich angepasst. Funktioniert aber leider immer noch nicht.

Wäre vielleicht die Fehlermeldung hilfreich?

Hab sogar einen Fehler allein lösen können. Ich hab vergessen ein weitere benötigte Library zu installieren.
Jetzt kompiliert der Sketch wenigstens schon mal.

MfG Scopax

Hallo Scopax

Der Code der funktioniert wäre noch ganz hilfreich, da ich längerfristig auch an diesem Projekt interessiert bin

Danke Martin

Er sagte, der Code kompiliert, das heißt nicht, dass er korrekt arbeitet. Warten wir ab, bis er seine Hardware hat und alles funzt

Hi

Scopax:
Okay hab ich angepasst. Funktioniert aber leider immer noch nicht.

Wäre vielleicht die Fehlermeldung hilfreich?

#1 - Das nennt sich 'Programmieren' - Glückwunsch, Du näherst Dich der Elite :slight_smile:
#2 - Fehlermeldungen sind immer hilfreich - auch Dein selbst gelöstes Problem kann einem anderen Anfänger hilfreich sein!
Wenn dann noch der Code dabei ist, ist Alles dabei, um Deinen Werdegang nachvollziehen zu können.

Viel Erfolg noch

Update:

Nach einigem rumprobieren und immer den gleichen Fehlermeldungen, hab ich einfach den Sketch nochmal komplett neu geschrieben und es gab keine Fehlermeldungen mehr. Anscheinend fand das Programm es nicht so toll, dass ich den Sketch zuerst auf dem Windows Editor geschrieben und dann reinkopiert habe. Außerdem hab ich noch ein paar Variablen neu benannt, den Teil "lcd.clean();" auf Empfehlung von ElEspanol entfernt und fehlend ";" hinzugefügt.

So sieht der Sketch nun aus:

#include <DHT.h>
#include <LiquidCrystal.h>

#define DHTPIN 8
#define DHT2PIN 9

#define DHTTYPE DHT22

DHT dht(DHTTYPE, DHTPIN);
DHT dht2(DHTTYPE, DHT2PIN);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Hochfahren...");
  lcd.clear();

  dht.begin();
  dht2.begin();
  
}

void loop() {

  float t = dht.readTemperature();
  float h = dht.readHumidity();
  float t2 = dht2.readTemperature();
  float h2 = dht2.readHumidity();

  if (isnan(t) || isnan(h) || isnan(t2) || isnan(h2))
  {
    lcd.setCursor(0, 0);
    lcd.print("DHT22 konnte nicht ausgelesen werden!");
    
  }
 else
 {
  lcd.setCursor(0, 0);
  lcd.print("Temp. 1: ");
  lcd.print(t, 1);
  lcd.print(" °C");

  lcd.setCursor(0, 1);
  lcd.print("Rel. F 1: ");
  lcd.print(h, 1);
  lcd.print(" %");

  delay(10000);

  lcd.setCursor(0, 0);
  lcd.print("Temp. 2: ");
  lcd.print(t2, 1);
  lcd.print(" °C");

  lcd.setCursor(0, 1);
  lcd.print("Rel. F 2: ");
  lcd.print(h2, 1);
  lcd.print(" %");

  delay(10000);

  }
}

Er kompiliert wie gesagt jetzt ohne Fehlermeldung.
Am Dienstag oder Mittwoch sollte dann meine Hardware ankommen. Dann kann ich testen, ob der Sketch so funktioniert wie er soll.

MfG Scopax

Das sieht so schon ganz ordentlich aus.
Ein kleines Problem besteht aber noch.
Dein LCD wird das Grad-Zeichen "°" nicht richtig darstellen können.
Statt dessen gibst du \337 ein. Also lcd.print(" \337C");

Oder:

//im Definitionsbereich
#define Grad "\xDF"

// in der Ausgabe
lcd.print(Grad "C");

Danke für den Tipp. Werd ich sofort ändern.

Habe den Code versucht mit nur einem Sensor und er klappt nicht.

Mein Einzelcode für LCD ( Oled noch integriert, kann einfach auskommentiert werden) ist dieser:

#include <Adafruit_GFX.h> // OLED
#include <Adafruit_SSD1306.h> // OLED
#include <LiquidCrystal.h>
#include <DHT.h>

#define OLED_RESET 4 // OLED
Adafruit_SSD1306 display(OLED_RESET); // OLED
#define DHTPIN A0                                           
#define DHTTYPE DHT22                                      
DHT dht(DHTPIN, DHTTYPE);                                  

#if (SSD1306_LCDHEIGHT != 64) // OLED
#error("Height incorrect, please fix Adafruit_SSD1306.h!"); // OLED
#endif // OLED
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
                             

void setup() {
  lcd.begin(16, 2);   
  lcd.setCursor(0, 0);
  lcd.print("Start...");
  delay(2000);
  display.begin(SSD1306_SWITCHCAPVCC); // OLED
}

void loop() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  
  display.clearDisplay(); // OLED Display leeren
// für OLED Display
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Temp:");
  display.println(t); // neu
  display.setCursor(0,30);
  display.print("Luft:");
  display.println(h); // neu
  display.display();
// für LCD Display
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(t); //neu
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("Luft: ");
  lcd.print(h); // neu
  lcd.print("%");
  
}

Damit geht es.

Da ich nur einen DHT22 habe kann ich nicht mehr testen als einen.

Das ° funkt leider auch nicht wie angegeben

Martin

@Darter69
Würdest du bitte mit deinem Problem einen eigenen Thread aufmachen.
Dein Problem stellt sich hier ganz anders und würde einiges vermischen.

Das mit dem zweiten Sensor war nur als Hinweis gedacht.

Mein Code ist drin, damit er den Vergleich zwischen seinem und meinem machen kann.

Darter69:
Das mit dem zweiten Sensor war nur als Hinweis gedacht.

Mein Code ist drin, damit er den Vergleich zwischen seinem und meinem machen kann.

Was soll er da vergleichen ?
Deiner hat nur einen Sensor und zwei Displays.
Da ist schon mal ein Unterschied.
Das bringt einen schon leicht in eine falsche Richtung.

Hi

Der DHT22 ist doch eh ein Single-Sensor - oder sollte ich mich da gerade irren?
Wenn nicht, kannst Du doch den DHT22 auf das andere Port umstecken und schauen, ob dort Messwerte kommen.

MfG