Pb sur widgets timescheduler

Bonjour a tous
je rencontre un souci avec le widget timescheduler
Pour l'instant je souhaite commander l'allumage d'une led via le dasboard avec
1 bouton pour allumer la led a la demande
2 time scheduler pour pouvoir allumer la led à 2 horaires differents de la journee et crees de la meme facon avec une variable Matin et une Soir

Le bouton marche parfaitement---led allumee et luminosite maximale
Le chedulerMatin fonctionne ---led allumee mais luminosite limite
le schedulerSoir ne fonctionne pas

Mon code est le suivant

/* 
  Sketch generated by the Arduino IoT Cloud Thing "Distri_Croquettes copy"
  https://create.arduino.cc/cloud/things/ffd52f53-e05f-40a6-92c8-be89aa172266 

  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  CloudSchedule Matin;
  CloudSchedule Soir;
  bool bouton;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/

#include "thingProperties.h"

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 
  
  pinMode(12,OUTPUT);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
  // Your code here 
  if (Matin.isActive()) {
    // whenever the job is "active", turn on the LED
    digitalWrite (12, HIGH);
  } else {
    // whenever the job is "not active", turn off the LED
    digitalWrite (12, LOW);
  }
  if (Soir.isActive()) {
    // whenever the job is "active", turn on the LED
    digitalWrite (12, HIGH);
  } else {
    // whenever the job is "not active", turn off the LED
    digitalWrite (12, LOW);
  }
  }


void onBoutonChange()  {
  // Add your code here to act upon Bouton change
  
  if (bouton) {
     digitalWrite (12,HIGH);
     delay(6000);
   }
   else {
     digitalWrite (12,LOW);
     
   }
   }





/*
  Since Matin is READ_WRITE variable, onMatinChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onMatinChange()  {
  // Add your code here to act upon Matin change
}


/*
  Since Soir is READ_WRITE variable, onSoirChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onSoirChange()  {
  // Add your code here to act upon Soir change
}

Dans l'attente de vos retours
Merci par avance

Il y a un problème dans la logique de gestion.

Je suppose que Matin et Soir sont 2 tranches horaires disjointes donc lorsque Matin et actif, Soir est inactif et inversement.
Donc, si on suppose qu'on est le matin et donc que Matin est actif, si on suit ton programme pas-à-pas voilà ce qui se passe.

  • Matin.isActive est vrai, donc tu allumes la LED.
  • Soir.isActive est faux, donc tu éteints la LED
  • et on boucle

Comme tu éteints et allumes la LED rapidement cela réduit son intensité.

Il vaudrait mieux travailler avec onMatinChange() et onSoirChange qui changent d'état au début et à la fin de la période de temps.

Autre remarque sur ton code.

  • Tu interroges le serveur pour mettre à jour tes variables
  • Tu fais tes tests
  • Tu reboucles aussitôt

Autant dire que tu inondes le serveur de requêtes. Le nombre de requêtes quotidiennes n'est pas limité?
Pourquoi ne pas avoir un delay() à la fin de loop()?

Salut et merci pour ta reponse
Effectivement vu comme ca cela est coherent
Dans mon idee le timeschduler pour lequel on parametre une duree avait la meme fonction que delay mais je vois maintenant que non.
je vais donc voir pour utiliser onMatinchange et onSoirchange
Mais dans ce cas je n'ai pas besoin de loop dans mon programme ?quel valeur de delay devrais je mettre ?genre 1h?plus?

Si j'en crois la doc Arduino loop doit contenir ArduinoCloud.update(); et c'est tout (voir le § Create Sketch dans le lien ci-dessous)
https://docs.arduino.cc/arduino-cloud/guides/arduino-c/

A noter quand même, le fonctionnement avec onChange fait que les fonctions callback ne sont appelées que lors du changement d'état des variables Soir et Matin. À la mise en route le logiciel ne sait pas s'il démarre à l'intérieur ou à l'extérieur de l'une des tranches horaires.
Il faudra donc dans setup() tester les variables pour savoir où on se trouve à cet instant.

j'ai deplacer mon code

 `void onBoutonChange()  {
    if (bouton) {
     digitalWrite (12,HIGH);
     delay(6000);
   }
   else {
     digitalWrite (12,LOW);
   }
   }
/*
void onMatinChange()  {
    if (Matin.isActive()) {
    digitalWrite (12, HIGH);
  } else {
    digitalWrite (12, LOW);`'

je n'ai aucune erreur a la compilation mais rien ne se passe ma led ne s'allume pas avec le scheduler
Ca marche nickel pour le bouton par contre

Mets ton code complet.


#include "thingProperties.h"

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 
  
  pinMode(12,OUTPUT);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
  // Your code here 
 }
void onBoutonChange()  {
  // Add your code here to act upon Bouton change
    if (bouton) {
     digitalWrite (12,HIGH);
     delay(6000);
   }
   else {
     digitalWrite (12,LOW);
   }
   }
/*
  Since Matin is READ_WRITE variable, onMatinChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onMatinChange()  {
  // Add your code here to act upon Matin change
    if (Matin.isActive()) {
    digitalWrite (12, HIGH);
  } else {
    // whenever the job is "not active", turn off the LED
    digitalWrite (12, LOW);
  }

}
/*
  Since Soir is READ_WRITE variable, onSoirChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onSoirChange()  {
  // Add your code here to act upon Soir change
  if (Soir.isActive()) {
    // whenever the job is "active", turn on the LED
    digitalWrite (12, HIGH);
  } else {
    // whenever the job is "not active", turn off the LED
    digitalWrite (12, LOW);
  }
}

Ton code tournait lors d'un changement de période?

Oui
Du coup je ne comprends plus grand chose ça marche quand l'instruction est dans la loop et si l'instruction du soir n'y est pas
Le widget devrait aller dans void onmatinchange () lorsqu'il change d'état donc cela devrait fonctionner.
Tous les exemples que je trouve sur ce widget sont pour un seul scheduler et il est toujours mis dans void loop

il ne faut pas mettre de delay

sinon vous arrêtez d'appeler ArduinoCloud.update(); pendant ce temps...

Je viens, enfin, de trouver sur Arduino Cloud de la doc sur les scheduler.
https://docs.arduino.cc/arduino-cloud/features/cloud-scheduler/

Tu pourrais essayer ça

void loop() {
  ArduinoCloud.update();
  if (Matin.isActive() || Soir.isActive()) {
    // whenever a job is "active", turn on the LED
    digitalWrite (12, HIGH);
  } else {
    // when both jobs are "not active", turn off the LED
    digitalWrite (12, LOW);
  }
}

ou en condensé

void loop() {
  ArduinoCloud.update();
  digitalWrite (12, (Matin.isActive() || Soir.isActive()) ? HIGH : LOW);
}

je vais essayer ca
j'ai bien trouve cette doc et l'ai lu des dizaines de fois sans rien trouver
dans leur exemple à 3 timescheduler on vit bien la condition mais rien n'indique comment l'inserer dans le programme( void loop ou pas )

Que voulez vous dire par là ? Ce qui est dans la fonction loop() est exécuté en boucle. Donc vous y mettez ce que vous voulez répéter sans cesse.

depuis hier je ne peux plus detecter mon device dans mon sctech
je peux televerser si je choisi un exemple "blink " par exemple mais lorsque je selectionne mon vrai scketch
image
Auriez vous une idee ??

Sinon je parlais de la commande timescheduler

if (Matin.isActive()) {
    // whenever the job is "active", turn on the LED
    digitalWrite(12, HIGH);
  } else {
    // whenever the job is "not active", turn off the LED
    digitalWrite(12, LOW);

La doc parle de multiples creneau avec chacun une action differente mais on ne si pas s'il faut la mettre en loop ou au contraire dans void onMatinchange () qui est censé etre appele a chaque changement d'etat

tout dépend de ce que vous voulez faire.

onMatinChange() devrait être appelé à chaque changement d'état, une seule fois par changement d'état. ça permet de faire une action une fois.

ce que vous mettez dans la loop tourne en permanence. ça vous permet de vérifier l'état courant du scheduler et de prendre des décisions qui nécessitent d'être répétées (pas qu'une seule action donc).

par exemple :

  • Imaginez que vous vouliez qu'une LED soit allumée ou éteinte en fonction du scheduler. C'est une action qui ne se fait qu'une seule fois. On mettra donc cela dans onMatinChange()

  • Imaginez que vous vouliez qu'une LED clignote à 5Hz pendant que le scheduler est actif et à 1Hz pendant que le scheduler est inactif. C'est une action qui est amenée à se répéter alors que l'état ne change pas ➜ vous mettez cela dans la loop.

je souhaite "simplement" pouvoir allumer la led à l'aide du widget "Bouton" pendant 6s a la demande
puis programmer 2 fois par jour l'allumage de la led pendant 6s aussi
une fois le matin et une fois le soir a l'aide de time scheduler

Donc tout peut se faire dans les callbacks, ce sont des actions ponctuelles lors du changement d'état.

la loop() ne serait alors que

void loop() {
  ArduinoCloud.update();
}

j'ai bien essayé mais rien ne fonctionne non plus

void onMatinChange()  {
  // Add your code here to act upon Matin change
    if (Matin.isActive()) {
    digitalWrite (12, HIGH);
  } else {
    // whenever the job is "not active", turn off the LED
    digitalWrite (12, LOW);
  }

Rien ne se passe au niveau de ma led

postez tout le code et montrez le circuit

mettez un print() dans la fonction pour voir si elle est appelée