Problème reboot Wemos D1 mini

Bonjour, je réalise actuellement un projet de rideau domotique à l'aide de moteur pas à pas, d'un ESP8266 et d'un L293D.
J'utilise le site IO Adafruit et la bibliothèque Adafruit MQTT car je suis débutant dans le domaine. Sauf que j'ai un petit soucis, je ne veux pas réaliser seulement une action simple (ON/OFF d'un interrupteur par exemple) mais contrôler un stepper durant une douzaine de tours (quelques secondes quand même) et le microcontrôleur "crash" au bout du 4è tours environ.
J'en ai déduis qu'il y avait certainement un temps d'action maximum à ne pas dépasser avant qu'il se remette en mode "écoute" de la requête d'une publication MQTT car lorsque que je mets un "delay" avant de faire tourner le moteur, le moteur tourne moins longtemps.
Il y a t-il un moyen d'allonger ce temps?

Merci de vos réponses et voici mon code

#include <Stepper.h>
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
 
#define WLAN_SSID       "****"
#define WLAN_PASS       "****"
#define relay D1
 
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME    "****"
#define AIO_KEY         "****"
 
const int stepsPerRevolution = 48; 
Stepper Stepper1(stepsPerRevolution, 5, 4, 0, 2); 

WiFiClient client;
 
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe rideau1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rideau1");
Adafruit_MQTT_Subscribe rideau2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rideau2");

int r1open = 1;
int r2open = 1;

void MQTT_connect();
 
void setup() {
  Serial.begin(115200);
  delay(10); 
  Stepper1.setSpeed(90);
 
  Serial.println(F("Adafruit MQTT demo"));
 
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);
 
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
 
  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());
  mqtt.subscribe(&rideau1);
  mqtt.subscribe(&rideau2);
 
 
}
uint32_t x=0;
void loop() {
  MQTT_connect();
 
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
   
    if (subscription == &rideau1) {
      Serial.print(F("Got: "));
      Serial.println((char *)rideau1.lastread);
      uint16_t state1 = atoi((char *)rideau1.lastread);
      if(state1 == 1){
        if (r1open==0){
            Stepper1.step(12*stepsPerRevolution);
            r1open = 1;
        }
      }
     
      else{
        if (r1open==1){
          Stepper1.step(-12*stepsPerRevolution);
          r1open = 0;
          
          }
      }
     
    }
 
   
    if (subscription == &rideau2) {
      Serial.print(F("Got: "));
      Serial.println((char *)rideau2.lastread);
      uint16_t state2 = atoi((char *)rideau2.lastread);
     
      if(state2 == 1){
     
      }else{
       
      }
     
    }
  }
 
}
void MQTT_connect() {
  int8_t ret;
if (mqtt.connected()) {
    return;
  }
 
  Serial.print("Connecting to MQTT... ");
 
  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);
       retries--;
       if (retries == 0) {
         while (1);
         
       }
  }
  Serial.println("MQTT Connected!");
}

Empty imported post

Bonjour

Reproduire içi le message sortant de l'ESP au moment du 'crash', il contient des informations utiles (cause du Reset,ou autre)

Regader l'exemple "Blink without Delay" qui montre comment utiliser millis()

Comment est alimenté l'ensemble, la partie L93/Moteur a-t-elle bien une alimentation séparée pour éviter de perturber celle du D1 Mini ?

Bon le petit soucis c'est que le serial.begin est réglé en 115200 pour que le module fonctionne correctement et en 9600 pour qu'on puisse lire la console mais dans tous les cas il ne va pas jusqu'au bout de l'action demandée.
Voici ce qui est affiché dans la console (lorsque que Serial.begin(9600); ) et qu'il crash.

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffdd0 end: 3fffffc0 offset: 01b0
3fffff80:  3fffdad0 0000018a 3ffee64c 4020166b  
3fffff90:  3fffdad0 00000000 3ffe84cc 40201231  
3fffffa0:  3fffdad0 00000000 3ffee6e8 40203dec  
3fffffb0:  feefeffe feefeffe 3ffe84ec 40100c0d  
<<<stack<<<
H!⸮⸮L⸮⸮⸮⸮⸮Adafruit MQTT demo

Sinon oui mon moteur est alimenté via une source externe: batterie 9V rechargeable et le d1mini est alimenté en USB 5V

Bonjour

Soft WDT Reset se produit lorsque l'ESP82266 ne trouve plus le temps pour ses tâches d'arrière plan (comme le maintien de la connection au point d'accès) . Au vu du programme et des symptômes il semble que les lignes suivantes soient reponsables :

Stepper1.step(12*stepsPerRevolution);

Que se passe t-il si , temporairement, 12 soit remplacé par 3 ? (tu dis que le crash se produit vers 4 tours)

Si ce test est positif, essaies alors de fractionner le mouvement en 4 fois 3 tours et en insérant yield() et éviter que l'ESP8266 déclenche un WDT Reset

 Stepper1.step(3*stepsPerRevolution);
yield();
Stepper1.step(3*stepsPerRevolution);
yield();
Stepper1.step(3*stepsPerRevolution);
yield();
Stepper1.step(3*stepsPerRevolution);

Je ne connais pas la librairie stepper, peut être pose t-elle un problème de compatibilité avec l'ESP8266.
Peut être faut-il éviter un trop grand nombre de pas dans une seule ligne Stepper.step().

Dans le cas particulier des ESP8266 yield() ou delay() sont mis a profit par le compilateur pour passer la main aux tâches de fond

Merci al1fch pour ta réponse ça fonctionne à merveille ! J'ai finalement mis plusieurs fois

Stepper1.step(2*stepsPerRevolution);
yield();

car avec les 3* le wemos D1 mini crashé encore 1 fois sur 3 .

Merci du retour

On a donc maintenant une idée du nombre maximal de pas à demander à la librairie 'en un seul coup' = une centaine. Elle n'est donc pas utilsable sans préacutions avec un ESP8266.