Inhoudsopgave:

RPi-Zero IoT-gebeurtenisindicator / kleurenlamp - Ajarnpa
RPi-Zero IoT-gebeurtenisindicator / kleurenlamp - Ajarnpa

Video: RPi-Zero IoT-gebeurtenisindicator / kleurenlamp - Ajarnpa

Video: RPi-Zero IoT-gebeurtenisindicator / kleurenlamp - Ajarnpa
Video: Stil zigbee-relais in een stopcontact zonder nullijn, installatiefuncties, condensator 2024, Juli-
Anonim
RPi-Zero IoT-gebeurtenisindicator / kleurenlamp
RPi-Zero IoT-gebeurtenisindicator / kleurenlamp
RPi-Zero IoT-gebeurtenisindicator / kleurenlamp
RPi-Zero IoT-gebeurtenisindicator / kleurenlamp
RPi-Zero IoT-gebeurtenisindicator / kleurenlamp
RPi-Zero IoT-gebeurtenisindicator / kleurenlamp

Geen extra microcontroller en geen HAT-uitbreidingsmodule vereist. De RPi-Zero doet het allemaal. Gebruik nog beter een RPi-Zero W!

Voorbeeldgebruik: statusindicator webservice (bijv. DowJonesIndex-tracking), statusindicator voor politieke of sportevenementen, sfeerlicht, een sensor volgen, noem maar op. Bekijk de video in stap 6.

De Raspberry-Pi heeft slechts één hardware-ondersteunde PWM-lijn. Dit project heeft 3 PWM-lijnen nodig, dus ik gebruikte een softwaregestuurde PWM 'c'-bibliotheek (https://wiringpi.com/reference/software-pwm-library/), die al zou moeten zijn geïnstalleerd.

Ik heb de verwerking opgedeeld in 2 processen. Een, interruptgestuurd, de stuurlijnen naar de LED schakelend als dat nodig is, zijn marsorders krijgend van zijn 'stdin'-stroom. De andere is een event-driven nodeJS-server die gebruik maakt van socket IO. Dit is om te voorkomen dat dingen zoals licht flikkeren en tegelijkertijd reactievermogen te garanderen. De combinatie gebruikt doorgaans minder dan 5% van de CPU. In tijden van continue kleurupdates (via schuifregelaars en/of veel clients) kan het gemakkelijk meer dan 50% gebruiken (vooral wanneer ook de browser in de Pi-Zero GUI wordt gebruikt). Merk op dat wanneer een wijziging binnenkomt, updatemeldingen uitgaan naar alle open socket-clients.

Stap 1: Wat heb je nodig

Wat je nodig hebt
Wat je nodig hebt
Wat je nodig hebt
Wat je nodig hebt
  • Pi-Zero micro-SD-kaart, 8 GB aanbevolen. Met Raspbian-Linux of NOOBS
  • RGB Led (ik gebruikte deze:
  • 3 weerstanden (waarde gebaseerd op gewenste stroom en/of gewenste helderheid, 1/8 watt)
  • een WiFi, USB-dongle (bijv. https://www.ebay.com/itm/252018085448) of nog beter een Raspberry Pi Z-W (met ingebouwde WiFi)
  • een koffer (bijvoorbeeld een kleine: https://www.ebay.com/itm/131583579374 met meer ruimte:
  • een diffuser (zie voorbeelden in afbeelding)
  • Kabels en adapters indien nodig.

Optioneel, afhankelijk van hoe je de componenten wilt aansluiten

  • koptekst (https://www.ebay.com/itm/14186077616)
  • jumpers (https://www.ebay.com/itm/262235387520)
  • haakse micro-USB-adapter (blauwe USB 2.0 OTG R)
  • mini-USB-hub, alleen gebruikt tijdens de installatiefase

Stap 2: Pi-Zero Setup en voorbereiding voor ontwikkeling

Volg deze initiële instelling voor uw PiZero om deze klaar te maken voor ontwikkeling…https://www.raspberrypi.org/help/noobs-setup/

Zodra u een microSD-kaart met NOOBS-configuratie heeft, doet u het volgende:

Sluit de microSD-kaart aan. Bevestig een USB-hub met laag vermogen met een wifi-dongle, toetsenbord en muis (u kunt een draadloze muis en/of toetsenbord gebruiken, hoe dan ook, het kan, maar het is niet waarschijnlijk, dat er externe voeding voor de hub nodig is). Ik gebruikte adapters en een hub die ik al had.

Sluit nu een monitor en een microUSB-voedingsadapter aan en hij zal opstarten. Ga door en voltooi de instructies voor het instellen van Raspbian, Debian Linux, zoals te zien is in de noobs-setup-link hierboven.

Bovendien had ik een te lage resolutie. Dus ik heb deze regels toegevoegd aan /boot/config.txt

disable_overscan=1

hdmi_group=2 hdmi_mode=58

De hdmi_mode=58 werkt voor mijn monitor, die van jou heeft misschien iets anders nodig.

zie: make-raspberry-pi-use-full-resolution-monitor en

raspberrypi.org/documentation/configuration/config-txt.md

Na het opstarten gaat de Pi-Zero naar de GUI-interface.

Om gebruik te maken van de volledige grootte van mijn microSD-kaart heb ik de selectie van raspi-config #1 'Expand Filesystem' gebruikt. Voer vanaf de opdrachtregel in een terminalvenster 'sudo raspi-config' in. Raadpleeg: documentatie/configuratie/raspi -config.md

Ook heb ik deze instellingen gewijzigd onder #5 'Internationaliseringsopties'

  • Landinstelling: nl_US. UTF-8 UTF-8
  • Tijdzone: Amerika … Los_Angeles
  • Toetsenbordindeling: generieke 105-toetsen (intl) pc … Engels (VS)

Voor mij maakte de toetsenbordstandaard uit Groot-Brittannië (waarvoor Raspbian vooraf is ingesteld) veel van mijn bewerkingen tot een echt karwei.

Wijzig deze instellingen indien nodig, passend bij u. Merk op dat je de pijltjestoetsen en de tab-toets moet gebruiken om te navigeren in 'raspi-config'; en na een selectie kan het erg traag reageren.

Ik vond het geen probleem om verbinding te maken met internet met een WiFi-USB-dongle (ik gebruikte 2 verschillende). Ik moest gewoon mijn WiFi-toegangssleutelwachtwoord invoeren met behulp van een vervolgkeuzelijst in de rechterbovenhoek van de GUI. Zodra ik dit deed, zou het automatisch verbinding maken na elke herstart / power-up.

Nu was ik klaar voor algemene ontwikkeling.

Om hier te komen kun je vele paden bewandelen. Tot nu toe heb ik hier niet veel details gegeven, maar er zijn veel methoden en configuraties die op internet in meer detail worden beschreven. Waaronder een voor een headless setup waarbij u een extern ssh-terminalvenster op uw pc zou gebruiken om de ontwikkelingsstappen uit te voeren die in deze instructie worden gegeven.

Stap 3: Ontwikkelomgeving en tools

Ontwikkelomgeving en tools
Ontwikkelomgeving en tools
Ontwikkelomgeving en tools
Ontwikkelomgeving en tools

Voor de systeemconfiguratie en software die ik voor het project heb ontwikkeld, deed ik de R&D op een Raspberry Pi-2; want het heeft een quad-core CPU waardoor browsen en code-ontwikkeling, met meerdere vensters, een stuk sneller gaat. U kunt natuurlijk elk model Raspberry-Pi gebruiken om dit project te realiseren.

Om Node.js in te stellen (gebeurtenisgestuurde I/O server-side JavaScript-ondersteuning) heb ik het volgende gedaan…

sudo apt-get update

sudo apt-get install nodejs npm

Deze nodeJS-pakketten toevoegen (npm is Nodejs Package Manager)

npm install express

npm installeren socket.io

Referenties:https://nodejs.org/en/

www.npmjs.com/package/express Snel, minimalistisch webframework

www.npmjs.com/package/socket.io Socket. IO maakt realtime bidirectionele, op gebeurtenissen gebaseerde communicatie mogelijk

Stap 4: De hardware

de hardware
de hardware
de hardware
de hardware
de hardware
de hardware
de hardware
de hardware

De gebruikte weerstandswaarden zijn allemaal verschillend, aangezien de spanningsval en efficiëntie verschillen voor alle drie de LED-kleursegmenten. De GPIO High-uitgangsniveaus waren allemaal ongeveer 3,2 volt. Elk LED-segment is getest om er zeker van te zijn dat het minder dan 20 mA maximaal verbruikt en ongeveer 40 mA bij elkaar (< 50 mA max totaal toegestaan), wat de PiZero gemakkelijk aankan. Ik kreeg zo veel output helderheid als ik kon, direct aansturen van de LED; dat is genoeg voor mijn behoeften. Om hogere stromen aan te sturen, voor een veel helderdere output, kunnen tussenliggende aandrijftransistors worden gebruikt met een gemeenschappelijke anode-LED met zijn anode aangesloten op de 5v-lijn. PS: omdat mijn verschillende witniveaus een beetje blauwachtig uitkomen, 27 in plaats van 24 Ohm zou voor mij een betere keuze zijn geweest.

Merk op dat ik een header met mannelijke pinnen heb gebruikt en verbonden met de LED-poten met FF-jumpers. Dit hield de totale hoogte laag. Ik soldeerde de weerstanden in het midden van de jumpers. Het gebruik van geen printplaat of soldeerloze kaart, samen met het gebruik van een haakse micro-USB naar USB-adapter voor de WiFi-dongle, maakte de eindmontage redelijk compact.

Voor een diffuser raad ik een pingpongbal aan (het is gemakkelijk om een gat te boren dat net groot genoeg is om je 5-8-10 mm LED in te steken). Of knip de bovenkant van een LED-lamp af (een die een plastic diffuser gebruikt). Markeer hiervoor een lijn, met een fijne puntslijper, waar u wilt snijden, en gebruik een Dremel-achtig gereedschap met een dun afgesneden hulpstuk. Eventueel kan een mooi klein geslepen glazen potje of drinkglas worden gebruikt. Als je eenmaal een diffuser hebt gevonden, lijm je deze op de bovenkant van de behuizing.

Voor demonstraties gebruik ik graag een kleine Li-powerbank die in de behuizing is geplaatst. Dit apparaat lijkt meer volledig draadloos. Natuurlijk zal het een beperkte bedrijfstijd hebben in die configuratie. Voor een normale werking gebruik ik gewoon een micro-USB-wandadapter.

Stap 5: Projectsoftware

Projectsoftware
Projectsoftware

Ik heb twee programma's gebruikt, een Node.js-proces dat met een onderliggend proces praat via zijn stdin-gegevensstroom. Dit is zodat ze elk kunnen doen waar ze goed in zijn en als onafhankelijke processen in hun eigen tempo kunnen werken.

Dit is wat ik deed: Maar dat hoeft niet, want ik heb een tar-gzip-bestand geleverd dat de resulterende bestandsboom bevat.

NodeJS server-side setup:

cd ~

mkdir node_rgb cd node_rgb mkdir openbaar

zet 'index.html' en 'style.css' in de map '~/node_rgb/public'put 'rgbDriver.c' en 'rgb_main.js' in de map '~/node_rgb'

Compileer/bouw het c-proces 'rgbDriver':

cd ~/node_rgb

cc -o rgbDriver rgbDriver.c -lwiringPi -lpthread

De equivalentie downloaden en uitbreiden

Om node_rgb.tgz (hieronder) te downloaden naar uw Pi-Zero in uw homedirectory (~pi) kunt u een van de volgende drie dingen doen:

  1. Download vanuit de browser in de GUI van uw Pi-ZeroVerplaats het bestand naar ~pi/
  2. In een terminalvenster dat met u is verbonden Pi-Zero:cd ~piwget

    mv FZBF9BDIL6VBHKF.tgz rgb_node.tgz

  3. Download vanuit een browser op uw desktopcomputer. Gebruik WinSCP om het naar de ~pi-map op de Pi-Zero te kopiëren

Na het uitvoeren van #1 2 of 3 hierboven …

cd ~

tar -xzvf node_rgb.tgz tree node_rgb … node_rgb naar public naar Dow_Jones_Index.html naar index.html naar style.css naar rgbDriver naar rgbDriver.c naar rgb_main. js ├── start_rgb ├── kill_rgb └── track_dji

Het resulterende uitvoerbare (van bovenaf) 'rgbDriver' kan onafhankelijk van het Node.js-interfaceproces worden gebruikt.

Om te controleren of dit stuurprogramma en de hardware werken, voert u sets van drie waarden (van 0-255), gescheiden door een spatie, naar het stuurprogramma. Zoals 'echo 255 0 0 |./rgbDriver' voor rood of 'echo 0 255 0 |./rgbDriver' voor groen. Merk op dat de "./" het besturingssysteem vertelt om ons programma 'rgbDriver' in de huidige map te vinden. Wanneer u een ^c (cntl-c) geeft om de bestuurder te stoppen, kan de led wel of niet blijven branden. Als alternatief kunt u de waarden interactief invoeren. Typ, vanaf de opdrachtregel, deze regels een voor een en kijk naar de LED.

./rgbDriver

0 255 0 100 0 100 255 255 0 …etc… ^c

Zorg ervoor dat er geen 2 van deze processen parallel lopen.

Gebruik deze opdracht om de volledige softwaretoepassingssuite te starten, inclusief de Node.js-server:

sudo-knooppunt rgb_main.js

Gebruik vervolgens cntl-c als u de Node.js-server wilt stoppen. Start het met

sudo-knooppunt rgb_main.js&

om het op de achtergrond te laten draaien, maar dan moet je een 'sudo kill -9 pid'-commando gebruiken om het te stoppen. Als dit commando je vreemd lijkt, bekijk dan de uitvoer van deze commando's: 'man kill' & 'man sudo'.

Gebruik een browser, op uw desktop, tablet of telefoon, die is verbonden met uw lokale netwerk. Ga naar https://raspberrypi:8080/ of als dat niet werkt, gebruik dan het ip-adres van het apparaat (verkregen uit de cmd 'ifconfig') zoiets als 192.168.1.15 plus de poortspecificatie: 8080 of als je de Pi-Zero's gebruikt GUI: localhost:8080 zal werken.

Bedien de RGB-schuifregelaars, op de pagina die verschijnt, en kijk hoe de RGB-LED-lamp meegaat.

Andere handige commando's Houd er rekening mee dat als u meer dan één 'rgbDriver' tegelijk gebruikt, u waarschijnlijk onvoorspelbaar gedrag krijgt. Als u een tweede exemplaar van rgb_main.js probeert uit te voeren, zal er een fout optreden.

Met deze opdracht worden alle gerelateerde processen weergegeven:

ps aux |grep rgb

Deze opdracht zal alle nodeJS-processen doden, samen met de onderliggende processen van 'rgbDriver':

sudo ps aux | grep-knooppunt.*rgb | awk '{print "sudo kill -9 " $2}' | NS

Stand-alone werking

Om de Pi-Zero de Node.js-server-app te laten opstarten wanneer deze opstart … met uw favoriete editor (bijv. nano ~/.bash_profile), typt u de volgende regels en slaat u op in ~/.bash_profile

cd node_rgb

sudo-knooppunt rgb_main.js &

Om te voorkomen dat u vervelende foutmeldingen krijgt bij het openen van een terminalvenster, gebruikt u voorwaardelijke codering zoals het shellscript in het 'start_rgb'-bestand

Wanneer de Pi-Zero embedded draait, zonder toetsenbord, muis of monitor; de grafische gebruikersinterface zal minimale CPU-tijd in beslag nemen, aangezien er geen gebruikersinteractie zal zijn. Ik schakel het automatisch opstarten van de GUI niet uit, omdat de Pi-Zero in dit geval meer middelen heeft dan nodig; en ik vind het leuk om een paar kabels aan te sluiten en te gebruiken, op elk moment in de toekomst. Dit is echter niet nodig omdat u een externe SSH-terminal (bijv. PuTTY) kunt gebruiken om eventueel onderhoud uit te voeren.

Het gebruiken als een gebeurtenismonitor

Ik heb een webpagina gemaakt om de dagelijkse verandering in de Dow Jones Index te volgen. De bron kan worden gebruikt als richtlijn voor uw eigen pagina die enkele webgegevens gebruikt en dienovereenkomstig uw Pi-Zero-indicator aanstuurt. Deze pagina haalt zijn (json)gegevens van een webservice van Google. Er zijn veel vormen van webservices, dus u zult degene moeten onderzoeken die u wilt gebruiken om de JavaScript-code te bepalen om toegang te krijgen.

Als u uw apparaat wilt gebruiken, net als ik, als een speciale, stand-alone, Dow Index change Indicator, voeg deze regels dan toe aan het einde van het ~/.bash_profile-bestand, of zoals gewenst SSH in en geef de tweede opdrachtregel uit. Als u vervolgens de afstandsbediening 'kill -9' wilt gebruiken, het resulterende epiphany-browserproces.

slaap 20

epiphany-browser --display=:0.0 localhost:8080/Dow_Jones_Index.html &

De indicator zal lichtgrijs oplichten bij een waarde van 0. Bij hogere waarden wordt hij steeds groener. Het is het helderst puur groen op ongeveer 250. Hogere waarden veroorzaken eerst een oppervlakkige flits, tot een diepste flits op ongeveer 500. Voor negatieve waarde (dagelijkse dalingen in de Dow) doet het hetzelfde, maar in rood.

UPDATE mei 2018

Ik heb een nieuwe webpagina gemaakt (SolarStorm_devCon.html, bijgevoegd als een.txt-bestand, omdat het.html-bestand niet wordt geüpload) die GeoMagnetic storm-informatie verzamelt (die een verwoestende CME, EMP zou kunnen voorspellen) en die gebruikt om een kleur weer te geven schaal die een soort Geo-Storm 'DevCon' Index weerspiegelt. geeft het potentieel aan van een ramp als gevolg van een elektromagnetische puls (EMP) als gevolg van ruimteweer, vermoedelijk zonnevlammen of een coronale massa-ejectie (CME). Gebruik het zoals u "Dow_Jones_Index.html" zou hebben gebruikt.

Stap 6: Beheer van webpagina's op afstand

Image
Image

Op dit punt kunt u uw IOT-kleurenlamp overal op uw lokale netwerk bedienen. Hoe u deze zichtbaar maakt op het openbare internet maakt geen deel uit van deze instructie. Als u een openbaar IP-adres voor uw apparaat instelt, moet u dit doen gebruik dat IP-adres in het open socket-commando in het JavaScript van uw pagina's (bijv. ~/node_rgb/public/index.html)

Ik ben van plan mijn Pi-Zero IOT-apparaat te gebruiken als een realtime kleurindicator voor de verandering van de dag in de Dow Jones Index. Ik heb een pagina gemaakt die dat doet, die json-gegevens van google.com/finance haalt. Ik heb verder een paar webpagina's gemaakt om het brede scala aan toepassingen voor dit kleine IOT-apparaat te demonstreren. In plaats van mijn PiZero op het openbare internet te zetten, heb ik hostte de pagina's op mijn bestaande openbare webserver (momenteel @ 71.84.135.81 alias: https://raspi.ddns01.com/ wanneer mijn gratis Dynamic Domain Name Server actief is), die draait op een originele versie B Raspberry-Pi.

In de code op mijn externe pagina's opende ik socketverbindingen naar 192.168.1.41:8080. Ik had mijn Pi-Zero's ip vastgezet op 192.168.1.41. Om op dezelfde manier te doen, volgt u de aanwijzingen bij het instellen van-raspberry-pi-met-wifi-en-een-statisch-ip onder de kop: Statisch IP-adres. Dus als u uw PiZero instelt op 192.168.1.41 op uw lokale netwerk, deze pagina's, geopend vanaf mijn website, zullen communiceren met uw apparaat, aangezien de verbinding vanaf de client wordt gedaan.

Dit zijn de pagina's die ik heb gebruikt om mijn Pi-Zero IOT-verlichtingsapparaat te testen en te bedienen. Als u deze pagina's oproept (https://71.84.135.81/iot/rgbLamp/ aka https://raspi.ddns01.com/iot/rgbLamp/ of een van de pagina's die op die pagina zijn ingelijst), zal de client-side JavaScript stuur je gemaakte IOT-licht aan (aangezien het draait op deze url "192.168.1.41:8080") Als je wilt, kun je de bron van een van die pagina's kopiëren en naar wens aanpassen.

Met de eerste pagina kunt u uw apparaat op elke kleur instellen. De LED-lamp en de kleur die u op de webpagina ziet, volgen redelijk goed. De gebruikte weerstandswaarden kunnen worden aangepast (evenals de monitor) om ze meer op elkaar af te stemmen. Ik besteedde weinig tot geen tijd om ervoor te zorgen dat ze overeenkwamen. Deze pagina zal de kleur bijwerken wanneer iemand anders de kleur verandert en de server het bijgewerkte infobericht verzendt.

Eén pagina is een eenvoudig, met een knop bediend verkeerslicht.

Er is een pagina die is ontworpen om een sportwedstrijd bij te houden (bijv. voetbal, basketbal, honkbal), een verkiezing, of zelfs aangepast voor een fondsenwerver of DEFCON-waarschuwingsniveau-stijlindicator. De scores (of vastgelegde verkiezingsstemmen) kunnen automatisch worden verkregen van een webservice of van een andere webpagina worden geschraapt. Ik heb geen automatische feed die mijn Contest_demo-pagina aanstuurt. Iemand met de juiste knowhow zou een krachtige driver kunnen toevoegen om krachtige LED-schijnwerpers te laten werken en een kamer (of sportbar) te baden met de kleur van een team als ze voorop lopen. Helaas ben ik te laat met deze instructable voor de superbowl-feesten van dit jaar, maar op tijd voor de verkiezingen van 2016.

Dan is er de pagina die lijkt op de pagina die ik zal gebruiken om van mijn apparaat een Dow Jones-tracking-indicator te maken. De schuifregelaar en knoppen staan alleen op de DJI-demopagina voor demonstratiedoeleinden. In de broncode voor deze pagina staat code die ik heb ontwikkeld om een op groen scherm geïnspireerd beeld opnieuw in te kleuren; met genoeg commentaar dat u het misschien ook nuttig vindt.

Alleen de eerste van deze 4 pagina's (samen met de op Pi-Zero gebaseerde index.html-pagina) luistert naar serverupdateberichten en ververst dienovereenkomstig. De rest stuurt alleen naar de server.

Aanbevolen: