Da ich keine brauchbaren Informationen gefunden habe, wie sich die GPIOs beim Einschalten des NodeMCU-Boards (Esp8266 ESP12 based) verhalten, habe ich sie mal mit einem einfachen Logik Analyser nachgemessen. Das Testprogramm (siehe unten) setzt die GPIO für 200 ms auf LOW und danach auf High.
Ganz links (Zeitpunkt 2715) ist der Einschaltmoment, nach 311 ms (Zeitpunkt 3026) wird der erste Codeblock (LOW) ausgeführt und 200 ms später (Zeitpunkt 3226) der nächste Codeblock (HIGH). Anschließend habe ich noch getestet, wie sich die Ausgänge mit PULL-Downs verhalten.
Erkenntnisse:
- D3 und D4 sind beim Einschalten nicht stabil
- D8 ist LOW (passt zum Schaltplan)
- D1, D2, D5, D6, D7 kann man mit Pull-Downs schön auf LOW ziehen.
- D3 und D4 mögen (erwartungsgemäß) keine Pull-Downs.
Fazit:
- D1, D2, D5, D6, D7 sind problemlos zu nutzen. Je nach gewünschten Zustand ggf. mit Pull-Downs.
- D3 und D4 können für Aufgaben genutzt werden, die immun gegen die nicht stabilen Zustände in der Startphase sind und mit HIGH zurecht kommen.
- D8 kann für Aufgaben genutzt werden, wo der Zustand in der Startphase LOW sein darf.
D-Notation | GPIO | Feste Pull-UP/DOWN | Notwendiger Zustand beim Booten | Anmerkungen |
---|---|---|---|---|
D0 | GPIO16 | |||
D1 | GPIO5 | |||
D2 | GPIO4 | |||
D3 | GPIO0 | PULL-UP | HIGH | Beim Einschalten nicht stabil; wird von der Schaltung beim Flashen auf Low gezogen |
D4 | GPIO2 | PULL-UP | HIGH | Beim Einschalten nicht stabil |
D5 | GPIO14 | |||
D6 | GPIO12 | |||
D7 | GPIO13 | |||
D8 | GPIO15 | PULL-DOWN | LOW |
void setup() { pinMode(D1, OUTPUT); digitalWrite(D1, LOW); pinMode(D2, OUTPUT); digitalWrite(D2, LOW); pinMode(D3, OUTPUT); digitalWrite(D3, LOW); pinMode(D4, OUTPUT); digitalWrite(D4, LOW); pinMode(D5, OUTPUT); digitalWrite(D5, LOW); pinMode(D6, OUTPUT); digitalWrite(D6, LOW); pinMode(D7, OUTPUT); digitalWrite(D7, LOW); pinMode(D8, OUTPUT); digitalWrite(D8, LOW); delay(200); digitalWrite(D1, HIGH); digitalWrite(D2, HIGH); digitalWrite(D3, HIGH); digitalWrite(D4, HIGH); digitalWrite(D5, HIGH); digitalWrite(D6, HIGH); digitalWrite(D7, HIGH); digitalWrite(D8, HIGH); } void loop() { }
Sauber dokumentiert! Vielen Dank
Hallo Sven,
vielen Dank für diese Info, aber wie kann ich denn z.B. D1 und D2 auf DOWN lassen? Gibt es da einen Befehl für?
pinMode(D1, OUTPUT_PULLDOWN); digitalWrite(D1, LOW);
oder so ?
Danke für ne kleine Info.
CU Kai