Prototyping mit Sonar-Näherungssensor
Dieses Beispiel zeigt, wie Sie mit ThingSpeak ™ unter Verwendung einer über WLAN verbundenen Arduino®-Platine einen Prototyp erstellen.
Sie lesen und schreiben Kanaldaten mit der ThingSpeak-Kommunikationsbibliothek. 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, wenn ein Objekt vorhanden ist.
Beim Prototyping eines Sensorprojekts kann es erforderlich sein, den Code mehrfach neu zu flashen, um die Kalibrierungsparameter, beispielsweise für einen Temperatursensor, fein abzustimmen. Eine Hardwareanpassung erhöht die Komplexität, verringert die Zuverlässigkeit und kann bei der Bereitstellung Ihres Projekts schwer zu erreichen sein. Stattdessen können Sie Kalibrierungsparameter von ThingSpeak lesen 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 drahtlosem Netzwerk oder Ethernet-Verbindung
Particle Photon (mit einigen Code- und Schemaanpassungen)
In diesem Beispiel überwacht ein Sonarsensor einen Hefter und sendet die Messung an Ihren Kanal. Der Sonarsensor funktioniert, indem er einen Schallimpuls sendet und die Zeit misst, die der Impuls benötigt, um von einem Objekt zurückzukehren. Das System verwendet den aus ThingSpeak gelesenen Entfernungsschwellenwert und vergleicht den Schwellenwert mit der gemessenen Entfernung. Die LED leuchtet, wenn der Hefter vorhanden ist.

Nachdem Sie dieses Beispiel abgeschlossen haben, werden Ihnen die Näherungsdaten und die Einstellungen in Ihrem Kanal angezeigt. Die Kanalansicht von ThingSpeak zeigt die folgenden Näherungsdaten und Einstellungen:
Die Schwelle ist auf 15 cm eingestellt
Für jeden Durchschnitt werden zehn Messungen durchgeführt
Das Lese-Flag ist gesetzt, um das Lesen der Kalibrierungsparameter zu erzwingen
Daten zeigen, dass jemand den Hefter um 11 Uhr „ausgeliehen“ und ihn später an eine neue Position zurückgebracht hat

Erforderliche Hardware
Arduino MKR1000 oder anderer Arduino mit Ethernet- oder drahtloser Netzwerkverbindung
HC-SR04 Sonarsensor
Überbrückungskabel (mindestens 4)
LED
Kleiner Widerstand (100 Ω – 1 kΩ)
USB-Kabel
Kanal-Setup
1) Erstellen Sie einen ThingSpeak-Kanal, wie unter Daten in einem neuen Kanal sammeln gezeigt. Speichern Sie die Daten im ersten Feld und speichern Sie die Geräteeinstellungen in den nachfolgenden Feldern. Zu den Geräteeinstellungen gehören der Entfernungsschwellenwert, die Anzahl der zu mittelnden Messungen und ein Flag, mit dem gesteuert wird, ob das Gerät die Einstellungen bei jeder Schleife aktualisiert.
2) Aktivieren Sie die Felder 1, 2, 3 und 4 in der Ansicht Kanaleinstellungen. Um zwischen den Feldern zu unterscheiden, geben Sie für jedes Feld einen beschreibenden Namen an. Dieses Bild zeigt einen einzelnen Kanal, der so konfiguriert ist, dass er im ersten Feld Daten sammelt und die Kalibrierungsparameter in den Feldern 2, 3 und 4 speichert.

3) Beachten Sie sich die entsprechenden Read- und Write-API-Schlüssel auf der Registerkarte API Keys in der Ansicht Channel Settings (im Bild eingekreist).
4) Füllen Sie Ihre Kalibrierungsfelder mithilfe eines Browserfensters aus. Sie können den Text aus der Registerkarte API Keys kopieren oder diesen Text mit Ihrem Write-API-Schlüssel ändern. Geben Sie jede URL direkt in die Adressleiste Ihres Browsers ein und ändern Sie IHREN Write-API-Schlüssel in den Write-API-Schlüssel für Ihren Kanal.
A. Legen Sie den Schwellenwert für die Erkennung eines Objekts fest (50 cm sind ein guter Ausgangspunkt):
https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field2=THRESHOLD
B. Stellen Sie die Anzahl der Messungen auf Durchschnitt 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 erstellt haben, sehen Sie eine 1, 2 und 3, wenn Sie die drei erforderlichen Kalibrierungsfelder ausfüllen.
Schema und Anschlüsse
1) Verbinden Sie VCC mit 5 V am MKR-1000.
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 Masse.

Programmieren Sie Ihren Arduino
1) Laden Sie die neueste Arduino IDE herunter.
2) Fügen Sie die ThingSpeak-Bibliothek für Arduino und 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 Posts 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. Denken Sie daran, die Informationen zum drahtlosen Netzwerk, die Kanal-ID und die API-Schlüssel zu 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 ist als der festgelegte Schwellenwert, sendet Ihr Gerät die Entfernung an Ihren Kanal. Experimentieren Sie mit der Anzahl der zu mittelnden Messungen und beobachten 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) Bibliotheken einbinden und die Steuerpins initialisieren.
#include <ThingSpeak.h> #include<WiFi101.h> #define triggerPin 8 #define echoPin 12 #define LEDpin 6
2) Definieren und initialisieren Sie die Variablen. Denken Sie daran, die Informationen zum drahtlosen Netzwerk, die Kanal-ID und die API-Schlüssel zu bearbeiten. Ihre Kanal-ID finden Sie 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 eine Zeit lang nicht in ThingSpeak geschrieben wurden, schreiben Sie die Daten in den Ausgabekanal. Wenn das Leseflag beim letzten Mal 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 zu 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 mithilfe 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);
}