Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Creación de prototipos con sensor de proximidad de sonda

Este ejemplo muestra cómo crear un prototipo con ThingSpeak™ usando una placa Arduino® conectada a Wi-Fi.

Usted lee y escribe datos de canales con la biblioteca de comunicación ThingSpeak. En este ejemplo, se lee un umbral ajustable desde ThingSpeak para crear un detector de proximidad. El hardware consta de un Arduino MKR100 con un sensor de sonda y un LED indicador para mostrar cuando hay un objeto presente.

La creación de un prototipo de un proyecto de sensor puede requerir varias actualizaciones del código para ajustar los parámetros de calibración, como los de un sensor de temperatura. Un ajuste de hardware agrega complejidad, reduce la confiabilidad y puede ser difícil de alcanzar cuando se implementa su proyecto. En su lugar, puede leer los parámetros de calibración desde ThingSpeak y cambiarlos en tiempo real. Puede mejorar la calidad de sus mediciones cuando ajusta un parámetro de sintonización almacenado en ThingSpeak.

Hardware compatible

  • Arduino MKR1000

  • Arduino Uno, Mega, Due o Leonardo con red inalámbrica o conexión Ethernet

  • Particle Photon (con algo de código y ajustes esquemáticos)

En este ejemplo, un sensor de sonda monitorea una grapadora y publica la medición en su canal. El sensor de sonar funciona enviando un pulso de sonido y midiendo el tiempo que tarda el pulso en regresar de un objeto. El sistema utiliza el umbral de distancia leído de ThingSpeak y compara el umbral con la distancia medida. El LED está encendido cuando la grapadora está presente.

PrototypingWithSonarProximitySensorTSExample_01.png

Después de completar este ejemplo, verá los datos de proximidad y la configuración en su canal. La vista del canal ThingSpeak muestra los siguientes datos y configuraciones de proximidad:

  • El umbral se establece en 15 cm.

  • Se toman diez mediciones para cada promedio.

  • El indicador de lectura está configurado para forzar la lectura de los parámetros de calibración.

  • Los datos muestran que alguien "tomó prestada" la grapadora a las 11 a.m. y la devolvió más tarde a una nueva posición.

Hardware requerido

  • Arduino MKR1000 u otro Arduino con conexión de red Ethernet o inalámbrica

  • Sensor de sonda HC-SR04

  • Cables de puente (al menos 4)

  • CONDUJO

  • Resistencia pequeña (100 Ω – 1 kΩ)

  • cable USB

Configuración del canal

1) Cree un canal ThingSpeak, como se muestra en Collect Data in a New Channel. Almacene los datos en el primer campo y almacene la configuración del dispositivo en campos sucesivos. La configuración del dispositivo incluye el umbral de distancia, el número de mediciones a promediar y una bandera para controlar si el dispositivo actualiza la configuración en cada bucle.

2) Habilite los campos 1, 2, 3 y 4 en la vista Configuración del canal. Para distinguir entre los campos, proporcione un nombre descriptivo para cada campo. Esta imagen muestra un único canal configurado para recopilar datos en el primer campo y almacenar los parámetros de calibración en los campos 2, 3 y 4.

3) Anote las claves API de lectura y escritura apropiadas en la pestaña Claves API en la vista Configuración del canal (encerrada en un círculo en la imagen).

4) Complete sus campos de calibración usando una ventana del navegador. Puede copiar el texto de la pestaña Claves API o modificar este texto con su clave API de escritura. Ingrese cada URL directamente en la barra de direcciones de su navegador, cambiando SU CLAVE API DE ESCRITURA por la clave API de escritura para su canal.

a. Establezca el umbral para detectar un objeto (50 cm es un buen punto de partida):

https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field2=THRESHOLD

b. Establezca el número de mediciones en promedio:

https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field3=NUMTOAVERAGE

c. Configure el indicador de control para que el dispositivo compruebe periódicamente si hay nuevas configuraciones:

https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field4=1

El navegador devuelve el número de entradas en el canal. Si acaba de crear el canal, verá un 1, 2 y 3 cuando complete los tres campos de calibración requeridos.

Esquema y conexiones

1) Conecte VCC a 5 V en el MKR-1000.

2) Conecte la tierra del sensor a la tierra de Arduino.

3) Conecte el pin Trig al pin 8 de Arduino.

4) Conecte el pin Echo al pin 12 de Arduino.

5) Conecte una resistencia al pin 5 de Arduino y conecte la resistencia a un LED indicador. Conecte el ánodo del LED a tierra.

Programa tu Arduino

1) Descargue el último IDE de Arduino.

2) Agregue el ThingSpeak Library for Arduino and ESP8266 al administrador de la biblioteca. Seleccione Sketch > Include Library > Manage Libraries. Seleccione ThingSpeak para agregarlo a su boceto.

3) Agregue la biblioteca WiFi101 en el administrador de biblioteca. Nota: Asegúrese de instalar la versión 0.13 de la biblioteca. Hay un error en la versión 0.14 que hace que las publicaciones fallen. Seleccione Sketch > Include Library > Manage Libraries. Seleccione WiFi101 para agregarlo a su boceto.

4) Crea la aplicación. Abra una nueva ventana en el IDE de Arduino y guarde el archivo. Agregue el código proporcionado en la sección Código. Asegúrese de editar la información de la red inalámbrica, la ID del canal y las claves API.

5) Después de cargar exitosamente su programa, puede monitorear la salida usando el monitor serial. Si un objeto está presente a una distancia más cercana que el umbral establecido, entonces su dispositivo publica la distancia en su canal. Intente experimentar con la cantidad de mediciones para promediar y vea cómo cambian las fluctuaciones medidas. Una vez que establezca los parámetros, puede cambiar el valor del indicador de lectura de 1 a 0. Una vez que su dispositivo lee este indicador como 0, deja de verificar los parámetros de ThingSpeak, lo que ahorra energía y ancho de banda.

Código

1) Incluir bibliotecas e inicializar los pines de control.

#include <ThingSpeak.h>
#include<WiFi101.h>

#define triggerPin 8
#define echoPin 12
#define LEDpin 6

2) Definir e inicializar las variables. Asegúrese de editar la información de la red inalámbrica, la ID del canal y las claves API. Encuentra el ID de tu canal en la parte superior de la página principal de tu canal.

// Network information
const char* ssid = "SSID";
const char* password = "xxxxxxxxxx";

// ThingSpeak information
char* writeAPIKey = "XXXXXXXXXXXXXXXX";
char* readAPIKey = "YYYYYYYYYYYYYYYY"; 
const long channelID = 000000; 
const unsigned int firstReadFieldNumber = 2;
const unsigned int secondReadFieldNumber = 3; 
const unsigned int switchField = 4; // Field number (1-8) to use to change status of device.  Determines if data is read from ThingSpeak.

// Other constants
const unsigned long postingInterval = 60L * 1000L;   // Post data every 60 seconds

// Global variables
unsigned long lastConnectionTime = 0;
long lastUpdateTime = 0;
float distanceThreshold = 0;
bool getInfo = 1;  // Set this to zero if you don’t want to read data from ThingSpeak anymore (i.e. calibration complete)
int points = 7; 
WiFiClient client; 

3) Inicialice los pines de entrada y salida, y lea los parámetros de calibración por primera vez en la rutina setup .

void setup() {
  Serial.begin (9600); 
  pinMode(triggerPin, OUTPUT); 
  pinMode(LEDpin, OUTPUT);
  pinMode(echoPin, INPUT);
  connectWifi();
  Serial.println("Start");

  // Get the initial parameters from ThingSpeak.
  distanceThreshold = readTSData(channelID,firstReadFieldNumber,readAPIKey); 
  points = readTSData(channelID,secondReadFieldNumber,readAPIKey);   
}

4) Cada vez que se ejecuta el bucle principal, tome varias medidas. Si los datos no se han escrito en ThingSpeak durante un tiempo, escríbalos en el canal de salida. Además, si la última vez que el indicador de lectura fue leído como verdadero, verifique los datos de calibración y los indicadores en cada ciclo.

void loop() {
  
  float  distance=0;

  // Make sure there is an Internet connection.
  if(WiFi.status() != WL_CONNECTED){
    
    connectWifi();  
    }

     for (uint16_t loops = 0; loops < points; loops++){
      distance += getDistance(triggerPin,echoPin);  //make a measurement, store the sum of all measurements
      delay(5);  
     }
     
     distance = distance/points;
     
    if (distance < distanceThreshold){
      digitalWrite(LEDpin,HIGH);
      }
    
     else{
      
      digitalWrite(LEDpin,LOW); 
      }
      
     
     Serial.println("Ave: "+ String(distance)+ " cm");
      
    if (millis() - lastUpdateTime >=  postingInterval) {  
      
      lastUpdateTime = millis();
      
           if (!(getInfo==0)){
            
            distanceThreshold = readTSData(channelID,firstReadFieldNumber,readAPIKey);
            points = readTSData(channelID,secondReadFieldNumber,readAPIKey);
            getInfo = (bool)readTSData(channelID,switchField,readAPIKey);
            }
            
       if (distance < distanceThreshold){
        
      // Write data to ThingSpeak channel.
       writeTSData(channelID, 1, distance, writeAPIKey);
       }
       
      }
      
    delay(500);    // Provide some delay between measurements.
    
}

5) Utilice estas funciones para leer y escribir datos hacia y desde ThingSpeak.

int writeTSData(long TSChannel,unsigned int TSField,float data,char* ReadAPIKey){
  int  writeSuccess = ThingSpeak.writeField(TSChannel, TSField, data, writeAPIKey); //write the data to the channel
  return writeSuccess;
}

// Use this function if you want multiple fields simultaneously.
/*
int writeTDData(long TSChannel,unsigned int TSField1,float data1,unsigned int TSField2,data2,char* ReadAPIKey){
  ThingSpeak.setField(TSField1,data1);
  ThingSpeak.setField(TSField1,data2);
   
  writeSuccess = ThingSpeak.writeFields(TSChannel, writeAPIKey);
  return writeSuccess;
}
*/
 
float readTSData(long TSChannel,unsigned int TSField,char* ReadAPIKey){
  
  float data = 0;
  
  data = ThingSpeak.readFloatField(TSChannel,TSField,ReadAPIKey);
  Serial.println(" Data read from ThingSpeak "+String(data));
  return data;
}

6) Utilice getDistance para obtener una única medición del sensor.

float getDistance(int tPin,int ePin){
  
  long duration, distance;
    
  digitalWrite(tPin, LOW);  // Reset the trigger pin.
  delayMicroseconds(2); 
  digitalWrite(tPin, HIGH);  // Start a measurement.
  delayMicroseconds(10); // 
  digitalWrite(tPin, LOW);   // Complete the pulse.
  duration = pulseIn(ePin, HIGH);  // Wait for a reflection pulse.
  distance = (duration/2) / 29.1;     // Calculate the appropriate distance using the estimated speed of sound.

  // This section is useful when debugging the sensor.
/*
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
   Serial.print(distance);
   Serial.println(" cm");
  }
  */
  return distance;
}

7) Conecte su dispositivo a una red inalámbrica usando la función connectWiFi .

int connectWifi(){
     
    while (WiFi.status() != WL_CONNECTED) {
       WiFi.begin(ssid, password);
       delay(2500);
       Serial.println("Connecting to WiFi");
    }
    
    Serial.println("Connected");
    ThingSpeak.begin(client);
  }