Hallo,
Ich habe einen esp8266 board (Lollin wemos D1 mini).
An den Ports sind zwei Taster angeschlossen und Transistoren welche leds
und einen Laserpointer ansteuern.
Zwei Port Pins (D4 und D0) blinken jetzt aber ungewollt ca. alle 3 sec.
Ich konnte es auf die Zeile: "while(digitalRead(SHOOT_SWITCH));"
eingrenzen. Sobald diese raus ist blinkt nichts. jemand eine Idee woran
das liegen kann? Bin überfragt.
Der Schaltplan ist im Anhang.
Hier mein aktueller Code:
1
#define FLASH_LED_1 D5
2
#define FLASH_LED_2 D6
3
#define FLASH_LED_3 D7
4
#define FLASH_LED_4 D8
5
#define FLASH_LED_5 D4
6
#define LASER D0
7
#define SHOOT_SWITCH D1
8
9
10
voidsetup(){
11
pinMode(FLASH_LED_1,OUTPUT);
12
pinMode(FLASH_LED_2,OUTPUT);
13
pinMode(FLASH_LED_3,OUTPUT);
14
pinMode(FLASH_LED_4,OUTPUT);
15
pinMode(FLASH_LED_5,OUTPUT);
16
pinMode(LASER,OUTPUT);
17
digitalWrite(FLASH_LED_1,LOW);
18
digitalWrite(FLASH_LED_2,LOW);
19
digitalWrite(FLASH_LED_3,LOW);
20
digitalWrite(FLASH_LED_4,LOW);
21
digitalWrite(FLASH_LED_5,LOW);
22
digitalWrite(LASER,LOW);
23
pinMode(SHOOT_SWITCH,INPUT);
24
pinMode(SHOOT_SWITCH,INPUT_PULLUP);
25
}
26
27
voidloop(){
28
while(digitalRead(SHOOT_SWITCH));// solange der Schalter gedrückt ist
29
30
//digitalWrite(FLASH_LED_1, HIGH); // turn the LED on (HIGH is the voltage level)
31
//delay(100);
32
while(!digitalRead(SHOOT_SWITCH));// solange der Schalter nicht gedrückt ist
Sven schrieb:> Ich konnte es auf die Zeile: "while(digitalRead(SHOOT_SWITCH));"> eingrenzen. Sobald diese raus ist blinkt nichts. jemand eine Idee woran> das liegen kann?
Dieser Eingang legt im Ruhezustand auf HIGH (true) und wenn gedrückt auf
LOW (false), deine Programmlogik erwartet das Gegenteil. Aber das
alleine ist noch keine Lösung des Problems, denn solche Endlosschleifen
sind beim ESP8266 nicht erlaubt. Du löst damit den Watchdog aus, der
einen Reset auslöst.
Lies das: http://stefanfrings.de/esp8266/index.html#fallstricke
Sherlock 🕵🏽♂️ schrieb:> Das ist eine Endlosschleife, die sind beim ESP8266 nicht erlaubt.
Ein regelmäßiger Aufruf der Funktion yield() würde den Wachhund
beruhigen.
Rainer W. schrieb:> Ein regelmäßiger Aufruf der Funktion yield() würde den Wachhund> beruhigen.
Ach was, wirklich? Hätte ich jetzt nicht gedacht. Wollen wir noch mehr
Hinweise duplizieren, die bereits auf der "Lies das" Seite stehen?
Sherlock 🕵🏽♂️ schrieb:> Ach was, wirklich? Hätte ich jetzt nicht gedacht. Wollen wir noch mehr> Hinweise duplizieren, die bereits auf der "Lies das" Seite stehen?
Man kann es doch gleich auf den Punkt bringen, ohne die eigene Seite
gleich wieder in den Vordergrund zu schieben.
Außerdem sind natürlich die wenigsten Taster so wichtig, dass sie mit
der maximalen Abfragefrequenz des ESP8266 überwacht werden müssen. Eine
regelmäßige, timergesteuerte Abfrage ist deutlich sinnvoller.
Wie werden die Taster entprellt? Die Input-Ports des ESP sind nicht
5V-fähig, deswegen müssen die Pullups auf 3.3V gelegt werden. Welche
FETs werden verwendet? Sind das LogicLevel-Typen für 3.3V? Fragen über
Fragen...
vielen Dank für die schnellen Antworten. Das war das Problem.
Das Programm ist so noch nicht fertig, ich wollte zuerst meine Hardware
testen. Da es aber wirklich relativ simple ist werde ich es vermutlich
trotzdem über eine while schleife lösen.
Das Problem mit den Tastern an 5V ist mir auch aufgefallen nachdem ich
es gelötet hatte. Werde ich vielleicht noch anpassen, aber aktuell
fließt einfach ein kleiner Strom über dem PullUp und die interne
Klemmdiode, nicht ideal aber tut erstmal. Die FETs sind logik level und
die 3,3V reichen zum durchsteuern.
Achja, Entprellung wird dann noch in der software erledigt.
Sven schrieb:> aktuell fließt einfach ein kleiner Strom über dem PullUp> und die interne Klemmdiode, nicht ideal aber tut erstmal
Wenn die Spannung am IC dabei größer also 3,6 Volt ist, riskierst du ihn
zu zerstören.
Sven schrieb:> aber aktuell fließt einfach ein kleiner Strom über dem PullUp und die> interne Klemmdiode
Wohin fließt dieser Strom von immerhin 2x 1,5mA? Richtig: nach 3V3. Wo
wird dieser Strom dann "verbraucht"? Der 5V/3V3 Spannungsregler kann nur
Strom liefern, aber nicht aufnehmen. Wenn dieser Diodenstrom keinen
Verbraucher in Richtung GND findet (weil zb der uC im Sleep nur 100uA
braucht), dann werden einfach die 3,3V auf bis zu 4,7V angehoben. Und
das ist deutlich über der Spec des ESP.
Sven schrieb:> aber aktuell> fließt einfach ein kleiner Strom über dem PullUp und die interne> Klemmdiode,
Irrtum!
Eine solche "interne Klemmdiode" gibt es beim ESP8266 nicht.
Arduino F. schrieb:> Irrtum!> Eine solche "interne Klemmdiode" gibt es beim ESP8266 nicht.
Ja, meine ESP Chips haben definitiv keine Klemmdiode direkt zwischen I/O
Pin und VDD. Die meisten anderen CMOS Chips haben eine.
Früher stand das angeblich mal im Datenblatt:
"All digital I/O Pins are protected from over-voltage with a snap-back
circuit connected between the pad and GND. The snap-back voltage is
typically 6V, and the holding voltage is 5.8 Volt. This provides
protection from over-voltages and ESD."
https://hackaday.com/2022/05/12/is-esp8266-5-v-tolerant-this-curve-tracer-says-yes/
Daraus wird alle paar Monate erneut eine 5V Toleranz abgeleitet, doch
das halte ich für falsch weil direkt darüber klipp und klar steht, dass
an allen I/O Pins maximal 3,6 Volt zulässig sind. An diesen maximalen
3,6V hat Espressif nie etwas geändert.
Die Messung die der Typ gemacht hat ist übrigens unglaubwürdig. Er hat
bei allen Spannungen von 0 bis 6 Volt ungefähr 0,25 mA gemessen. Das
kann unmöglich sein. Nie im Leben nimmt ein heiler I/O Pin so viel Strom
auf. Das IC müsste eine negative Ausgangsspannung liefern, um bei knapp
über 0V und 1kΩ schon auf 0,25 mA zu kommen.