wemos + dht11

ciao, sto cercando di fare una semplice sonda per rilevare temperatura e umidità per poi iviare i dati via mqtt.
sto usando una scheda wemos e un sensore dht11
ho fatto un po di ricerche ed ho trovato la libreria del dht dedicata per gli 8266.
fatto il semplice programma ma mi dà quasi sempre errore.... mi dà una letura ogni tanto....
i collegamenti son giusti perchè alla fine son solo 3 fili...
il dht montato su arduino1 non sbaglia un colpo, quindi penso che il problema sia sulla libreria dht sul wemos o sul mio codice....
mi potete aiutare per favore?

allego codice:

#include "DHTesp.h"     // Libreria per utilizzare la Wemos D1 Mini con il sensore DHT11/DHT22 
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define DEBUG //decommentare per attivare la scrittura su seriale per PC
#define led 13 

DHTesp dht;

const char* ssid = "*********";
const char* password = "******";
const char* mqtt_server = "*********";
#define mqtt_user "**********"
#define mqtt_password "*******"

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
char msa[50];
int value = 0;
int temp;
int umid;
unsigned long currentMillis = 0;
unsigned long intervalloluce = 10000; //millisecondi
unsigned long previousMillisluce = 0;
unsigned long intervallotemp = 11500; //millisecondi
unsigned long previousMillistemp = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  randomSeed(micros());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {

    // Attempt to connect
    // If you do not want to use a username and password, change next line to
    // if (client.connect("ESP8266Client")) {
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {

    } else {

      // Wait 5 seconds before retrying
      delay(2000);
    }
  }
}

void setup()
{
#ifdef DEBUG
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)\tHeatIndex (C)\t(F)");
  String thisBoard = ARDUINO_BOARD;
  Serial.println(thisBoard);
#endif
  dht.setup(5, DHTesp::DHT11); 
  setup_wifi();
  client.setServer(mqtt_server, 1883);

  pinMode (led, OUTPUT);

  digitalWrite(led, HIGH); //accensione led notifica

  delay(1000);  
  digitalWrite(led, LOW); //spegnimento led notifica

  delay(10); 

}

void loop() {
  delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  currentMillis = millis();
  if (currentMillis - previousMillistemp >= intervallotemp) {
    previousMillistemp = currentMillis;
    digitalWrite(led, HIGH); //accensione led notifica


#ifdef DEBUG
    Serial.print(" Temp:");
    Serial.println(temperature);
#endif
    delay (5);
    temperature= temperature *10.00;
    int temp= int(temperature);
    snprintf (msg, 50, "%ld", temp);
    client.publish("temperatura_piante", msg);

    digitalWrite(led, LOW); //spegnimento led notifica

    delay(10);  
  }

  ////////////////
  if (currentMillis - previousMillisluce >= intervalloluce) {
    previousMillisluce = currentMillis;
    digitalWrite(led, HIGH); //accensione led notifica

#ifdef DEBUG

    Serial.print(" Umid:");
    Serial.print(humidity);

#endif
humidity= humidity *10.00;
    int umid= int(humidity);
    snprintf (msg, 50, "%ld", umid);
    client.publish("umidita_piante", msg);
    digitalWrite(led, LOW); //spegnimento led notifica
    delay(10);  
  }

}

e qui il dubug:

 Umid:nan Temp:nan
 Umid:nan Temp:nan
 Umid:nan Temp:nan
 Umid:nan Temp:nan
 Umid:nan Temp:nan
 Umid:nan Temp:nan
 Umid:nan Umid:nan Temp:nan
 Umid:nan Temp:nan
 Umid:nan Temp:nan
 Umid:nan Temp:19.50
 Umid:nan Temp:nan
 Umid:nan Temp:nan

Io ti dico solo una cosa:
il mio sketch per la lettura di umidità e temperatura con DHT22 funziona su Arduino Nano con trasferimento da IDE 1.0.6.
Lo stesso sketch trasferito sullo stesso Nano da IDE 1.8.13 da errore, ma proprio NON LEGGE.
Poi uno si domanda come mai la versione IDE 1.0.6 è ancora sul sito per il download...

Quindi, sostituendo la libreria DHT22 con la libreria DHT ho risolto il problema.

Se volessi fare anche tu una prova vedresti che il tuo sketch funziona solo se lo trasferisci con 1.0.6

Tra le varie versioni dell'IDE sono cambiate un'infinità di cose e alcune librerie, pur compilando, NON funzionano più.

Se si aggiorna l'IDE si devono usare anche le librerie più aggiornate (es. Adafruit le mantiene sempre piuttosto aggiornate), pena altrimenti l'avere poi problemi.

Guglielmo

il dht11 è già montato sulla sua schedina in cui escono i 3 pin (allego foto) i quali li ho collegati direttaente al wemos

per il voltaggio si, sono stato attento, l'ho collegato ai 3.3v altrimenti gli arriverebbe un segnale da 5v al pin di ingresso del wemos (voltaggio supportato dal modulo dht)

per la velocità di lettura si ho letto, e se non erro la libreria dedicata ai moduli esp (quella che ho incluso) serve proprio per risolvere questo problema.

io ho l'ide 1.8.5 mai avuto versioni precedenti nè sucessive.
però su arduino uno funziona senza problemi.

provo a vedere se riesco a scaricare la 1.0.6

gpb01:
Se si aggiorna l'IDE si devono usare anche le librerie più aggiornate (es. Adafruit le mantiene sempre piuttosto aggiornate), pena altrimenti l'avere poi problemi.

Si, ma la DHT22 esiste ancora come libreria. Solo che non funziona con l'IDE 1.8

steve-cr:
Si, ma la DHT22 esiste ancora come libreria. Solo che non funziona con l'IDE 1.8

Tutte le librerie, anche le più vecchie, le trovi sempre ed esistono ... sta poi all'utente essre "sveglio" ed installare quelle più aggiornate e NON roba vecchia ... "questo è Arduino" ... ci vuole spirito d'iniziativa :smiley: :smiley: :smiley:

Guglielmo

Sono d'accordo con te, Guglielmo, ma quello che cercavo di spiegarti è che la libreria DHT22 è una libreria che trovi dappertutto ma non c'è scritto da nessuna parte che "non è compatibili con le versioni IDE superiori a....", quindi uno va un po' anche a "tentativi" per capire come mai il suo programma non funziona.

Non è essere "svegli" o meno, ma io partivo da un programma perfettamente funzionante che poi non funzionava più, e questo senza problemi di compilazione: solo che i dati della sonda non li leggeva più!

Per uno che parte da ZERO, con IDE 1.8, e si affida a quella libreria CHE NON FUNZIONA, tu capisci che diventa matto, e non è nemmeno "normale" che il povero malcapitato pensi di cambiare libreria (quindi comandi) solo perché la prima non funziona.... Poi magari anche la seconda non va come dovrebbe!
E' normale che un "novizio" pensa che ha sbagliato lui, chiede aiuto, si deprime.... quando poi la colpa non è sua!

Comunque, per tornare al problema, io su ESP uso la libreria DHT e funziona benissimo.

quindi metti la

#include <DHT.h>
DHT dht (4, DHT22);      // Digital Pin 4, per esempio

poi nel SETUP

  dht.begin (100);

poi nel LOOP

T = dht.readTemperature ();
RH = dht.readHumidity ();

steve-cr:
Sono d'accordo con te, Guglielmo, ma quello che cercavo di spiegarti ...

Steve ... è un discorso vecchio ... la maggior parte delle librerie NON sono scritte da Arduino, sono scritte, spesso, da gente comune, che le scrive per il suo uso personale e poi le lascia li ... GRATIS. Pensi che poi, nel tempo, si preoccupi di scrivere se è compatibile o meno con una versione dell'IDE? ... perdona la francehzza ... sono fatti tuoi ... provi e se non va o te la studi e capisci perché o ne trovi un'altra.

E' uni dei risvolti negativi dell'OpenSource e del software gratuito ... chi lo rilascia non ti garantisce nulla, tanto meno che lo manterrà ... ::slight_smile:

Altrimenti usi software a pagamento, con librerie chiuse (compilate) e sei sicuro che, finché paghi il canone annuale, avrai sempre tutto aggiornato ! :smiling_imp:

Guglielmo

signori, non era mia intenzione creare polemica :sweat_smile:
non è il primo progetto che faccio e non sarà neanche l'ultimo, e so che si tratta di fare prove su prove e tentativi.
ho provato con entrambe le librerie senza successo, ed ho paura a cambiare versione dell'ide che poi magari non mi funzioneranno più progetti che ho già fatto.

dovendo fare solo un software di lettura temperatura e umidità per poi inviare i dati al mio home assistant, ho provato a cimentarmi sul software esphome.
vi dico che ha funzionato al primo colpo, quindi è solo un problema di librerie, perchè scheda,sensore e cavi son sempre gli stessi.

@acaplush,

  1. la MCU non è la stessa, la R dipende dall'impedenza dei pin della MCU; una lavora a 5V e l'altra a 3.3V e poi il core che sta sotto è diverso. Quel modulo ha una resistenza smd da 103, quindi 10K, di solito per MCU a 3.3V vedo suggerire dht11 con resistenza da 4.7K. Non dovrebbe cambiare nulla ma meglio chiedere agli elettronici.

  2. Per la velocità, ogni quanto leggi ? Che senso ha leggere alla velocità della luce un sensore del cappero (economico) come un dht11 o dht22 ? Leggi ogni mezzo secondo basta e avanza

  3. Ma hai provato con ESP8266 a mettere un programmino che legge solo il dht11 e lo stampa su seriale, senza tutto il resto di mqtt e connessioni varie ?

P.S. a che distanza è il sensore ? cavetti corti vero ?

@nid69ita

non sono elettronico, ma penso che per la resistenza non sia un grosso problema in quanto andrebbe solo a sballarmi un po il valore ricevuto, qui stiamo parlando che dà proprio errore! e fa una lettura corretta ogni 30/40 letture.

per la velocità lo so, ma ho modificato il codice di esempio del dht che era già così.
avevo provato a mettere la lettura all'interno dell' if del''invio del dato (così da fare una lettura ogni tot minuti) ma non funzionava comunque

anche il codice di esempio puro fà cilecca. :confused:

lunghezza cavi.... i classici dupont da prova su banco.

ps. ora che funziona con le librerie di esphome senza mai perdere colpi, ho allungato il cavo a 5mt.... nessun problema riscontrato! forse mi avrà perso qualche decimo di temperatura ma poco importa dato che devo misurare la temperatura ambientale. e vicino ad un altro termometro hanno una differenza di mezzo grado! :smiley:

acuplush:
.......
ps. ora che funziona con le librerie di esphome senza mai perdere colpi, ho allungato il cavo a 5mt.... nessun problema riscontrato! forse mi avrà perso qualche decimo di temperatura ma poco importa .....

Perché dovrebbe aver perso qualche decimo? Guarda che stai leggendo in DIGITALE e non in analogico, quindi la lunghezza dei cavi non va a cambiare assolutamente la lettura della temperatura.
E' come la TV digitale: o vedi o non vedi.

acuplush:
.....
non sono elettronico, ma penso che per la resistenza non sia un grosso problema in quanto andrebbe solo a sballarmi un po il valore ricevuto, qui stiamo parlando che dà proprio errore! e fa una lettura corretta ogni 30/40 letture.
.....

Allora se fa una lettura CORRETTA ogni 30/40 letture, la libreria funziona ed il programma, teoricamente, PURE!

Allora, visto che ultimamente uso molte WeMos D1 PRO e ho una decina di DHT22 mi sono preso la briga di montare velocemente su breadboard il sensore e il WeMos, senza nemmeno la resistenza.

Ho caricato l'esempio a corredo della libreria

#include "DHTesp.h"

#ifdef ESP32
#pragma message(THIS EXAMPLE IS FOR ESP8266 ONLY!)
#error Select ESP8266 board.
#endif

DHTesp dht;

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)\tHeatIndex (C)\t(F)");
  String thisBoard= ARDUINO_BOARD;
  Serial.println(thisBoard);

  // Autodetect is not working reliable, don't use the following line
  // dht.setup(17);
  // use this instead: 
  dht.setup(5, DHTesp::DHT22); // Connect DHT sensor to GPIO 17
}

void loop()
{
  delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.print(dht.toFahrenheit(temperature), 1);
  Serial.print("\t\t");
  Serial.print(dht.computeHeatIndex(temperature, humidity, false), 1);
  Serial.print("\t\t");
  Serial.println(dht.computeHeatIndex(dht.toFahrenheit(temperature), humidity, true), 1);
}

NESSUN PROBLEMA.

Sicuro che il collegamento alla porta è quello giusto? Te lo dico perché al mio primo utilizzo di WeMos ho fatto il MADORNALE errore di collegare un sensore su D1 e poi sul programma sono andato a leggere su 1........
Mentre invece D1 corrisponde a 5, D2 corrisponde a 4, D3 corrisponde a 0 eccetera.....

Vorresti provare anche tu a far girare questo programma e dirci se funziona?

ho riprovato sia il codice di esempio sia il mio.
entrambi funzionano.
penso di aver capito dov'era il problema.... sull'ide avevo la velocità di upload impostata a 921600, l'ho abbassata a 57600 e adesso funziona benissimo.
non chiedetemi perchè era impostata quella velocità lì perchè non lo so :astonished:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.