Go Down

Topic: Mehrere DHT an einem Arduino (Read 21816 times) previous topic - next topic

Der_Arne

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

Code: [Select]
// 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

pylon

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.

Der_Arne

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

pylon

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.

Der_Arne

Okay Danke


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

GRüße der Arne

Mardetuino


...
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:
Code: [Select]

#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

Zuse

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:
Code: [Select]

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


das passt dann auch zu den nachfolgenden Anweisungen.

Gruss
Manfred

sth77


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).
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

Mardetuino

Ups  :smiley-red:
In der schnelle echt vergessen...
Danke für die Korrektur!

Zuse

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

Der_Arne

Hallo

Danke für die Tipps

ich habe versucht dies mal umzusetzen komme aber wieder nicht weiter  :smiley-slim:

Eigentlich werden doch die DHT´s per
Code: [Select]
#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
Code: [Select]
DHT dht1(DHT1PIN, DHTTYPE);  // Initialisieren des DHTs
DHT dht2(DHT2PIN, DHTTYPE);
DHT dht3(DHT3PIN, DHTTYPE);



Jetzt kann ich den DHT1 (DHT1PIN 5)  per
Code: [Select]
t1=dht1.readTermerature auslesen und auf dem Display per
Code: [Select]
  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

Code: [Select]
// 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

Mardetuino

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:
Code: [Select]
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???

Der_Arne

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

Der_Arne

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

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....


Code: [Select]


// 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...

Go Up