Steuern Sie ein Licht mit TalkBack auf ESP32
Dieses Beispiel zeigt, wie Befehle aus einer ThingSpeak™ TalkBack-Warteschlange abgerufen und zum Ändern des Status der integrierten LED verwendet werden.
Verwenden Sie TalkBack, wenn Ihre Anwendung einen Computer umfasst, den Sie nur ausführen möchten, wenn sich ein Befehl in der Warteschlange befindet.
In diesem Beispiel schreiben Sie TURN_ON
oder TURN_OFF
in eine TalkBack-Warteschlange und das Gerät ändert den Status der integrierten LED entsprechend dem Befehl. Verwenden Sie TalkBack App , um Befehle für Ihr Gerät zu speichern. Verwenden Sie die Befehle web interface oder HTTP, um Gerätebefehle in eine Liste zu schreiben. Sie können bis zu 8000 Befehle in der Liste speichern. Jedes Mal, wenn das Gerät die Befehlsliste liest, liest es einen einzelnen Befehl und entfernt den neuesten Befehl aus der Liste.
Unterstützte Hardware
ESP32
Voraussetzungen
Um dieses Beispiel abzuschließen, muss mindestens ein Kanal eingerichtet sein. Erstellen Sie einen Kanal wie in Collect Data in a New Channel gezeigt und notieren Sie den Schreib-API-Schlüssel. Sie müssen außerdem ein TalkBack einrichten. Gehen Sie zu „Apps“ > „TalkBacks“ und wählen Sie „Neues TalkBack“.
Befehle zur TalkBack-Warteschlange hinzufügen
Sie können einer TalkBack-Warteschlange auf zwei Arten Befehle hinzufügen.
Verwenden Sie die ThingSpeak TalkBack- Weboberfläche, um Befehle zur TalkBack-Warteschlange hinzuzufügen. Sie können TalkBack so konfigurieren, dass es bis zu 8000 Befehle hat.
Verwenden Sie die ThingSpeak API. Sie können eine HTTP-POST-Anfrage verwenden, um der Warteschlange einen Befehl hinzuzufügen. Ersetzen Sie im folgenden POST
TALKBACK_ID
,YOUR_TALKBACK_API_KEY
,TALKBACK_COMMAND
undPOSITION_NUMBER
durch die entsprechenden Werte für deinen Kanal.
POST https://api.thingspeak.com/talkbacks/TALKBACK_ID/commands api_key=YOUR_TALKBACK_API_KEY command_string=TALKBACK_COMMAND position=POSITION_NUMBER
Programmieren Sie Ihren ESP32
1) Laden Sie die neueste Arduino® IDE herunter.
2) Installieren Sie den ESP32-Kern. Weitere Informationen finden Sie Install Arduino ESP32 Support.
3) Wählen Sie im Menü „Extras“ den entsprechenden Port und das entsprechende Board in der Arduino IDE aus. Dieses Beispiel wird mit der Option Sparkfun ESP32 Thing
getestet.
4) Fügen Sie den Code in die Arduino IDE ein. Fügen Sie Ihre WLAN-Netzwerkinformationen, Ihren TalkBack-API-Schlüssel und Ihre TalkBack-Nummer hinzu.
5) Programmieren Sie das Gerät und beobachten Sie dann den seriellen Monitor und die LED, um Änderungen zu beobachten, wenn Befehle verbraucht werden. Jeder ausgeführte Befehl wird aus der Liste entfernt. Sie müssen der Liste weitere Befehle hinzufügen, nachdem diese verbraucht wurden.
Code
1) Beginnen Sie mit der Einbindung der entsprechenden Bibliotheken und der Definition von Variablen. Geben Sie Ihre Netzwerk-SSID und Ihr Passwort ein. Geben Sie Ihre Kanalnummer und TalkBack-Parameter ein: myTalkBackID
und myTalkBackKey
.
/* 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) Initialisieren Sie in der Funktion setup
die LED und starten Sie den seriellen Monitor.
void setup() { pinMode(LED_BUILTIN, OUTPUT); // Set up LED Serial.begin(115200); // Initialize serial WiFi.mode(WIFI_STA); }
3) Beginnen Sie in der Hauptschleife damit, eine Verbindung zum lokalen WLAN-Netzwerk herzustellen. Erstellen Sie die POST-Nachricht mit den richtigen Parametern. Senden Sie die POST-Anfrage, überprüfen Sie das Ergebnis und suchen Sie nach einem TalkBack-Befehl. Warten Sie 60 Sekunden und überprüfen Sie die Warteschlange erneut.
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) Verwenden Sie die Funktion httpPOST
, um den nächsten TalkBack-Befehl zu lesen.
// 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; }