Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino-Umweltüberwachung

Komponenten und Verbrauchsmaterialien

Arduino MKR1000
× 1
MikroE Environment click
× 1

Notwendige Werkzeuge und Maschinen

Adafruit weibliche/weibliche Überbrückungsdrähte

Apps und Onlinedienste

Arduino-IDE
WolkAbout IoT Platform

Über dieses Projekt

Einführung

Wir hatten einige Umgebungs-Klicksensoren zur Hand, also beschlossen wir, sie an den Arduino MKR1000 anzuschließen und auf der WolkAbout IoT-Plattform zu visualisieren. Die Idee war, jede Minute eine Messung durchzuführen und die Ergebnisse alle 15 Minuten zu veröffentlichen. Wenn die Veröffentlichung der Sensormesswerte fehlschlägt (aufgrund eines ausgelasteten Netzwerks oder eines anderen Problems), sollten die Ergebnisse im Flash-Speicher des Geräts gespeichert werden. Mit einem möglichen Maximum von 96 Schreibvorgängen pro Tag minimieren wir die Wahrscheinlichkeit, dass der Flash-Speicher in einen falschen Zustand versetzt wird (Arduino garantiert 10.000 Schreibzyklen).

Hardware-Setup

Der Umgebungs-Klicksensor wird an die I2C-Kommunikationspins (nämlich 11 und 12 beim MKR1000), Vcc und Masse angeschlossen.

Software-Setup

Wir haben einige Bibliotheken verwendet, um dieses Projekt zu ermöglichen, die alle über den Bibliotheksmanager der Arduino IDE installiert werden können oder indem .zip-Archive aus den in den Anhängen aufgeführten GitHub-Repositorys heruntergeladen und dann zur Arduino IDE hinzugefügt werden. Die erforderlichen Bibliotheken sind:

  • WiFi101
  • Adafruit Unified Sensor Driver
  • Adafruit BME680-Bibliothek
  • RTCZero
  • FlashSpeicher
  • WolkConnect

Sobald alle erforderlichen Bibliotheken installiert sind, kopieren Sie den Inhalt von Umgebungsüberwachung Skizze aus den Anhängen in die Arduino IDE.

Es implementiert eine Struktur eines Ringpuffers und verwendet diese zum Speichern der Messergebnisse. Es gibt auch eine Implementierung zum Speichern dieser Struktur im Flash-Speicher mithilfe der FlashStorage-Bibliothek. Das zeitgesteuerte Lesen und Veröffentlichen der Daten wird durch die Verwendung der RTCZero-Bibliothek erreicht. Nachdem wir eine Verbindung zum WLAN hergestellt haben, senden wir zunächst einen Ping an die WolkAbout IoT-Plattform, um die aktuelle Epoche abzurufen, die in die RTC-Bibliothek eingespeist wird, damit die Sensormesswerte korrekt mit einem Zeitstempel versehen werden können.

Ein Alarminterrupt ändert Flags für Aufgaben, die erledigt werden müssen (Lesen und Veröffentlichen) und der Rest der Arbeit wird in der Schleifenfunktion abgewickelt. Hier prüfen wir, ob wir lesen oder veröffentlichen müssen. Für minimalen Stromverbrauch ist WLAN ebenso wie der MKR1000 auf einen Energiesparmodus eingestellt. Der Sensor des Umgebungsklicks schaltet automatisch auf den Energiesparmodus, bis ein Messwert angefordert wird.

Zu den Änderungen, die an der Skizze vorgenommen werden müssen, gehören die Eingabe von WLAN-Anmeldeinformationen in Zeile 33 und 34:

const char* ssid ="<*IHRE SSID*>";
const char* wifi_pass ="<*IHR WIFI-PASSWORT*>";

sowie die Eingabe von Geräteanmeldeinformationen von WolkAbout IoT Platform.

Um diese Anmeldeinformationen zu erhalten, müssen Sie zuerst ein Gerät erstellen, indem Sie einen Gerätetyp verwenden.

Der Gerätetyp für dieses Projekt, Environment click-deviceType.json, ist in den Anhängen des Projekts verfügbar, also erstellen Sie eine Kopie davon. Melden Sie sich bei WolkAbout IoT Platform an oder erstellen Sie Ihr Konto und öffnen Sie das Gerät Verwaltung Anwendung.

Wählen Sie das Gerät . aus Typ Verwaltung Tab und drücken Sie dann + unterschreiben und Hochladen auswählen und navigieren Sie zu Ihrer lokalen Kopie des Gerätetyps.

Da nun ein Gerätetyp verfügbar ist, können Sie daraus ein Gerät erstellen, indem Sie auf Erstellen klicken Gerät .

Hier müssen Sie Ihrem Gerät einen Namen geben , den Konnektivitätstyp festlegen zu MQTT und aktivieren Sie das Kontrollkästchen für Standard erstellen Semantik (notwendig, um später Widgets auf Ihrem Dashboard zu erstellen).

Drücken Sie Speichern und das Formular mit den Geräteanmeldeinformationen wird angezeigt. Speichern Sie diese Informationen nach Belieben und geben Sie sie dann in Ihre Skizze in der Arduino IDE ein:

const char *device_key ="device_key";
const char *device_password ="device_password";

Jetzt können Sie diese Skizze überprüfen und auf Ihr Board hochladen, aber Sie müssen noch eine Möglichkeit erstellen, die empfangenen Sensordaten anzuzeigen.

Um diese Daten anzuzeigen, wechseln Sie zu Visualisierung und Überwachung Abschnitt auf der WolkAbout IoT Platform und erstellen Sie ein neues Dashboard, indem Sie + Dashboard hinzufügen drücken und Eingeben eines Namens für das Dashboard und Festlegen des Bereichs auf einen beliebigen Gerätenamen. Dann können Sie mit dem Hinzufügen von Widgets zu Ihrem Dashboard beginnen, indem Sie auf Hinzufügen . drücken Widget.

Wählen Sie Trend

und wählen Sie dann Temperatur von Ihrem Gerät.

Wiederholen Sie den Vorgang für Druck und Luftfeuchtigkeit . Erstellen Sie ein weiteres Widget vom Typ Lesen wählen Sie Höhe und erstelle ein weiteres Karten-Widget für Gas Widerstand . Sie können die Widgets nach Belieben neu anordnen.

Nachdem Sie Widgets für den gesamten individuellen Sensormesswert hinzugefügt haben, den Sie von Ihrem Gerät erwarten, ist das folgende Dashboard bereit, die Daten von Ihrem Gerät zu empfangen.

Stellen Sie das Gerät also in der von Ihnen ausgewählten Umgebung bereit und überwachen Sie die Bedingungen aus der Ferne.

Fazit

Durch die Verbindung von Arduino MKR1000 und Environment Click zur WolkAbout IoT-Plattform haben Sie eine energieeffiziente Möglichkeit geschaffen, die Umgebungsbedingungen des Ortes, den Sie aus der Ferne überwachen möchten, zu melden. Diese Lösung kann durch die Verwendung der Regel-Engine von WolkAbout IoT Platform erweitert werden, mit der Sie verschiedene Arten von Benachrichtigungen erhalten können, wenn ein bestimmter Wert einen von Ihnen definierten Schwellenwert überschreitet.

Weitere Informationen zur Regel-Engine und anderen Funktionen der WolkAbout IoT-Plattform finden Sie auf unserer Seite mit den Benutzerhandbüchern.

Code

  • Umweltüberwachungsskizze
  • Umgebung click-deviceType.json
UmweltüberwachungsskizzeArduino
Importieren Sie diese Skizze in die Arduino IDE und bearbeiten Sie die WLAN-Anmeldeinformationen und die Geräteanmeldeinformationen
#include #include #include #include #include #include #include #include "WolkConn.h"#include "MQTTClient.h"/*Anzahl der zu speichernden outbound_message_t*/#define STORAGE_SIZE 32#define SEALEVELPRESSURE_HPA (1013.25)/ *Kreispuffer zum Speichern ausgehender Nachrichten, um sie zu speichern*/typedef struct{ boolean valid; outbound_message_t outbound_messages[STORAGE_SIZE]; uint32_t Kopf; uint32_t Schwanz; boolesch leer; boolean full;} Nachrichten;statische Nachrichtendaten;/*Verbindungsdetails*/const char* ssid ="ssid";const char* wifi_pass ="wifi_pass";const char *device_key ="device_key";const char *device_password ="device_password ";const char* hostname ="api-demo.wolkabout.com";int portno =1883;WiFiClient espClient;PubSubClient client(espClient);/* WolkConnect-Arduino Connector Kontext */static wolk_ctx_t wolk;/* Init Flash Storage * /FlashStorage(flash_store, Messages);/*Init i2c sensor communication*/Adafruit_BME680 bme;RTCZero rtc;bool read;/*Sensor jede Minute lesen. Wenn Sie diesen Parameter ändern, stellen Sie sicher, dass er <60*/const byte readEvery =1;bool publish;/*Publish alle 10 Minuten ist. Wenn Sie diesen Parameter ändern, stellen Sie sicher, dass er <60*/const byte publishEvery =10;byte publishMin;/*Flash-Speicher und benutzerdefinierte Persistenzimplementierung ist*/void _flash_store(){ data.valid =true; flash_store.write(data);}void raise_pointer(uint32_t* pointer){ if ((*pointer) ==(STORAGE_SIZE - 1)) { (*pointer) =0; } else { (*Zeiger)++; }}void _init () { data =flash_store.read (); if (data.valid ==false) { data.head =0; Daten.tail =0; Daten.leer =wahr; data.full =false; }}bool _push(outbound_message_t* outbound_message){ if(data.full) { raise_pointer(&data.head); } memcpy(&data.outbound_messages[data.tail], outbound_message, sizeof(outbound_message_t)); Erhöhter_Zeiger(&data.tail); Daten.leer =falsch; data.full =(data.tail ==data.head); true zurückgeben;}bool _peek(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t)); true zurückgeben;}bool _pop(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t)); raise_pointer(&data.head); data.full =false; data.empty =(data.tail ==data.head); return true;}bool _is_empty(){ return data.empty;}void init_wifi(){ if ( WiFi.status() !=WL_CONNECTED) { while (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { delay(1000 ); } }}void setup_wifi () { Verzögerung (10); if (WiFi.status() !=WL_CONNECTED) { int numAttempts =0; while (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { numAttempts++; if (numAttempts ==10) {Serial.println ("Konnte WLAN nicht erreichen!"); brechen; } Verzögerung (1000); } }}void setup () { pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); /*Ringpufferstruktur initialisieren*/ _init(); init_wifi(); wolk_init(&wolk, NULL, NULL, NULL, NULL, Geräteschlüssel, Gerätepasswort, &client, Hostname, Portnr, PROTOCOL_JSON_SINGLE, NULL, NULL); wolk_init_custom_persistence(&wolk, _push, _peek, _pop, _ist_leer); /*Die Onboard-LED geht an, wenn etwas schief gelaufen ist*/ if(!bme.begin()) { digitalWrite(LED_BUILTIN, HIGH); } /*Sensorinit*/ bme.setTemperatureOversampling (BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling (BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320 * C für 150 ms Verzögerung (200); gelesen =wahr; veröffentlichen =wahr; /*Aktuelle Epoche vom Server holen*/ wolk_connect(&wolk); Verzögerung (100); wolk_update_epoch(&wolk); while (!(wolk.pong_received)) { wolk_process(&wolk); digitalWrite (LED_BUILTIN, HIGH); Verzögerung (1000); } digitalWrite (LED_BUILTIN, LOW); wolk_disconnect(&wolk); rtc.begin(); rtc.setEpoch(wolk.epoch_time); rtc.setAlarmTime(rtc.getHours(), (rtc.getMinutes() + readEvery) % 60, rtc.getSeconds()); rtc.enableAlarm(rtc.MATCH_MMSS); rtc.attachInterrupt(alarmMatch); publizierenMin =(rtc.getMinutes() + publizierenEvery) % 60; WiFi.lowPowerMode();}void loop() { /*Um die Interrupt-Routine so kurz wie möglich zu halten, setzt Routine nur die auszuführenden Aufgaben read =true bedeutet, dass die Sensorauslesung durchgeführt werden soll Publish =true bedeutet, dass die Messwerte sollten auf der Plattform veröffentlicht oder im Flash beibehalten werden, wenn die Verbindung nicht verfügbar ist */ if(read) { read =false; if (!bme.performReading()) { digitalWrite (LED_BUILTIN, HIGH); } wolk_add_numeric_sensor_reading(&wolk, "T", bme.temperature, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "H", bme.humidity, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "P", bme.pressure / 100.0, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "GR", bme.gas_resistance, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "A", bme.readAltitude(SEALEVELPRESSURE_HPA), rtc.getEpoch()); /*neuen Alarm setzen*/ int alarmMin =(rtc.getMinutes() + readEvery) % 60; rtc.setAlarmMinutes(alarmMin); Verzögerung (100); } if(publish) {publish =false; setup_wifi(); wolk_connect(&wolk); if(!wolk.is_connected) { _flash_store(); } Verzögerung (100); if(wolk_publish(&wolk) ==W_TRUE) { _flash_store(); } /*neue Veröffentlichungszeit festlegen*/ publishMin =(rtc.getMinutes() + publishEvery) % 60; Verzögerung (100); wolk_disconnect(&wolk); Verzögerung (100); } Verzögerung (100); }/*Zeitgesteuerte Interrupt-Routine*/void alarmMatch() {lesen =wahr; if(publishMin ==rtc.getMinutes()) { veröffentlichen =wahr; }}
Umgebung click-deviceType.jsonJSON
Gerätetyp, der zum Erstellen eines Geräts auf der WolkAbout IoT Platform verwendet wird
[ { "name":"Environment click", "description":"Gerätetyp für den BME680-Sensor auf der Platine von MikroElektronika Environment Click", "guid":" def68ff6-63c5-4f9c-a066-bcc944b7bd2d", "deviceType":"STANDARD", "protocol":"JSON", "connectivityType":null, "firmwareUpdateType":null, "feeds":[ { "name":" Temperature", "description":null, "reference":"T", "unit":{ "name":"CELSIUS", "guid":"7c805d10-a879-11e9-83cd-0a0027000005" } }, { " name":"Feuchte", "description":null, "reference":"H", "unit":{ "name":"HUMIDITY_PERCENT", "guid":"7c8080a3-a879-11e9-83cd-0a0027000005" } }, { "name":"Pressure", "description":null, "reference":"P", "unit":{ "name":"MILLIBAR", "guid":"7c807980-a879-11e9-83cd -0a0027000005" } }, { "name":"Gas Resistance", "description":null, "reference":"GR", "unit":{ "name":"OHM", "guid":"7c805890- a879-11e9-83cd-0a0027000005" } }, { "name":"Höhe", "Beschreibung":null, "referenc e":"A", "unit":{ "name":"METRE", "guid":"7c805a59-a879-11e9-83cd-0a0027000005" } } ], "actuators":[], "alarms":[], "configs":[], "attributes":[ { "name":"CONNECTIVITY_TYPE", "dataType":"ENUM", "validationRegex":"^(MQTT|HTTP)$", "options":[ "MQTT", "HTTP" ], "defaultValue":"MQTT", "required":true, "readOnly":true }, { "name":"FIRMWARE_UPDATE_ENABLED", "dataType":"BOOLEAN", "validationRegex ":"^(true|false)$", "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FIRMWARE_VERSION", "dataType":"STRING", "validationRegex":null, "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FILE_DIRECT_DOWNLOAD_ENABLED", "dataType":"BOOLEAN ", "validationRegex":"^(true|false)$", "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FILE_URL_DOWNLOAD_ENABLED", "dataType":"BOOLEAN", "validationRegex":"^(true|false)$", "options":null, "defaultValue":null, "required":false, " readOnly":true } ] }]
WolkAbout-Umgebungsüberwachung
Dieses Repository enthält die in diesem Projekt verwendete Arduino-Skizze https://github.com/Wolkabout/Wolk-Arduino-Environment-Monitoring
Arduino WiFi 101-Schild
Wifi-Bibliothek für das Arduino WiFi 101 Shieldhttps://github.com/arduino-libraries/WiFi101
Adafruit Unified Sensor-Treiber
Einheitliche Sensorbibliothek für alle Sensoren erforderlichhttps://github.com/adafruit/Adafruit_Sensor
Adafruit BME680-Bibliothek
Bibliothek verwendet für die Umwelt Klicken Sie hier, um Sensormesswerte abzurufenhttps://github.com/adafruit/Adafruit_BME680
RTC-Bibliothek für Arduino
RTC-Bibliothek für SAMD21-basierte Boards https://github.com/arduino-libraries/RTCZero
FlashStorage-Bibliothek für Arduino
Eine bequeme Möglichkeit zum Speichern von Daten im Flash-Speicher auf dem ATSAMD21https://github.com/cmaglie/FlashStorage
WolkConnect-Arduino
Arduino-Bibliothek, die eine einfache Verbindung zur WolkAbout IoT-Plattform bietet.https://github.com/Wolkabout/WolkConnect-Arduino

Schaltpläne


Herstellungsprozess

  1. Arduino Spybot
  2. CO2-Überwachung mit K30-Sensor
  3. FlickMote
  4. Selbstgemachter Fernseher B-Gone
  5. Hauptuhr
  6. Finde mich
  7. Arduino-Power
  8. Tech-TicTacToe
  9. Arduino-Vierbeiner
  10. Kontaktloses Temperaturüberwachungstor