Forum: Mikrocontroller und Digitale Elektronik ESP8266 DHT22 Projekt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von H. C. (sunshine)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Joachim S. (oyo)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


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

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.