Mehrere DHT an einem Arduino

Hallo

Wie ist es möglich mehrere DHT22 Sensoren auszulesen und diese an einem TFT anzuzeigen.

Ist dies überhaupt möglich bisher habe ich nur Sketch gefunden für die Anzeige eines Sensors.

Genutzt wird ein MEGA und ein HY-1.8 SPI Display und 3 DHT22

Hat jemand erfahrung mit der maximalen Leitungslänge des DHT ich habe ca. 40m zu überbrücken.

Grundlage für den Sketch wollte ich diesen verwenden.

Muss aber noch gleich dazu sagen das ich noch blutiger Anfänger bin

// DHT11, TinyRTC (DS1307) und 1.8 Zoll TFT-Farb-Display (HY-1.8 SPI)

#include "Adafruit_GFX.h"    // Adafruit Grafik-Bibliothek
#include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek
#include <SPI.h>

#include <Wire.h>
#


#include <DHT.h>
#define DHTPIN 4         // Zur Messung verwendeter Pin, in unserem Fall also Pin 4
#define DHTTYPE DHT22    // DHT 22

// TFT-Display
#define CS   10 // Arduino-Pin an Display CS   
#define DC   9  // Arduino-Pin an Display A0
#define RST  8  // Arduino Reset-Pin

Adafruit_ST7735 tft = Adafruit_ST7735(CS, DC, RST);  // Display-Bibliothek Setup



DHT dht(DHTPIN, DHTTYPE);  // Initialisieren des DHTs




void setup(void) {
  
  dht.begin();  // DHT starten
  
  // Display
  tft.initR(INITR_BLACKTAB);     // ST7735-Chip initialisieren
  
  display_show();
}


float temp=1000;
float hum=1000;
float min_temp=1000;
float max_temp=-1000;
float min_humidity=1000;
float max_humidity=-1000;

int tempct=0;

void loop() {

  
  float t;
  if(tempct%2==0)t=dht.readTemperature();
  else t=bmp.readTemperature();
  if(isnan(t)){}
  else if((int)t!=(int)temp){
   show_temp(temp,true);
   temp=t;
   if(min_temp>temp)min_temp=temp;
   if(max_temp<temp)max_temp=temp;
   show_temp(temp,false);
  }
  tempct++;
  
  float h = dht.readHumidity();
  if(isnan(h)){}
  else if(h!=hum){
   show_hum(hum,true);
   hum=h;
   if(min_humidity>hum)min_humidity=hum;
   if(max_humidity<hum)max_humidity=hum;
   show_hum(hum,false);
  }
  
  
  delay(10000);  
 
}

void show_temp(float temp,boolean clear){
  
  int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE;
  int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK;
  
  byte xs=10;
  byte ys=36;
  String htemp=String((int)temp);
  //byte xss=(temp<10?:temp
  
  set_text(xs,ys,htemp,clear?clearcolor:textcolor,3);
  set_text(xs+(3*htemp.length()*8),ys,"",(clear?clearcolor:textcolor),2);
  tft.write(247); // das °-Zeichen  
  tft.print("C");
  set_text(xs+81,ys+1,String((int)max_temp),clear?clearcolor:ST7735_RED,1);
  tft.write(247);tft.print("C");
  set_text(xs+81,ys+11,String((int)min_temp),clear?clearcolor:ST7735_BLUE,1);
  tft.write(247);tft.print("C");
}

void show_hum(float hum,boolean clear){

  int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE;
  int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK;

  byte xs=12;
  byte ys=96;
  
  set_text(xs,ys,String((int)hum)+"%",clear?clearcolor:textcolor,3);
  set_text(xs+81,ys+1,String((int)max_humidity)+"%",clear?clearcolor:ST7735_GREEN,1);
  set_text(xs+81,ys+11,String((int)min_humidity)+"%",clear?clearcolor:ST7735_YELLOW,1);
}

DANKE

falls ihr einen Tipp für mich habt

Grüße der Arne

Poste einen Link auf die DHT-Bibliothek, die Du verwenden willst. Es gibt einige, die praktisch gleich heissen, aber unterschiedlich aufgebaut sind. Normalerweise sollte es keine Probleme machen, mehrere Sensoren zu verwenden.
40m Distanz dürften hingegen Probleme bereiten. Mit hochwertigen Kabeln könntest Du Erfolg haben, ich würde hingegen einen ATtiny zum Sensor gesellen und RS485 als Verbindung nutzen.

Hallo

nutzten wollte ich die Lib von http://nethoncho.com/arduino/DHT22/DHT22-04.zip

Wenn du meinst ich sollte einen ATtiny noch dazu setzten hört es leider mit meiner Erfahrung auf und dann brauche ich wesentlich mehr Hilfe.

Derzeitig werden bei uns CAT6 Kabel verlegt welches ich nutzten wollte.

Grüße der Arne

Die Bibliothek sollte problemlos in der Lage sein, mehrere DHTs anzusprechen.

Du kannst es mit den CAT6-Kabeln versuchen, ich hätte gesagt, so 20m könnten drin liegen, aber unter guten Umständen könnte das übertroffen werden. Wenn es nicht klappt, meldest Du Dich im Forum wieder und wir versuchen das mit den Tiny-Satelliten.

Okay Danke

aber wie unterscheide ich die verschiedenen DHT´s und bringe ihre Werte geordnet zur Anzeige?

GRüße der Arne

Der_Arne:
...
aber wie unterscheide ich die verschiedenen DHT´s und bringe ihre Werte geordnet zur Anzeige?
...

Pro Pin hast du ja nur einen DHT, da dieser keine Adresse o.ä. hat.

Sollte doch so gehen:

#define DHTPIN 4 
#define DHTPIN 5
#define DHTPIN 6
DHT1 dht(DHT1PIN, DHTTYPE);  // Initialisieren des DHTs
DHT2 dht(DHT2PIN, DHTTYPE);  // Initialisieren des DHTs
DHT3 dht(DHT3PIN, DHTTYPE);  // Initialisieren des DHTs

Hallo,

ich fürchte, mit den drei aufeinanderfolgenden "#define DHTPIN" weist Du ein und derselben Variablen DHTPIN nur nacheinander die Werte 4,5 und 6 zu, also entspricht DHTPIN dem Wert 6 zum Schluss.

Ich würde es wie folgt versuchen:

#define DHTPIN1 4
#define DHTPIN2 5
#define DHTPIN3 6

das passt dann auch zu den nachfolgenden Anweisungen.

Gruss
Manfred

ManfredH:
ich fürchte, mit den drei aufeinanderfolgenden "#define DHTPIN" weist Du ein und derselben Variablen DHTPIN nur nacheinander die Werte 4,5 und 6 zu, also entspricht DHTPIN dem Wert 6 zum Schluss.

Gut aufgepasst, ich denke da hat mde110 einfach nur die Ziffern 1 bis 3 vergessen. Beim Initialisieren sind sie ja immerhin vorhanden (DHT1PIN, DHT2PIN und DHT3PIN).

Ups :blush:
In der schnelle echt vergessen...
Danke für die Korrektur!

@sth77,
das seh ich ebenso :slight_smile:
bei Copy-Paste die Nummerierung vergessen.

Hallo

Danke für die Tipps

ich habe versucht dies mal umzusetzen komme aber wieder nicht weiter :relaxed:

Eigentlich werden doch die DHT´s per #define DHTTYPE DHT22  // DHT 22 als DHT 22 definiert ..... sprich alle DHT sind nun DHT22

nächster Schritt ist die DHT´s einen "Namen" zu geben und zu aktivieren

DHT dht1(DHT1PIN, DHTTYPE);  // Initialisieren des DHTs
DHT dht2(DHT2PIN, DHTTYPE);
DHT dht3(DHT3PIN, DHTTYPE);

Jetzt kann ich den DHT1 (DHT1PIN 5) per t1=dht1.readTermerature auslesen und auf dem Display per   set_text(xs,ys,t1,clear?clearcolor:textcolor,3); anzeigen lassen

oder bin ich da auf dem großen Holzweg?

So habe ich es erstmal geschrieben für das Auslesen von zwei Sensoren der dritte würde sich ja "automatisch" ergeben wenn alles okay ist

// DHT11, TinyRTC (DS1307) und 1.8 Zoll TFT-Farb-Display (HY-1.8 SPI)

#include "Adafruit_GFX.h"    // Adafruit Grafik-Bibliothek
#include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek
#include <SPI.h>

#include <Wire.h>



#include <DHT.h>
#define DHT1PIN 4         // Zur Messung verwendeter Pin 4
#define DHT2PIN 5        // Zur Messung verwendeter Pin 5
#define DHT3PIN 6          // Zur Messung verwendeter Pin 6
#define DHTTYPE DHT22  // DHT 22


// TFT-Display
#define CS   10 // Arduino-Pin an Display CS   
#define DC   9  // Arduino-Pin an Display A0
#define RST  8  // Arduino Reset-Pin

Adafruit_ST7735 tft = Adafruit_ST7735(CS, DC, RST);  // Display-Bibliothek Setup





DHT dht1(DHT1PIN, DHTTYPE);  // Initialisieren des DHTs
DHT dht2(DHT2PIN, DHTTYPE);
DHT dht3(DHT3PIN, DHTTYPE);
boolean night_mode=true;

void setup(void) {
  
  // Display
  tft.initR(INITR_BLACKTAB);     // ST7735-Chip initialisieren
  
  display_show();
}



int tempct=0;

void loop() {

  float t1;
  t1=dht1.readTemperature();

  if(isnan(t1)){}
  else if((int)t!=(int)temp1){
   show_temp1(temp1,true);
   temp=t1;
   show_temp1(temp1,false);
  }
  {

  float t2;
  t1=dht2.readTemperature();

  if(isnan(t2)){}
  else if((int)t!=(int)temp2){
   show_temp2(temp2,true);
   temp2=t2;
   show_temp2(temp2,false);
  }
  tempct++;
  
}

void show_temp1(float temp1,boolean clear){
  
  int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE;
  int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK;
  
  byte xs=12;
  byte ys=66;
  String htemp=String((int)temp);
  //byte xss=(temp<10?:temp
  
  set_text(xs,ys,t1,clear?clearcolor:textcolor,3);
  set_text(xs+(3*htemp.length()*8),ys,"",(clear?clearcolor:textcolor),2);
  tft.write(247);                                                             // das °-Zeichen  
  tft.print("C");                                                             // "C" Zeichen

void show_temp2(float temp,boolean clear){
  
  int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE;
  int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK;
  
  byte xs=12;
  byte ys=66;
  String htemp=String((int)temp2);
  //byte xss=(temp<10?:temp
  
  set_text(xs+20,ys,t2,clear?clearcolor:textcolor,3);
  set_text(xs+(3*htemp.length()*8),ys,"",(clear?clearcolor:textcolor),2);
  tft.write(247);                                                             // das °-Zeichen  
  tft.print("C");                                                             // "C" Zeichen

 }

Auch wenn dies ein bescheidender Anfang für mich ist eure Tipps haben mich doch schon gut weiter gebracht und ich habe ein paar Sachen gelöscht aus dem altem Sketch den ich kopiert hatte.

Grüße der Arne

SIeht doch mal recht gut aus.
Bloß, mache nicht den selben Fehler wie ich!

t1=dht2.readTemperature();
muss
t2=dht2.readTemperature();
sein!

und
else if((int)t!=(int)temp2){
muss
else if((int)t2!=(int)temp2){

temp1 und temp2 müssen definiert werden!

Ich persönlich würde es aber so machen:

void loop() {
  float fltTemp;

  fltTemp=dht1.readTemperature();

  if(isnan(fltTemp)){}
  else if((int)fltTemp!=(int)temp1){
   show_temp1(temp1,true);
   temp=fltTemp;
   show_temp1(temp1,false);
  }
  {

  fltTemp=dht2.readTemperature();

  if(isnan(fltTemp)){}
  else if((int)fltTemp!=(int)temp2){
   show_temp2(temp2,true);
   temp2=fltTemp;
   show_temp2(temp2,false);
  }
  tempct++;
  
}

Das dürfte fürs erste Mal genug sein...

Das typecasting von float auf int habe ich noch nicht gesehen. Was kommt dabei raus???

Hallo mde110

Ich habe das ganze ja auch nur kopiert und versuche es nun auf meine Anforderungen anzupassen.

Ich kann dir nicht sagen wo der Unterschied ist

Ich verzweifle nun langsam doch etwas...

Ich komme zwar Schritt für Schritt weiter aber das sind sehr kleine Schritte und die Fehlermeldungen kann ich mir teilweise nicht erklären bzw. ich verstehe sie nicht.

Gibt es noch eine andere Möglichkeit die verschiedenen Werte auf dem Display anzeigen zulassen?

Währe ja schon froh wenn ich zwei Verschieden Werte schaffe.

Grüße der Arne

So hier nochmal mein neuer Versuch

erstmal nur damit ich die einzelnen Werte auslesen kann und ihnen ein Variable zu geben aber hier stockt es auch wieder....

// DHT11 und 1.8 Zoll TFT-Farb-Display (HY-1.8 SPI)

#include "Adafruit_GFX.h"    // Adafruit Grafik-Bibliothek
#include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek
#include <SPI.h>
#include <Wire.h>
#include <DHT22.h>

#define DHT1PIN 4         // Zur Messung verwendeter Pin 4
#define DHT2PIN 5        // Zur Messung verwendeter Pin 5
#define DHT3PIN 6          // Zur Messung verwendeter Pin 6
#define DHTTYPE DHT22  // DHT 22


// TFT-Display
#define CS   10 // Arduino-Pin an Display CS   
#define DC   9  // Arduino-Pin an Display A0
#define RST  8  // Arduino Reset-Pin

Adafruit_ST7735 tft = Adafruit_ST7735(CS, DC, RST);  // Display-Bibliothek Setup





DHT dht1(DHT1PIN, DHTTYPE);  // Initialisieren des DHTs
DHT dht2(DHT2PIN, DHTTYPE);
DHT dht3(DHT3PIN, DHTTYPE);
boolean night_mode=true;

void setup(void) {
  
  // Display
  tft.initR(INITR_BLACKTAB);     // ST7735-Chip initialisieren
  

}
void loop() {
          // DHTs auslesen
  float t1 = dht1.readTemperatur();  // Temperatur DHT #1
  float t2 = dht2.readTemperatur();  // Temperatur DHT #2
  float t3 = dht3.readTemperatur();  // Temperatur DHT #3
  
  float h1 = dht1.readHumidity();  // Luftfeuchte DHT #1
  float h2 = dht2.readHumidity();  // Luftfeuchte DHT #2
  float h3 = dht3.readHumidity();  // Luftfeuchte DHT #3

Das ganze kann doch nicht so schwer sein...

Bitte ganzen Sketch und ich schau mir dann auch mal die Meldungen an.
Das Display geht komplett?
Nur das Auslesen der DHTs mach Probleme?

Hallo mal wieder

so ich habe ein paar Fehler gefunden und diese nun Berichtigt hier nun der neue Code

// DHT11 und 1.8 Zoll TFT-Farb-Display (HY-1.8 SPI)

#include "Adafruit_GFX.h"    // Adafruit Grafik-Bibliothek
#include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek
#include <SPI.h>
#include <Wire.h>
#include <DHT22.h>

#define DHT1PIN 4         // Zur Messung verwendeter Pin 4
#define DHT2PIN 5        // Zur Messung verwendeter Pin 5
#define DHT3PIN 6          // Zur Messung verwendeter Pin 6
#define DHTTYPE DHT22  // DHT 22


// TFT-Display
#define CS   10 // Arduino-Pin an Display CS   
#define DC   9  // Arduino-Pin an Display A0
#define RST  8  // Arduino Reset-Pin

Adafruit_ST7735 tft = Adafruit_ST7735(CS, DC, RST);  // Display-Bibliothek Setup





DHT22 dht1(DHT1PIN, DHTTYPE);  // Initialisieren des DHTs
DHT22 dht2(DHT2PIN, DHTTYPE);
DHT22 dht3(DHT3PIN, DHTTYPE);
boolean night_mode=true;

void setup(void) {
  
  // Display
  tft.initR(INITR_BLACKTAB);     // ST7735-Chip initialisieren
  
// DHT
dht.begin();
}
void loop() {
          // DHTs auslesen
  float t1 = dht1.getTemperatureC();  // Temperatur DHT #1
  float t2 = dht2.getTemperatureC();  // Temperatur DHT #2
  float t3 = dht3.getTemperatureC();  // Temperatur DHT #3
  
  float h1 = dht1.getHumidity();  // Luftfeuchte DHT #1
  float h2 = dht2.getHumidity();  // Luftfeuchte DHT #2
  float h3 = dht3.getHumidity();  // Luftfeuchte DHT #3

nun bekomme ich aber die Fehlermeldungen

DHT_test_222:27: error: expected primary-expression before ')' token
DHT_test_222:28: error: expected primary-expression before ')' token
DHT_test_222:29: error: expected primary-expression before ')' token
DHT_test_222.cpp: In function 'void setup()':
DHT_test_222:38: error: 'dht' was not declared in this scope
DHT_test_222.cpp: In function 'void loop()':
DHT_test_222.cpp:46: warning: unused variable 't1'
DHT_test_222.cpp:47: warning: unused variable 't2'
DHT_test_222.cpp:48: warning: unused variable 't3'
DHT_test_222.cpp:50: warning: unused variable 'h1'
DHT_test_222.cpp:51: warning: unused variable 'h2'
DHT_test_222.cpp:52: warning: unused variable 'h3'

Das mit den unused variable ist klar aber der Rest verwirt mich

Grüße der Arne

dht.begin();
in
dht1.begin();
dht2.begin();
dht3.begin();

Am Ende der LOOP fehlt die }

Welche Lib verwendest du? Bitte Link!
In die LOOP sollte noch ein delay von ca. 1 Sekunde.
Mach ne Serielle Ausgabe der Werte. Und Poste das Ergebnis+Code.

Du verwendest ganz offensichtlich nicht die Bibliothek, die Du verlinkt hast. Bitte poste einen Link auf die Bibliothek, die Du wirklich verwendest.

Hallo

nochmal danke für die Hilfe und Geduld.

Ich habe alle Libs mit DHT nochmal entfernt und die von meinem Link installiert. Anschließend habe ich noch ein paar Änderungen vorgenommen
das Sketch sieht grade noch etwas wild aus.
Ich habe versucht die Seriale Ausgabe umzusetzen bekomme aber noch eine Fehlermeldung

Hier der WILDE Sketch mit ein paar, Ich habe die alten Daten für das Display noch drin, diese habe ich aber noch nicht getestet da das Display grade fehlt und ich erst an einer Stelle anfangen wollte und nicht gleich fünf Baustellen aufreißen. Ich habe die Variablen für das Display auch noch nicht geändert

// DHT11 und 1.8 Zoll TFT-Farb-Display (HY-1.8 SPI)

#include "Adafruit_GFX.h"    // Adafruit Grafik-Bibliothek
#include "Adafruit_ST7735.h" // Adafruit ST7735-Bibliothek
#include <SPI.h>
#include <Wire.h>
#include <DHT22.h>

#define DHT1_PIN 4         // Zur Messung verwendeter Pin 4
#define DHT2_PIN 5        // Zur Messung verwendeter Pin 5
#define DHT3_PIN 6          // Zur Messung verwendeter Pin 6



// TFT-Display
#define CS   10 // Arduino-Pin an Display CS   
#define DC   9  // Arduino-Pin an Display A0
#define RST  8  // Arduino Reset-Pin

Adafruit_ST7735 tft = Adafruit_ST7735(CS, DC, RST);  // Display-Bibliothek Setup





DHT22 dht1(DHT1_PIN);  // Initialisieren des DHTs
DHT22 dht2(DHT2_PIN);
DHT22 dht3(DHT3_PIN);
boolean night_mode=true;

void setup(void) {
 

  Serial.begin(9600);

  // Display
  tft.initR(INITR_BLACKTAB);     // ST7735-Chip initialisieren
  
// DHT

}
void loop() {
   
  delay(1000);

}
{
  Serial.print(dht1.getTemperatureC());
  Serial.println(C);
  Serial.print(dht2.getTemperatureC())
  Serial.println(C);
  Serial.print(dht3.getTemperatureC())
  Serial.println(C);
  Serial.print(dht1.getHumidity());
  Serial.println(%);
  Serial.print(dht2.getHumidity());
  Serial.println(%);
  Serial.print(dht3.getHumidity());
  Serial.println(%);
}
/*  
}

void show_t1(float t1,boolean clear){
   // Werte anzeigen lassen
 
   
  int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE;
  int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK;
  
  byte xs=12;
  byte ys=66;
  String htemp=String((int)temp);
  
  
  set_text(xs,ys,t1,clear?clearcolor:textcolor,3);
  set_text(xs+(3*htemp.length()*8),ys,"",(clear?clearcolor:textcolor),2);
  tft.write(247);                                                             // das °-Zeichen  
  tft.print("C");                                                             // "C" Zeichen

void show_t2(float temp,boolean clear){
  
  int clearcolor=night_mode?ST7735_BLACK:ST7735_WHITE;
  int textcolor=night_mode?ST7735_WHITE:ST7735_BLACK;
  
  byte xs=12;
  byte ys=66;
  String htemp=String((int)temp2);
  //byte xss=(temp<10?:temp
  
  set_text(xs+20,ys,t2,clear?clearcolor:textcolor,3);
  set_text(xs+(3*htemp.length()*8),ys,"",(clear?clearcolor:textcolor),2);
  tft.write(247);                                                             // das °-Zeichen  
  tft.print("C");                                                             // "C" Zeichen

 }*/

Danke nochmal für die Geduld

Achso ganz vergessen hier die Fehlermeldung

DHT_test_222:46: error: expected unqualified-id before '{' token