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(inti=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.
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.
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.
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.
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
DHTdht(DHTPIN,DHTTYPE);
7
8
voidsetup(){
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
floathum=dht.readHumidity();
36
floattemp=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
voidloop(){
54
}
So sieht meine Ausgabe aus:
1
{$l⸮⸮|⸮d⸮| ....noch viel mehr so komische Sonderzeichen, die sich aber nicht kopieren lassen ...
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
floathum=dht.readHumidity();
6
floattemp=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.
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.
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
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
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.
> 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?
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