Main Content

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Prototyping mit Sonar-Näherungssensor

Dieses Beispiel zeigt, wie ein Prototyp mit ThingSpeak™ mithilfe eines über WLAN verbundenen Arduino®-Boards erstellt wird.

Sie lesen und schreiben Kanaldaten mit der ThingSpeak Communication Library. In diesem Beispiel wird ein einstellbarer Schwellenwert aus ThingSpeak gelesen, um einen Näherungsdetektor zu erstellen. Die Hardware besteht aus einem Arduino MKR100 mit einem Sonarsensor und einer Anzeige-LED, die anzeigt, ob ein Objekt vorhanden ist.

Für die Prototypenerstellung eines Sensorprojekts kann ein mehrfaches erneutes Flashen des Codes erforderlich sein, um die Kalibrierungsparameter, beispielsweise für einen Temperatursensor, zu optimieren. Eine Hardwareanpassung erhöht die Komplexität, verringert die Zuverlässigkeit und kann bei der Bereitstellung Ihres Projekts schwierig zu erreichen sein. Stattdessen können Sie Kalibrierungsparameter von ThingSpeak auslesen und die Parameter in Echtzeit ändern. Sie können die Qualität Ihrer Messungen verbessern, indem Sie einen auf ThingSpeak gespeicherten Tuning-Parameter anpassen.

Unterstützte Hardware

  • Arduino MKR1000

  • Arduino Uno, Mega, Due oder Leonardo mit einem drahtlosen Netzwerk oder einer Ethernet-Verbindung

  • Particle Photon (mit einigen Code- und schematischen Anpassungen)

In diesem Beispiel überwacht ein Sonarsensor einen Hefter und sendet die Messung an Ihren Kanal. Der Sonarsensor sendet einen Schallimpuls und misst die Zeit, die der Impuls benötigt, um von einem Objekt zurückzukehren. Das System verwendet den von ThingSpeak gelesenen Entfernungsschwellenwert und vergleicht den Schwellenwert mit der gemessenen Entfernung. Die LED leuchtet, wenn der Hefter vorhanden ist.

PrototypingWithSonarProximitySensorTSExample_01.png

Nachdem Sie dieses Beispiel abgeschlossen haben, werden Ihnen die Näherungsdaten und die Einstellungen in Ihrem Kanal angezeigt. Die ThingSpeak Kanalansicht zeigt die folgenden Näherungsdaten und -einstellungen:

  • Der Schwellenwert ist auf 15 cm festgelegt

  • Für jeden Durchschnitt werden zehn Messungen durchgeführt

  • Das Leseflag ist gesetzt, um das Lesen der Kalibrierungsparameter zu erzwingen

  • Den Daten zufolge hat sich jemand den Hefter um 11 Uhr morgens „ausgeliehen“ und ihn später an einer neuen Position zurückgebracht

Erforderliche Hardware

  • Arduino MKR1000 oder ein anderes Arduino mit Ethernet- oder drahtloser Netzwerkverbindung

  • Sonarsensor HC-SR04

  • Überbrückungskabel (mindestens 4)

  • LED

  • Kleiner Widerstand (100 Ω – 1 kΩ)

  • USB-Kabel

Kanal-Setup

1) Erstellen Sie einen ThingSpeak Kanal, wie in Collect Data in a New Channel gezeigt. Speichern Sie die Daten im ersten Feld und die Geräteeinstellungen in den folgenden Feldern. Zu den Geräteeinstellungen gehören der Entfernungsschwellenwert, die Anzahl der zu mittelnden Messungen und ein Flag zur Steuerung, ob das Gerät die Einstellungen in jeder Schleife aktualisiert.

2) Aktivieren Sie die Felder 1, 2, 3 und 4 in der Ansicht „Kanaleinstellungen“. Um die Felder zu unterscheiden, geben Sie für jedes Feld einen beschreibenden Namen ein. Dieses Bild zeigt einen einzelnen Kanal, der so konfiguriert ist, dass er Daten im ersten Feld sammelt und die Kalibrierungsparameter in den Feldern 2, 3 und 4 speichert.

3) Notieren Sie sich die entsprechenden Lese- und Schreib-API-Schlüssel auf der Registerkarte „API-Schlüssel“ in der Ansicht „Kanaleinstellungen“ (im Bild eingekreist).

4) Füllen Sie Ihre Kalibrierungsfelder über ein Browserfenster aus. Sie können den Text aus der Registerkarte „API-Schlüssel“ kopieren oder diesen Text mit Ihrem Schreib-API-Schlüssel ändern. Geben Sie jede URL direkt in die Adressleiste Ihres Browsers ein und ändern Sie IHREN SCHREIB-API-SCHLÜSSEL in den Schreib-API-Schlüssel für Ihren Kanal.

A. Legen Sie den Schwellenwert für die Erkennung eines Objekts fest (50 cm ist ein guter Ausgangspunkt):

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

B. Stellen Sie die Anzahl der Messungen auf „Mittelwert“ ein:

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

c. Setzen Sie das Kontrollflag, damit das Gerät regelmäßig nach neuen Einstellungen sucht:

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

Der Browser gibt die Anzahl der Einträge im Kanal zurück. Wenn Sie den Kanal gerade erst erstellt haben, sehen Sie beim Ausfüllen der drei erforderlichen Kalibrierungsfelder eine 1, 2 und 3.

Schaltplan und Anschlüsse

1) VCC an 5 V am MKR-1000 anschließen.

2) Verbinden Sie die Sensormasse mit der Arduino-Masse.

3) Verbinden Sie den Trig-Pin mit Arduino-Pin 8.

4) Verbinden Sie den Echo-Pin mit Arduino-Pin 12.

5) Schließen Sie einen Widerstand an Arduino Pin 5 an und verbinden Sie den Widerstand mit einer Anzeige-LED. Verbinden Sie die Anode der LED mit der Erde.

Programmieren Sie Ihr Arduino

1) Laden Sie die neueste Arduino-IDE herunter.

2) Fügen Sie ThingSpeak Library for Arduino and ESP8266 zum Bibliotheksmanager hinzu. Wählen Sie Sketch > Include Library > Manage Libraries. Wählen Sie ThingSpeak aus, um es Ihrer Skizze hinzuzufügen.

3) Fügen Sie die Bibliothek WiFi101 im Bibliotheksmanager hinzu. Hinweis: Stellen Sie sicher, dass Sie Version 0.13 der Bibliothek installieren. In Version 0.14 gibt es einen Fehler, der dazu führt, dass Beiträge fehlschlagen. Wählen Sie Sketch > Include Library > Manage Libraries. Wählen Sie WiFi101 aus, um es Ihrer Skizze hinzuzufügen.

4) Erstellen Sie die Anwendung. Öffnen Sie ein neues Fenster in der Arduino IDE und speichern Sie die Datei. Fügen Sie den im Abschnitt „Code“ bereitgestellten Code hinzu. Stellen Sie sicher, dass Sie die Informationen zum drahtlosen Netzwerk, die Kanal-ID und die API-Schlüssel bearbeiten.

5) Nachdem Sie Ihr Programm erfolgreich hochgeladen haben, können Sie die Ausgabe mit dem seriellen Monitor überwachen. Wenn sich ein Objekt in einer Entfernung befindet, die geringer als der eingestellte Schwellenwert ist, sendet Ihr Gerät die Entfernung an Ihren Kanal. Versuchen Sie, mit der Anzahl der zu mittelnden Messungen zu experimentieren und sehen Sie, wie sich Ihre gemessenen Schwankungen ändern. Sobald Sie Parameter festgelegt haben, können Sie den Wert des Leseflags von 1 in 0 ändern. Sobald Ihr Gerät dieses Flag als 0 liest, hört es auf, ThingSpeak auf Parameter zu prüfen, wodurch Strom und Bandbreite gespart werden.

Code

1) Binden Sie Bibliotheken ein und initialisieren Sie die Steuerpins.

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

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

2) Definieren und initialisieren Sie die Variablen. Stellen Sie sicher, dass Sie die Informationen zum drahtlosen Netzwerk, die Kanal-ID und die API-Schlüssel bearbeiten. Finden Sie Ihre Kanal-ID oben auf der Hauptseite Ihres Kanals.

// 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) Initialisieren Sie die Pins für Ein- und Ausgang und lesen Sie die Kalibrierungsparameter zum ersten Mal in der 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) Nehmen Sie bei jeder Ausführung der Hauptschleife mehrere Messungen vor. Wenn die Daten längere Zeit nicht in ThingSpeak geschrieben wurden, schreiben Sie die Daten in den Ausgabekanal. Wenn das Leseflag zuletzt als wahr gelesen wurde, überprüfen Sie außerdem die Kalibrierungsdaten und Flags in jedem Zyklus.

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) Verwenden Sie diese Funktionen, um Daten von und in ThingSpeak zu lesen und zu schreiben.

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) Verwenden Sie getDistance , um eine einzelne Messung vom Sensor zu erhalten.

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) Verbinden Sie Ihr Gerät mit der Funktion connectWiFi mit einem drahtlosen Netzwerk.

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