主要内容

本页采用了机器翻译。点击此处可查看英文原文。

使用 ESP32 上的 TalkBack 控制灯光

此示例显示如何从 ThingSpeak™ TalkBack 队列中获取命令并使用它们来改变板载 LED 的状态。

当您的应用程序涉及仅当队列中有命令时才想要运行的计算机时,请使用 TalkBack。

在此示例中,您将 TURN_ONTURN_OFF 写入 TalkBack 队列,设备会更改板载 LED 的状态以匹配命令。使用 TalkBack App 存储设备命令。使用 Web 界面或 HTTP 命令将设备命令写入列表。您可以在列表中存储最多 8000 条命令。每次设备读取命令列表时,它会读取一条命令并从列表中删除最新的命令。

支持的硬件

  • ESP32

前提条件

您必须至少设置一个通道才能完成此示例。按照在新通道中收集数据所示创建一个通道,并记录写入 API Key。您还需要设置 TalkBack。转至 Apps > TalkBacks,然后选择 New TalkBack

将命令添加到 TalkBack 队列

您可以通过以下两种方式之一将命令添加到 TalkBack 队列。

  • 使用 ThingSpeak TalkBack 网络界面将命令添加到 TalkBack 队列。您可以将 TalkBack 配置为最多 8000 条命令。

  • 使用 ThingSpeak API。您可以使用 HTTP POST 请求将命令添加到队列。在以下 POST 中,将 TALKBACK_IDYOUR_TALKBACK_API_KEYTALKBACK_COMMANDPOSITION_NUMBER 替换为您的通道的适当值。

POST https://api.thingspeak.com/talkbacks/TALKBACK_ID/commands
 api_key=YOUR_TALKBACK_API_KEY
     command_string=TALKBACK_COMMAND
     position=POSITION_NUMBER

对 ESP32 进行编程

1) 下载最新的 Arduino®IDE。

2) 安装 ESP32 核心。有关更多信息,请参阅安装 Arduino ESP32 支持

3) 在 Tools 菜单中,选择 Arduino IDE 中适当的端口和主板。此示例使用 Sparkfun ESP32 Thing 选项进行测试。

4) 将代码粘贴到 Arduino IDE。添加您的 Wi-Fi 网络信息、您的 TalkBack API 密钥和您的 TalkBack 号码。

5) 对设备进行编程,然后观察串行监视器和 LED,以观察命令被使用时的变化。每个执行的命令都会从列表中删除。使用完命令后,您需要将更多命令添加到列表中。

代码

1)首先包含适当的库并定义变量。输入您的网络 SSID 和密码。输入您的通道号和 TalkBack 参数:myTalkBackID 和我的 TalkBackKey

/*
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) 在 setup 函数中,初始化 LED 并启动串口监视器。

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);  // Set up LED
  Serial.begin(115200);          // Initialize serial
  WiFi.mode(WIFI_STA);
}

3) 在主循环中,首先建立与本地 Wi-Fi 网络的连接。使用正确的参数创建 POST 消息。发送 POST 请求,验证结果并检查 TalkBack 命令。等待 60 秒然后再次检查队列。

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) 使用 httpPOST 函数读取下一个 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;
}