Forum: Mikrocontroller und Digitale Elektronik Batteriebetriebener Sensor - sleep


von Frank (Gast)


Lesenswert?

Hallo und frohe Ostern,

über die Osterfeiertage habe ich mal versucht meinen Temperatur und 
Luftfeuchtesensor zu überarbeiten.
Es werden alle paar Minuten die Daten eines DHT22 gemessen und mit einem 
ESP8266 ins Web geschickt.
Zusätzlich messe ich die Versorgungsspannung über einen integrierten 
ADWandler.


Das Programm läuft an sich schon seit längerem stabil. Das Programm 
läuft auf dem ESP den ich mit Arduino programiere. Nur jetzt wo ich ein 
"deep sleep" integrieren wollte läuft der Code nicht mehr.
D.h. lege ich an die Schaltung eine Versorgungsspannung an, sendet der 
Sensor genau ein mal Daten ins Web, nach dem ersten deep sleep wird nur 
noch die Versorgungsspannung ins Web übertragen.

Änderungen zu dem lauffähigen code: delay(); durch ESP.deepSleep 
ersetzt...

Code:

#include "DHT.h" //Library für den DHT
#include <ESP8266WiFi.h> //Library für den ESP8266


#define DHTPIN 2     // Digitaleingang 2 wird für den DHT22 Sensor 
verwendet
#define DHTTYPE DHT22   // Definieren, welcher Sensor verwendet wird: 
DHT 22
DHT dht(DHTPIN, DHTTYPE);

ADC_MODE(ADC_VCC); // Umschalten des ADC auf interne Messung der 
Versorgungsspannung

void updateThingspeak(String field1, String field2, String field3){
// Daten versenden
}



void setup() {
  delay(1000);
  dht.begin();

  WiFi.begin(wlanName, wlanPasswort);
    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }

  Serial.println("");
  Serial.println("WiFi connected");
  delay(1000);

  float h = dht.readHumidity();;
  float t = dht.readTemperature();
  float vcc = ESP.getVcc();

    if (isnan(t) || isnan(h))
    {
        Serial.println("Failed to read from DHT");
    }


  updateThingspeak(String(t), String(h), String(vcc)); //Aufrufen der 
Funktion Am Thingspeak-Server Anmelden und Daten Senden Strings 
übergeben!
  delay(100);
  ESP.deepSleep(60000000,WAKE_RF_DEFAULT); // 1s  60  5 = 5 Min. (Deep 
sleep ist in mikrosekunden)
  delay(100); // wird benötigt damit nicht die Befehle weiter laufen bis 
der Controller in den deep sleep geht


}

void loop() {

}

von Michael U. (amiga)


Lesenswert?

Hallo,

liest er denn den DHT noch? Da hst Du ja eine serielle Ausgbae drin.
Laß Dir doch die Daten auch mal seriell ausgeben, dann kommst Du edm 
vielleicht näher, wo es klemmt.
Wenn er die Spannung noch schickt muß er ja prinzipiell aufwachen.

Gruß aus Berlin
Michael

von Frank (Gast)


Lesenswert?

Hallo Michael,

ja genau, er wacht auf und sende den Wert der Versorgungsspannung, dabei 
sehe ich ebenfalls die blaue Led aufleuchten.

Aufwachen funktioniert, das habe ich per seriellem Monitor schon 
geprüft.

Nur das lesen vom DHT funktioniert nach dem ersten reset nicht mehr :-(.

von Zeltplatznachbar (Gast)


Lesenswert?

Scheint ein bekanntes Problem des Sensors zu sein:

http://www.esp8266.com/viewtopic.php?f=32&t=8114&start=4

Lösung ist wohl, den Wert nach dem Aufwecken so lange zu pollen, bis 
etwas Sinnvolles kommt.

von Frank (Gast)


Lesenswert?

Hallo Zeltplatznachbar,

trotz längerem suchen im Netz hatte ich den von dir genannten Beitrag 
nicht gefunden.
Das scheint es zu sein. Danke!

Ich werde morgen mal die beiden Ansätze:

- DHT Sensor mehrfach abfragen, bis ein Gültiger Wert geliefert wird
und
- den Pin an den der DHT angschlossen ist vor dem sleep auf output und 
dann low zu schalten.

von Michael U. (amiga)


Lesenswert?

Hallo,

ich bin jetzt nicht sicher, ob ich die identische DHT-lib hier drauf 
habe.
Ich habe mal einen DHT11 an den ESP gehängt, der lag hier noch rum.
Der liefert mit der default-Einstellung nur selten überhaupt Werte(ohne 
sleep).

Mit DHT dht(DHTPIN, DHTTYPE, 50); meldet er sich (fast) immer.
mit Sleep (zum Test nur auf 1s gesetzt) kommen ca. 70% mit Werten.

Keine Lust im Moment, mir die Lib und das Datenbaltt des DHT genauer 
anzuschauen. Meine Sensoren haben FOST02 und RFM12 und laufen seit ca. 6 
Jahren mit seltenen Batteriewechseln.
Die ESP waren mir bisher da zu stromhungrig, so ist es nur eine 
RFM12-ESP8266-Bridge geworden, die die Daten jetzt per MQTT 
weiterschickt...

Hatt ich zumindest einen Grund, den Sleep mal zu testen. :-)

Gruß aus Berlin
Michael

von Frank (Gast)


Lesenswert?

Hallo,

ich habe nun etwas herum probiert und komme leider immer noch nicht 
weiter. :-(

Ich habe folgendes probiert:

- DHT Sensor mehrfach abfragen, bis ein gültiger Wert geliefert wird
--> selbst bei 100 mal abfragen kam bis dato kein gültiger Wert vom 
Sensor zurück.
Code:
    do
    {
      if (isnan(t) || isnan(h))
      {
        Serial.println("Failed to read from DHT");
        delay(100);
        x = x+1;
      }

      else
      {
      h = dht.readHumidity();
      t = dht.readTemperature();
      vcc = ESP.getVcc();
      x = 100;
      }
    }
   while (x < 100);

- den Pin an den der DHT angschlossen ist vor dem sleep auf output und
dann low zu schalten.
--> kein Unterschied
Code:
     pinMode(DHTPIN, OUTPUT);
     digitalWrite(DHTPIN, LOW);


- In der Datei dht.cpp den Wert "delayMicroseconds(10) auf 40 erhöhen
--> kein Unterschied
Code:
// Now start reading the data line to get the value from the DHT sensor.
pinMode(_pin, INPUT_PULLUP);
delayMicroseconds(10); // Delay a bit to let sensor pull data line low.

von Frank (Gast)


Lesenswert?

UPDATE

- den Pin an den der DHT angschlossen ist vor dem sleep auf output und
dann low zu schalten.

Code:
     pinMode(DHTPIN, OUTPUT);
     digitalWrite(DHTPIN, LOW);

Scheint nun doch zu funktionieren.

Ich hatte nach dem digital write noch ein kleines delay welches ich nun 
entfernt habe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.