Main Content

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

使用 ESP32 进行通道更新和灯光控制

此示例展示如何更新通道并从 ThingSpeak™ TalkBack 队列获取命令。使用命令更改板载 LED 的状态。

当您的应用涉及您只想在队列中有命令时运行的计算机时,请使用 TalkBack。

您可以同时更新通道并检索保存在 TalkBack 队列中的最新命令。将参数 talkback_key 添加到 POST请求中,ThingSpeak 将在响应中返回最新的 TalkBack 命令。

支持的硬件

  • ESP32

先决条件

您必须至少设置一个通道才能完成此示例。Create a Channel,如在新通道中收集数据并记录写入API密钥所示。您还需要设置 TalkBack。转到 App > “TalkBacks”并选择“New TalkBack”。

将命令添加到 TalkBack 队列

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

  • 使用 ThingSpeak TalkBack Web 界面将命令添加到 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核心。有关详细信息,请参阅 Install Arduino ESP32 Support

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

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

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

代码

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

WriteMultipleFieldsAndFetchCommandFromTalkBack

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: 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 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) 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 命令。然后生成新的随机数,20 秒后再次发布。

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 that might be 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) 使用 httpPOST 函数将数据发送到 ThingSpeak 并读取下一个 TalkBack 命令。

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;
}