Main Content

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

Prototypage avec capteur de proximité Sonar

Cet exemple montre comment prototyper avec ThingSpeak™ en utilisant une carte Arduino® connectée en Wi-Fi.

Vous lisez et écrivez des données de canal avec la bibliothèque de communication ThingSpeak . Dans cet exemple, un seuil réglable est lu à partir de ThingSpeak pour créer un détecteur de proximité. Le hardware se compose d'un Arduino MKR100 avec un capteur sonar et une LED indiquant la présence d'un objet.

Le prototypage d'un projet de capteur peut nécessiter plusieurs reflashages du code pour affiner les paramètres d'étalonnage, tels que ceux d'un capteur de température. Un ajustement hardware ajoute de la complexité, réduit la fiabilité et peut être difficile à atteindre lorsque votre projet est déployé. Au lieu de cela, vous pouvez lire les paramètres d'étalonnage de ThingSpeak et modifier les paramètres en temps réel. Vous pouvez améliorer la qualité de vos mesures lorsque vous ajustez un paramètre de réglage stocké sur ThingSpeak.

Matériel pris en charge

  • Arduino MKR1000

  • Arduino Uno, Mega, Due ou Leonardo avec un réseau sans fil ou une connexion Ethernet

  • Particle Photon (avec quelques ajustements de code et de schéma)

Dans cet exemple, un capteur sonar surveille une agrafeuse et publie la mesure sur votre canal. Le capteur sonar fonctionne en envoyant une impulsion sonore et en mesurant le temps nécessaire pour que l'impulsion revienne d'un objet. Le système utilise le seuil de distance lu à partir de ThingSpeak et compare le seuil à la distance mesurée. Le voyant est allumé lorsque l'agrafeuse est présente.

PrototypingWithSonarProximitySensorTSExample_01.png

Après avoir terminé cet exemple, vous verrez les données de proximité et les paramètres de votre canal. La vue des canaux ThingSpeak affiche les données et paramètres de proximité suivants :

  • Le seuil est fixé à 15 cm

  • Dix mesures sont prises pour chaque moyenne

  • L'indicateur de lecture est défini pour forcer la lecture des paramètres d'étalonnage

  • Les données montrent que quelqu'un a  emprunté  l'agrafeuse à 11 h du matin, la remettant plus tard dans une nouvelle position

Matériel requis

  • Arduino MKR1000 ou autre Arduino avec connexion Ethernet ou réseau sans fil

  • Capteur sonar HC-SR04

  • Fils de liaison (au moins 4)

  • DIRIGÉ

  • Petite résistance (100 Ω – 1 kΩ)

  • cable USB

Configuration du canal

1) Créez un canal ThingSpeak , comme indiqué dans Collect Data in a New Channel. Enregistrez les données dans le premier champ et enregistrez les paramètres de appareil dans des champs successifs. Les paramètres de appareil incluent le seuil de distance, le nombre de mesures à moyenner et un indicateur pour contrôler si l' appareil met à jour les paramètres sur chaque boucle.

2) Activez les champs 1, 2, 3 et 4 dans la vue  Paramètres des canaux . Pour distinguer les champs, fournissez un nom descriptif pour chaque champ. Cette image montre un seul canal configuré pour collecter des données dans le premier champ et stocker les paramètres d'étalonnage dans les champs 2, 3 et 4.

3) Notez les clés API de lecture et d'écriture appropriées dans l'onglet Clés API dans la vue Paramètres du canal (encerclées dans l'image).

4) Renseignez vos champs d'étalonnage à l'aide d'une fenêtre de navigateur. Vous pouvez copier le texte depuis l'onglet Clés API ou modifier ce texte avec votre clé d'API' écriture. Saisissez chaque URL directement dans la barre d'adresse de votre navigateur, en remplaçant VOTRE CLÉ API D'ÉCRITURE par la clé d'API' écriture de votre canal.

un. Réglez le seuil de détection d'un objet (50 cm est un bon point de départ) :

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

b. Définissez le nombre de mesures sur la moyenne :

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

c. Définissez l'indicateur de contrôle pour que l' appareil vérifie périodiquement les nouveaux paramètres :

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

Le navigateur renvoie le nombre d'entrées dans le canal. Si vous venez de créer le canal, vous voyez 1, 2 et 3 lorsque vous remplissez les trois champs d'étalonnage requis.

Schéma et connexions

1) Connectez VCC à 5 V sur le MKR-1000.

2) Connectez la masse du capteur à la masse Arduino.

3) Connectez la broche Trig à la broche Arduino 8.

4) Connectez la broche Echo à la broche Arduino 12.

5) Connectez une résistance à la broche 5 de l'Arduino et connectez la résistance à un indicateur LED. Connectez l'anode de la LED à la terre.

Programmez votre Arduino

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

2) Ajoutez le ThingSpeak Library for Arduino and ESP8266 au gestionnaire de bibliothèque. Sélectionnez Sketch > Include Library > Manage Libraries. Sélectionnez ThingSpeak pour l'ajouter à votre figure.

3) Ajoutez la bibliothèque WiFi101 dans le gestionnaire de bibliothèque. Remarque : »Assurez-vous d'installer la version 0.13 de la bibliothèque. Il y a un bug dans la version 0.14 qui fait échouer les messages. Sélectionnez Sketch > Include Library > Manage Libraries. Sélectionnez WiFi101 pour l'ajouter à votre figure.

4) Créez l'application. Ouvrez une nouvelle fenêtre dans l'IDE Arduino et enregistrez le fichier. Ajoutez le code fourni dans la section Code. Assurez-vous de modifier les informations sur le réseau sans fil, l'ID du canal et les clés API.

5) Après avoir téléchargé avec succès votre programme, vous pouvez surveiller la sortie à l'aide du moniteur série. Si un objet est présent à une distance inférieure au seuil défini, votre appareil affiche la distance sur votre canal. Essayez d'expérimenter le nombre de mesures à moyenner et voyez comment vos fluctuations mesurées changent. Une fois que vous avez défini les paramètres, vous pouvez modifier la valeur de l'indicateur de lecture de 1 à 0. Une fois que votre appareil lit cet indicateur comme 0, il arrête de vérifier ThingSpeak pour les paramètres, économisant de l'énergie et de la bande passante.

Code

1) Inclure les bibliothèques et initialiser les broches de contrôle.

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

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

2) Définir et initialiser les variables. Assurez-vous de modifier les informations sur le réseau sans fil, l'ID du canal et les clés API. Recherchez l'identifiant de votre canal en haut de la page principale de votre 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) Initialisez les broches d'entrée et de sortie et lisez les paramètres d'étalonnage pour la première fois dans la routine 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) Chaque fois que la boucle principale s'exécute, effectuez plusieurs mesures. Si les données n'ont pas été écrites sur ThingSpeak pendant un certain temps, écrivez les données sur le canal de sortie . De plus, si l'indicateur de lecture a été lu pour la dernière fois comme vrai, vérifiez les données d'étalonnage et les indicateurs à chaque cycle.

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) Utilisez ces fonctions pour lire et écrire des données vers et depuis 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) Utilisez getDistance pour obtenir une seule mesure du capteur.

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) Connectez votre appareil à un réseau sans fil à l'aide de la fonction 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);
  }