Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

“Het is voor de vogels!”

Componenten en benodigdheden

Arduino 101
× 1
Intel Edison
× 1
Logitech c270 HD-webcam
× 1
Pololu Carrier met Sharp GP2Y0D815Z0F digitale afstandssensor 15 cm
× 2
Adafruit Square Force-Sensitive Resistor (FSR) - Interlink 406
× 1
Adafruit Si7021 Breakout Board voor temperatuur- en vochtigheidssensor
× 1
Seeed Grove Start Kit Plus, Intel IoT Edition
× 1
Condensator 47 µF
× 2
Weerstand 1k ohm
× 1
Adafruit-aansluitblok - 2-pins 3,5 mm - pak van 5 !
× 1
Adafruit compacte schakelende voeding - selecteerbare uitgang 3-12VDC
× 1
Adafruit Perma-Proto Quarter-sized Breadboard PCB - enkel
× 1
Jumperdraden (algemeen)
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
Soldeerbout (algemeen)

Apps en online services

Intel XDK voor IoT
Autodesk Fusion 360
PubNub Publish/Subscribe API
Bewolkt
noble.js

Over dit project

"Het is voor de vogels!" De toekomst van eco-monitoring opnieuw uitvinden met de Arduino 101

Inleiding en motivatie:

Een manier om de gezondheid van ons klimaat en het ecosysteem waarin we leven te meten, is door de omvang en variëteit van de fauna of dierenpopulatie te meten. Elke winter, sinds 1987, voert het Cornell Lab of Ornithology een enorme burgerwetenschappelijke inspanning uit, genaamd Project FeederWatch:

"Project FeederWatch is een winteronderzoek van vogels die feeders bezoeken in achtertuinen, natuurcentra, gemeenschapsgebieden en andere locaties in Noord-Amerika... FeederWatch-gegevens laten zien welke vogelsoorten elke winter feeders bezoeken op duizenden locaties op het continent . De gegevens geven ook aan hoeveel individuen van elke soort worden gezien. Deze informatie kan worden gebruikt om veranderingen in de winterreeksen en abundanties van vogelsoorten in de loop van de tijd te meten. ”

Dit is ons eerste jaar dat we meedoen en we wilden onze interesse in maken en hacken combineren met onze interesse in de natuur en onze deelname aan Project FeederWatch. Dus hebben we besloten om onze toekomst van vogelspotten en milieumonitoring opnieuw uit te vinden met de Arduino 101!

De Arduino 101 is ideaal voor dit project omdat het de eenvoud van de Arduino IDE combineert om onze embedded programmering eenvoudig te maken, ingebouwde mogelijkheden zoals Bluetooth LE met een schat aan sensoren en breakout-boards die direct beschikbaar zijn. Door een Arduino 101 in een zelfgemaakte vogelvoederbak in te bouwen, hebben we een experimenteel platform ontwikkeld om weersparameters te meten en de vogelactiviteit bij onze voerbak te volgen. Door enkele opwindende IoT-technologieën van Cloudinary en PubNub toe te voegen, hebben we de toekomst van monitoring van milieu- en ecosysteemgezondheid opnieuw uitgevonden!

Projectoverzicht:

Het hart van ons project is een Arduino 101 ingebed in een zelfgemaakte vogelvoeder. We gebruiken 2 Sharp infrarood afstandssensoren om vogels te detecteren die op een houten deuvel zitten die door beide zijden van de feeder loopt. Een krachtgevoelige weerstand (FSR) wordt gebruikt om de hoeveelheid zaad in de feeder te detecteren. Een Adafruit Si7021 temperatuur- en vochtigheidssensor-breakoutboard is bevestigd aan de i2c-pinnen en wordt gebruikt om onze fysieke weergegevens te leveren. De Arduino 101 is ingesteld om te fungeren als een BLE-randapparaat en om gegevens van deze sensoren via BLE naar een BLE-centrale te sturen apparaat. De voeding wordt geleverd door 4 AA-batterijen. Al deze componenten zijn ondergebracht in een op maat gemaakte 3D-geprinte behuizing.

We gebruiken een Intel Edison op het Arduino Breakout Board, zowel als de BLE-centrale als als een internetgateway. Een logitech c270 usb-webcam is aangesloten op de usb-poort op het bord en wordt gebruikt om foto's te maken wanneer een BLE-melding wordt ontvangen die activiteit op een van de zitstokken aangeeft. Deze afbeeldingen worden lokaal opgeslagen op een SD-kaart die in de SD-kaartsleuf op het breakout-bord is geplaatst.

We profiteren van de wifi-mogelijkheden van de Intel Edison om hem als internetgateway te gebruiken. Hierdoor kunnen we supertechnologieën gebruiken zoals PubNub voor realtime datastreaming en Cloudinary voor beeldopslag en manipulatie in de cloud.

De vogelvoeder is gemaakt van een lege frisdrankfles en een houten plug en hing hem aan een paal in onze tuin.

Het project bouwen:

Arduino 101 de ingebouwde vogelvoeder.

De basis van dit project is een Arduino 101 die is ingebed in onze vogelvoeder. De vogelvoeder zal buiten zijn en moet bestand zijn tegen de fysieke ontberingen van buiten zijn. Het heeft een manier nodig om gegevens in realtime en draadloos te verzenden. De afstand tussen de verzendende Arduino 101 en de ontvangende Edison is slechts enkele meters en aangezien de Arduino 101 al BLE aan boord heeft, zullen we BLE gebruiken!

Het grootste deel van het circuit kan worden geconstrueerd door het fritzing-diagram te volgen, maar er waren een paar uitdagingen die we tegenkwamen tijdens het maken en testen van dit circuit. Hier zullen we ons op concentreren:

  • De eerste uitdaging:een vogel detecteren op de voerbak, buiten! Voor dit project hebben we een sensor nodig die buiten kan functioneren, afgedicht tegen de elementen. We willen niet dat het het onderwerp verstoort of afschrikt. Het zou alleen moeten detecteren wat zich op de baars bevindt. Na evaluatie van de kenmerken van verschillende sensoren, hebben we besloten om de Pololu Carrier te gebruiken met Sharp GP2Y0D815Z0F Digital Distance Sensor. Deze sensoren hebben, in tegenstelling tot de reguliere PIR-sensoren, een zeer kort detectiebereik. We willen alleen weten of een vogel op enkele centimeters van de sensor zit. De PIR-sensoren hebben een zeer lang en breed detectiebereik. Dit is geweldig voor het detecteren van elke vorm van beweging op de oprit van uw huis, maar we willen niet dat de boomtakken of ander "geluid" worden gedetecteerd telkens wanneer de vogelvoeder in de wind zwaait. Ook een snelle evaluatie van het tafelblad toonde aan dat de Sharp IR-sensoren werkten wanneer ze in een plastic frisdrankfles werden geplaatst. Dit is belangrijk omdat we de elektronica tegen de elementen moeten beschermen en door dit deel van de behuizing moeten kunnen "kijken".
  • De tweede uitdaging:nadat we een van de sensoren hadden aangesloten en getest, waren we klaar om te gaan! Dus hebben we een tweede Sharp IR-sensor aangesloten op de Arduino 101 en . . .ze werkten niet! Na het vele malen controleren van de code. Na het controleren van een paar kaarten en verschillende sensoren, zou niets deze twee sensoren laten samenwerken. Dus stonden we voor onze 1e grote uitdaging. Moeten we een ander type sensor proberen? Moeten we een vogelvoeder voor één baars maken (lam!), wat te doen? In wanhoop hebben we gedaan wat we de eerste keer hadden moeten doen, check de website, en op de product FAQ's vonden we dit:Deze sensor gedraagt ​​zich niet zoals ik verwacht:ik krijg veel intermitterende detectie verder dan het maximale bereik van de sensor en het detecteert geen objecten binnen het geadverteerde detectiebereik. Wat is er aan de hand? Problemen als deze kunnen het gevolg zijn van problemen met de stroomvoorziening, vooral omdat deze sensor stroom verbruikt in korte, grote stoten, dus zorg ervoor dat je voeding de benodigde stroom kan leveren. Als u dit probleem ondervindt, probeer dan een condensator van ongeveer 10 µF toe te voegen aan de voeding van de sensor en de aarde in de buurt van de sensor; dit compenseert een ontoereikende stroomvoorziening en herstelt doorgaans de normale functionaliteit. Probleem opgelost! We hebben een elektrolytische condensator van 47 uF aan elk van de sensoren toegevoegd en ze werkten, met nog één waarschuwing, ze moesten beide rechtstreeks worden gevoed vanaf de +5V-pin op het bord. Je zult dit op het fritzing-diagram zien als een jumper van de +5V lijn van de ene sensor naar de +5V voeding naar de andere sensor. We zijn geen EE's, dus ik kan dit niet uitleggen, het is precies wat we ontdekten om zowel binnen als buiten te werken!
  • De derde uitdaging:in het gedeelte Gerelateerde activiteiten en leren van de Project FeederWatch-website is een van de aanbevolen activiteiten om het vogelzaad in uw voerbak voor en na elke telling te wegen en te berekenen hoeveel zaad er is gegeten. Bereken na verschillende tellingen het gemiddelde verbruik. Waarom zou u, in plaats van handmatig te wegen, de zaadconsumptie niet op een geautomatiseerde manier vastleggen? Onze oplossing was om een ​​krachtgevoelige weerstand (FSR) te gebruiken. Dit is een weerstand met een weerstand die varieert met de kracht die erop wordt uitgeoefend. Het kan worden aangesloten op een analoge ingangspin. Maar zou het gevoelig genoeg zijn om veranderingen in zaadhoeveelheden te detecteren? Onze eerste pogingen om zaadniveaus te meten in een kleine plastic container waren niet erg succesvol. De sensor reageerde goed op wisselende vingerdruk, maar niet op de zaadniveaus. Dus hebben we twee wijzigingen aangebracht om het probleem op te lossen. Ten eerste wordt het analoge signaal geleverd aan de Arduino 101 analoge pin via een spanningsdeler met 2 weerstanden, waarvan de FSR een conventionele weerstand is. We hebben de waarde van deze tweede weerstand verlaagd en de sensor leek gevoeliger te zijn voor aanraking, maar hij reageerde nog steeds niet zo goed op zaadveranderingen als we zouden willen. Dus toegevoegd in een hardwarewijziging aan dit alles. Enigszins analoog aan het principe van Pascal, dat als we in plaats van het gewicht van de zaden over het hele oppervlak van de FSR uit te oefenen, we een platform zouden creëren met een klein contactpunt in het midden, we de kracht van het zaad op de FSR. Precies het tegenovergestelde van een sneeuwschoen en het werkte!

Een andere kleine uitdaging is om de FSR op een veilige en betrouwbare manier met de Arduino 101 te verbinden. Dit is eenvoudig op te lossen door het gebruik van 2-pins 3,5 mm aansluitblokken. Zorg ervoor dat de afstand van het aansluitblok overeenkomt met die van uw bord.

De rest van de Arduino 101-hardware is eenvoudig. We hebben het Adafruit Si702-breakoutboard aangesloten op de I2C-buspinnen () en de lege +3.3V gebruikt voor stroom. Het hele pakket wordt van stroom voorzien via een 4XAA schakelbaar batterijpakket dat zich onder de hoofdbehuizing bevindt.

We hebben de IR- en FSR-sensoren gesoldeerd aan Adafruit Perma-Proto Quarter-sized Breadboard-printplaten en deze met dubbelzijdig plakband aan de onderkant van de Arduino 101 vastgemaakt. Het hele pakket is in de vogelvoederbak met frisdrankfles geplaatst en heeft temperaturen onder het vriespunt, mist en lichte regen en sneeuw overleefd (nep-blizzard 'Stella'!).

Arduino 101 Schets:

De belangrijkste taak van de schets is om de aangesloten sensoren te bewaken en de waarden van de sensoren via BLE te rapporteren. Alle gegevens in BLE worden verzonden als een pakket van bytes. Of uw originele gegevens nu een int float of array of char zijn, u zult deze moeten opsplitsen in zijn byterepresentatie om via BLE te verzenden. De gemakkelijkste manier die ik ken om dit te doen, is door een unie van datatypes te creëren. Een unie stelt ons in staat om dezelfde geheugenlocatie te delen tussen twee verschillende gegevenstypen. In ons geval levert de SI7021 temperatuur- en vochtigheidssensor gegevens als een getal met drijvende komma. De Arduino C-taal vertegenwoordigt een float als 4 bytes, dus we creëren een unie tussen onze temperatuur float en vochtigheid float en een array van 4 bytes.

/** * De Union-richtlijn staat toe dat deze variabelen dezelfde geheugenlocatie delen. Zie de * mijn tutorial Imu to You!(https://www.hackster.io/gov/imu-to-you-ae53e1?team=18045) tutorial voor verdere * bespreking van het gebruik van de vakbondsrichtlijn in C. */ unie { float t; niet-ondertekende char bytes [4]; } tempData; unie { float h; niet-ondertekende char bytes [4]; } vochtigheidData; unie { int f; niet-ondertekende char bytes [2]; } feedData;  

Wanneer we de drijvende-kommawaarde in de unie opslaan, wordt de byte-array ook gevuld. Om de gegevens te verzenden, geven we de reeks bytes door aan de functie setValue() van deze kenmerken.

Voor embedded toepassingen kan het gebruik van de delay()-functies problemen veroorzaken. Ten eerste, terwijl de vertragingsfunctie wordt aangeroepen, stopt alle processoractiviteit gedurende de periode van de vertraging. Dit is niet ideaal wanneer vogels op elk moment kunnen komen neerstrijken. Een tweede probleem is dat de functie delay() problemen kan veroorzaken met het BLE-meldingsmechanisme. De manier om dit te voorkomen is door geen delay() te gebruiken in onze schets. Er is echter vaak een vertraging in het codeprogramma nodig. Om dit te verhelpen, gebruiken we de methodebeschrijving in deze set van 3 supertutorials van Bill Earl van Adafruit.

In hoofdlijnen maken we een object dat ons ingesloten apparaat vertegenwoordigt. We beslissen over een interval of een reeks intervallen om onze sensoren die op dit apparaat zijn aangesloten, te pollen. We maken dan een Update() functie.

void Update() { // Serial.print("Feed Sensor:");Serial.println(analogRead(A0)); // Baars Activiteit-updates/-meldingen zijn afhankelijk van tijd en nabijheidssensoren currentPerchMillis =millis(); if ((currentPerchMillis - previousPerchMillis)> perchInterval ) { previousPerchMillis =currentPerchMillis; currentLeftPerch =digitalRead (LEFT_PERCH); currentRightPerch =digitalRead (RIGHT_PERCH); if ((currentLeftPerch ==0) &&(previousLeftPerch ==1)) { // nieuwe activiteit op de leftperch // BLE meldt perchCharacteristic.setValue(1); Serial.println("LINKER BAANACTIVITEIT"); vorigeLeftPerch =0; } ...}  

Deze functie dient om te controleren of de tijdsintervallen voor onze sensoren zijn verstreken, zo ja, update de sensoren, of negeer ze gewoon. De functie Update() wordt herhaaldelijk aangeroepen in de sectie loop() van onze schets.

void loop() { // plaats hier je hoofdcode, om herhaaldelijk uit te voeren:blePeripheral.poll(); birdFeeder.Update(); }  

Daarbij bootsen we met onze sensoren een realtime, multitasking-effect na.

Intel Edison en Arduino Breakout Board:

Het meest uitdagende deel van het werken met de Intel Edison is het instellen ervan. De beste tutorial die ik hierover heb gevonden, is Vincent Wong's Intel Edison en Intel XDK IoT Edition 101. Ik kan je garanderen dat het de moeite waard is om dit proces te doorlopen en enkele JavaScript-voorbeelden uit te proberen!

Als u met uw Edison werkt en de Intel XDK IoT-editie gebruikt, kunt u deze op de opdrachtregel gebruiken en configureren. U kunt ook profiteren van de vele JavaScript/Node-voorbeeldprogramma's en -sjablonen. Het leren en gebruiken van JavaScript/Node om te programmeren zal een groot aantal gebruiksvriendelijke en krachtige API's openen, zoals PubNub, Noble.js en Cloudinary.

Nadat je de Edison hebt ingesteld en een actieve verbinding met je wifi-netwerk hebt bevestigd, kun je de bibliotheken installeren die nodig zijn voor dit project:

npm nobel installeren

npm installeer pubnub

npm cloudinary installeren

De USB-webcam

Een google-zoekopdracht van "intel edison webcam" zal verschillende mooie voorbeelden en tutorials opleveren. Maar er is wat verwarrend materiaal dat volgens mij voornamelijk te wijten is aan enkele wijzigingen in de modules die beschikbaar zijn in het Yocto-besturingssysteem. Yocto is een embedded versie van linux die de Intel edison draait. De Logitech c270 is een uvcvideo-compatibele webcam. Er zijn talloze tutorials om ervoor te zorgen dat uw Edison de uvcvideo-driver/-module heeft geïnstalleerd. Zonder dit kun je geen interactie hebben met de camera en geen foto's maken met de camera.

Ik heb de volgende stappen van Webcamera op Intel Edison met uploads gebruikt om de webcam op mijn Edison te laten werken. Ik heb de instructies van deze blogpost hieronder gepost voor het geval het ooit oud zou worden.

Met uw Edison worden de volgende instructies uitgevoerd op de opdrachtregel op het tabblad XDK seriële terminal.

"We zullen wat extra pakketten gebruiken, die geïnstalleerd kunnen worden met opkg pakket manager. Voor de eerste bewerkingslijst van repo's met vi:

vi /etc/opkg/base-feeds.conf

en zorg ervoor dat je al deze regels in het bestand hebt staan:

src/gz all 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

Update nu de pakketcache:

opkg-update

En installeer de kernelmodule om usb uvc-camera's te ondersteunen.

opkg installeer kernel-module-uvcvideo

Sluit nu uw webcam aan op de USB-poort en voer deze opdracht uit.

ls -l /dev/video*

Als uw camera met succes is gedetecteerd, is de uitvoer als volgt:

crw-rw---- 1 rootvideo 81, 0 juli 25 09:35 /dev/video0

Om met de webcam te werken en om op tijd foto's te maken moeten we 2 extra pakketten installeren:

opkg fswebcam installeren vriendje

*** let op we hebben geen cronie geïnstalleerd voor dit project, we hebben alleen opkg fswebcam geïnstalleerd. vriendje is niet nodig omdat we fswebcam noemen wanneer de IR-sensoren worden geactiveerd door een vogel op een baars, niet volgens een tijdschema ***

Werken met camera

Voer deze opdracht uit om uw camera te testen:

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

  • -r 1280x720 stel de resolutie van de afbeelding in, het is beter om het maximum te gebruiken dat beschikbaar is voor uw camera (optioneel)
  • — jpeg 100 zet de JPEG-kwaliteit op maximaal. Het is handig als je later iets met deze afbeeldingen gaat doen (optioneel)
  • -D 3 -S 13 voegt 3 seconden vertraging toe en slaat de eerste 13 frames over. Het is nodig, want sommige webcams hebben tijd nodig om de beste foto's te maken (aanbevolen)
  • test.jpg is de naam van het uitvoerbestand "

Aanvullende informatie over het gebruik van een webcam met de Edison, en andere echt leuke projecten, is te vinden op Dr. Kim's github-pagina. Ze plaatst ook coole projecten op Hackster.io!

Naast het bevestigen dat de juiste module aanwezig was, moest ik ook de schakelaar tussen de microusb-kabels en de USB-poort in de richting van de USB-poort draaien en het Arduino-schild op een voeding aansluiten. Ik gebruikte de compacte schakelende voeding - selecteerbare uitgang 3-12VDC (Adafruit-product-ID:1448).

Plaats nu uw SD-kaart in de SD-kaartsleuf. De Seriële Terminal . gebruiken gebruik in de Intel XDK de opdrachtregel om de kaart te controleren door de volgende opdrachten in te voeren:

cd /media/sdcard

ls

Dit zou alle bestanden op de kaart moeten weergeven, of niets als er geen bestanden aanwezig zijn. U zou geen foutmeldingen moeten zien. Als je foutmeldingen ziet, raad ik aan om het Edison-bord opnieuw op te starten zonder de SD-kaart te verwijderen door deze opdracht in te voeren:

opnieuw opstarten

Herhaal dan de bovenstaande commando's nadat je weer bent ingelogd op je Edison.

Voer nu de volgende opdracht in om onze Edison toegang te geven tot Bluetooth:

rfkill deblokkeer bluetooth

Om te bevestigen dat Bluetooth is ingeschakeld en werkt, voert u het volgende in:

bluetoothctl

Typ vervolgens

scan aan

Dit zou moeten worden getoond door BLE-apparaten als zodanig:

Sluit nu bluetoothctl af en klik op het tabblad Intel XDK IoT en maak vervolgens verbinding met uw bord. Selecteer een project in het menu aan de linkerkant, zoals BLESCAN. Verwijder de inhoud van index.js en verwijder de afhankelijkheden uit het bestand package.json.

Vervang hier de inhoud van index.js door het programma uit onze github-repository. Upload deze code naar je Edison. Zorg ervoor dat de Arduino 101 is ingeschakeld en voer de Edison-code uit. Zodra de Edison je Arduino 101 heeft gedetecteerd, zou je zoiets als dit moeten zien:

De code:

De code die op de Edison draait, is geschreven in JavaScript of beter gezegd Node.js. Nadat we de benodigde objecten uit onze geïmporteerde bibliotheken hebben gemaakt, gaan we variabelen maken die de BLE-service vertegenwoordigen die op de Arduino 101 draait.

noble.js

 // BLE-service en kenmerken voor nobel // Deze moeten overeenkomen met de service van de randapparatuur en karakteristieke UUID's // (in dit geval op de Arduino 101) var LOCAL_NAME ='bird'; var SERVICE_UUID ='917649a0d98e11e59eec0002a5d5c51b'; //geen streepjes!!!! var PERCH_UUID ='917649a1d98e11e59eec0002a5d5c51b'; var TEMPERATURE_UUID ='917649a2d98e11e59eec0002a5d5c51b'; var HUMIDITY_UUID ='917649a3d98e11e59eec0002a5d5c51b'; var FEED_UUID ='917649a4d98e11e59eec0002a5d5c51b';  

Deze UUID's worden gebruikt door nobel.js. Als je de UUID's op je Arduino wijzigt, moeten ze hier ook worden gewijzigd. Het is belangrijk om ervoor te zorgen dat je geen streepjes hebt zodat nobel.js goed werkt.

Om met nobel.js te kunnen werken, moeten we zoeken naar BLE-randapparatuur, deze ontdekken en vervolgens verbinding maken. Eenmaal verbonden, zullen we de kenmerken die beschikbaar zijn voor gebruik doornemen, met behulp van de UUID-definitie hierboven. De kenmerken zijn allemaal lees-/meldkenmerken.

noble.on('discover', function(peripheral){ console.log('Found BLE Device:[' + periferie.id + '] ' + perifere.advertisement.localName); if(peripheral. advertentie.localName ==LOCAL_NAME){ console.log('Gevonden:' + perifere.advertisement.localName);} perifere.connect(function(error) { console.log('Verbonden met randapparatuur:' + perifere.uuid); nobel.stopScanning(); // voorkomen dat we "verdwaalde" services perifere.discoverServices([SERVICE_UUID], function(error, services) { console.log('services:' + services.length); var feederService =services [0]; console.log('Bird Feeder Service!'); feederService.discoverCharacteristics([], function(error, karakteristieken) { karakteristieken.forEach(function(karakteristiek) { console.log('karakteristieke UUID:' + karakteristieke .uuid); karakteristieke.on('data', function(data, isNotification) {transformRawData(characteristic.uuid,data);}); karakteristieke.notify('true', function(error) { if (error) throw e fout; }); }); }); }); }); });  

Er zijn 2 belangrijke elementen om op te wijzen uit het codegedeelte hierboven. Ten eerste was er een verandering in de manier waarop u aan noble.js vertelt dat dit een lees-/meldingskenmerk is. Van de github-pagina van Sandeep Mistry:

Gegevens

Uitgezonden wanneer het lezen van kenmerken is voltooid, resultaat van characteristic.read(...) of karakteristieke waarde is bijgewerkt door randapparaat via melding of indicatie - na te zijn ingeschakeld met notify(true[, callback(error)]) .

karakteristieke.on('data', callback(data, isNotification));

karakteristieke.once('lezen', callback(data, isNotification)); // erfenis

De wijziging is van 'lezen' naar 'gegevens'. We kwamen hier wat problemen tegen door per ongeluk een oudere versie van nobel te gebruiken en vervolgens de nieuwste versie te wijzigen. Het kostte vele uren om erachter te komen wat er is gebeurd, dus we wilden je mogelijk helpen dit te voorkomen

De andere sleutel hier is de functie transformRawData(characteristic.uuid,data). Deze functie haalt de uuid en gegevens uit de read en geeft deze door aan de grote en onpraktische functie. Elke keer dat het BLE-meldingsmechanisme wordt geactiveerd door een verandering in een kenmerk, wordt deze functie aangeroepen en worden de ontvangen gegevens verwerkt. Hier vindt alle opwinding plaats.

transformRawData controleert om te zien welk kenmerk wordt ontvangen.

In het geval dat de Arduino ons vertelt dat er activiteit is op de baars, willen we een foto maken. In dit geval gebruiken we de child_process bibliotheek om een ​​oproep te doen naar het programma fswebcam dat zich in ons Yocto(linux) systeem bevindt. Met de child_process-bibliotheek kunnen we opdrachtregelfuncties uitvoeren vanuit onze node.js-code. Dit is een zeer krachtige functie.

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

PubNub en Cloudinary:

Deze functie is ook waar PubNub en Cloudinary in het spel komen! PubNub biedt een realtime datastreamingnetwerk voor uw applicatie. Dit betekent dat met een internetverbinding uw applicatie overal ter wereld live data kan streamen. Elke andere app of ander programma met de abonnementssleutel voor uw gepubliceerde streams heeft toegang tot een JSON-payload die uw gegevens vertegenwoordigt. In ons geval sturen we het huidige zaadniveau, de temperatuur, de luchtvochtigheid en het aantal baarsbezoeken. Daarnaast sturen we een link naar de 3 meest actuele foto's van de feeder! Dit zijn jpeg's die met ons programma naar Cloudinary zijn geüpload. Het is niet nodig om een ​​server te draaien! Een eenvoudig HTML-bestand met ingebed JavaScript dient als een realtime interface voor onze vogelvoeder met dank aan PubNub!

In de bovenstaande afbeelding heb ik mezelf eenvoudigweg het HTML-bestand met de code voor de interface met de vogelvoeder via PubNub ge-e-maild en elk vanuit een lokale map in een Chrome-browser geladen. U hoeft geen server te coderen om deze pagina op uw Edison weer te geven.

Cloudinary is een service voor het uploaden, opslaan en transformeren van afbeeldingen. Het heeft een zeer eenvoudig te gebruiken api. Bij het ontwikkelen van dit project kon ik geen eenvoudigere, meer rechttoe rechtaan te gebruiken api vinden. Er is niets vergelijkbaars daarbuiten. Hun helpdesk is ook fantastisch. Het is zeker iets dat u wilt bekijken voor uw projecten!

In de onderstaande code gebruiken we de cloudinary api om de 3 nieuwste afbeeldingen van de lokale SD-kaart te uploaden. De URL die door deze upload wordt geretourneerd, wordt vervolgens opgeslagen in een array. Deze URL's worden vervolgens als onderdeel van onze JSON-payload naar PubNub gestuurd, zodat ze via onze HTML-pagina kunnen worden weergegeven. Schoonheid, hè?!

index.html

Waar gaat dit index.html-bestand over? Het bestand index.html is onze gebruikersinterface. Omdat we onze gegevens streamen met PubNub en onze afbeeldingen in een openbaar toegankelijke URL plaatsen met Cloudinary, kunnen we profiteren van het Javascript/HTML/CSS power trio om een ​​draagbare gebruikersinterface te maken. Zowel PubNub als Cloudinary zijn zeer gebruiksvriendelijk en krachtig Javascript-API's. We importeren ze gewoon in ons html-bestand om ze te gebruiken:

     

Bij het maken van het PubNub-object geven we het de abonneersleutel voor onze gegevensstroom en het heeft in realtime toegang tot de gegevensstroom wanneer we deze stroom publiceren.

 

Productieproces

  1. DHT Tiny Breakout voor de Raspberry Pi
  2. HC-SR04 ultrasone bereiksensor op de Raspberry Pi
  3. De beste accessoires voor je Raspberry Pi
  4. SIGHT:For the Blind
  5. Intel roept Udacity in om graad voor AI on the Edge toe te kennen
  6. De juiste sensor kiezen voor het vullen van applicaties
  7. Sensorfilm voor ruimtevaart
  8. WiFi RSSI-sensortracker voor het ISS
  9. Nieuw wiskundig hulpmiddel kan de beste sensoren voor de taak selecteren
  10. De uitdaging van de 5S-methode voor de industrie 4.0
  11. Intel Edison IoT:hoe u de Intel Edison kiest voor uw IoT-prototype?