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
}
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?
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.
#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);
}
}
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
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);
}
}
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 )
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
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
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
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);
}