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

"Es ist für die Vögel!"

Komponenten und Verbrauchsmaterialien

Arduino 101
× 1
Intel Edison
× 1
Logitech c270 HD-Webcam
× 1
Pololu Tragetasche mit Sharp GP2Y0D815Z0F digitalem Distanzsensor 15cm
× 2
Kraftempfindlicher Widerstand (FSR) von Adafruit Square - Interlink 406
× 1
Adafruit Si7021 Temperatur- und Feuchtigkeitssensor Breakout Board
× 1
Seeed Grove Start Kit Plus, Intel IoT Edition
× 1
Kondensator 47 µF
× 2
Widerstand 1k Ohm
× 1
Adafruit-Anschlussblock – 2-polig 3,5 mm – 5er-Packung !
× 1
Adafruit Kompaktes Schaltnetzteil - Wählbarer Ausgang 3-12VDC
× 1
Adafruit Perma-Proto Breadboard PCB in Viertelgröße - Einzeln
× 1
Jumper (generisch)
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)
Lötkolben (generisch)

Apps und Onlinedienste

Intel XDK für IoT
Autodesk Fusion 360
PubNub Publish/Subscribe-API
Cloudinary
noble.js

Über dieses Projekt

"Es ist für die Vögel!" Mit dem Arduino 101 die Zukunft der Öko-Überwachung neu erfinden

Einführung und Motivation:

Eine Möglichkeit, die Gesundheit unseres Klimas und des Ökosystems, in dem wir leben, zu messen, besteht darin, die Größe und Vielfalt seiner Fauna oder Tierpopulation zu messen. Seit 1987 führt das Cornell Lab of Ornithology jeden Winter eine massive Citizen-Science-Initiative namens Project FeederWatch durch:

„Das Projekt FeederWatch ist eine winterliche Untersuchung von Vögeln, die Futterhäuschen in Hinterhöfen, Naturzentren, Gemeindegebieten und anderen Orten in Nordamerika besuchen… FeederWatch-Daten zeigen, welche Vogelarten jeden Winter Futterstellen an Tausenden von Orten auf dem ganzen Kontinent besuchen . Die Daten geben auch an, wie viele Individuen jeder Art zu sehen sind. Diese Informationen können verwendet werden, um Veränderungen der Winterreichweiten und der Häufigkeiten von Vogelarten im Laufe der Zeit zu messen. ”

Dies ist unser erstes Jahr, an dem wir teilnehmen, und wir wollten unser Interesse am Herstellen und Hacken mit unserem Interesse an der Natur und unserer Teilnahme am Project FeederWatch kombinieren. Also haben wir uns entschieden, mit dem Arduino 101 unsere Zukunft der Vogelbeobachtung und Umweltüberwachung neu zu erfinden!

Das Arduino 101 ist ideal für dieses Projekt, da es die Einfachheit der Arduino IDE kombiniert, um unsere Embedded-Programmierung einfach zu machen, Onboard-Funktionen wie Bluetooth LE mit einer Fülle von Sensoren und Breakout-Boards, die leicht verfügbar sind. Durch die Einbettung eines Arduino 101 in ein selbstgebautes Vogelfutterhaus haben wir eine experimentelle Plattform entwickelt, um Wetterparameter zu messen und die Vogelaktivität an unserem Futterhaus zu überwachen. Das Hinzufügen einiger aufregender IoT-Technologien von Cloudinary und PubNub hat uns geholfen, die Zukunft der Überwachung des Umwelt- und Ökosystemzustands neu zu erfinden!

Projektübersicht:

Das Herzstück unseres Projekts ist ein Arduino 101, eingebettet in ein selbstgebautes Vogelhäuschen. Wir verwenden 2 Sharp Infrarot-Distanzsensoren, um Vögel zu erkennen, die auf einem Holzdübel sitzen, der durch beide Seiten des Futterautomaten läuft. Ein kraftempfindlicher Widerstand (FSR) wird verwendet, um die Menge an Saatgut in der Zuführung zu messen. Ein Adafruit Si7021 Temperatur- und Feuchtigkeitssensor-Breakout-Board ist an den i2c-Pins angebracht und wird verwendet, um unsere physikalischen Wetterdaten bereitzustellen. Der Arduino 101 ist so eingerichtet, dass er als BLE-Peripheriegerät agiert und Daten von diesen Sensoren über BLE an eine BLE-Zentrale sendet Gerät. Die Stromversorgung erfolgt über 4 AA-Batterien. Alle diese Komponenten sind in einem benutzerdefinierten 3D-gedruckten Gehäuse untergebracht.

Wir verwenden einen Intel Edison auf dem Arduino Breakout Board sowohl als BLE-Zentrale als auch als Internet-Gateway. Eine Logitech c270 USB-Webcam ist mit dem USB-Port auf dem Board verbunden und wird verwendet, um Bilder aufzunehmen, wenn eine BLE-Benachrichtigung empfangen wird, die auf Aktivitäten auf einer der Sitzstangen hinweist. Diese Bilder werden lokal auf einer SD-Karte gespeichert, die in den SD-Kartensteckplatz des Breakout-Boards eingesteckt wird.

Wir nutzen die WiFi-Fähigkeit des Intel Edison, um ihn als Internet-Gateway zu verwenden. Dies ermöglicht es uns, Supertechnologien wie PubNub für das Echtzeit-Datenstreaming und Cloudinary für die Bildspeicherung und -bearbeitung in der Cloud zu verwenden.

Das Vogelfutterhaus wird aus einer leeren Sodaflasche und einem Holzdübel hergestellt und an einem Pfosten in unserem Hof ​​aufgehängt.

Aufbau des Projekts:

Arduino 101 das eingebettete Vogelhäuschen.

Die Grundlage dieses Projekts ist ein Arduino 101, der in unser Vogelhäuschen eingebettet ist. Das Vogelhäuschen befindet sich im Freien und muss in der Lage sein, den körperlichen Belastungen im Freien standzuhalten. Es wird eine Möglichkeit benötigen, Daten in Echtzeit und drahtlos zu übertragen. Der Abstand zwischen dem sendenden Arduino 101 und dem empfangenden Edison beträgt nur wenige Meter und da der Arduino 101 bereits BLE an Bord hat, werden wir BLE verwenden!

Der größte Teil der Strecke kann gebaut werden, indem man dem Fritzing-Diagramm folgt, aber es gab einige Herausforderungen, denen wir beim Bauen und Testen dieser Strecke begegneten. Auf diese konzentrieren wir uns hier:

  • Die erste Herausforderung:Einen Vogel am Futterhäuschen im Freien entdecken! Für dieses Projekt brauchen wir einen Sensor, der im Freien funktioniert, abgedichtet gegen die Elemente. Wir wollen nicht, dass es das Thema stört oder verschreckt. Es sollte nur erkennen, was sich auf der Stange befindet. Nach Auswertung der Eigenschaften verschiedener Sensoren haben wir uns entschieden, den Pololu Carrier mit dem digitalen Distanzsensor GP2Y0D815Z0F von Sharp zu verwenden. Diese Sensoren haben im Gegensatz zu den regulären PIR-Sensoren eine sehr kurze Erfassungsreichweite. Wir wollen nur wissen, ob sich ein Vogel wenige Zentimeter vom Sensor entfernt aufhält. Die PIR-Sensoren haben einen sehr großen und breiten Erfassungsbereich. Dies ist großartig, um jede Art von Bewegung in der Auffahrt Ihres Hauses zu erkennen, aber wir möchten nicht, dass jedes Mal, wenn das Vogelhäuschen im Wind schwankt, Äste oder andere "Lärm" erkannt werden. Auch eine schnelle Benchtop-Auswertung zeigte, dass die Sharp IR-Sensoren funktionierten, wenn sie in eine Plastik-Soda-Flasche gegeben wurden. Dies ist wichtig, da wir die Elektronik vor Witterungseinflüssen schützen und diesen Teil des Gehäuses „durchschauen“ müssen.
  • Die zweite Herausforderung:Nachdem wir einen der Sensoren angeschlossen und getestet hatten, konnten wir loslegen! Also haben wir einen zweiten Sharp IR-Sensor an den Arduino 101 und angeschlossen. . .sie haben nicht funktioniert! Nachdem ich den Code mehrmals überprüft habe. Nach der Überprüfung einiger Boards und verschiedener Sensoren würde nichts dazu führen, dass diese beiden Sensoren zusammenarbeiten. Wir standen also vor unserer ersten großen Herausforderung. Sollten wir einen anderen Sensortyp ausprobieren? Sollten wir ein einzelnes Barsch-Vogelfutterhaus machen (lahm!), was tun? In meiner Verzweiflung taten wir, was wir beim ersten Mal hätten tun sollen, schauten auf der Website nach und fanden in den Produkt-FAQs Folgendes:Dieser Sensor verhält sich nicht so, wie ich es erwartet hatte:Ich erhalte häufig zeitweilige Erkennung weiter als die maximale Reichweite des Sensors und er erkennt keine Objekte innerhalb des angekündigten Erkennungsbereichs. Was ist los? Probleme wie diese können das Ergebnis von Stromversorgungsproblemen sein, insbesondere da dieser Sensor Strom in kurzen, großen Bursts verbraucht. Stellen Sie also sicher, dass Ihr Netzteil den erforderlichen Strom liefern kann. Wenn dieses Problem auftritt, versuchen Sie, einen Kondensator von etwa 10 µF zwischen der Stromversorgung des Sensors und der Masse in der Nähe des Sensors hinzuzufügen. dies gleicht eine unzureichende Stromversorgung aus und stellt normalerweise die normale Funktionalität wieder her. Problem gelöst! Wir haben jedem der Sensoren einen 47uF-Elektrolytkondensator hinzugefügt und sie funktionierten, mit nur einer weiteren Einschränkung, sie mussten beide direkt vom +5V-Pin auf der Platine gespeist werden. Sie sehen dies auf dem Fritzing-Diagramm als Jumper von der +5V-Leitung eines Sensors an die +5V-Versorgung des anderen Sensors. Wir sind keine EEs, also kann ich das nicht erklären, es ist einfach das, was wir sowohl drinnen als auch draußen gefunden haben!
  • Die dritte Herausforderung:Im Abschnitt "Verwandte Aktivitäten und Lernen" auf der Website von The Project FeederWatch ist eine der empfohlenen Aktivitäten, das Vogelfutter in Ihrem Feeder vor und nach jeder Zählung zu wiegen und zu berechnen, wie viel Saatgut gegessen wurde. Berechnen Sie nach mehreren Zählungen den durchschnittlichen Verbrauch. Warum nicht den Saatgutverbrauch automatisiert erfassen, anstatt manuell zu wiegen? Unsere Lösung bestand darin, einen kraftempfindlichen Widerstand (FSR) zu verwenden. Dies ist ein Widerstand mit einem Widerstand, der sich mit der auf ihn ausgeübten Kraft ändert. Es kann an einen analogen Eingangspin angeschlossen werden. Aber wäre es empfindlich genug, um Veränderungen der Saatmengen zu erkennen? Unsere ersten Versuche, den Saatgutfüllstand in einem kleinen Plastikbehälter zu messen, waren nicht sehr erfolgreich. Der Sensor reagierte gut auf unterschiedlichen Fingerdruck, aber nicht auf die Saatfüllstände. Also haben wir zwei Änderungen vorgenommen, um das Problem zu lösen. Zuerst wird das analoge Signal über einen 2-Widerstands-Spannungsteiler an den analogen Arduino 101-Pin geliefert, einer ist der FSR und der zweite ist ein konventioneller Widerstand. Wir haben den Wert dieses zweiten Widerstands gesenkt und der Sensor schien berührungsempfindlicher zu sein, aber er reagierte immer noch nicht so auf Seed-Änderungen, wie wir es gerne hätten. Also in einer Hardware-Änderung zu all dem hinzugefügt. Etwas in Analogie zu Pascals Prinzip, dass, wenn wir, anstatt das Gewicht der Samen über die gesamte Oberfläche des FSR aufzubringen, eine Plattform mit einem kleinen Kontaktpunkt in der Mitte schaffen würden, wir die Kraft des Samens auf die FSR. Genau das Gegenteil von einem Schneeschuh und es hat funktioniert!

Eine weitere kleine Herausforderung ist die sichere und zuverlässige Verbindung des FSR mit dem Arduino 101. Dies lässt sich leicht durch die Verwendung von 2-poligen 3,5-mm-Klemmblöcken lösen. Stellen Sie nur sicher, dass der Abstand des Klemmenblocks dem Ihres Boards entspricht.

Der Rest der Arduino 101-Hardware ist einfach. Wir haben das Adafruit Si702-Breakout-Board an die I2C-Bus-Pins () angeschlossen und die leeren +3,3 V für die Stromversorgung verwendet. Die Stromversorgung des gesamten Pakets erfolgt über einen umschaltbaren 4XAA-Akku, der sich unter dem Hauptgehäuse befindet.

Wir haben die IR- und FSR-Sensoren an Adafruit Perma-Proto Quarter-Size Breadboard PCBs gelötet und mit doppelseitigem Klebeband an der Unterseite des Arduino 101 befestigt. Das gesamte Paket wird in den Vogelfutterspender mit Soda-Flasche gelegt und hat Minusgrade, Nebel und leichten Regen und Schnee überstanden (gefälschter Schneesturm 'Stella'!).

Arduino 101-Skizze:

Die Hauptaufgabe der Skizze besteht darin, die angeschlossenen Sensoren zu überwachen und die Werte der Sensoren über BLE zu melden. Alle Daten in BLE werden als Paket von Bytes übertragen. Unabhängig davon, ob Ihre ursprünglichen Daten ein int float oder array of char sind, müssen Sie sie in ihre Byte-Darstellung zerlegen, um sie über BLE zu übertragen. Der einfachste Weg, den ich kenne, besteht darin, eine Vereinigung von Datentypen zu erstellen. Eine Union ermöglicht es uns, denselben Speicherort zwischen zwei verschiedenen Datentypen zu teilen. In unserem Fall liefert der Temperatur- und Feuchtigkeitssensor SI7021 Daten als Gleitkommazahl. Die Arduino C-Sprache stellt einen Float als 4 Bytes dar, also erstellen wir eine Vereinigung zwischen unserem Temperatur- und Feuchtigkeitsfloat und einem Array von 4 Bytes.

/** * Die union-Direktive ermöglicht es diesen Variablen, sich denselben Speicherort zu teilen. Bitte beachten Sie das * mein Tutorial Imu to You! (https://www.hackster.io/gov/imu-to-you-ae53e1?team=18045) Tutorial für weitere * Diskussionen über die Verwendung der Union-Direktive in C. */ union { float t; unsignierte Zeichenbytes[4]; } tempData; Gewerkschaft { Schwimmer h; unsignierte Zeichenbytes[4]; } feuchtigkeitsdaten; Gewerkschaft {int f; vorzeichenlose Zeichenbytes [2]; } feedData;  

Wenn wir den Gleitkommawert in der Union speichern, wird auch das Byte-Array gefüllt. Um die Daten zu übertragen, übergeben wir das Array von Bytes an die Funktion setValue() dieser Merkmale.

Bei eingebetteten Anwendungen kann die Verwendung der delay()-Funktionen zu Problemen führen. Erstens, während die Verzögerungsfunktion aufgerufen wird, wird die gesamte Prozessoraktivität für die Dauer der Verzögerung gestoppt. Dies ist nicht ideal, wenn Vögel jederzeit zum Sitzen kommen können. Ein zweites Problem besteht darin, dass die Funktion delay() Probleme mit dem BLE-Benachrichtigungsmechanismus verursachen kann. Der Weg, dies zu vermeiden, besteht darin, delay() in unserer Skizze nicht zu verwenden. Es ist jedoch oft eine Verzögerung im Codeprogramm erforderlich. Um dies zu überwinden, verwenden wir die Methodenübersicht in diesem Set von 3 Super-Tutorials von Bill Earl of Adafruit.

Im Umriss erstellen wir ein Objekt, das unser eingebettetes Gerät darstellt. Wir entscheiden uns für ein Intervall oder eine Reihe von Intervallen, um unsere mit diesem Gerät verbundenen Sensoren abzufragen. Wir erstellen dann eine Update()-Funktion.

void Update () {//Serial.print ( "Feed Sensor:"); Serial.println (analogRead (A0)); // Aktualisierungen/Benachrichtigungen der Perch-Aktivität hängen von Zeit- und Näherungssensoren ab currentPerchMillis =millis (); if ((currentPerchMillis - previousPerchMillis)> perchInterval ) { previousPerchMillis =currentPerchMillis; currentLeftPerch =digitalRead(LEFT_PERCH); currentRightPerch =digitalRead (RIGHT_PERCH); if ((currentLeftPerch ==0) &&(vorherigeLeftPerch ==1)) { // neue Aktivität auf der linken Stange // BLE benachrichtigen perchCharacteristic.setValue(1); Serial.println ("LEFT PERCH ACTIVITY"); previousLeftPerch =0; } ...}  

Diese Funktion dient dazu, zu überprüfen, ob die Zeitintervalle für unsere Sensoren abgelaufen sind, wenn ja, aktualisieren Sie die Sensoren, wenn nicht einfach ignorieren. Die Funktion Update() wird im Abschnitt loop() unserer Skizze wiederholt aufgerufen.

void loop() { // Geben Sie Ihren Hauptcode hier ein, um ihn wiederholt auszuführen:blePeripheral.poll(); VogelFeeder.Update(); }  

Dabei emulieren wir mit unseren Sensoren einen Echtzeit-Multitasking-Effekt.

Intel Edison und Arduino Breakout Board:

Der schwierigste Teil bei der Arbeit mit dem Intel Edison ist die Einrichtung. Das beste Tutorial, das ich dazu gefunden habe, ist Intel Edison und Intel XDK IoT Edition 101 von Vincent Wong. Ich kann Ihnen garantieren, dass es sich lohnt, diesen Prozess zu durchlaufen und einige der JavaScript-Beispiele auszuprobieren!

Wenn Sie mit Ihrem Edison mit der Intel XDK IoT Edition arbeiten, können Sie ihn über die Befehlszeile interagieren und konfigurieren. Sie können auch die vielen JavaScript/Node-Beispielprogramme und -Vorlagen nutzen. Das Erlernen und Verwenden von JavaScript/Node zum Programmieren eröffnet eine große Anzahl einfach zu verwendender und leistungsstarker APIs wie PubNub, Noble.js und Cloudinary.

Nachdem Sie Edison eingerichtet und eine aktive Verbindung zu Ihrem WLAN-Netzwerk bestätigt haben, können Sie die für dieses Projekt erforderlichen Bibliotheken installieren:

npm install noble

npm installiere pubnub

npm Cloudinary installieren

Die USB-Webcam

Eine Google-Suche nach "Intel Edison Webcam" führt zu mehreren guten Beispielen und Tutorials. Aber es gibt da draußen einiges verwirrendes Material, was meiner Meinung nach hauptsächlich auf einige Änderungen in den Modulen zurückzuführen ist, die im Yocto OS verfügbar sind. Yocto ist eine eingebettete Version von Linux, die die Intel-Edison ausführt. Die Logitech c270 ist eine uvcvideo-kompatible Webcam. Es gibt zahlreiche Tutorials, um sicherzustellen, dass auf Ihrem Edison der uvcvideo-Treiber/das -Modul installiert ist. Andernfalls können Sie nicht mit der Kamera interagieren und Bilder mit ihr aufnehmen.

Ich habe die folgenden Schritte von der Webkamera auf Intel Edison mit Uploads auf s3 verwendet, damit die Webcam auf meinem Edison funktioniert. Ich habe die Anweisungen aus diesem Blog-Post unten gepostet, nur für den Fall, dass es jemals veraltet sein sollte.

Bei Ihrem Edison werden die folgenden Anweisungen in der Befehlszeile im XDK-Serial-Terminal-Tab ausgeführt.

"Wir werden einige zusätzliche Pakete verwenden, die mit opkg installiert werden können Paket-Manager. Für den Anfang bearbeiten Sie die Liste der Repos mit vi:

vi /etc/opkg/base-feeds.conf

und stellen Sie sicher, dass Sie alle diese Zeilen in der Datei haben:

src/gz alle http://repo.opkg.net/edison/repo/all src/gz edison http://repo.opkg.net/edison/repo/edison src/gz core2–32 http://repo. opkg.net/edison/repo/core2-32 src intel-iotdk http://iotdk.intel.com/repos/3.0/intelgalactic/opkg/i586

Jetzt Paket-Cache aktualisieren:

opkg-Update

Und installieren Sie das Kernel-Modul, um USB-UVC-Kameras zu unterstützen.

opkg install kernel-module-uvcvideo

Verbinden Sie nun Ihre Webcam mit dem USB-Port und führen Sie diesen Befehl aus.

ls -l /dev/video*

Wenn Ihre Kamera erfolgreich erkannt wurde, sieht die Ausgabe wie folgt aus:

crw-rw---- 1 Root-Video 81, 0 25. Juli 09:35 /dev/video0

Um mit der Webcam zu arbeiten und pünktlich Fotos zu machen, müssen wir 2 zusätzliche Pakete installieren:

opkg installiere fswebcam Kumpel

*** Beachten Sie, dass wir Cronie für dieses Projekt nicht installiert haben, sondern nur opkg fswebcam installiert haben. Cronie wird nicht benötigt, da wir fswebcam nennen, wenn die IR-Sensoren von einem Vogel auf einer Stange ausgelöst werden, nicht nach einem festgelegten Zeitplan ***

Mit der Kamera arbeiten

Führen Sie diesen Befehl aus, um Ihre Kamera zu testen:

fswebcam -r 1280x720 --jpeg 100 -D 3 -S 13 "test.jpg"

  • -r 1280 x 720 Stellen Sie die Auflösung des Bildes ein, es ist besser, das für Ihre Kamera verfügbare Maximum zu verwenden (optional)
  • — JPEG 100 Stellen Sie die JPEG-Qualität auf das Maximum ein. Es ist nützlich, wenn Sie später etwas mit diesen Bildern machen möchten (optional)
  • -D 3 -S 13 fügt 3 Sekunden Verzögerung hinzu und überspringt die ersten 13 Frames. Dies ist notwendig, da einige Webcams Zeit brauchen, um die besten Fotos zu erhalten (empfohlen)
  • test.jpg ist der Name der Ausgabedatei "

Weitere Informationen zur Verwendung einer Webcam mit dem Edison und andere wirklich nette Projekte finden Sie auf der Github-Seite von Dr. Kim. Sie postet auch coole Projekte auf Hackster.io!

Neben der Bestätigung, dass das richtige Modul vorhanden war, musste ich auch den Schalter zwischen den Micro-USB-Kabeln und dem USB-Port in Richtung des USB-Ports umlegen und das Arduino-Shield an eine Stromversorgung anschließen. Ich habe das kompakte Schaltnetzteil - Wählbarer Ausgang 3-12 VDC (Adafruit Produkt-ID:1448) verwendet.

Legen Sie nun Ihre SD-Karte in den SD-Kartensteckplatz ein. Verwenden des seriellen Terminals Verwenden Sie im Intel XDK die Befehlszeile, um die Karte zu überprüfen, indem Sie die folgenden Befehle eingeben:

CD /media/sdcard

ls

Dies sollte alle Dateien anzeigen, die auf der Karte vorhanden sind, oder nichts, wenn keine Dateien vorhanden sind. Sie sollten keine Fehlermeldungen sehen. Wenn Fehlermeldungen angezeigt werden, empfehle ich, das Edison-Board neu zu starten, ohne die SD-Karte zu entfernen, indem Sie diesen Befehl eingeben:

Neustart

Wiederholen Sie dann die obigen Befehle, nachdem Sie sich wieder bei Ihrem Edison angemeldet haben.

Um unserem Edison nun den Zugriff auf Bluetooth zu ermöglichen, geben Sie den folgenden Befehl ein:

rfkill Bluetooth entsperren

Geben Sie Folgendes ein, um zu bestätigen, dass Bluetooth eingeschaltet ist und funktioniert:

Bluetoothctl

Dann tippe

scannen an

Dies sollte auf BLE-Geräten als solches angezeigt werden:

Beenden Sie nun Bluetoothctl, klicken Sie auf die Registerkarte Intel XDK IoT und stellen Sie dann eine Verbindung zu Ihrem Board her. Wählen Sie im Menü auf der linken Seite ein Projekt aus, z. B. BLESCAN. Entfernen Sie den Inhalt von index.js und entfernen Sie die Abhängigkeiten aus der Datei package.json.

Ersetzen Sie hier den Inhalt von index.js durch das Programm aus unserem Github-Repository. Laden Sie diesen Code in Ihren Edison hoch. Stellen Sie sicher, dass das Arduino 101 eingeschaltet ist und führen Sie den Edison-Code aus. Sobald der Edison Ihren Arduino 101 erkannt hat, sollten Sie etwa Folgendes sehen:

Der Code:

Der auf dem Edison ausgeführte Code ist in JavaScript oder besser Node.js geschrieben. Nachdem wir die erforderlichen Objekte aus unseren importierten Bibliotheken erstellt haben, erstellen wir Variablen, um den BLE-Dienst darzustellen, der auf dem Arduino 101 ausgeführt wird.

noble.js

 // BLE-Dienst und Eigenschaften für noble // Diese sollten dem Dienst und den charakteristischen UUIDs des Peripheriegeräts entsprechen // (in diesem Fall auf dem Arduino 101) var LOCAL_NAME ='bird'; var SERVICE_UUID ='917649a0d98e11e59eec0002a5d5c51b'; //Keine Bindestriche!!!! var PERCH_UUID ='917649a1d98e11e59eec0002a5d5c51b'; var TEMPERATURE_UUID ='917649a2d98e11e59eec0002a5d5c51b'; var HUMIDITY_UUID ='917649a3d98e11e59eec0002a5d5c51b'; var FEED_UUID ='917649a4d98e11e59eec0002a5d5c51b';  

Diese UUIDs werden von noble.js verwendet. Wenn Sie die UUIDs auf Ihrem Arduino ändern, müssen sie auch hier geändert werden. Es ist wichtig sicherzustellen, dass keine Bindestriche vorhanden sind, damit noble.js ordnungsgemäß funktioniert.

Um mit noble.js zu arbeiten, müssen wir nach peripheren BLE-Geräten suchen und diese dann erkennen und dann eine Verbindung herstellen. Sobald die Verbindung hergestellt ist, werden wir die verfügbaren Eigenschaften durchgehen, wobei die oben definierte UUID verwendet wird. Die Merkmale sind alle Lese-/Benachrichtigungsmerkmale.

noble.on('discover', function(peripheral){ console.log('Found BLE Device:[' + periphere.id + '] ' + periphere.advertisement.localName); if(peripheral. Advertisment.localName ==LOCAL_NAME){ console.log('Gefunden:' + periphere.advertisement.localName); } periphere.connect(function(error) { console.log('Mit Peripherie verbunden:' + periphere.uuid); noble.stopScanning(); // Verhindern, dass "verirrte" Dienste abgeholt werden periphere.discoverServices([SERVICE_UUID], function(error, services) { console.log('services:' + services.length); var feederService =services [0]; console.log('Bird Feeder Service!'); feederService.discoverCharacteristics([], function(error, properties) { properties.forEach(function(characteristic) { console.log('characteristic UUID:' + Merkmal .uuid); character.on('data', function(data, isNotification) { transformRawData(characteristic.uuid,data); }); Merkmal.notify('true', function(error) { if (error) throw e Fehler; }); }); }); }); }); });  

Es gibt 2 Schlüsselelemente aus dem Codeabschnitt oben. Erstens gab es eine Änderung in der Art und Weise, wie Sie noble.js mitteilen, dass dies ein Lese-/Benachrichtigungsmerkmal ist. Von der Github-Seite von Sandeep Mistry:

Daten

Wird ausgegeben, wenn das Lesen des Merkmals abgeschlossen ist, Ergebnis von characteristic.read(...) oder Kennwert wurde per Benachrichtigung oder Anzeige von Peripheriegerät aktualisiert - nach Freischaltung mit notify(true[, callback(error)]) .

Eigenschaft.on('Daten', Rückruf(Daten, isNotification));

Eigenschaft.once('read', callback(data, isNotification)); // Vermächtnis

Die Änderung erfolgt von „read“ zu „data“. Wir sind hier versehentlich auf einige Probleme gestoßen, als wir eine ältere Version von noble verwendeten und dann die neueste Version änderten. Es hat viele Stunden gedauert, um herauszufinden, was passiert ist, daher wollten wir Ihnen möglicherweise helfen, dies zu vermeiden

Der andere Schlüssel hier ist die Funktion transformRawData(characteristic.uuid,data). Diese Funktion nimmt die UUID und die Daten, die aus dem Lesevorgang geliefert werden, und gibt sie an die große und unhandliche Funktion weiter. Jedes Mal, wenn der BLE-Benachrichtigungsmechanismus durch eine Änderung eines Merkmals aktiviert wird, wird diese Funktion aufgerufen und verarbeitet die empfangenen Daten. Hier entsteht die ganze Aufregung.

tranformRawData prüft, welches Merkmal empfangen wird.

Falls uns der Arduino sagt, dass es Aktivität auf der Stange gibt, möchten wir ein Foto machen. In diesem Fall verwenden wir die child_process-Bibliothek, um das Programm fswebcam aufzurufen, das sich in unserem Yocto(linux)-System befindet. Die child_process-Bibliothek ermöglicht es uns, Befehlszeilenfunktionen innerhalb unseres node.js-Codes auszuführen. Dies ist eine sehr mächtige Funktion.

childProcess.execFile('fswebcam',['-r 1280x720',fileName],function(error,stdout,stderr) { console.log(stdout); );  

PubNub und Cloudinary:

Bei dieser Funktion kommen auch PubNub und Cloudinary ins Spiel! PubNub bietet Ihrer Anwendung ein Echtzeit-Daten-Streaming-Netzwerk. Das bedeutet, dass Ihre Anwendung mit einer Internetverbindung Daten überall auf der Welt live streamen kann. Jede andere App oder jedes andere Programm, das über den Abonnementschlüssel für Ihre veröffentlichten Streams verfügt, hat Zugriff auf eine JSON-Nutzlast, die Ihre Daten darstellt. In unserem Fall senden wir den aktuellen Saatstand, Temperatur, Luftfeuchtigkeit und die Anzahl der Barschbesuche. Zusätzlich senden wir einen Link zu den 3 aktuellsten Bildern des Feeders! Dies sind JPEGs, die mit unserem Programm zu Cloudinary hochgeladen wurden. Es ist nicht erforderlich, einen Server zu betreiben! Eine einfache HTML-Datei mit eingebettetem JavaScript dient als Echtzeit-Schnittstelle zu unserem Vogelhäuschen mit freundlicher Genehmigung von PubNub!

Im Bild oben habe ich mir einfach die HTML-Datei mit dem Code für die Schnittstelle mit dem Vogelhäuschen über PubNub per E-Mail geschickt und jeweils aus einem lokalen Verzeichnis in einen Chrome-Browser geladen. Sie müssen keinen Server codieren, um diese Seite auf Ihrem Edison bereitzustellen.

Cloudinary ist ein Dienst zum Hochladen, Speichern und Umwandeln von Bildern. Es hat eine sehr einfach zu bedienende API. Bei der Entwicklung dieses Projekts konnte ich keine einfachere und einfachere API finden. Es gibt nichts Vergleichbares da draußen. Ihr Helpdesk ist auch fantastisch. Es ist definitiv etwas, das Sie für Ihre Projekte ausprobieren möchten!

Im folgenden Code verwenden wir die Cloudinary-API, um die 3 neuesten Bilder von der lokalen SD-Karte hochzuladen. Die von diesem Upload zurückgegebenen URLs werden dann in einem Array gespeichert. Diese URLs werden dann als Teil unserer JSON-Nutzlast an PubNub gesendet, damit sie von unserer HTML-Seite zur Anzeige aufgerufen werden können. Schönheit, oder?!

index.html

Worum geht es in dieser Datei index.html? Die Datei index.html ist unsere Benutzeroberfläche. Da wir unsere Daten mit PubNub streamen und unsere Bilder mit Cloudinary in einer öffentlich zugänglichen URL platzieren, können wir das Javascript/HTML/CSS-Power-Trio nutzen, um eine tragbare Benutzeroberfläche zu erstellen. Sowohl PubNub als auch Cloudinary sind sehr einfach zu bedienen und leistungsstark Javascript-APIs. Wir importieren sie einfach in unsere HTML-Datei, um sie zu verwenden:

     

Beim Erstellen des PubNub-Objekts geben wir ihm den Subskriptionsschlüssel für unseren Datenstrom und es kann in Echtzeit auf den Datenstrom zugreifen, wenn wir diesen Stream veröffentlichen.

 

Herstellungsprozess

  1. DHT Tiny Breakout für den Raspberry Pi
  2. HC-SR04 Ultraschall-Reichweitensensor auf dem Raspberry Pi
  3. Das beste Zubehör für Ihren Raspberry Pi
  4. SICHT:Für Blinde
  5. Intel beauftragt Udacity mit der Vergabe eines Abschlusses für AI on the Edge
  6. So wählen Sie den richtigen Sensor für Abfüllanwendungen aus
  7. Sensorfolie für die Luft- und Raumfahrt
  8. WiFi-RSSI-Sensor-Tracker für die ISS
  9. Neues mathematisches Tool kann die besten Sensoren für den Job auswählen
  10. Die Herausforderung der 5S-Methode für die Industrie 4.0