Forum: Mikrocontroller und Digitale Elektronik ESP8266 DHT22 Projekt


von H. C. (sunshine)


Lesenswert?

Hallo,

ich bin gerade dabei meinen nodeMCU v3 ESP8266 ESP-12 E zu 
programmieren. Eine LED bekomme ich schon zum Blinken, nun möchte ich 
folgendes Projekt bei mir zum Laufen bringen: 
http://blog.thomasheldt.de/esp8266-am2302-dht22-sensor-fuer-akkubetrieb-ein-projekt-zum-mitmachen-3/

Also habe ich das Programm in Arduino 1.8.5 genöffnet und meine 
Variablen aus dem EEPROM entsprechend angepasst:

Wenn ich mir nun die serielle Ausgabe anschaue, erhalte ich alle meine 
angepassten Variablen mit ⸮ z.B.
SENSORSSID=⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮

So wird es im Code ausgegeben:
1
  for (int i = 117; i < 149; ++i)
2
  {
3
    SENSORSSID += char(EEPROM.read(i));
4
  }
5
  
6
  Serial.print(F("SENSORSSID="));
7
  Serial.println(SENSORSSID.c_str());
Auch meine IP hat er nicht entsprechend meiner Vorgaben angepasst. Woran 
kann das liegen??

Mir ist aufgefallen, dass ich nur eine Systemspannung von 3.028Volt 
habe. Eigentlich würde der Code bei einer Spannung < 3.1Volt gar nicht 
laufen.
Auch wenn ich extern 5V an Vin anschließe, erhöht sich die 
Systemspannung nicht.

von Bernhard S. (b_spitzer)


Lesenswert?

Da wird bei die eim EEPROM an Adresse 117 bis 149 wohl nur 0xff 
drinstehen.
Der Rest des Quellcodes ist schonmal korrekt.
Ich tippe auf ein Problem in Zeile 42 oder Layer 8.

von H. C. (sunshine)


Lesenswert?

Ja, nur warum werden meine Werte nicht ins EEPROM geschrieben?
Im Code steht unter den Variablen:
String SENSORSSID="ESP8266-DHT22-SENSOR";

Auch die anderen Variablen haben ihren Wert.

Kann das an der Spannung liegen und warum ist die so niedrig?
Das Board wird über USB versorgt ist aber auch so bei externer 
Versorgung über VIN.

von STK-500-Besitzer (Gast)


Lesenswert?

H. C. schrieb:
> Im Code steht unter den Variablen:
> String SENSORSSID="ESP8266-DHT22-SENSOR";
Meine Vermutung: Dieser String ist eine Variable im RAM.

> Ja, nur warum werden meine Werte nicht ins EEPROM geschrieben?
Das wird vielleicht in einem früheren Teil des Tutoriums beschrieben.
Es gibt in diesem Teil ja die Funktion "void ReadEEPROMConfig();".
Vielleicht gibt es auch eine "WriteEEPROMConfig()";
Die braucht ja nur einmalig aufgerufen zu werden.
Danach sind die Werte im EEPROM, bis man sie wieder überschreibt.

von sunshineh (Gast)


Lesenswert?

Danke für den Hinweis. Ich habe nun im Teil-2 des Tutorials etliche 
kleine Testprogramme gefunden. Den Sensor liest er korrekt aus, aber bei 
diesem Code sollte der ESP8266 eigentlich in den Tiefschlaf gehen und 
alle 2 Sekunden die Messung wiederholen.
Bei mir wird es nur ein einziges Mal gemacht:
1
#include <DHT.h>
2
 
3
#define DHTPIN 4            
4
#define DHTTYPE DHT22       
5
 
6
DHT dht(DHTPIN, DHTTYPE);
7
 
8
void setup() {
9
  pinMode(5,OUTPUT);
10
  pinMode(14,OUTPUT);
11
 
12
  digitalWrite(14,1);
13
  digitalWrite(5,1);
14
  
15
  Serial.begin(115200);
16
 
17
  Serial.println(F("")); 
18
  Serial.println(F("")); 
19
  Serial.println(F("ESP8266-DHT22-AKKU-SENSOR Test mit Deep-Sleep..."));
20
  Serial.println(F(""));
21
  Serial.print(F("SDK-Version: "));
22
  Serial.println(ESP.getSdkVersion());
23
  Serial.print(F("ESP8266 Chip-ID: "));
24
  Serial.println(ESP.getChipId());
25
  Serial.print(F("ESP8266 Speed in MHz: ")); 
26
  Serial.println(ESP.getCpuFreqMHz());
27
  Serial.print(F("Free Heap Size in Bytes: "));
28
  Serial.println(ESP.getFreeHeap());
29
  Serial.println(F(""));
30
 
31
  delay(1000);
32
  
33
  dht.begin();
34
 
35
  float hum = dht.readHumidity();
36
  float temp = dht.readTemperature();
37
 
38
  if (isnan(hum) || isnan(temp)) {
39
    Serial.println(F("Sensorfehler!"));
40
  } else {
41
    Serial.print(F("Luftfeuchte: "));
42
    Serial.print(hum);
43
    Serial.println(F(" %"));
44
    Serial.print(F("Temperatur: "));
45
    Serial.print(temp);
46
    Serial.println(F(" *C"));
47
  } 
48
  
49
  ESP.deepSleep(2000000, WAKE_RF_DISABLED);
50
  delay(100);
51
}
52
 
53
void loop() {
54
}

So sieht meine Ausgabe aus:
1
{$l⸮⸮|⸮d⸮|  ....noch viel mehr so komische Sonderzeichen, die sich aber nicht kopieren lassen ...
2
ESP8266-DHT22-AKKU-SENSOR Test mit Deep-Sleep...
3
4
SDK-Version: 1.5.3(aec24ac9)
5
ESP8266 Chip-ID: 991916
6
ESP8266 Speed in MHz: 80
7
Free Heap Size in Bytes: 46792
8
9
Luftfeuchte: 69.60 %
10
Temperatur: 17.70 *C
11
{ll⸮⸮|⸮d⸮|⸮d⸮c<⸮⸮⸮⸮{⸮c$⸮b⸮⸮og⸮l'o⸮⸮⸮#p⸮⸮${ls$⸮s⸮⸮n⸮c⸮ocp

von STK-500-Besitzer (Gast)


Lesenswert?

sunshineh schrieb:
> aber bei
> diesem Code sollte der ESP8266 eigentlich in den Tiefschlaf gehen und
> alle 2 Sekunden die Messung wiederholen.
> Bei mir wird es nur ein einziges Mal gemacht:

Dazu müsste
1
  delay(1000);
2
  
3
  dht.begin();
4
 
5
  float hum = dht.readHumidity();
6
  float temp = dht.readTemperature();
7
 
8
  if (isnan(hum) || isnan(temp)) {
9
    Serial.println(F("Sensorfehler!"));
10
  } else {
11
    Serial.print(F("Luftfeuchte: "));
12
    Serial.print(hum);
13
    Serial.println(F(" %"));
14
    Serial.print(F("Temperatur: "));
15
    Serial.print(temp);
16
    Serial.println(F(" *C"));
17
  } 
18
  
19
  ESP.deepSleep(2000000, WAKE_RF_DISABLED);
20
  delay(100);

in der loop(){} sein, und nicht nur in setup(){}.
Einfach nur Sachen aus dem Internet zusammen zu kopiern bringt nichts. 
Man sollte sie auch verstehen.

von sunshineh (Gast)


Lesenswert?

Das gleich hab ich mir auch gedacht. Dort stand aber geschrieben, dass 
beim Aufwachen jedesmal die Setup durchlaufen wird.
Außerdem habe ich es getestet und den Code mal in die Loop kopiert, das 
Verhalten blieb komplett gleich.

von Michael U. (amiga)


Lesenswert?

Hallo,

an die Verbindung GPIO15 mit Reset des ESP hast Du gedacht?
Der ESP-Sleeptimer löst bei Ablauf nur einen L-Impuls an GPIO15 aus, 
dieser muß den ESP resetten damit dieser aus dem Sleep neu startet.

GPIO15 müßte D8 an der NodeMCU sein.

Michael

von Michael U. (amiga)


Lesenswert?

Hallo,

Michael U. schrieb:
> an die Verbindung GPIO15 mit Reset des ESP hast Du gedacht?

Es ist natürlich GPIO16, nicht GPIO15...
Es gibt auf der NodeMCU da wohl schon eine passende Beschaltung, das 
sollte man aber je nach Version besser überprüfen.

Gruß aus Berlin
Michael

von G. H. (schufti)


Lesenswert?

Hi,
der Code paßt schon so. Natürlich kann man das im setup() haben, wenn es 
sowieso nur einmal durchlaufen werden soll.
Auf NodeMcu Boards ist zwar ein Widerstand gpio16-rst vorgesehen aber 
i.d.R. nicht bestückt.
Eine Brücke ist das Übelste was man da bestücken kann, ein Widerstand 
(ca 560 Ohm) geht gerade so, eine Schottkydiode ist wohl die beste Wahl 
(mit Katode nach gpio16).
Hintergrund: gpio16 ist während deepdleep ziemlich "hard" high, somit 
auch rst und der kann dann von der Flashelektronik kaum erfolgreich auf 
gnd gepulst werden -> Flashversuche schlagen großteils fehl.

von Stefan F. (Gast)


Lesenswert?

https://raw.githubusercontent.com/nodemcu/nodemcu-devkit/master/Documents/NODEMCU_DEVKIT_SCH.png

Laut diesem Schaltplan ist da schon ein Widerstand, nämlich R7.

von Joachim S. (oyo)


Angehängte Dateien:

Lesenswert?

Stefan U. schrieb:
> 
https://raw.githubusercontent.com/nodemcu/nodemcu-devkit/master/Documents/NODEMCU_DEVKIT_SCH.png
>
> Laut diesem Schaltplan ist da schon ein Widerstand, nämlich R7.

Bzw. bei Boards die auf dem aktuellen v1.0-Schaltplan
https://github.com/nodemcu/nodemcu-devkit-v1.0/blob/master/NODEMCU_DEVKIT_V1.0.PDF
basieren, heisst dieser 470 Ohm-Widerstand R11 (und hat die Seite 
gewechselt); der unbestückte Widerstand heisst R10 (siehe Anhang).

von G. H. (schufti)


Lesenswert?

dass der V0.9 Schaltplan in dem Bereich Unfug ist steht wohl ausser 
Debatte, oder?

von Stefan F. (Gast)


Lesenswert?

> dass der V0.9 Schaltplan in dem Bereich Unfug ist steht wohl ausser
> Debatte, oder?

Man beachte, dass der Taster dort als KEY_USER beschriftet ist, nicht 
als RESET Taster. Bei der Schaltung 0.9 ohne Brücke kann man ihn 
tatsächlich als User-Taster verwenden.

Erwarten würde das aber wohl kaum jemand, oder?

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.