Contenuto principale

Questa pagina è stata tradotta con la traduzione automatica. Fai clic qui per vedere l'ultima versione in inglese.

Aggiornamento dei canali e controllo della luce su Arduino

Questo esempio mostra come aggiornare il tuo canale e recuperare i comandi da una coda TalkBack ThingSpeak™ . Utilizza i comandi per modificare lo stato del LED integrato.

Utilizza TalkBack quando la tua applicazione coinvolge un computer che desideri eseguire solo quando è presente un comando in coda.

Puoi aggiornare contemporaneamente il tuo canale e recuperare l'ultimo comando salvato in una coda TalkBack. Aggiungi il parametro talkback_key alla tua richiesta POST e ThingSpeak restituirà l'ultimo comando TalkBack nella risposta.

Hardware supportato

  • Arduino Uno o scheda Arduino simile con Wi-Fi Shield

  • MKR1000

Prerequisiti

È necessario avere almeno un canale configurato per completare questo esempio. Crea un canale come mostrato in Collect Data in a New Channel e registra la chiave API di scrittura. È inoltre necessario impostare un TalkBack. Vai su App > TalkBacks e seleziona Nuovo TalkBack.

Aggiungi comandi alla coda TalkBack

Puoi aggiungere comandi a una coda TalkBack in due modi.

  • Utilizzare l'interfaccia Web ThingSpeak TalkBack per aggiungere comandi alla coda TalkBack. Puoi configurare TalkBack per avere fino a 8000 comandi.

  • Utilizza l'API ThingSpeak . È possibile utilizzare una richiesta HTTP POST per aggiungere un comando alla coda. Nel seguente POST, sostituire TALKBACK_ID, YOUR_TALKBACK_API_KEY, TALKBACK_COMMAND e POSITION_NUMBER con il valore appropriato valori dal 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 dispositivo

1) Scarica l'ultimo IDE Arduino®.

2) Aggiungi WiFi101 al Gestore della libreria, se non è già presente.

a) Seleziona Schizzo > Includi libreria > Gestisci librerie.

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

3) Aggiungi SPI al Gestore della libreria, se non è già presente.

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

b) Seleziona SPI per aggiungerlo al tuo schizzo.

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

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

6) Programmare il dispositivo e quindi osservare il monitor seriale e il LED per osservare i cambiamenti quando vengono utilizzati i comandi. Ogni comando eseguito viene rimosso dall'elenco. È necessario aggiungere più comandi all'elenco dopo che sono stati utilizzati.

Codice

1) Inizia includendo le librerie appropriate e definendo le variabili. Inserisci il SSID e la password della tua rete. Modifica il numero del canale e i parametri TalkBack per ID e chiave API.

/*
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: Arduino Wi-Fi Shield 101

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 this 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 "ThingSpeak.h"
#include <SPI.h>
#include <WiFi101.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>;

// Some values to send to ThingSpeak
int number1 = 0;
int number2 = random(0,100);
int number3 = random(0,100);
int number4 = random(0,100);

2) Nella funzione setup inizializzare il LED e avviare il monitor seriale.

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

3) Nel circuito principale, iniziare stabilendo una connessione alla rete wireless locale. Crea il messaggio POST dai numeri generati casualmente. Invia la richiesta POST, verifica il risultato e controlla la presenza di un comando TalkBack. Quindi genera nuovi numeri casuali per il prossimo aggiornamento del canale entro 20 secondi.

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) Utilizza la funzione httpPOST per pubblicare dati su ThingSpeak e leggere il successivo comando TalkBack.

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