Contrôler une lumière avec Talkback sur ESP32
Cet exemple montre comment extraire des commandes d'une file d'attente ThingSpeak™ Talkback et les utiliser pour modifier l'état du voyant intégré.
Utilisez Talkback lorsque votre application implique une machine que vous souhaitez exécuter uniquement lorsqu'il y a une commande dans la file d'attente.

Dans cet exemple, vous écrivez TURN_ON ou TURN_OFF dans une file d'attente TalkBack et le périphérique modifie l'état de la LED intégrée pour correspondre à la commande. Utilisez l'application TalkBack pour stocker les commandes de votre appareil. Utilisez l'interface Web ou les commandes HTTP pour écrire des commandes de périphérique dans une liste. Vous pouvez stocker jusqu'à 8 000 commandes dans la liste. Chaque fois que l' appareil lit la liste de commandes, il lit une seule commande et supprime la dernière commande de la liste.

Matériel supporté
ESP32
Conditions préalables
Vous devez avoir au moins un canal configuré pour compléter cet exemple. Créez un canal comme indiqué dans Collect Data in a New Channel et enregistrez la clé API d'écriture. Vous devez également configurer un Talkback. Accédez à Apps > TalkBacks et choisissez New TalkBack.
Ajouter des commandes à la file d'attente TalkBack
Vous pouvez ajouter des commandes à une file d'attente Talkback de deux manières.
Utilisez l'interface Web ThingSpeak TalkBack pour ajouter des commandes à la file d'attente TalkBack. Vous pouvez configurer Talkback pour avoir jusqu'à 8 000 commandes.
Utilisez l'API ThingSpeak. Vous pouvez utiliser une requête HTTP POST pour ajouter une commande à la file d'attente. Dans le POST suivant, remplacez
TALKBACK_ID,YOUR_TALKBACK_API_KEY,TALKBACK_COMMANDetPOSITION_NUMBERpar les valeurs appropriées pour votre canal.
POST https://api.thingspeak.com/talkbacks/TALKBACK_ID/commands
api_key=YOUR_TALKBACK_API_KEY
command_string=TALKBACK_COMMAND
position=POSITION_NUMBER
Programmez votre ESP32
1) Téléchargez le dernier IDE Arduino®.
2) Installez le noyau ESP32. Pour plus d'informations, voir Installer la prise en charge Arduino ESP32.
3) Dans le menu Tools, sélectionnez le port et la carte appropriés dans l'IDE Arduino. Cet exemple est testé à l'aide de l'option Sparkfun ESP32 Thing .
4) Collez le code dans l'IDE Arduino. Ajoutez les informations de votre réseau Wi-Fi, votre clé d'API Talkback et votre numéro Talkback.
5) Programmez l'appareil , puis regardez le moniteur série et la LED pour observer les changements lorsque les commandes sont consommées. Chaque commande exécutée est supprimée de la liste. Vous devez ajouter d'autres commandes à la liste après leur utilisation.
Code
1) Commencez par inclure les bibliothèques appropriées et définissez les variables. Saisissez le SSID et le mot de passe de votre réseau. Entrez votre numéro de canal et vos paramètres TalkBack : myTalkBackID et mon TalkBackKey.
/*
FetchCommandFromTalkBack
Description: Checks a TalkBack queue every 60 seconds and set the state of the build in LED according
to the latest command fetched. Turn the LED on and off by using the commands TURN_ON and TURN_OFF.
The TalkBack documentation can be found at https://www.mathworks.com/help/thingspeak/talkback-app.html.
Hardware: ESP32-based boards
Notes:
- Requires installation of EPS32 core.
- Select the target hardware from the Tools > Board menu
Copyright 2018, The MathWorks, Inc.
*/
#include <WiFi.h>
char ssid[] = <enter your SSID>; // Your network SSID (name)
char pass[] = <enter your password>; // Your network password
WiFiClient client;
unsigned long myTalkBackID = <enter your TalkBack ID>;
const char * myTalkBackKey = <enter your TalkBack API key>;
2) Dans la fonction setup, initialisez la LED et démarrez le moniteur série.
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // Set up LED
Serial.begin(115200); // Initialize serial
WiFi.mode(WIFI_STA);
}
3) Dans la boucle principale, commencez par établir une connexion au réseau Wi-Fi local. Créez le message POST avec les paramètres corrects. Envoyez la requête POST, vérifiez le résultat et recherchez une commande Talkback. Attendez 60 secondes et vérifiez à nouveau la file d'attente.
void loop() {
// Connect or reconnect to Wi-Fi
if(WiFi.status() != WL_CONNECTED){
Serial.print("Attempting to connect to SSID: ");
Serial.println(String(ssid));
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, pass);
Serial.print(".");
delay(5000);
}
Serial.println("\nConnected.");
}
// Create the TalkBack URI
String tbURI = String("/talkbacks/") + String(myTalkBackID) + String("/commands/execute");
// Create the message body for the POST out of the values
String postMessage = String("api_key=") + String(myTalkBackKey);
// Make a string for any commands that might be in the queue
String newCommand = String();
// Make the POST to ThingSpeak
int x = httpPOST(tbURI, postMessage, newCommand);
client.stop();
// Check the result
if(x == 200){
Serial.println("checking queue...");
// check for a command returned from TalkBack
if(newCommand.length() != 0){
Serial.print(" Latest command from queue: ");
Serial.println(newCommand);
if(newCommand == "TURN_ON"){
digitalWrite(LED_BUILTIN, HIGH);
}
if(newCommand == "TURN_OFF"){
digitalWrite(LED_BUILTIN, LOW);
}
}
else{
Serial.println(" Nothing new.");
}
}
else{
Serial.println("Problem checking queue. HTTP error code " + String(x));
}
delay(60000); // Wait 60 seconds to check queue again
}
4) Utilisez la fonction httpPOST pour lire la prochaine commande TalkBack.
// General function to POST to ThingSpeak
int httpPOST(String uri, String postMessage, String &response){
bool connectSuccess = false;
connectSuccess = client.connect("api.thingspeak.com",80);
if(!connectSuccess){
return -301;
}
postMessage += "&headers=false";
String Headers = String("POST ") + uri + String(" HTTP/1.1\r\n") +
String("Host: api.thingspeak.com\r\n") +
String("Content-Type: application/x-www-form-urlencoded\r\n") +
String("Connection: close\r\n") +
String("Content-Length: ") + String(postMessage.length()) +
String("\r\n\r\n");
client.print(Headers);
client.print(postMessage);
long startWaitForResponseAt = millis();
while(client.available() == 0 && millis() - startWaitForResponseAt < 5000){
delay(100);
}
if(client.available() == 0){
return -304; // Didn't get server response in time
}
if(!client.find(const_cast<char *>("HTTP/1.1"))){
return -303; // Couldn't parse response (didn't find HTTP/1.1)
}
int status = client.parseInt();
if(status != 200){
return status;
}
if(!client.find(const_cast<char *>("\n\r\n"))){
return -303;
}
String tempString = String(client.readString());
response = tempString;
return status;
}