Aggiornamento del canale e controllo della luce con ESP8266
Questo esempio mostra come aggiornare un canale e recuperare i comandi da una coda TalkBack ThingSpeak ™. Utilizzare i comandi per modificare lo stato del LED integrato.
Utilizza TalkBack quando la tua applicazione coinvolge una macchina che vuoi eseguire solo quando c'è un comando nella coda.

Puoi aggiornare contemporaneamente il tuo canale e recuperare l'ultimo comando salvato in una coda di TalkBack. Aggiungi il parametro talkback_key alla tua richiesta POST e ThingSpeak restituirà l'ultimo comando TalkBack nella risposta.

Hardware supportato
ESP8266 e altre schede basate su ESP8266
NodeMCU
Wemos
Prerequisiti
Per completare questo esempio è necessario avere almeno un canale configurato. Crea un canale come mostrato in Raccogli dati in un nuovo canale e registra la chiave API di scrittura. È inoltre necessario impostare un TalkBack. Vai su App > TalkBack e scegli Nuovo TalkBack.

Aggiungi comandi alla coda di TalkBack
È possibile aggiungere comandi a una coda TalkBack in due modi.
Utilizzare l'interfaccia web ThingSpeak TalkBack per aggiungere comandi alla coda di TalkBack. È possibile configurare TalkBack in modo che contenga fino a 8000 comandi.
Utilizzare l'API ThingSpeak. È possibile utilizzare una richiesta HTTP POST per aggiungere un comando alla coda. Nel POST seguente, sostituire
TALKBACK_ID,YOUR_TALKBACK_API_KEY,TALKBACK_COMMANDePOSITION_NUMBER.
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 ESP8266
1) Scarica l'ultima versione di Arduino® IDE.
2) Aggiungere il pacchetto della scheda ESP8266.
3) In File > Preferenze, inserisci https://arduino.esp8266.com/stable/package_esp8266com_index.json in URL aggiuntivi del gestore schede.
4) Scegli Tools > Boards > Board Manager. Inserisci ESP8266 nella barra di ricerca, quindi seleziona e installa il pacchetto.
5) Nel menu Strumenti, seleziona la porta e la scheda appropriate nell'IDE di Arduino. L'hardware utilizzato per generare questo esempio utilizzava l'opzione Node MCU 1.0 (ESP 8266–12E).
6) Incolla il codice nell'IDE di Arduino. Aggiungi le informazioni sulla tua rete Wi-Fi, la tua 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 eseguiti i comandi. Ogni comando eseguito viene rimosso dall'elenco. Dopo averli utilizzati, è necessario aggiungere altri comandi all'elenco.
Codice
1) Iniziare includendo le librerie appropriate e definendo le variabili. Inserisci l'SSID e la password della tua rete. Modifica il numero del canale e i parametri TalkBack per ID e chiave API.
/*
WriteMultipleFieldsAndFetchCommandFromTalkBack
Description: Writes values to fields 1,2,3, and 4 and checks a TalkBack queue every 20 seconds for new commands.
The TalkBack documentation can be found at https://www.mathworks.com/help/thingspeak/talkback-app.html.
Hardware: ESP8266-based boards
Notes:
- Requires ESP8266WiFi library and ESP8266 board add-on. See https://github.com/esp8266/Arduino for details.
- Select the target hardware from Tools > Board
Copyright 2018, The MathWorks, Inc.
*/
#include <ESP8266WiFi.h>
char ssid[] = <enter your SSID>; // your network SSID (name)
char pass[] = <enter your password>; // your network password
WiFiClient client;
unsigned long myChannelNumber = <enter your channel ID>;
unsigned long myTalkBackID = <enter your TalkBack ID>;
const char * myTalkBackKey = <enter your TalkBack API key>;
// Initialize values for ThingSpeak updates
int number1 = 0;
int number2 = random(0,100);
int number3 = random(0,100);
int number4 = random(0,100);
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 ciclo principale, iniziare stabilendo una connessione alla rete Wi-Fi locale. Crea il messaggio POST dai numeri generati casualmente. Invia il POST, verifica il risultato e controlla se è presente un comando TalkBack. Quindi genera nuovi numeri casuali per la successiva richiesta POST tra 20 secondi.
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 message body for the POST out of the values
String postMessage = String("field1=") + String(number1) +
String("&field2=") + String(number2) +
String("&field3=") + String(number3) +
String("&field4=") + String(number4) +
String("&api_key=") + String(myWriteAPIKey) +
String("&talkback_key=") + String(myTalkBackKey);
// Make a string for any commands in the queue
String newCommand = String();
// Make the POST to ThingSpeak
int x = httpPOST(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));
}
// Confirm code works by changing values
number1++;
if(number1 > 99){
number1 = 0;
}
number2 = random(0,100);
number3 = random(0,100);
number4 = random(0,100);
delay(20000); // Wait 20 seconds to update the channel again
}
4) Utilizzare la funzione httpPOST per post dati a ThingSpeak e leggere il successivo comando TalkBack.
// General function to POST to ThingSpeak
int httpPOST(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 /update 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;
}