Contenuto principale

Questa pagina è stata tradotta con la traduzione automatica. Fai clic qui per vedere l’originale in inglese.

Controllare una luce con TalkBack su Arduino

Questo esempio mostra come recuperare i comandi da una coda TalkBack ThingSpeak ™ e utilizzarli per modificare lo stato del LED integrato.

Utilizza TalkBack quando la tua applicazione coinvolge una macchina che vuoi eseguire solo quando c'è un comando nella coda.

In questo esempio, scrivi TURN_ON o TURN_OFF in una coda TalkBack e il dispositivo modifica lo stato del LED integrato per adattarlo al comando. Utilizza l'app ThingSpeak TalkBack per memorizzare i comandi per il tuo dispositivo. È possibile utilizzare l'interfaccia web o i comandi HTTP per scrivere i comandi del dispositivo in un elenco. È possibile memorizzare fino a 8000 comandi nell'elenco. Ogni volta che il dispositivo legge l'elenco dei comandi, legge un singolo comando e rimuove l'ultimo comando dall'elenco.

Hardware supportato

  • Arduino UNO o simile con modulo Wi-Fi o connettività Wi-Fi

  • MKR1000

Prerequisiti

Imposta un TalkBack per eseguire questo esempio. Vai su App > TalkBack e scegli Nuovo TalkBack. Quindi, aggiungi i comandi alla coda.

Aggiungi comandi alla coda di TalkBack

È possibile aggiungere comandi a una coda TalkBack in due modi.

  • Utilizzare l'interfaccia web ThingSpeak TalkBack per aggiungere comandi alla coda di TalkBack. È possibile configurare TalkBack in modo che contenga fino a 8000 comandi.

  • Utilizzare l'API ThingSpeak. È possibile utilizzare una richiesta HTTP POST per aggiungere un comando alla coda. Nel POST seguente, sostituisci TALKBACK_ID, YOUR_TALKBACK_API_KEY, TALKBACK_COMMAND e POSITION_NUMBER con i valori appropriati del tuo canale.

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

Programma il tuo Arduino

1) Scarica l'ultima versione di Arduino® IDE.

2) Aggiungere WiFi101 al Gestore librerie, se non è già presente.

a) Seleziona Schizzo > Includi libreria > Gestisci librerie. Cerca WiFi101.

b) Selezionare la libreria WiFi101 e fare clic su Installa.

3) Aggiungere la libreria WiFi101 allo sketch.

a) Seleziona Schizzo > Includi libreria > Gestisci librerie.

b) Seleziona WiFi101 per aggiungerlo al tuo schizzo.

4) Aggiungere la libreria SPI allo sketch.

a) Seleziona Schizzo > Includi libreria > Gestisci librerie.

b) Seleziona SPI per aggiungerlo al tuo schizzo.

5) Nel menu Strumenti, seleziona la porta e la scheda appropriate nell'IDE di Arduino.

6) Incolla il codice nell'IDE di Arduino. Aggiungi le informazioni sulla tua rete Wi-Fi, la tua chiave API TalkBack e il tuo numero TalkBack.

7) Programmare il dispositivo e quindi osservare il monitor seriale e il LED per osservare i cambiamenti quando vengono eseguiti i comandi. Ogni volta che un comando viene eseguito, viene rimosso dall'elenco. Dopo averli utilizzati, è necessario aggiungere altri comandi all'elenco.

Codice

1) Iniziare includendo le librerie appropriate e definendo le variabili.

/*
FetchCommandFromTalkBack

Description: Checks a TalkBack queue every 60 seconds and set 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: Arduino WiFi Shield 101 or MKR

Notes:
 - Requires WiFi101 library. Use the WiFi101 library version 0.13.0 or older. WiFi101 library versions 0.14.0 and newer have a bug
   that prevents the ThingSpeak library from working properly.
 - Make sure the WiFi Shield 101 has updated firmware. Find instructions at https://www.arduino.cc/en/Tutorial/FirmwareUpdater.

Copyright 2018, The MathWorks, Inc.
*/

#include <SPI.h>  // Required for shield communication
#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) Nella funzione setup, inizializza il LED e avvia il monitor seriale.

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

3) Nel ciclo principale, iniziare stabilendo una connessione alla rete WiFi locale. Creare il messaggio POST con i parametri corretti. Invia la richiesta POST, verifica il risultato e controlla se è presente un comando TalkBack. Attendi 60 secondi e controlla nuovamente la coda.

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 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) Utilizzare la funzione httpPOST per leggere il comando TalkBack successivo.

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