dht 11

hallo ik heb problemen met dht 11 sensors.
als ik een Wemos met een oled scherm een temperatuur waarde van een dht wil weergeven, krijg ik de waarde nan. dit betekend not a number.
als ik een dht aansluit op een nano en serieel uitlees krijg ik mooi de temperatuur te zien?
ik heb vanalles geprobeerd maar niks lukt .
wie weet wat er fout of niet goed gaat?

fzwart

Golden Member

Misschien een pull-up weerstand nodig?

Al is een spreekwoord nog zo raar, als het rijmt dan is 't waar

Zoiets heb ik ook eens gehad, was een sensor te dicht (enkele mm's) bij de ESP01 antenne geplaatst.

Sine

Moderator

wie weet wat er fout of niet goed gaat?

Daar kan heel veel fout, en niet op de laatste plaats de software. Weet je zeker dat dat goed is?

Arco

Special Member

krijg ik de waarde nan. dit betekend not a number.

Is het misschien een string?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

dit is een sketch als test die ik gebruik

code:


// dit is de test met een nano
//  SDA -> A4
//  SCL -> A5

//#include <Arduino.h>
#include <U8g2lib.h>
//#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);


#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
uint8_t DHTPIN = 3; 
//#define DHTPIN 3   
#define DHTTYPE    DHT11     // DHT 11
//#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)
DHT_Unified dht(DHTPIN, DHTTYPE);

uint32_t delayMS;

void setup() {
  
  Serial.begin(9600);
  u8g2.begin();
  dht.begin();
  sensor_t sensor;
}

void loop() {
  u8g2.clearBuffer(); 
  delay(delayMS);
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  else {
    Serial.print(F("Temperature: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Error reading humidity!"));
  }
  else {
    Serial.print(F("Humidity: "));
    Serial.print(event.relative_humidity);
    Serial.println(F("%"));
  }
  u8g2.drawStr(10, 12, "HALLO"); 
  u8g2.drawStr(10, 30, "temp"); 
  u8g2.setCursor(60,30);
  u8g2.print(event.temperature );
  u8g2.sendBuffer();
  delay(3000);
}

[Bericht gewijzigd door GJ_ op 31 juli 2023 13:51:10 (0%)

het maakt niet uit welke voorbeeld sketch ik gebruik ik krijg altijd nan? deze werkt ook niet?

code:


#include "DHT.h"
#define DHT11Pin 4
#define DHTType DHT11
//OLED
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

DHT HT(DHT11Pin,DHTType);
float humi;
float tempC;
float tempF;

//OLED define
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(9600);
  //For DHT11
  HT.begin();
  //For OLED I2C
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  display.display(); //Display logo
  delay(1000); 
  display.clearDisplay();
}

void loop() {
 delay(1000);
 humi = HT.readHumidity();
 tempC = HT.readTemperature();
 tempF = HT.readTemperature(true);

 Serial.print("Humidity:");
 Serial.print(humi,0);
 Serial.print("%");
 Serial.print(" Temperature:");
 Serial.print(tempC,1);
 Serial.print("C ~ ");
 Serial.print(tempF,1);
 Serial.println("F");

 display.clearDisplay();
 oledDisplayHeader();
 

 oledDisplay(3,5,28,humi,"%");
 oledDisplay(2,70,16,tempC,"C");
 oledDisplay(2,70,44,tempF,"F");
 
 display.display(); 
 
}
void oledDisplayHeader(){
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0, 0);
 display.print("Humidity");
 display.setCursor(60, 0);
 display.print("Temperature");
}
void oledDisplay(int size, int x,int y, float value, String unit){
 int charLen=12;
 int xo=x+charLen*3.2;
 int xunit=x+charLen*3.6;
 int xval = x; 
 display.setTextSize(size);
 display.setTextColor(WHITE);
 
 if (unit=="%"){
   display.setCursor(x, y);
   display.print(value,0);
   display.print(unit);
 } else {
   if (value>99){
    xval=x;
   } else {
    xval=x+charLen;
   }
   display.setCursor(xval, y);
   display.print(value,0);
   display.drawCircle(xo, y+2, 2, WHITE);  // print degree symbols (  )
   display.setCursor(xunit, y);
   display.print(unit);
 }
}

[Bericht gewijzigd door GJ_ op 31 juli 2023 13:51:33 (0%)

Die eerste probeert te checken op "nan" en print als dat door de "driver" als temperatuur gegeven wordt te printen: "Error reading temperature".

Kennelijk werkt de check op isnan() niet goed. Maar de interpretatie moet hetzelfde zijn: Er is wat misgegaan bij het lezen van de sensor.

Kortom, de driver vind dat er iets niet klopt met wat er terugkomt. Of er komt helemaal niets terug.

Omdat jij de sourcode van de driver ook ergens hebt, kan je kijken in wat voor gevallen hij dat "return NAN" doet.

De DHT11 is ook simpel genoeg om "even" zelf een drivertje te maken. Dan heb je meer controle en kan je de boel makkelijk debuggen.

Jij stuurt een pulse (laag) van 18 ms. De DHT reageert dan met 40 pulsjes van ofwel iets minder dan 30µs ofwel ongeveer 70µs. Als het pulsje kort is bedoelt hij een "0" en als ie lang is bedoelt ie een "1". En als eerste debug kan je ze gewoon printen. (niet gaan printen voordat je ze alle 40 hebt: Dat printen duurt (soms) langer dan de resterende 39 bitjes!)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
marcob

Golden Member

In de eerste sketch zit de DTH11 op pin 3 en in de tweede op pin 4, dat gaat natuurlijk niet werken. Weet je zeker dat je de juiste pin gebruikt op de Wemos?

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Kan ook wel aan welke DHT11 die je hebt liggen. Blijkbaar zijn er veel verschillende specs in omloop.
Sommige hebben een minimale voeding van 3.5V nodig, andere werken dan weer wel op 3.3V, er zijn er zelfs bij die op 3V werken.
Aangezien je Wemos op 3.3V draait, misschien iets om in de gaten te houden.

In de code van DHT.c staan behoorlijk wat debug statements. Als je zorgt dat #DEBUG defined is, dan zou je wat meer info moeten krijgen over het probleem.

ik kom er niet aan uit dus nog eens van het begin geprobeerd met een nano en een oled scherm, dit werkt. dan heb ik met een nano en dht de waarde serieel laten weg schrijven dit werkt ook .
maar als ik de twee samen voeg werkt het niet meer en krijg ik de melding dat er weinig geheugen beschikbaar is ?
gebruik het volgende programma:

c code:


//  SDA -> A4
//  SCL -> A5
// ik gebruik DHT sensor library en de DHTtester 

#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
uint32_t delayMS;
#include "DHT.h"
#define DHTPIN 2    
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTstart");
  dht.begin();
  u8g2.begin();
  pinMode(6, OUTPUT);
  pinMode(8, OUTPUT);
  digitalWrite(6, LOW);
  digitalWrite(8, HIGH);
}

void loop() {
  digitalWrite(8, HIGH);
  u8g2.clearBuffer(); 
  delay(delayMS);
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

kan iemand mij uitleggen wat er fout gaat? en wat ik moet doen om het werkend te krijgen.
het lijkt toch niet zo'n groot programma!

[Bericht gewijzigd door GJ_ op 31 juli 2023 13:52:42 (0%)

Tja, als je de melding krijgt dat er te weinig geheugen is dan zal dat wel de oorzaak zijn 8)7 .

En je programma is inderdaad niet zo groot, maar dat komt vooral doordat veruit de meeste code verstopt zit in de libraries. Vooral een grafish display heeft nogal wat code nodig om te functioneren.

ik ben even wat gaan proberen alles van dht uitgeschakeld en een voor een inschakelen en dan kijken wanneer het fout gaat.
als ik de t en h float read inschakel gaat het fout en geeft de oled geen scherm meer weer ?

De oled wordt heel niet aangestuurd. Alleen geïnitialiseerd.

Welke foutmelding krijg je van de compiler? Met en zonder die dht funkties? De compiler meldt meestal wel hoeveel geheugen er nodig is, en de ruimte in een nano is nogal beperkt.

Een moderne compiler is tegenwoordig slim genoeg om uit een library alleen die funkties mee te nemen die daadwerkelijk gebruikt worden. Dus zodra je de "float read" gebruikt worden zowel de DHT funkties als de float librarie aan je programma toegevoegd. Dat zal dan wel net teveel zijn.

dit is de melding die ik krijg
De schets gebruikt 13356 bytes (43%) programma-opslagruimte. Maximum is 30720 bytes.
Globale variabelen gebruiken 1751 bytes (85%) van het dynamisch geheugen. Resteren 297 bytes voor lokale variabelen. Maximum is 2048 bytes.
Weinig geheugen beschikbaar, er kunnen zich stabiliteitsproblemen voordoen
hierna werkt het niet meer?

Dus het programma past nog wel in het geheugen, maar misschien/waarschijnlijk blijft er te weinig over voor de stack.

Je hebt hier weinig opties om de verbeteren.
Je kunt "DHTStart" verhuizen naar flash mbv een F() macro. Dat helpt maar een klein beetje, maar dat kan net genoeg zijn. En anders moet je op zoek naar betere libraries of een grotere micro.

code:


   Serial.println(F("DHTstart"));
marcob

Golden Member

Dit krijg je als je programma's knipt en plakt vanaf het internet. :+

Waarom staat er dit:

c code:

delay(delayMS);
delay(2000);

Ook ken je nergens een waarde aan delayMS toe. Dus zowel

c code:

uint32_t delayMS;
delay(delayMS);

kunnen weg

Ook kun je om iets te besparen het volgende veranderen:

c code:

#define DHTPIN 2    
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

in

c code:

DHT dht(2, DHT11);
People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Op 31 juli 2023 14:42:08 schreef marcob:
Ook kun je om iets te besparen het volgende veranderen:

c code:

#define DHTPIN 2    
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

in

c code:

DHT dht(2, DHT11);

Pardon? Hoeveel microbytes denk je dat het bespaart? Ik zeg "minder dan 1".

De C preprocessor leest

code:


#define DHTPIN 2    

en zal dan in alle vervolgcode (die dus na de preprocessor naar de compiler gaat), alle instanties van "DHTPIN" door "2" vervangen. (gewoon een textuele vervanging, met maar een HEEL klein beetje meer: Hij zal van abcDHTPINdef "afblijven" en een paar andere gevallen.)

P.S. Het zal een paar microseconden schelen bij het compileren. Dat dan weer wel.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
marcob

Golden Member

Op 31 juli 2023 15:09:59 schreef rew:
[...]Pardon? Hoeveel microbytes denk je dat het bespaart? Ik zeg "minder dan 1".

Je hebt helemaal gelijk, zat een beetje te slapen. 8)7

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

hallo allemaal de aanhouder wint maar niet echt
ik zit nog steeds dat ik geen waarde uit een dht 11 krijg.
ik ben nu echt terug bij de basis met een Wemos en dht, en krijg de melding error reading temperature
van deze sketch

#include <DHT11.h>

// Create an instance of the DHT11 class and set the digital I/O pin.
DHT11 dht11(3);

void setup()
{
// Initialize serial communication at 115200 baud.
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
digitalWrite(LED_BUILTIN, HIGH);
// Read the temperature from the sensor.
float temperature = dht11.readTemperature();

// If the temperature reading was successful, print it to the serial monitor.
if (temperature != -1)
{
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
}
else
{
// If the temperature reading failed, print an error message.
Serial.println("Error reading temperature");
}

// Wait for 2 seconds before the next reading.
delay(3000);
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(100);
}

ik zou het fijn vinden als iemand mij kon helpen met mijn probleem?

marcob

Golden Member

Weet je 100% zeker dat je de DHT module aan de juiste poort het aangesloten?
Maak eens een foto van je opstelling!

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Hensz

Golden Member

Ik vind het vreemd dat zo'n DHT een 'float' als resultaat ophoest. In deze example code komt er een 'int' uit het ding. Dat lijkt me al een stuk meer voor de hand liggen.

Don't Panic!

arduino libraries willen nog wel zo'n 2- of 4 bits achter de comma als "float" teruggeven.

De DHT11 lijkt tegelijk of na de DHT22 ontworpen te zijn. Het grotere broertje heeft precies hetzelfde protocol, maar meer "cijfers achter de comma".

[Bericht gewijzigd door rew op 26 augustus 2023 09:47:23 (46%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

probleem gedeeltelijk opgelost de Wemos die ik gebruik heeft pin nummers en gpio nummers deze komen niet overeen , en ik gebruikte steeds de pin nummers zoals bij een Arduino Nano wel het geval is.

de dht 11 geeft nu als luchtvochtigheid een waarde als -1% terwijl de temperatuur wel de juiste waarde geeft.
ter info ik doe dit bij twee Wemos en een nano , en alle drie het zelfde resultaat?