NODEMCU - Boucle de x seconde à la place dela fonction delay()

Bonjour à tous,

Je souhaite modifier un code qui utilise la fonction delay(10000).

J'ai trouvé la fonction millis() mais je n'arrive pas à la mettre en oeuvre , même aprés avoir vu plusieurs tutos et exemple.

Pouvez vous m'aider ? Je souhaite faire une pause de 15 sec.....

Merci d'avance

que doit faire le reste du code pendant ces 15 secondes ?

rien ... attendre

alors utilisez delay() c’est fait pour ça

Si vous voulez utiliser millis() en attente active

unsigned long t0  = millis(); // heure de départ
while (millis() - t0 < 15000ul) yield(); // ne rien faire en attendant 15 secondes

Merci la pause fonctionne bien ...
Mais cela ne change rien ... cela fait pareil qu'avec delay.
Ma fonctionn callback pour mqtt ne se lance pas ....
Je pensais que c'était du au fait que la fonction delay met l'arduino en pause ....

M'enfin, tu as dit que le programme n'avait rien à faire, alors qu'il semble qu'il attend quelque chose d'autre que la fin du temps d'attente.
Explique mieux ce que tu veux faire STP

Mais cela ne change rien ... cela fait pareil qu'avec delay.

oui c'est exactement ce que vous avez demandé puisque le code n'a rien à faire pendant l'attente de 15s

Bonjour
@lolo19430 : Mieux vaut publier intégralement le code en expliquant le comportement attendu, travailler sur des bribes est rarement productif et porteur de malentendus.

Bonjour,
Je suis toujours sur mon projet Horloge et recupération de valeur via mon serveur Mosquitto avec mqtt.

Voici mon code sans la partie affichage de l’heure :

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <PubSubClient.h>  
#include <ArduinoJson.h>

//WiFi Connection configuration
char ssid[] = "xxxxxxxxxxxxx";     //  le nom du reseau WIFI
char password[] = "xxxxxxxxxx";  // le mot de passe WIFI
//mqtt server
char mqtt_server[] = "10.1.2.198";  //adresse IP serveur 
#define MQTT_USER ""
#define MQTT_PASS ""
char message_buff[100];
long tps=0;
int longueur;
String t;


WiFiClient espClient;
PubSubClient MQTTclient(espClient);


void MQTTconnect() {

  while (!MQTTclient.connected()) {
      Serial.print("Attente  MQTT connection...");
      String clientId = "TestClient-";
      clientId += String(random(0xffff), HEX);

    // test connexion
    if (MQTTclient.connect(clientId.c_str(),"","")) {
      Serial.println("connected");
      MQTTclient.subscribe("ESP_Easy/temp_lolo/Temperature");
      
    } else {  // si echec affichage erreur
      Serial.print("ECHEC, rc=");
      Serial.print(MQTTclient.state());
      Serial.println(" nouvelle tentative dans 5 secondes");
      delay(5000);
    }
  }
}

void setup() {
Serial.begin(115200);
  // Conexion WIFI
   WiFi.begin(ssid, password);
   Serial.println("");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
   Serial.println("Connected");
   MQTTclient.setServer(mqtt_server, 1883);
   MQTTclient.setCallback(MQTTcallback);
}

void loop() {
  // ici affichage de l'heure pendant 20 sec
  
  
  delay(20000);
 
 
  MQTTclient.loop();
  
  if (!MQTTclient.connected()) {
    MQTTconnect();
  }

  Serial.println("Temperature: " + String(message_buff));

}

void MQTTcallback(char* topic, byte* payload, unsigned int length) {
  
  //Serial.write(payload, length);
  //Serial.println(); 
  int i = 0;
  
  // create character buffer with ending null terminator (string)
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';
  
  String msgString = String(message_buff);
  //Serial.println("Payload: " + msgString);
}

Si je mets delay(20000) cela ne fonctionne pas, pas d’affichage de la temperature.
Si je mets delay(8000) cela fonctionne !

Merci de votre aide.

il faut appeler [url=https://pubsubclient.knolleary.net/api#loop]MQTTclient.loop[/url](); fréquemment pour maintenir la connexion (vous pouvez aussi tester la valeur de retour)

8s ça suffit peut être, 20 secondes c’est sans doute trop longtemps

Ok super merci.
Ca veut dire que je dois multiplier les MQQTclient.loop() dans mon code de loop ?

Tu veux dire quoi par tester la valeur de retour de cette fonction ?

lolo19430:
Ca veut dire que je dois multiplier les MQQTclient.loop() dans mon code de loop ?

Non... le souci c'est l'attente de 20s qui est bloquante.
que voulez vous faire concrètement (en français).

lolo19430:
Tu veux dire quoi par tester la valeur de retour de cette fonction ?

la doc de la fonction dit

boolean loop ()

This should be called regularly to allow the client to process incoming messages and maintain its connection to the server.

Returns
false - the client is no longer connected
true - the client is still connected

Pendant les 20 sec , je laisse l'affichage de l'heure. C'est tout.

et après ?

Du coup je pensai faire plusieurs delay(5000) et y inserer entre chaque MQTTclient.loop()

Et apres j'affiche la temperature de la piece (dht22) et celle de l'exterieur du coup ...

donc le principe c’est que de temps en temps vous voulez effectuer une requête pour obtenir une valeur distante et l’afficher pendant un certain temps puis revenir à l’autre valeur ?

vous n’avez pas la place d’afficher les 2 ?

C'est un peu ça.

Un j'ai pas la place sur l'afficheur de mettre les deux.

Et puis je laisse l'affichage de l'heure pendant 20 sec. et apres je fais un effet "chenillard" pour afficher la température de la piece (grace une sonde DHT sur l'ESP) et la température exterieure.

il faudrait architecturer le code pour faire cela alors. Pour le moment si la Connexion se passe mal dans la fonction MQTTconnect() vous y restez coincé avec une nouvelle tentative toutes les 5 secondes mais sans jamais revenir à l'affichage

Pour l'instant le soucis c'est d'arriver à recuperer la temperature exterieure ...