Forum: Mikrocontroller und Digitale Elektronik esp8266 wdt soft reset


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 Andre G. (andre_g929)


Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

ich versuche, eine elektronisch steuerbare hühnertorklappe zu bauen. das 
ganze soll per webinterface gesteuert werden können.
um alles optimal zu machen, wollte ich das webinterface asynchron 
zugänglich machen. funktioniert soweit auch.
aber wenn ich nun im asynchronen aufruf den motor ansteuere, kriege ich 
einen wdt reset.

alles was ich dazu gefunden habe, ist, dass man in der loop-schleife 
nicht blockend programmieren sollte, weil sonst der watchdog timer einen 
reset auslöst.
gibt es eine möglichkeit, einen stepmotor non-blocking anzusteuern?
der motor soll nachher über reed-kontakte gestoppt werden, es gibt also 
interrupts, die den motorlauf unterbinden würden.

gruß,
andre

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Bewertung
-1 lesenswert
nicht lesenswert
Könnte auf das hinauslaufen:
Beitrag "NodeMcu Board ständig wdt Reset"

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Andre G. schrieb:
> gibt es eine möglichkeit, einen stepmotor non-blocking anzusteuern?

Beim ESP8266 Board schwierig, denn du brächtest dazu entsprechende 
Timer, die den Motor autark ansteuern. Ich würde in diesem Fall einen 
zweiten Mikrocontroller daneben packen, der vom ESP irgendwie seriell 
Kommandos empfängt und abarbeitet (als den Motor ansteuert).

von Andre G. (andre_g929)


Bewertung
0 lesenswert
nicht lesenswert
der motor wird von einem n2003 angesteuert. reicht der n2003 dafür?

gruß,
andre

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Andre G. schrieb:
> n2003

Unter der Nummer finde ich alles Mögliche, aber keinen Motortreiber.

Meinst du vielleicht einen ULN2003? Das ist ein passives Teil, der kann 
von alleine gar nichts.

von Andre G. (andre_g929)


Bewertung
0 lesenswert
nicht lesenswert
korrekt, meinte uln2003.
ok. habe nun meinen sketch von async auf loop umgebaut, habe aber das 
gleiche problem.

sobald ich den motor ansteuere (TUER=ZU oder TUER=AUF im http request), 
gibt es einen wdt reset.  und ich habe derzeit nichts angeschlossen, 
also nur den esp8266 im trockenbetrieb quasi.

in der loop habe ich yield gesetzt, aber das scheint nichts zu ändern.
nur, wenn ich den motor tatsächlich nur einen einzigen step machen 
lasse, dann scheint es zu klappen. eigentlich ist der plan, die 
hühnerklappe auf bzw. zuzumachen, was mindestens eine minute dauert.

kann ich das irgendwie anders lösen?

kriege den code irgendwie nicht rein, meldet mir immer, dass spam 
enthalten ist...

: Bearbeitet durch User
von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Bewertung
-1 lesenswert
nicht lesenswert
Andre G. schrieb:
> kriege den code irgendwie nicht rein, meldet mir immer, dass spam
> enthalten ist...

Workaround per pastebin vielleicht?

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Andre G. schrieb:
> kann ich das irgendwie anders lösen?

Ohne Quelltext, Schaltplan und Fotos von der Leitungsführung kann man 
nur unqualifiziert raten. Ich habe keine Lust darauf, denn so etwas 
endet in der Regel mit wüsten Beschimpfungen.

Stelle du erstmal die Unterlagen zusammen, dann sehen wir weiter.

von batman (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Da nimmt man einen ganz normalen DC-Bürstenmotor mit PWM und 
Anschlag-Reed/IR/Mikroschalter oder vielleicht tuts auch schon ein 
besserer Servo.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ich möchte nur erwähnen, dass die Problemursache nicht zwangsläufig im 
Timing des Programms liegen muss. Es könnte auch an mangelhafter 
Leitungsführung, Stromversorgung oder Entstörung liegen.

von Andre G. (andre_g929)


Bewertung
0 lesenswert
nicht lesenswert
Stefan ⛄ F. schrieb:
> Andre G. schrieb:
>> kann ich das irgendwie anders lösen?
> Ohne Quelltext, Schaltplan und Fotos von der Leitungsführung kann man
> Stelle du erstmal die Unterlagen zusammen, dann sehen wir weiter.

kann ich völlig nachvollziehen, aber der quelltext wird hier 
abgelehnt...
1
#include <Arduino.h>
2
#include <ESP8266WiFi.h>
3
#include <ESP8266HTTPClient.h>
4
#include <Stepper.h>
5
6
const int stepsPerRevolution = 128;
7
Stepper myStepper = Stepper(stepsPerRevolution, 2, 0, 4, 5);
8
9
10
const int motorPin1 = 2;  
11
const int motorPin2 = 0;  
12
const int motorPin3 = 4;
13
const int motorPin4 = 5;
14
15
HTTPClient http;
16
WiFiServer server(80);
17
18
void setup() {
19
  Serial.begin(9600);
20
  pinMode(motorPin1, OUTPUT);
21
  pinMode(motorPin2, OUTPUT);
22
  pinMode(motorPin3, OUTPUT);
23
  pinMode(motorPin4, OUTPUT);
24
25
  WiFi.mode(WIFI_STA);
26
  WiFi.begin(ssid, password);
27
  server.begin();
28
  myStepper.setSpeed(8);
29
30
void loop() {
31
  WiFiClient client = server.available();
32
  if (!client) {    return;  }
33
  String request = client.readStringUntil('\r');
34
  client.flush();
35
36
  if (request.indexOf( --- /TUER=ZU --- ) != -1) {
37
    yield();
38
    myStepper.step(-stepsPerRevolution);
39
    yield();
40
  }
41
  if (request.indexOf( --- /TUER=AUF --- ) != -1) {
42
    yield();
43
    myStepper.step(stepsPerRevolution);
44
    yield();
45
  }
46
47
--- ausgabe html mit links für tür auf und Tür zu.
48
  delay(1000);
49
}



edit: jetzt hat es geklappt. lag vermutlich am html-code im sketch.
edit2: verkabelung schließe ich aus, denn das verhalten tritt auch auf, 
wenn der esp8266 ohne angeschlossenen stepmotor den code durchläuft. 
aber halt nur beim schritt myStepper.step(*).
ansonsten läuft er stabil.

: Bearbeitet durch User
von batman (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wie wärs dann mit 1 Step per Loopdurchlauf?

von Andre G. (andre_g929)


Bewertung
0 lesenswert
nicht lesenswert
das wäre die alternative. aber dann muss ich mein konstrukt umbauen.
hab eben gelesen, dass es mit der stepper.h lib zusammenhängen kann. 
versuche mich jetzt mal am accelstepper.h. die soll non-blocking 
programmiert sein.

von batman (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Oder einfach mal ein ganzes Programm schreiben. Wie wird auf den 
Anschlagkontakt reagiert.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Der oben gezeigte Quelltext ist jedenfalls ok. Bei HTML und String 
Klasse bekommt man ratzfatz einen Speicherüberlauf. Teilweise wegen 
Fragmentierung des Heap, teilweise weil der Stack nur 5kB für den Sketch 
frei hat.

Benutze lieber ein statisches char array mir fester Grösse, dass du 
wiederholt als Puffer zum erzeugen der HTML Fragmente verwendest. Und 
immer dran denken: Die Webseite kann stückweise übertragen werden. 
Solange die Stücke nicht kleiner als 1kB sind, leidet die Performance 
nicht.

von Andre G. (andre_g929)


Bewertung
0 lesenswert
nicht lesenswert
vielen Dank für die Hinweise.
Habe jetzt AccelStepper in loop() eingebunden, damit klappt es ohne 
Abstürze.
Jetzt muss ich nur noch schauen, wie ich den Motor rückwärts rotieren 
lasse. (edit: klappt jetzt auch, anstatt moveTo einfach move nehmen)

gruß und vielen dank,
andre

edit: hier der code https://pastebin.com/XJDW3LaC

: Bearbeitet durch User

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.