2 DHT22 im Wechsel auf LCD anzeigen

Hallo an alle,

ich habe ein wenig mit DHT22 und einem LCD 16x2 herumgespielt.
Soweit sogut. Dann wollte ich mal sehen wie die Unterschiede zwischen 2 Sensoren sind.
Beide DHT stecken nebeneinander im Steckbrett und ich wollte Temperatur/Feuchte auf
dem zweizeiligen Display abwechselnd anzeigen lassen.
Für den Wechsel wollte ich den "Blink without delay" Sketch adaptieren. Mein Sketch
kompiliert ohne Fehlermeldungen, das Ergebnis ist aber nicht wie erwartet.
Die Texte "Temp.:" und "Feuchte:" werden in ihren Zeilen angezeigt.
Die beiden Werte zeigen aber nur "0". Zusätzlich soll am Ende der ersten Zeile die Nummer
angezeigten Sensors erscheinen. Dort erscheint aber nur die "2". Also findet wohl der
Wechsel zwischen den Sensoren nicht statt und ausserdem werden keine Werte
angezeigt. Bin etwas ratlos...

mfg

Frank

P.S.: Board ist ein Arduino Uno...

/*
  LiquidCrystal Library - display() and noDisplay()
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD and uses the 
 display() and noDisplay() functions to turn on and off
 the display.
 
 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe

 This example code is in the public domain.

 http://arduino.cc/en/Tutorial/LiquidCrystalDisplay

 */

// include the library code:
#include <LiquidCrystal.h>
#include "DHT.h"

DHT dht0;
DHT dht1;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Variablen
int dht_State = LOW;     // used to set the dht_state
unsigned long previousMillis = 0; // speichere letzte zeit
const long interval = 2000;    // interval des anzeigewechsels
int humidity;
int temperature;

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  //lcd.print("Thermo-/Hygro");
  dht0.setup(8); //data pin 8
  dht1.setup(9); //data pin 9
  delay(1000);
}

void loop() 
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to change the display; that is, if the 
  // difference between the current time and last time you changed 
  // the display is bigger than the interval at which you want to 
  // change the display.
  unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;  
    
    // if dht0 is active change to dht1 and vice-versa:
    if (dht_State == LOW) {
      dht_State = HIGH;
    } else {
      dht_State = LOW;
   }     
  
  if (dht_State = LOW) {
  delay(dht0.getMinimumSamplingPeriod());
  
  int humidity = int(dht0.getHumidity()); // Nachkommastellen abschneiden
  int temperature = int(dht0.getTemperature());
  lcd.setCursor(15, 0);
  lcd.print('1'); // Nummer des Sensors
  }
  
  if (dht_State = HIGH) {
    
  delay(dht1.getMinimumSamplingPeriod());
  
  int humidity = int(dht1.getHumidity()); // Nachkommastellen abschneiden
  int temperature = int(dht1.getTemperature());
  lcd.setCursor(15, 0);
  lcd.print('2'); // Sensornummer
  }
  
  lcd.setCursor(0, 0);
  lcd.print("Temp.:");
  
  lcd.setCursor(0, 1);
  lcd.print("Feuchte:");
  
  lcd.setCursor(9, 0);
  lcd.print(temperature);
  
  lcd.setCursor(9, 1);
  lcd.print(humidity);
  }
}

dht22_mit_lcd_06_12_2019.ino (3.02 KB)

Poste deinen Sketch bitte direkt im Forum in Code-Tags und verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dann ist dieser für alle besser zu lesen.

Hallo,

warum liesst du nicht beide Sensoren immer ein und speicherst die Werte in unterschiedlichen Variable. Mit Serial print kannst Du dir dann alle Werte anzeigen lassen. Mit dem "Blinker" schaltest Du dann die Ausgabe der Variablen auf die Anzeige um.

Heinz

Nachtrag

if (dht_State == LOW) {

= ist eine Zuweisung

== Ist ein Vergleich

du willst vergleichen

noiasca:
also das:

int humidity = int(dht0.getHumidity()); // Nachkommastellen abschneiden

gib dir mal dein humidity auf der Seriellen aus.
Ich wette das ist schon 0. Daher wird das LCD auch nichts ausgeben.

Lesevorschlag:
casting - C convert floating point to int - Stack Overflow

Die Zeile funktioniert hier wenn ich nur einen Sensor anspreche.
Die Umwandlung float/integer habe ich von hier:
https://forum.arduino.cc/index.php?topic=29895.0
Welche "Serielle" ist hier gemeint?

mfg

Frank

Rentner:
Hallo,

warum liesst du nicht beide Sensoren immer ein und speicherst die Werte in unterschiedlichen Variable. Mit Serial print kannst Du dir dann alle Werte anzeigen lassen. Mit dem "Blinker" schaltest Du dann die Ausgabe der Variablen auf die Anzeige um.

Heinz

Nachtrag

if (dht_State == LOW) {

= ist eine Zuweisung

== Ist ein Vergleich

du willst vergleichen

Das ist eine prima Idee, daran hatte ich gar nicht gedacht.
Zum Nachtrag: Autsch, ist wohl mein Lieblingsfehler...
Ich mache gerade ein Überarbeitung und kann den Code dann hier einstellen.

mfg

Frank

Es klappt jetzt!
Vielen Dank an Euch alle!
Ich stelle hier die überarbeitete funktionierende Version ein:

/*
  LiquidCrystal Library - display() and noDisplay()
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD and uses the 
 display() and noDisplay() functions to turn on and off
 the display.
 
 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 22 Nov 2010
 by Tom Igoe

 This example code is in the public domain.

 http://arduino.cc/en/Tutorial/LiquidCrystalDisplay

 */

// include the library code:
#include <LiquidCrystal.h>
#include "DHT.h"

DHT dht0;
DHT dht1;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Variablen
int dht_State = LOW;     // used to set the dht_state
unsigned long previousMillis = 0; // speichere letzte zeit
const long interval = 2000;    // interval des anzeigewechsels
int humidity;
int temperature;

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  dht0.setup(8); //data pin 8
  dht1.setup(9); //data pin 9
  delay(1000);
}

void loop() 
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to change the display; that is, if the 
  // difference between the current time and last time you changed 
  // the display is bigger than the interval at which you want to 
  // change the display.
  unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;  
    
    // if dht0 is active change to dht1 and vice-versa:
    if (dht_State == LOW) {
      dht_State = HIGH;
    } else {
      dht_State = LOW;
   }     
  
  if (dht_State == LOW) {
  delay(dht0.getMinimumSamplingPeriod());
  
  humidity = int(dht0.getHumidity()); // Nachkommastellen abschneiden
  temperature = int(dht0.getTemperature());
  lcd.clear();
  lcd.setCursor(15, 0);
  lcd.print('1'); // Nummer des Sensors
  }
  
  if (dht_State == HIGH) {
    
  delay(dht1.getMinimumSamplingPeriod());
  
  humidity = int(dht1.getHumidity()); // Nachkommastellen abschneiden
  temperature = int(dht1.getTemperature());
  lcd.clear();
  lcd.setCursor(15, 0);
  lcd.print('2'); // Sensornummer
  }
  
  lcd.setCursor(0, 0);
  lcd.print("Temp.:");
  
  lcd.setCursor(0, 1);
  lcd.print("Feuchte:");
  
  lcd.setCursor(9, 0);
  lcd.print(temperature);
  lcd.print(char(223)),lcd.print("C");
  
  lcd.setCursor(9, 1);
  lcd.print(humidity);
  lcd.print("%");
  }
}

Hallo,

schön das es jetzt klapp , danke für die Rückmeldung
Heinz

Hi

Dein 'Lieblingsfehler' wird Dir von der IDE als WARNUNG ausgegeben, wenn Du Diese aktivierst.
In den Einstellungen beide Haken zu Meldungen beim Kompilieren und Hochladen.

MfG

Danke, habe ich gemacht. Warum ist das denn nicht standardmässig aktiv?
Andere Frage: Könnte man das Programm einfacher umsetzen?
Immerhin habe ich 2-mal den gleichen Code für die beiden Sensoren geschrieben.
Wenn ich noch mehr Sensoren hätte würde der Code recht umfangreich...

mfg

Frank

bastler_th:
Danke, habe ich gemacht. Warum ist das denn nicht standardmässig aktiv?
Andere Frage: Könnte man das Programm einfacher umsetzen?
Immerhin habe ich 2-mal den gleichen Code für die beiden Sensoren geschrieben.
Wenn ich noch mehr Sensoren hätte würde der Code recht umfangreich...

mfg

Frank

Das geht in Funktionen die du mit entsprechenden Parametern aufrufst.

Hi

Deine Code-Duplikate werden sich in einer Kleinigkeit unterscheiden - wohl dem benutztem DHT.
Du musst also dem Code-Block diesen Unterschied variable übergeben können - Das kann eine Funktion mit Parametern.

MfG

Hier noch ein Beispielcode zum Aufruf der Funktion.
Nicht getestet, da nur Beispiel:

  if (dht_State == LOW)
    {
      sensor(1);
    }

    if (dht_State == HIGH)
    {
      sensor(2);
    }

    void sensor (int value)
    {
      if (value == 1)
      {
        delay(dht0.getMinimumSamplingPeriod());
        humidity = int(dht0.getHumidity()); // Nachkommastellen abschneiden
        temperature = int(dht0.getTemperature());
      }
      if (value == 2)
      {
        delay(dht1.getMinimumSamplingPeriod());
        humidity = int(dht1.getHumidity()); // Nachkommastellen abschneiden
        temperature = int(dht1.getTemperature());
      }
      lcd.clear();
      lcd.setCursor(15, 0);
      lcd.print(value); // Nummer des Sensors

Musst du noch an deine Gegebenheiten anpassen und geht sicher noch einfacher. :wink:

Danke, werde ich ausprobieren.
Ursprünglich hatte ich an sowas gedacht:

delay(dht(value).getMinimumSamplingPeriod());

wobei in "value" die aktuelle Sensornummer eingesetzt wird. Funktioniert aber
nicht. Dann hätte ich den Codeblock nur einmal schreiben müssen und nur den
Wert von "value" jeweils einsetzen.

Möglicherweise geht das auch irgendwie und ich als Anfänger weiss nur
nicht wie...

mfg

Frank

Ja, man kann da noch einiges vereinfachen.
War ja nur als Beispiel für die Nutzung von Funktionen gedacht.
In deinem Fall kannst du auch über die Nutzung von Arrays nachdenken.

Hallo,

mit

DHT dht0;
DHT dht1;

legst du zwei objekte der Klasse DHT an jeweils mit unterschedlichem Namen

mit

DHT dht[2];

würdest Du ein Array mit 2 Elementen anlegen. die könntest Du dann jeweils über den Index in der [] ansprechen. Damit würde es sich anbieten für die Messwerte selbst auch Arrays zu verwenden.

Also beschäftige dich mit dem Thema Arrays wenn du magst.

Heinz

Tommy Danke für den Hinweis Tippteufel hatte zugeschlagen :slight_smile:

Rentner:

DHT dht[1];

würdest Du ein Array mit 2 Elementen anlegen.

Nö, mit 1 Element.

Gruß Tommy

Tommy56:
Nö, mit 1 Element.

Gruß Tommy

danke für den Hinweis Tippteufel hatte zugeschlagen

Heinz

Danke für die Hinweise. Bin gerade bei einer anderen Sache dran
mit Arrays. Klappt bisher ganz gut. Könnte ich vielleicht in einem eigenen
Thread hochladen falls Interesse besteht.

Übrigens:
Die Temperaturwerte beider Sensoren sind ziemlich identisch, lediglich
die Feuchtewerte liegen etwas auseinander(1-56%; 2-52%).

mfg

Frank

Hallo,

hier meine letzte Variante meines Thermo/Hygrometer Sketches:

vorige Version: 4178 Bytes
letzte Version: 4050 Bytes

es wird besser...

mfg

Frank

/*

  The circuit:
   LCD RS pin to digital pin 12
   LCD Enable pin to digital pin 11
   LCD D4 pin to digital pin 5
   LCD D5 pin to digital pin 4
   LCD D6 pin to digital pin 3
   LCD D7 pin to digital pin 2
   LCD R/W pin to ground
   10K resistor:
   ends to +5V and ground
   wiper to LCD VO pin (pin 3)

   Neue Version meines LCD Sketches
   Zeigt abwechselnd Temperatur/Feuchte von 2 DHT22 Fuehlern
   ohne Nachkommastellen um Platz auf Display zu sparen
*/

// include the library code:
#include <LiquidCrystal.h>
#include "DHT.h"

//DHT Array erstellen
DHT dht[2];

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Variablen
int dht_State = LOW;     // used to set the dht_state
unsigned long previousMillis = 0; // speichere letzte zeit
const long interval = 2000;    // interval des anzeigewechsels
int humidity;
int temperature;
byte sensor;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  dht[0].setup(8); //erster dht pin 8
  dht[1].setup(9); //zweiter dht pin 9
}

void loop()
{
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if dht0 is active change to dht1 and vice-versa:
    if (dht_State == LOW) {
      dht_State = HIGH;
    } else {
      dht_State = LOW;
    }
    if (dht_State == LOW) {
      sensor = 0;
    } else {
      sensor = 1;
    }
    }
    

      delay(dht[sensor].getMinimumSamplingPeriod());
      humidity = int(dht[sensor].getHumidity()); // Nachkommastellen abschneiden
      temperature = int(dht[sensor].getTemperature()); // Nachkommastellen abschneiden

      lcd.setCursor(0, 0);
      lcd.print("Temp.:");

      lcd.setCursor(0, 1);
      lcd.print("Feuchte:");

      lcd.setCursor(9, 0);
      lcd.print(temperature);
      lcd.print(char(223)), lcd.print("C");

      lcd.setCursor(9, 1);
      lcd.print(humidity);
      lcd.print("%");
      lcd.setCursor(15, 0); // Cursor ans Ende der ersten Zeile
      lcd.print(sensor + 1); // Sensornummer anzeigen
  }

Hi

Status als int? Wie viele Status bekommst Du? Bei auch <0 char?
Ok ... boolean würde ebenfalls reichen - hier wäre 1 Byte Ram und wohl 1...2 Byte Flash einsparbar (Du musst ja nicht ein int beschreiben, wenn auch ein byte reicht - nur besteht ein int aus zwei Byte)

Auch könntest Du die Abfrage, Welcher DHT nun dran ist, in eine IF packen, bzw. dht_State einfach nur negieren.

Ob man die Sensor-Nummer (sensor) einsparen kann - also, ob Das dann wirklich spart, müsste man testen.
dht[sensor?1:0]. ...
Hätten wir aber 3x im Sketch und für die Wertzuweisung nur eine IF.

MfG