Suche Code für Seeed OLED (0,96") mit DHT 11 verbinden (Thermostat)

Hallo,
Ich habe schon seit einiger Zeit den Wunsch ein Thermostat zu bauen, also beschloss ich einen DHT11 mit einem OLED Display, beides von Seeed Studio, zu kaufen! Ich stellte jedoch fest, dass es sich hierbei nicht um einen Üblichen SSD1306 handelt sondern um einen SSD1308, der mit keiner der mir bekannten Librarys zusammenarbeitet (also Adafruit, U8glib...). Mit der eigenen Library aus der Wiki funktioniert es zwar, jedoch habe ich noch keinen Weg gefunden eine Temperatur oder einen Wert der von einem Sensor ausgeht, drauf anzuzeigen. Ich habe wirklich schon vieles probiert aber vielleicht könnt ihr ja besser mit der Library arbeiten oder einen anderen Weg finden. Und ich weiß der DHT Sensor ist nicht der Beste, es haben mir auch schon viele gesagt, dass ich einen anderen nehmen soll (im letzten thread waren es mindestens 6 Leute!) ich brauch jedoch keinen großen schnickschnack und will es einfach mit dem erledigen. Die Links findet ihr eigentlich alle bei den passenden Wörtern, wenn das nicht der Fall ist sind hier alle nochmal:

https://github.com/Seeed-Studio/OLED_Display_128X64/archive/master.zip
(ganz nach unten scrollen für wichtige Datein, Librarys etc.)

GitHub - Seeed-Studio/Grove_Temperature_And_Humidity_Sensor: Arduino library for the DHT series temperature&humidity sensors (Library für Sensor)

edit: Es ist ein DHT 11 Sensor

Danke für die Hilfe :slight_smile:

Ok....wenn du Hilfe brauchst, dann zeige uns deinen aktuellen Sketch.
Poste den in Code-Tags, Schaltfläche </> oben links im Editorfenster.

Hallo
Sowohl für den Dht11 22 als auch für das Display gibt es Beispiele.

Eigendlich musst du beide Beispiele geschickt verbinden .

Dazu würde ausgehend von dem Beispiel für das Display die Zeile wo etwas angezeigt wird entsprechend anpassen .

Da wirst du keine Lib finden die das für Dich bereits fertig gemacht hat.

Heinz

Wieso nimmst Du nicht die Library, die Seedstudio auf der Produktseite, die Du verlinkt hast, anbietet?

Grüße Uwe

Hallo,

Zwischen einem DHT11 und ein DHT22 liegen ja schon fast Welten, ich meine damit der DHT11 verwendet ein eigenes Protokoll zum auslesen der andere den I2C Bus.

Ich würde den das auslesen des DHTxx in eine eigene Funktion packen, dann nimmst Du das Beispiel Programm des Displays und da wo die Werte stehen sollen, kommt der Funktionsaufruf hinein. Aber wo sollen die Werte stehen?
Du könntest ja das "Hello World" beispiel nehmen und da einfach mal den Text ändern, das Beispiel ist echt klein, dann nimmst Du dir von irgendwo nen Code für den DHT11 und schmeisst den dazu. Davor solltest Du den DHTxx Code aber standalone testen.

/ende der copy&paste Erklärung. :confused:

Grüße,
Donny

dony:
Zwischen einem DHT11 und ein DHT22 liegen ja schon fast Welten, ich meine damit der DHT11 verwendet ein eigenes Protokoll zum auslesen das andere den I2C Bus.

Dass einer I2C benutzt würde ich als Falschinformation betrachten.

Gruß Tommy

dony:
....
Zwischen einem DHT11 und ein DHT22 liegen ja schon fast Welten, ich meine damit der DHT11 verwendet ein eigenes Protokoll zum auslesen das andere den I2C Bus.
....

Hier liegst du aber falsch.
Der DHT22 verwendet kein I2C-Bus.
Auch hier wird ein Protokoll ähnlich dem DHT11 verwendet.
Dafür kann sogar ein und die selbe Library verwendet werden, wenn man dann die richtige wählt.

Da sich der TO aber nicht dazu äußert, wissen wir immer noch nicht, wo es hin geht.

ok, ich hab kein DHT22 hab aber mal (ver)gelesen das er den Bus verwendet... Danke für die Korrektur.

Grüße,
Donny

HotSystems:
Hier liegst du aber falsch.
Der DHT22 verwendet kein I2C-Bus.
Auch hier wird ein Protokoll ähnlich dem DHT11 verwendet.
Dafür kann sogar ein und die selbe Library verwendet werden, wenn man dann die richtige wählt.

Da sich der TO aber nicht dazu äußert, wissen wir immer noch nicht, wo es hin geht.

Hab jetzt nach geschaut, es ist ein DHT 11 Sensor. Entschuldigt bitte die Verwirrung!

Rentner:
Hallo
Sowohl für den Dht11 22 als auch für das Display gibt es Beispiele.

Eigendlich musst du beide Beispiele geschickt verbinden .

Dazu würde ausgehend von dem Beispiel für das Display die Zeile wo etwas angezeigt wird entsprechend anpassen .

Da wirst du keine Lib finden die das für Dich bereits fertig gemacht hat.

Heinz

Hallo,
Danke für deine Antwort, habe gerade etwas herum experimentiert (mit den Examples) konnte jedoch keine Erfolge verzeichnen, hab noch nen Test gemacht, der Display funktioniert einwandfrei. Ich glaube es liegt an meiner zu kurzen Erfahrung und ich habe kein Plan wie ich diese Libs und Examples zusammensetzen kann, weißt du oder vielleicht jemand anderes wie das funktioniert?
Danke für die Hilfe

Hallo,

Poste doch mal was Du hast und wo Du nicht weiterkommst, bzw. was Du nicht verstehst.

Ich hab leider viel zu selten zeit hier rein zu schauen und will dann nicht noch erst libs downloaden/entpacken/die beispiele anschauen aber anders geht es nicht. Versetze Dich einfach mal in meine (unsere) Lage.

Versuch einfach mal die zwei Teile zusammen zu geben und poste es. Dann hat man was mit dem man arbeiten kann.
Einfach diese Beispiele mit denen Du experementiert hast. :slight_smile:

Grüße,
Donny

dony:
Hallo,

Poste doch mal was Du hast und wo Du nicht weiterkommst, bzw. was Du nicht verstehst.

Ich hab leider viel zu selten zeit hier rein zu schauen und will dann nicht noch erst libs downloaden/entpacken/die beispiele anschauen aber anders geht es nicht. Versetze Dich einfach mal in meine (unsere) Lage.

Versuch einfach mal die zwei Teile zusammen zu geben und poste es. Dann hat man was mit dem man arbeiten kann.
Einfach diese Beispiele mit denen Du experementiert hast. :slight_smile:

Grüße,
Donny

Okay, entschuldigung, hier bitte mein Code, hoffe er kann helfen :slight_smile:

Könnt sein, dass einige unlogische und dumme Fehler dabei sind, hatte nur wenig Zeit und habs ganz schnell zusammen geschrieben :-). Mein größtes Problem ist nämlich wie ich die Temperatur auf den OLED kriege, mit putstring geht es nicht da man dort kein byte + int eingeben kann.
Danke für die Hilfe

#include <SeeedOLED.h>
#include <Wire.h>
#define DHT11_PIN 0

byte read_dht11_dat()
{
   byte i = 0;
   byte result=0;
   for(i=0; i< 8; i++){

       while(!(PINC & _BV(DHT11_PIN)));  
       delayMicroseconds(30);

       if(PINC & _BV(DHT11_PIN))
       result |=(1<<(7-i));
       while((PINC & _BV(DHT11_PIN)));  
   }
   return result;
}
void setup(){
 Wire.begin();
 SeeedOled.init();  

 Serial.begin(9600); // Seriellen Anschluss initialisieren 
 DDRC |= _BV(DHT11_PIN);
   PORTC |= _BV(DHT11_PIN);
}

void loop() {
byte dht11_dat[5];
   byte dht11_in;
   byte i;
   
   PORTC &= ~_BV(DHT11_PIN);
   delay(18);
   PORTC |= _BV(DHT11_PIN);
   delayMicroseconds(40);

   DDRC &= ~_BV(DHT11_PIN);
   delayMicroseconds(40);

   dht11_in = PINC & _BV(DHT11_PIN);

   if(dht11_in){
       Serial.println("dht11 start condition 1 not met");
       return;
   }
   delayMicroseconds(80);

   dht11_in = PINC & _BV(DHT11_PIN);

   if(!dht11_in){
       Serial.println("dht11 start condition 2 not met");
       return;
   }
   delayMicroseconds(80);
   
   for (i=0; i<5; i++)
   dht11_dat[i] = read_dht11_dat();

   DDRC |= _BV(DHT11_PIN);
   PORTC |= _BV(DHT11_PIN);

   byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
   // check check_sum
   if(dht11_dat[4]!= dht11_check_sum)
   {
       Serial.println("DHT11 checksum error");
   }
SeeedOled.clearDisplay();          //clear the screen and set start position to top left corner
 SeeedOled.setNormalDisplay();      //Set display to normal mode (i.e non-inverse mode)
 SeeedOled.setPageMode();           //Set addressing mode to Page Mode
 SeeedOled.setTextXY(0,0);          //Set the cursor to Xth Page, Yth Column  
   SeeedOled.putString("Temperatur = ");
   SeeedOled.putString(dht11_dat[0], DEC);
   SeeedOled.putString(".");
   SeeedOled.putString(dht11_dat[1], DEC);
   SeeedOled.putString("%  ");
  SeeedOled.putString("Temperatur = ");
   SeeedOled.putString(dht11_dat[2], DEC);
   SeeedOled.putString(".");
   SeeedOled.putString(dht11_dat[3], DEC);
   SeeedOled.putString("°C  ");

   delay(2000);
   {

Vielleicht muss ich es mit dem putfloat, "command" machen, hab ich schon öfter gelesen, hier nochmal die Keywords aus der Library:

#######################################
# Syntax Coloring Map For Seeed OLED
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

addressingMode	KEYWORD1
SeeedOled	KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

init	KEYWORD1
setNormalDisplay	KEYWORD1
setInverseDisplay	KEYWORD1
sendCommand	KEYWORD1
setPageMode	KEYWORD1
setHorizontalMode	KEYWORD1
setTextXY	KEYWORD1
clearDisplay	KEYWORD1
setBrightness	KEYWORD1
putChar	KEYWORD1
putString	KEYWORD1
putNumber	KEYWORD1
putFloat	KEYWORD1
drawBitmap	KEYWORD1
chipErase	KEYWORD1
setHorizontalScrollProperties	KEYWORD1
activateScroll	KEYWORD1
deactivateScroll	KEYWORD1


#######################################
# Constants (LITERAL1)
#######################################

Scroll_Left	LITERAL1
Scroll_Right	LITERAL1

Scroll_2Frames	LITERAL1
Scroll_3Frames	LITERAL1
Scroll_4Frames	LITERAL1
Scroll_5Frames	LITERAL1
Scroll_25Frames	LITERAL1
Scroll_64Frames	LITERAL1
Scroll_128Frames	LITERAL1
Scroll_256Frames	LITERAL1

#######################################
# Instances (KEYWORD2)
#######################################

SeeedOLED	KEYWORD2

Ich hab schon wieder was zum meckern. :wink:

Bitte gib den Code in die Code Tags </> (erster Punkt in der Werkzeugleiste), kannst Du auch Nachträglich machen. Ich will Dich damit echt nicht nerven aber so bekommst Du einfach mehr Hilfe. <- ok weißt Du also eh auch. :slight_smile:

Ich hab den Code für Dich mal Formatiert. in der IDE einfach Strg + T.
Also verstehe mich bitte nicht falsch, ich bin mir da echt nicht sicher ob Du überhaupt diese Befehle verstehst?

void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600);
Serial.println("Ready");
}

Zum Display, das Hello World Beispiel dürfte für Deine Bedürfnisse für den Anfang passen. Ich hab noch nie mit dieser lib gearbeitet, als nicht schlagen.

#include <Wire.h>
#include <SeeedOLED.h>

int temperature= 20; 


void setup()
{
  Wire.begin();
  SeeedOled.init();  //initialze SEEED OLED display

  SeeedOled.clearDisplay();          //clear the screen and set start position to top left corner
  SeeedOled.setNormalDisplay();      //Set display to normal mode (i.e non-inverse mode)
  SeeedOled.setPageMode();           //Set addressing mode to Page Mode
  SeeedOled.setTextXY(0,0);          //Set the cursor to Xth Page, Yth Column  
  //SeeedOled.putString("Hello World!"); //Print the String <-!!!!!

}
// Die loop ist im Beispiel leer
void loop()
{
  SeeedOled.setTextXY(0,0);
// Wie man den alten Text raus bekommt weiß ich nicht, wie gesagt hatte noch nie mit der lib zu tun aber ein Rechteck tut es zB. 
  SeeedOled.putString(temperature); // Zeigt den Wert

  SeeedOled.setTextXY(40,0); // <- Damit musst Du dich selber rumspielen
  SeeedOled.putString("Grad"); //Print the String

  delay(1000); // Die sollte man normalerweise weglassen aber um das Display nicht unter dauerbeschuss zu setzten füg ich es mal ein.
  temperature= 25; // Und man kann ein Veränderung veranschaulichen.
  
  
}

So das müsste jetzt 20 Grad anzeigen und nach 1 Sekunde 25 Grad. Die zweite Zeile schaffst Du selber?

Zu Deinem Edit: Ich glaube nicht das Du das brauchst, Du hast ja 2 Beispiel Codes die funktionieren, also nimm Dir den ersten Code vor und verstehe ihn, dann den zweiten und dann ist es relativ einfach die beiden zusammenzuführen. Einen Ansatz hast Du ja jetzt. Wenn Du vordefinierte Variablen am Display anzeigen kannst ist die Hälfte gemacht.

Grüße,
Donny
PS: Fang doch mit was leichten an, sprich: Lerne erstmal die Grundlagen. :slight_smile:

Edit: Dreh doch mal den letzten '{' um, also '}'.

dony:
Ich hab schon wieder was zum meckern. :wink:

Bitte gib den Code in die Code Tags </> (erster Punkt in der Werkzeugleiste), kannst Du auch Nachträglich machen. Ich will Dich damit echt nicht nerven aber so bekommst Du einfach mehr Hilfe. <- ok weißt Du also eh auch. :slight_smile:

Ich hab den Code für Dich mal Formatiert. in der IDE einfach Strg + T.
Also verstehe mich bitte nicht falsch, ich bin mir da echt nicht sicher ob Du überhaupt diese Befehle verstehst?

void setup()

{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600);
Serial.println("Ready");
}




Zum Display, das Hello World Beispiel dürfte für Deine Bedürfnisse für den Anfang passen. Ich hab noch nie mit dieser lib gearbeitet, als nicht schlagen.


#include <Wire.h>
#include <SeeedOLED.h>

int temperature= 20;

void setup()
{
  Wire.begin();
  SeeedOled.init();  //initialze SEEED OLED display

SeeedOled.clearDisplay();          //clear the screen and set start position to top left corner
  SeeedOled.setNormalDisplay();      //Set display to normal mode (i.e non-inverse mode)
  SeeedOled.setPageMode();          //Set addressing mode to Page Mode
  SeeedOled.setTextXY(0,0);          //Set the cursor to Xth Page, Yth Column 
  //SeeedOled.putString("Hello World!"); //Print the String <-!!!!!

}
// Die loop ist im Beispiel leer
void loop()
{
  SeeedOled.setTextXY(0,0);
// Wie man den alten Text raus bekommt weiß ich nicht, wie gesagt hatte noch nie mit der lib zu tun aber ein Rechteck tut es zB.
  SeeedOled.putString(temperature); // Zeigt den Wert

SeeedOled.setTextXY(40,0); // <- Damit musst Du dich selber rumspielen
  SeeedOled.putString("Grad"); //Print the String

delay(1000); // Die sollte man normalerweise weglassen aber um das Display nicht unter dauerbeschuss zu setzten füg ich es mal ein.
  temperature= 25; // Und man kann ein Veränderung veranschaulichen.
 
 
}



So das müsste jetzt 20 Grad anzeigen und nach 1 Sekunde 25 Grad. Die zweite Zeile schaffst Du selber? 

Zu Deinem Edit: Ich glaube nicht das Du das brauchst, Du hast ja 2 Beispiel Codes die funktionieren, also nimm Dir den ersten Code vor und verstehe ihn, dann den zweiten und dann ist es relativ einfach die beiden zusammenzuführen. Einen Ansatz hast Du ja jetzt. Wenn Du vordefinierte Variablen am Display anzeigen kannst ist die Hälfte gemacht.

Grüße,
Donny
PS: Fang doch mit was leichten an, sprich: Lerne erstmal die Grundlagen. :) 

Edit: Dreh doch mal den letzten '{' um, also '}'.

Haha, habs mir gedacht, danke für deine Hilfe und ich verstehe den Command wirklich nicht (also diesen Teil: DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);), hab ihn aus einem Example, ich arbeite jetzt zwar schon länger mit dem Arduino, aber noch nie so richtig mit Displays und Sensoren deswegen ist das alles sehr komisch für mich XD, danke für die Hilfe

Grooxy:
Haha, habs mir gedacht, danke für deine Hilfe und ich verstehe den Command wirklich nicht, hab ihn aus einem Example, ich arbeite jetzt zwar schon länger mit dem Arduino, aber noch nie so richtig mit Displays und Sensoren deswegen ist das alles sehr komisch für mich XD, danke für die Hilfe

:slight_smile: Passt schon aber Du sollst ja was lernen, schau mal, hier gibts einen Code für das DHT11 (ohne der lib) in beiden Version.

Ich glaub da hast Du jetzt eh einiges zum lesen und üben!? Was das Display angeht, kann ich mich auch nur an den Beispielen orientieren ausser ich setzte mich wirklich damit auseinander.

Grüße,
Donny
Nachtrag: Du kannst auch die lib verwenden die Du gepostet hast, der code ist ja nun wirklich nicht schwer.
-> Serial.print....