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 un computer che desideri eseguire solo quando è presente un comando in coda.
Puoi aggiornare contemporaneamente il tuo canale e recuperare l'ultimo comando salvato in una coda 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
NodoMCU
Wemos
Prerequisiti
È necessario avere almeno un canale configurato per completare questo esempio. Crea un canale come mostrato in Collect Data in a New Channel e registra la chiave API di scrittura. È inoltre necessario impostare un TalkBack. Vai su App > TalkBacks e seleziona Nuovo TalkBack.
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_COMMAND
ePOSITION_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'ultimo IDE Arduino®.
2) Aggiungi il pacchetto scheda ESP8266.
3) Sotto File > Preferenze, inserisci https://arduino.esp8266.com/stable/package_esp8266com_index.json in Ulteriori URL del Board Manager.
4) Scegli Tools
> Boards
> Board Manager
. Inserisci ESP8266
nella barra di ricerca, quindi seleziona e installa il pacchetto.
5) Nel menu Strumenti, selezionare 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 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 comando eseguito 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. Inserisci il 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 circuito principale, inizia stabilendo una connessione alla rete Wi-Fi locale. Crea il messaggio POST dai numeri generati casualmente. Invia il POST, verifica il risultato e controlla la presenza di un comando TalkBack. Quindi genera nuovi numeri casuali per la successiva richiesta POST in 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 inviare 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; }