Controla una luz con TalkBack en ESP8266
Este ejemplo muestra cómo obtener comandos de una cola de ThingSpeak™ TalkBack y luego usar los comandos para cambiar el estado del LED integrado.
Use TalkBack cuando su aplicación involucre una máquina que desee ejecutar solo cuando haya un comando en la cola.
En este ejemplo, escribes TURN_ON
o TURN_OFF
a su cola de TalkBack y el dispositivo cambia el estado del LED integrado para que coincida con el comando. Utilizar el Aplicación TalkBack a través de interfaz web o comandos HTTP para escribir comandos de dispositivos en una lista. Puede almacenar hasta 8000 comandos en la lista. Cada vez que el dispositivo lee la lista de comandos, lee un solo comando y lo elimina de la lista.
Hardware compatible
Dispositivos basados en ESP8266
NodoMCU
Wemos
requisitos previos
Debe tener al menos un canal configurado para completar este ejemplo. Cree un canal como se muestra en Recopilar datos en un nuevo canal y registre la clave API de escritura. También debe configurar un TalkBack. Ir aplicaciones > TalkBack y elige Nuevo TalkBack.
Agregar comandos a la cola de TalkBack
Puede agregar comandos a una cola de TalkBack de dos maneras.
Usar ThingSpeak Replicar interfaz web para agregar comandos a la cola de TalkBack. Puede configurar TalkBack para tener hasta 8000 comandos.
Utilice la API de ThingSpeak. Puede usar una solicitud HTTP POST para agregar un comando a la cola. En el siguiente POST, reemplace
TALKBACK_ID
,YOUR_TALKBACK_API_KEY
,TALKBACK_COMMAND
, yPOSITION_NUMBER
con los valores apropiados para tu canal.
POST https://api.thingspeak.com/talkbacks/TALKBACK_ID/commands api_key=YOUR_TALKBACK_API_KEY command_string=TALKBACK_COMMAND position=POSITION_NUMBER
Programa tu dispositivo
1) Descargue el último IDE de Arduino®.
2) Agregue el paquete de placa ESP8266.
3) Bajo Expediente > preferencias , ingresar https://arduino.esp8266.com/stable/package_esp8266com_index.json
dentro URL adicionales de Board Manager.
4) Elige Tools
> Boards
> Board Manager
. Ingresar ESP8266
en la barra de búsqueda, luego seleccione e instale el paquete.
5) En el Instrumentos seleccione el puerto y la placa adecuados en el IDE de Arduino. El hardware usado para generar este ejemplo usó el Node MCU 1.0 (ESP 8266–12E)
opción.
6) Pegue el código en el IDE de Arduino. Agregue su información de red, su clave API de TalkBack y su número de TalkBack.
7) Programe el dispositivo y luego mire el monitor serial y el LED para observar los cambios cuando se consumen los comandos. Cada comando que se ejecuta se elimina de la lista. Debe agregar más comandos a la lista después de que se consuman.
Código
1) Comience por incluir las bibliotecas apropiadas y definir variables. Ingrese el SSID y la contraseña de su red. Ingresa tu número de canal y los parámetros de TalkBack: myTalkBackID
y myTalkBackKey
.
/* WiFi FetchCommandFromTalkBack Description: Checks a TalkBack queue every 60 seconds and sets 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: ESP8266-based boards 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 myTalkBackID = <enter your TalkBack ID>; const char * myTalkBackKey = <enter your TalkBack API key>;
2) En el setup
función, inicialice el LED e inicie el monitor serie.
void setup() { pinMode(LED_BUILTIN, OUTPUT); // Set up LED Serial.begin(115200); // Initialize serial }
3) En el bucle principal, comience por establecer una conexión a la red Wi-Fi local. Cree el mensaje POST con los parámetros correctos. Realice la solicitud POST, verifique el resultado y busque un comando TalkBack. Espere 60 segundos y verifique la cola nuevamente.
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) Usa el httpPOST
función para leer el siguiente comando de 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; }