Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

Mise à jour des canaux et contrôle de la lumière avec ESP8266

Cet exemple montre comment mettre à jour un canal et récupérer des commandes à partir d'une file d'attente ThingSpeak™ Talkback . Utilisez les commandes pour modifier l'état de la LED intégrée.

Utilisez Talkback lorsque votre application implique une machine que vous souhaitez exécuter uniquement lorsqu'il y a une commande dans la file d'attente.

Vous pouvez simultanément mettre à jour votre canal et récupérer la dernière commande enregistrée dans une file d'attente Talkback . Ajoutez le paramètre talkback_key à votre requête POST et ThingSpeak renvoie la dernière commande Talkback dans la réponse.

Matériel pris en charge

  • ESP8266 et autres cartes basées sur ESP8266

  • NodeMCU

  • Wemos

Conditions préalables

Vous devez avoir au moins un canal configuré pour compléter cet exemple. Créez un canal comme indiqué dans Collect Data in a New Channel et enregistrez la clé d'API en écriture. Vous devez également configurer un Talkback. Allez dans Applications > TalkBacks et choisissez Nouveau Talkback.

Ajouter des commandes à la file d'attente Talkback

Vous pouvez ajouter des commandes à une file d'attente Talkback de deux manières.

  • Utilisez l'interface Web ThingSpeak TalkBack pour ajouter des commandes à la file d'attente Talkback . Vous pouvez configurer Talkback pour avoir jusqu'à 8000 commandes.

  • Utilisez l'API ThingSpeak . Vous pouvez utiliser une requête HTTP POST pour ajouter une commande à la file d'attente. Dans le POST suivant, remplacez les TALKBACK_ID, YOUR_TALKBACK_API_KEY, TALKBACK_COMMAND et POSITION_NUMBER.

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

 Programmez votre ESP8266 

1) Téléchargez le dernier IDE Arduino®.

2) Ajoutez le package de carte ESP8266.

3) Sous Fichier > Préférences , entrez https://arduino.esp8266.com/stable/package_esp8266com_index.json dans URL supplémentaires du gestionnaire de cartes .

4) Choisissez Tools > Boards > Board Manager. Saisissez ESP8266 dans la barre de recherche, puis sélectionnez et installez le package.

5) Dans le menu Outils , sélectionnez le port et la carte appropriés dans l'IDE Arduino. Le hardware utilisé pour générer cet exemple utilisait l'option Node MCU 1.0 (ESP 8266–12E).

6) Collez le code dans l'IDE Arduino. Ajoutez les informations de votre réseau Wi-Fi, votre clé d'API Talkback et votre numéro Talkback .

7) Programmez l' appareil , puis regardez le moniteur série et la LED pour observer les changements lorsque les commandes sont consommées. Chaque commande exécutée est supprimée de la liste. Vous devez ajouter d'autres commandes à la liste après leur utilisation.

Code

1) Commencez par inclure les bibliothèques appropriées et définissez les variables. Saisissez le SSID et le mot de passe de votre réseau. Modifiez le numéro de canal et les paramètres Talkback pour l'ID et la clé d'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) Dans la fonction setup, initialisez la LED et démarrez le moniteur série.

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

3) Dans la boucle principale, commencez par établir une connexion au réseau Wi-Fi local. Créez le message POST à ​​partir des nombres générés aléatoirement. Envoyez le POST, vérifiez le résultat et recherchez une commande Talkback . Générez ensuite de nouveaux nombres aléatoires pour la prochaine requête POST en 20 secondes.

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) Utilisez la fonction httpPOST pour publier des données sur ThingSpeak et lire la commande Talkback suivante.

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