Controlla una luce con TalkBack su Arduino
Questo esempio mostra come recuperare i comandi da una coda ThingSpeak™ TalkBack e utilizzarli per modificare lo stato del LED integrato.
Utilizza TalkBack quando la tua applicazione coinvolge un computer che desideri eseguire solo quando è presente un comando in coda.

In questo esempio, scrivi TURN_ON o TURN_OFF in una coda TalkBack e il dispositivo modifica lo stato del LED integrato per corrispondere al comando. Utilizza ThingSpeak TalkBack App per memorizzare i comandi per il tuo dispositivo. È possibile utilizzare i comandi web interface o HTTP per scrivere i comandi del dispositivo in un elenco. È possibile memorizzare fino a 8000 comandi nell'elenco. Ogni volta che il dispositivo legge l'elenco dei comandi, legge un singolo comando e rimuove l'ultimo comando dall'elenco.

Hardware supportato
Arduino UNO o simili con modulo Wi-Fi o connettività Wi-Fi
MKR1000
Prerequisiti
Configura un TalkBack per eseguire questo esempio. Vai su App > TalkBacks e seleziona Nuovo TalkBack. Quindi, aggiungi comandi alla coda.

Aggiungi comandi alla coda TalkBack
Puoi aggiungere comandi a una coda TalkBack in due modi.
Utilizzare l'interfaccia Web ThingSpeak TalkBack per aggiungere comandi alla coda TalkBack. Puoi configurare TalkBack per avere fino a 8000 comandi.
Utilizza l'API ThingSpeak . È possibile utilizzare una richiesta HTTP POST per aggiungere un comando alla coda. Nel seguente POST, sostituire
TALKBACK_ID,YOUR_TALKBACK_API_KEY,TALKBACK_COMMANDePOSITION_NUMBERcon i valori appropriati dal tuo canale.
POST https://api.thingspeak.com/talkbacks/TALKBACK_ID/commands
api_key=YOUR_TALKBACK_API_KEY
command_string=TALKBACK_COMMAND
position=POSITION_NUMBER
Programma il tuo Arduino
1) Scarica l'ultimo IDE Arduino®.
2) Aggiungi WiFi101 al Gestore della libreria, se non è già presente.
a) Selezionare Schizzo > Includi libreria > Gestisci librerie. Cerca WiFi101.
b) Selezionare la libreria WiFi101 e fare clic su Installa.
3) Aggiungere la libreria WiFi101 allo schizzo.
a) Selezionare Schizzo > Includi libreria > Gestisci librerie.
b) Seleziona WiFi101 per aggiungerlo al tuo schizzo.
4) Aggiungere la libreria SPI allo schizzo.
a) Selezionare Schizzo > Includi libreria > Gestisci librerie.
b) Seleziona SPI per aggiungerlo al tuo schizzo.
5) Nel menu Strumenti, selezionare la porta e la scheda appropriate nell'IDE di Arduino.
6) Incolla il codice nell'IDE di Arduino. Aggiungi le informazioni sulla tua rete WiFi, la chiave API TalkBack e il tuo numero TalkBack.
7) Programmare il dispositivo e quindi osservare il monitor seriale e il LED per osservare i cambiamenti quando vengono utilizzati i comandi. Ogni volta che viene eseguito un comando, viene rimosso dall'elenco. È necessario aggiungere più comandi all'elenco dopo che sono stati utilizzati.
Codice
1) Inizia includendo le librerie appropriate e definendo le variabili.
/*
FetchCommandFromTalkBack
Description: Checks a TalkBack queue every 60 seconds and set the state of the built-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: Arduino WiFi Shield 101 or MKR
Notes:
- Requires WiFi101 library. Use the WiFi101 library version 0.13.0 or older. WiFi101 library versions 0.14.0 and newer have a bug
that prevents the ThingSpeak library from working properly.
- Make sure the WiFi Shield 101 has updated firmware. Find instructions at https://www.arduino.cc/en/Tutorial/FirmwareUpdater.
Copyright 2018, The MathWorks, Inc.
*/
#include <SPI.h> // Required for shield communication
#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) Nella funzione setup inizializzare il LED e avviare il monitor seriale.
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // Set up LED
Serial.begin(115200); // Initialize serial
}
3) Nel circuito principale, inizia stabilendo una connessione alla rete WiFi locale. Creare il messaggio POST con i parametri corretti. Invia la richiesta POST, verifica il risultato e controlla la presenza di un comando TalkBack. Attendi 60 secondi e controlla nuovamente la coda.
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 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) Utilizzare la funzione httpPOST per leggere il comando TalkBack successivo.
// 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;
}