In Teil 1 dieser Reihe hatten wir den Seeeduino XIAO eingerichtet und betriebsbereit gemacht. In Teil 2 hatten wir dann 8 der 16 Sensoren aus dem 16-in-1-Sensorkit verwendet und zwei Miniprojekte erstellt. Jetzt werden wir die restlichen Sensoren nutzen und noch einmal zwei weitere Miniprojekte mit einigen der Sensoren erstellen.
DS1302 Echtzeituhr-Modul
Dies ist ein Echtzeitmodul und wird verwendet, wenn wir das Datum und die Uhrzeit in einem Projekt halten und auslesen müssen. Die CR2032-Batterie muss installiert sein, damit die Konfiguration nicht verloren geht, denn wenn das Modul von der Stromversorgung getrennt wird, werden diese Daten gelöscht und müssen vor der Verwendung neu konfiguriert werden. Um dieses Modul mit dem Seeeduino XIAO Mikrocontroller zu verwenden, können wir die virtuabotixRTC.h Bibliothek verwenden. Laden Sie die Dateien als ZIP herunter und installieren Sie sie über die Bibliotheksverwaltung. Der folgende Code wird verwendet, um den Tag und die Uhrzeit zu konfigurieren. Er wird nur einmal ausgeführt. Um ihn in den Projekten zu verwenden, muss die Zeile myRTC.setDS1302Time(xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx) auskommentiert oder gelöscht werden, sobald der Tag und die Uhrzeit eingestellt wurden.
(Sie können auch andere Bibliotheken und deren Beispiele ausprobieren. Suchen Sie in der Bibliotheksverwaltung nach „DS1302“, dann muss der folgende Code allerdings neu angepasst werden.)
#include <virtuabotixRTC.h> // Library use //Wiring SCLK -> 3, I/O -> 2, CE -> 1 //Or CLK -> 3 , DAT -> 2, Reset -> 1 // If you change the wiring change the pins here also virtuabotixRTC myRTC(3, 2, 1); void setup() { Serial.begin(9600); // Set the current date, and time in the following format: // seconds, minutes, hours, day of the week, day of the month, month, year. myRTC.setDS1302Time(00, 26, 10, 3, 1, 5, 2024); // Here you write your actual time/date as shown above but remember to // "comment/remove" this function once you're done // The setup is done only one time and the module will continue. // counting it automatically } void loop() { // This allows for the update of variables for time or // accessing the individual elements. MyRTC.updateTime(); // Start printing elements as individuals. Serial.print("Current Date / Time: "); // You can switch between day and month if you're using American system. Serial.print(myRTC.dayofmonth); Serial.print("/"); Serial.print(myRTC.month); Serial.print("/"); Serial.print(myRTC.year); Serial.print(" "); Serial.print(myRTC.hours); Serial.print(":"); Serial.print(myRTC.minutes); Serial.print(":"); Serial.println(myRTC.seconds); // Delay so the program doesn't print non-stop delay(1000); }
Sensor zur Hinderniserkennung
Dieses Modul verwendet einen Infrarotlichtsender und -empfänger. Der Sender sendet das Infrarotlichtaus, das von dem Objekt vor ihm reflektiert wird. Das Licht kehrt zum Modul zurück und wird vom Empfängersensor erfasst. Die Standardmessschaltung mit dem LM393-Komparator des Moduls erhält den digitalen Messwert und ändert den Zustand des Signalpins, der an einem Pin des Mikrocontrollers angeschlossen wird. Daraufhin kann eine von uns programmierte Aktion ausgeführt werden. Der Abstand zum Objekt sollte für eine optimale Ablesung zwischen 5 mm und 20 mm betragen. Ein Beispiel für die Verwendung dieses Moduls zusammen mit einem RTC (Real Time Clock)-Modul finden Sie im Artikel über die elektronische Spardose.
(Das RTC-Modul ist nicht das in diesem Bausatz enthaltene, so dass der Code angepasst werden müsste.)
int obstacle_avoid_sensor = 1; int val; void setup() { pinMode(obstacle_avoid_sensor,INPUT); Serial.begin(9600); } void loop() { val=digitalRead(obstacle_avoid_sensor); if(val==HIGH) { Serial.println("HIGH!"); } else { Serial.println("LOW!"); } }
Regensensor
Mit dem Regensensor dieses Bausatzes können Wassertropfen auf der Sensorplatte erkannt werden. Der Bausatz besteht aus zwei Teilen: Das erste ist die MD-RH-Platte mit aufgedruckten Kupferbahnen auf der Oberfläche. Sie verhält sich wie ein variabler Widerstand, dessen Wert sich in Abhängigkeit von der Wassermenge auf der Oberfläche ändert. Je mehr Wasser auf die Messplatte trifft, desto geringer ist der gemessene Widerstand. Der zweite Teil ist ein Messmodul, das einen LM393-Komparator und ein Potentiometer für die Empfindlichkeitseinstellung beherbergt. Der Komparator arbeitet digital oder analog. Der folgende Sketch verwendet sowohl den digitalen Wert (regnet/regnet nicht), als auch den analogen Wert, um die Wassermenge in Prozent anzuzeigen.
#define DIGITAL_PIN 3 #define ANALOG_PIN 1 #define SENSOR_POWER 2 uint16_t rainVal; boolean isRaining = false; String raining; void setup() { Serial.begin(9600); pinMode(DIGITAL_PIN, INPUT); pinMode(SENSOR_POWER, OUTPUT); digitalWrite(SENSOR_POWER, LOW); } void loop() { digitalWrite(SENSOR_POWER, HIGH); delay(10); rainVal = analogRead(ANALOG_PIN); isRaining = digitalRead(DIGITAL_PIN); digitalWrite(SENSOR_POWER, LOW); if (isRaining) { raining = "No"; } else { raining = "Yes"; } rainVal = map(rainVal, 0, 1023, 100, 0); Serial.print("Raining: "); Serial.println(raining); Serial.print("Moisture: "); Serial.print(rainVal); Serial.println("%\n"); delay(1000); }
Feuchte- und Temperatursensor DHT11
Mit dem DHT11-Sensor können wir die Temperatur und die relative Luftfeuchtigkeit mit nur einem Port eines beliebigen Mikrocontrollers ermitteln. Sie können dafür z.B. die DHT Sensor Library verwenden, die über den Bibliotheksverwalter installiert wird. Es wird nur ein Pin benötigt, um beide Werte auszulesen. Der Sensor eignet sich gut für Projekte, bei denen die Messungen nicht sehr genau sein müssen. Es gibt ein Beispiel für die Verwendung in dem Projekt Matrixanzeige, Servos und Klimasensoren. Der folgende Beispielsketch zeigt die Umgebungstemperatur und Luftfeuchtigkeit im Serial Monitor der Arduino IDE.
#include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println(F("DHTxx test!")); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)) { Serial.println(F("Failed to read from DHT sensor!")); return; } Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.print(F("°C ")); Serial.print(f); }
Flammenmelde-Sensor
Das Flammendetektormodul enthält ebenfalls einen LM393-Komparator und ein Potentiometer zur Einstellung der Erkennungsempfindlichkeit. Die wichtigste Komponente dieses Moduls ist der Infrarotempfänger-Sensor, der eine Flamme erkennt. Feuer erzeugt Energie in Form von Wärme und Licht, dessen Lichtspektrum von ultraviolett bis infrarot reicht. Letzteres kann mit dem Sensor detektiert werden. Wir werden das D0-Ausgangssignal des Moduls an Pin 6 unseres Mikrocontrollers anschließen.
int flame_sensor = 6; int val; void setup() { pinMode(LED_BUILTIN, OUTPUT); pinMode(flame_sensor, INPUT); Serial.begin(9600); } void loop() { val = digitalRead(flame_sensor); if(val==HIGH) { digitalWrite(LED_BUILTIN,HIGH); Serial.println("Fire not detected"); } else { digitalWrite(LED_BUILTIN,LOW); Serial.println("Fire detected !!!!"); } }
Gassensor MQ-2
Dieser Sensor dient der Erkennung von Rauch und brennbaren Gasen. Es können Gaskonzentrationen von 300 bis 10000 ppm gemessen werden.
MQ-Gassensoren verwenden eine kleine Heizung mit einem elektrochemischen Sensor, der seinen Widerstand in Abhängigkeit von der Gaskonzentration in der Luft ändert. Die Versorgungsspannung des Moduls muss 5 VDC betragen, damit die Heizung ordnungsgemäß funktioniert. Für ausreichend Strom sollte eine externe Stromquelle verwendet werden. Dieser Sensor wird in Innenräumen bei Raumtemperatur genutzt. Er verfügt über einen digitalen und einen analogen Ausgang.
Das Gasmodul MQ-2 ist in der Lage, LPG, i-Butan, Propan, Methan, Alkohol, Wasserstoff und Rauch aufzuspüren, was bei der Erkennung von Gaslecks und bei Raucherkennung nützlich sein kann.
int smokeA2 = A2; int sensorThres = 400; void setup() { pinMode(smokeA2, INPUT); Serial.begin(9600); } void loop() { int analogSensor = analogRead(smokeA2); Serial.print("Pin A2: "); Serial.println(analogSensor); if (analogSensor > sensorThres) { Serial.println("Gas detected"); } else { Serial.println("No gas detected"); } delay(100); }
Barometrischer Sensor GY-68 BMP180
Dies ist ein kleiner Sensor mit geringem Stromverbrauch, guter Stabilität und hoher Genauigkeit. Er wird häufig verwendet, um den Luftdruck und mit Hilfe von Kompensation der Temperatur die Flughöhe von Drohnen, die Höhenlage von Wetterstationen oder für Navigation zu berechnen. Verwendet wird eine piezo-resistive Technologie. Das Modul kommuniziert über die I2C-Schnittstelle.
Es kann mit einer Spannung von 5V oder 3.3V versorgt werden. Im Falle des Seeeduino XIAO verbinden wir das Modul mit dem 3,3 VDC-Ausgang, die SCL-Leitung mit Pin 5 und die SDA-Leitung mit Pin 4. Wir installieren die BMP180-Bibliothek für Arduino von Adafruit im Bibliotheksverwalter und nutzen Sketch unten. Nach dem Kompilieren und Hochladen werden die Daten im Seriellen Monitor der Arduino IDE angezeigt.
#include <Wire.h> #include <BMP180.h> BMP180 bmp180; void setup() { bmp180.init(); Serial.begin(9600); Serial.println("BMP180 Demo"); if (!bmp180.hasValidID()) { Serial.println("Error - please check the BMP180 board!"); } } void loop() { Serial.print("Temperature: "); Serial.print(bmp180.getTemperature()); Serial.println(" C"); Serial.print("Pressure: "); Serial.print(bmp180.getPressure()); Serial.println(" hPa"); Serial.println(); delay(2000); }
Bodenfeuchtesensor
Der Bodenfeuchtesensor dieses Kits besteht aus einer Sonde mit zwei Elektroden, die in den Boden eingeführt wird, um die Feuchtigkeit zu messen und dem Komparatormodul LM393, um auch hier sowohl analoge, als auch digitale Messwerte zu erhalten. Auch dieses Modul verfügt über ein Potentiometer, um die Empfindlichkeit zu regulieren.
Der digitale Ausgang des Komparatormoduls zwei Zustände an. In unserem Beispiel werden wir ihn verwenden, um die Meldung "Dry" (trocken) oder "Wet" (nass) anzuzeigen. Der Analogausgang liefert eine Spannung zwischen 0V und der Versorgungsspannung des Moduls abhängig von der Leitfähigkeit des Bodens durch die Bodenfeuchtigkeit und wandelt sie in eine entsprechende Zahl zwischen 0 und 1023 um. Bei trockenem Boden ist der Wert 1023, bei völlig durchnässtem Boden ist der Wert 0. Diesen Wert kann man dann wie im folgenden Sketch in Prozent umrechnen.
#define DIGITAL_PIN 3 #define ANALOG_PIN 1 uint16_t humidity_Val; boolean isWet = false; String Wet_soil; void setup() { Serial.begin(9600); pinMode(DIGITAL_PIN, INPUT); } void loop() { humidity_Val = analogRead(ANALOG_PIN); isWet = digitalRead(DIGITAL_PIN); if (isWet) { Wet_soil = "Dry"; } else { Wet_soil = "Wet"; } humidity_Val = map(humidity_Val, 0, 1023, 100, 0); Serial.print("How is the soil? "); Serial.println(Wet_soil); Serial.print("Moisture: "); Serial.print(humidity_Val); Serial.println("%\n"); delay(1000); }
Miniprojekte Teil 2
Bei dieser Gelegenheit werden wir wieder zwei grundlegende Projekte mit den gerade beschriebenen Modulen erstellen. Das eine wird ein einfaches Wetterstations-Miniprojekt sein und das andere ist ein Feuer- und Gasalarm.
Einfache Wetterstation
Für dieses Projekt werden wir den DHT11-Sensor, den GY-68 BMP180-Sensor und den Bodenfeuchtesensor verwenden. Mit dem DHT11-Sensor werden wir die Außentemperatur und die Luftfeuchtigkeit messen. Der GY-68 BMP180-Sensor gibt uns Temperatur und den atmosphärischen Druck. Wir werden bei der Gelegenheit den Unterschied der Temperaturwerte der beiden Sensoren vergleichen. Der Bodenfeuchtesensor wird normalerweise verwendet, um den Feuchtigkeitsgrad im Boden einer Pflanze zu messen. In diesem Fall stellen wir ihn in ein Glas, dessen Volumen wir kennen. Dadurch können wir z.B. Niederschlagsmenge berechnen.
Es ist ein Bastelprojekt und wird uns nicht solche exakten Daten wie in eine professionelle Wetterstation liefern. Der Sketch (Download) wird durch die enthaltenen Kommentare erklärt.
Einfache Brand- und Gasmeldeanlage
Dies ist ein sehr einfacher Aufbau eines Feuer- und Gasmeldealarms. Zusätzlich zum MQ-2- und dem Flammensensor benötigen wir das MB102-Netzteil mit 3,3 VDC- und 5 VDC-Ausgängen, einen bidirektionalen Pegelwandler und das passive Summermodul KY-006. Den Pegelwandler setzen wir ein, da das MQ-2-Modul 5V zum Aufheizen benötigt und am Datenausgang Spannungen von 0V bis 5V liefert. Die Pins des Seeeduino XIAO benötigen jedoch 3,3V. Daher müssen wir diese Spannung anpassen.
Wenn die kontinuierlich durchgeführten Messungen die angegebene Alarmschwelle überschreiten, ertönt der Summer mit einer Frequenz von 700 Hz. Wenn der Flammenmelder feststellt, dass es brennt, ertönt der Alarm ebenfalls und zwar so lange, bis der Mikrocontroller zurückgesetzt wird. In dem Video können Sie sehen, wie es funktioniert. Auch dieser Sketch (Download) wird durch die Kommentare erklärt.
(Sollten die Videos nicht angezeigt werden, kontrollieren Sie bitte die Cookie-Einstellungen Ihres Browsers)
Wir hoffen, dass diese Blogreihe Ihr Interesse geweckt hat und dass die Beispiele der Miniprojekte Ihre Neugierde angeregt haben, andere Projekte mit den Sensoren des 16-in-1-Sensorkits umzusetzen.
2 commenti
Andreas Wolter
@Mausfan: danke für den Hinweis. Wir haben die Links zu den Sketches korrigiert.
Grüße,
Andreas Wolter
AZ-Delivery Blog
mausfan
Vielen Dank für den Blog.
Leider wurde unter den Download-Links nicht das veröffentlicht,
was veröffentlicht werden sollte bzw. verwechselt.
Es fehlt der Sketch zur Wetterstation: da steht jetzt der
fire_and_gas_alarm.ino
Bei der “Einfache Brand- und Gasmeldeanlage” ist der
obstacle_avoidance_sensor.ino unter dem (Download)-Link zu finden.
Ich würde mich freuen, wenn das so schnell wie möglich
korrigiert werden würde.