Traitement du message de type event
Le programme précédent permet de commander l'allumage de la led bleue vocalement. Toutefois, imaginons que la led soit pilotée également par un bouton poussoir, il faudra dans ce cas informer SinricPro du nouvelle état pris par la led (allumée ou bien éteinte) pour que l'état de Switch dans Alexa soit actualisé en conséquence.
Dashboard = tableau de bord
Méthode : Commande locale de la led par bouton-poussoir
Il faut écrire la fonction handleButtonPress()
qui :
doit détecter l'appui sur le bp ;
traiter le rebond du bp (anti-rebond logiciel) ;
allumer ou éteindre la led selon son état antérieur ;
indiquer le nouvel état de la led en envoyant un message de type event() grâce à la fonction
sendPowerStateEvent().
Commençons par la détection de l'appui sur le bp. Le bp est raccordé à la broche GPIO0 de la carte ESPDUINO-32 et ne possède pas de résistance de tirage à l'état haut (pull-up). Il faut donc activer la résistance de pull-up interne en ajoutant la ligne suivante au début de la fonction setup() :
pinMode(0, INPUT_PULLUP);
On ajoute maintenant au-dessus de la fonction onPowerStateCb()
la fonction handleButtonPress()
:
void handleButtonPress() {
bool buttonState;
unsigned long actualMillis = millis();
if (digitalRead(0) == LOW && actualMillis - lastBtnPress > 500) {
buttonState = digitalRead(2); // lecture de l'état de la led
digitalWrite(2, !buttonState); // commande de la led dans l'état opposé
buttonState = !buttonState; // on mémorise le nouvel état dans la variable buttonState
lastBtnPress = actualMillis;
}
}
L'utilisation de la fonction millis()
permet de ne pas prendre en compte les rebonds qui se produisent suite à un appui ou un relâchement d'un bouton-poussoir.
Il faut ajouter la déclaration et l'initialisation de la variable lastBtnPress
en dessous des #define
:
unsigned long lastBtnPress = 0;
Exécutons maintenant la fonction handleButtonPress()
dans le loop()
pour lire périodiquement l'état du bp.
void loop() {
handleButtonPress();
SinricPro.handle();
}
Compilez et téléversez votre programme puis validez son bon fonctionnement en vérifiant l'allumage de la led à partir du bp. Vérifier également que pour l'instant l'état du bp n'est pas actualisé sous Alexa ou SinricPro !
Méthode : Envoi du message event()
Il ne reste plus qu'à envoyer le message event() pour informer SinricPro et par conséquent Alexa du nouvel état de la led.
Rendez-vous sur le site détaillant la bibliothèque SinricPro et rechercher la classe SinricProSwitch
. Cette classe a déjà été utilisée dans le chapitre précédent pour créer un objet de type SinricProSwitch
et enregistrer la fonction de rappel. Cette fois on s'intéresse à la fonction sendPowerStateEvent()
qui permet d'envoyer un message de type event()
et d'y associer l'état de la led.
Q4. Quelle variable contient l'état de la led bleue dans la fonction handleButtonPress()
?
Ajoutez l'appel de la fonction sendPowerStateEvent()
dans la fonction handleButtonPress()
en remplaçant les pointillés avec la variable qui contient l'état de la led bleue :
mySwitch.sendPowerStateEvent(............); // envoi du message event() avec l'état de la led bleue
Compilez et téléversez votre programme puis validez son bon fonctionnement en vérifiant l'allumage de la led à partir du bp et l'actualisation de l'état de Switch sous Alexa ou SinricPro .
Attention :
Pour l'ESP8266 la led bleue s'allume à l'état bas, il faut donc en tenir compte pour envoyer un état correct à Sinric Pro.
Complément :
Allumez la led bleue, puis faire un reset de la carte ESP. Est-ce que Switch (Alexa ou SinricPro) est dans le même état que la led bleue ?
Modifiez votre code pour corriger ce problème.
Remarque :
Il faut être sûr d'être connecté au serveur pour que le message event() soit envoyé vers la plateforme SinricPro.
Félicitations, vous venez de créer votre premier système IoT qui permet à travers l'informatique en nuage[1] et l'application pour mobile Alexa :
de commander une led raccordée à un ESP ;
de connaître l'état de cette led même si cet état a été modifié localement.
S'il vous reste du temps vous pouvez passer à l'activité suivante qui permet d'aller plus loin.