Avis sur ce code?

Bonjour, est ce que c'est quelques lignes vous semblent correct? C'est pour un ESP32.
Je voudrais inclure la lecture de cette sonde à un autre programme existant mais j'ai lu que la fonction Delay était pas une bonne idée.

#include "OneWire.h"
#include "DallasTemperature.h"
 
OneWire oneWire(23);
DallasTemperature ds(&oneWire);

void setup() {
  ds.begin(); // sonde activée
}

void loop() {
  ds.requestTemperatures();
  int t = ds.getTempCByIndex(0) 
  delay(10000);
}

Ça ne compilera pas… manque un point virgule

Sinon comme ça ne fait rien de la valeur lue, il y a de forte chance que le compilateur vire le code….

Le delay dans l’absolu n’est pas génial mais si vous voulez faire du polling toutes les 10 secondes et rien d’autre entre temps, pourquoi pas, c’est pas plus mal sur esp32 car ça réduit la consommation pendant l’attente

Quel autre programme? (mettre au moins les #include)

Vous feriez bien d'afficher, ne serait ce pour vous rassurer, les valeurs lues


void setup() {
  ds.begin(); // sonde activée
  Serial.begin(115200); // liaison série activée pour test
}
void loop() {
  ds.requestTemperatures();
  int t = ds.getTempCByIndex(0) ;
  Serial.println(t); // affichage minimaliste
  delay(10000); // on verra -cf loopwithoutdelay exemple à le supprimer plus tard
}

Là, la console serie vous balancera des chiffres toutes les 10 secondes (en mettant la sonde près (pas dedans!) d'une tasse de thé chaude ou d'un verre d'eau glacée, vous saurez si elle est bien branchée).

Bonjour @sanders29
Le même code, sans la fonction delay(10000);, et qui affiche la valeur sur le moniteur série :

#include "OneWire.h"
#include "DallasTemperature.h"
 
OneWire oneWire(23);
DallasTemperature ds(&oneWire);
unsigned long Millis = 0;

void setup() {
  ds.begin(); // sonde activée
  Serial.begin(115200);
}

void loop() {
const unsigned int Read_Temps = 10000;
static unsigned long prevMillis = 0;
Millis = millis();
if ((Millis - prevMillis) > Read_Temps)
 {
  ds.requestTemperatures();
  int t = ds.getTempCByIndex(0);
  Serial.print(F("La valeur est : "));
  Serial.println(F(t));
  prevMillis = Millis;
 }
}

Tapé ici, non testé
Je ne sais pas si ça fonctionne sur un ESP32 ?

Cordialement
Pandaroux007

Comme l'indique @J-M-L ce n'est pas que c'est une mauvaise idée.
le problème est plutôt que lorsque l'on a ensuite besoin comme toi, d'intégrer son code de test, dans un autre programme, tu va bousiller les timings que tu aurais pu faire dans l'autre programme, voir te retrouver avec un comportement chaotique.
Si tu sais ce que tu fais avec le delais, par contre ce n'est pas un soucis.

à la louche, je dirais que ça ne compile sur aucune plateforme :japanese_ogre: :face_with_hand_over_mouth:

Millis n'a pas été déclarer.
après tu t'es aussi trompé dans le sens de la condition du if, mas bon, je ne voulais pas m'acharner non plus :slight_smile:

oui mais pas Millis.

Ou plus simplement

if((Millis - prevMillis) > Read_Temps)

oui ou plutôt le code suivant qui est plus lisible non ?
if ((Millis - prevMillis) > Read_Temps)

@fdufnews lol :slight_smile:

ou déclares tu la variable Millis ?

Et pour l’améliorer la durée d’attente devrait aussi être non signée (c’est bien de l’avoir déclarée en constante)

L’inconvénient de ce code sur esp32 c’est que l’on boucle à fond en lisant millis et ne faisant rien. Donc ça consomme du courant. Sur esp32 quand on appelle delay ça fait un dormir le processeur pendant le temps voulu (je simplifie) et donc on consomme moins. C’est pour cela que delay dans ce cas est mieux que l’usage de millis pour limiter le réchauffement planétaire et le gaspillage d’énergie… sur AVR ça ne change rien.

1 Like

Normalement, les éventuels massages d'horreur du compilateur permettent d'avoir grâce à vous un joli code, peut être pas du premier coût, mais très vite...
(j'aurais mis aussi Read_Temps en long -ça ne mange pas de pain sur un ESP- pour gèrer de ... longs délais -minute-)

Merci à tous pour l'aide et désolé pour le peu de détail.

Alors la fonction serial je l'est retiré volontairement car c'est sur une page web que devra s'afficher la valeur, là c'était juste pour avoir votre avis.

@coloneldeguerlasse voici les #include de l'autre programme. C'est un routeur d'énergie pour surplus photovoltaïque auquel j'aimerais rajouté cette sonde de température.

Si vous voulez tout le code pas de problème, il est open source.

//Libraries
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ArduinoOTA.h>
#include <RemoteDebug.h>
#include <NTPClient.h>

//Program routines
#include "PageWeb.h"

J'ai rajouter le ; qui était partie lors du copier coller, pas de problème de compilation avec une carte ESP32 DEV MODULE.

Si tu as un serveur WEB et que ton code fait un delay actif de 10s systématiquement, le serveur WEB ne pourra pas être actif pendant ce moment là!

Oui tout à fait c'est ce que j'ai compris après certaine lecture. C'est pour sa que je pose la question.

Les #include vous sont d'une aide?

moi je la mets entre le pouce et l'index, pas besoin de passer à la cuisine :smile:

1 Like

Oui et non, du coup la réponse est qu'il ne faudra pas faire une attente active.
suivant ton code, il y a plusieurs solution possible.

Tu ne pense pas qu'il serait plus efficace de diminuer le delay à quelques millisecondes dans la loop et gérer l'acquisition comme le propose @pandaroux007

Non, pas si le code ne fait que cela. Au final vous voulez attendre 10 secondes, autant faire dormir votre ESP pendant 10s plutôt que de tester quelques dizaines de milliers de fois si les 10 secondes sont passées…

Justement @sanders29 ne veut pas faire que cela.
Du coup, il n'est pas question de faire 10000 fois le IF avec un délais de 1ms.
Mais plutôt moins de 1000 fois, avec un délais d'au moins 10ms, ce qui veut dire qu'en gros l'ESP dors 90% du temps, mais à une réaction de l'ordre de 10ms.