In deze zelfstudie leer je hoe je een netwerk van kosteneffectieve, draadloze sensormodules kunt maken. Veel van de kant-en-klare draadloze modules kunnen te duur zijn voor gebruik in meerdere sensoreenheden. Hoewel Wi-Fi en Zigbee-modules populair en gebruiksvriendelijk zijn, kunnen hun kosten het gebruik ervan in een reeks sensoren onpraktisch maken. Er zijn echter goedkope RF-modules zonder alle dure functies die deze doelen prima zullen werken. Het Arduino-platform kan low-end radiomodules gebruiken om gemakkelijk en betrouwbaar te communiceren.
Zodra de hardware is samengesteld, maakt u gebruik van het Raspberry Pi-platform om de gegevens naar de Internet of Things-service van Xively te verzenden, waar u de waarden in de loop van de tijd kunt volgen en drempelwaarden kunt activeren.
Dit project omvat drie delen, twee zendereenheden en één ontvangereenheid. De zenders bestaan uit een Arduino-bord, sensor en RF-zender. De ontvanger bestaat uit een Arduino-bord, een RF-ontvanger, een logisch niveau-omzetter en een Raspberry Pi.
Er is een breed scala aan Arduino-compatibele kaarten die voor dit project kunnen worden gebruikt. De minimale vereiste voor het bord voor dit project is twee digitale GPIO-pinnen en één analoge pen. Selecteer een Arduino-compatibel bord dat aansluit bij de kosten en eenvoud van dit project.
In deze tutorial heb ik een set Arduino Nano-platen gebruikt die goed in een breadboard passen en eenvoudig te programmeren zijn. De 5V-versies van de Arduino pro mini of Trinket werken echter ook goed en tegen een veel lagere prijs. Deze vereisen echter wat meer ervaring om te programmeren en te gebruiken. Kies verstandig.
De zenders zelf zijn relatief eenvoudige circuits. Er wordt slechts één pin gebruikt om de informatie van de temperatuur- en vochtigheidssensor op te halen en één pin wordt gebruikt om die gegevens naar de RF-zender te sturen. Het breadboard-diagram wordt hieronder getoond.
De 9V-voeding wordt aangesloten op de cilinderconnector en maakt de onderste rails 9V. De vermogensregelaar in de Arduino produceert 5V die veilig te gebruiken is voor de radio en sensoren, de bovenste stroomrail van het diagram.
De sensor wordt geleverd met een weerstand van 10k ohm die de datastekker verbindt met vermogen als pull-upweerstand terwijl een andere draad deze verbindt met GPIO D3.
Zorg ervoor dat u de onderstaande instellingen volgt en zorg dat u de datasheet voor de sensor en RF-module dubbel controleert om ervoor te zorgen dat de componenten correct in het breadboard worden geplaatst en de stroom-, grond- en signaalpennen op de juiste pinnen worden aangesloten. Het fritzingdiagram is opgenomen in het bronpakket voor meer informatie.
Zender diagramDe antenne is een belangrijk onderdeel van het bord omdat de RF-module geen ingebouwde antenne heeft. Ik gebruikte een 6-inch vrouwelijk naar mannelijk doorverbindingsdraad aangesloten op het breadboard en het werkte goed genoeg om ontvangst van alle delen van mijn huis en een beetje buiten mogelijk te maken. Zoals in het diagram is aangegeven, is 6.5-inch optimaal voor deze antenne als u extra bereik nodig hebt.
Een opmerking over RF-gebruik. Er zijn verschillende wetten en regels over het gebruik van frequenties in verschillende landen. Zorg ervoor dat u zich aan deze regels houdt voordat u uitzendt. Dat gezegd hebbende, de signalen van deze modules zijn nauwelijks krachtig genoeg om buiten je huis door te gaan. Onder perfecte omstandigheden kunnen deze modules echter wel tot 500 voet worden uitgezonden.
De zender gebruikt twee bibliotheken die niet zijn gebundeld met de Arduino IDE. Download de bibliotheken zoals hieronder beschreven en decomprimeer ze in uw schetsdirectory in een submap genaamd Bibliotheken.
Deze tutorial veronderstelt dat je wat ervaring hebt met Arduino en hoe je ze programmeert met behulp van de Arduino IDE. Als je dat niet doet, zijn er zeer goede instructies op de officiële Arduino-site.
#define MYID 1 // het ID-nummer van dit bord. Verander dit voor elke plank die je flitst. // De ID wordt met de gegevens verzonden, zodat u kunt zien welk apparaat #define verzendt TRANSPIN 3 // welke pin moet worden verzonden op #define DHTPIN 4 // op welke pin de DHT is aangesloten #define UNIT 0 // 0 voor Fahrenheit en 1 voor Celsius
De MYID-definitie is een numerieke ID die de zender gebruikt om zichzelf uniek te identificeren. Omdat u meerdere zenders op verschillende locaties zult hebben, is het belangrijk om voor elke zender een unieke ID te hebben. Dit nummer zal opnieuw worden gebruikt wanneer u het receiver-script instelt.
De Seriële monitor venster reset de Arduino zodat u een regel code op het scherm ziet die er ongeveer zo uitziet:
Vochtigheid: 44.00% Temperatuur: 60.80 * F Verzendbericht: ID: 1: TS: 23143: TF: 60.79: RH: 44.00
Het bericht is samengesteld uit Naam: Value paren die de ontvanger zal verwerken. De zender zal het signaal met een lang willekeurig interval lezen en uitzenden. De sensoren veranderen niet erg of vaak, dus vaker uitzenden dan eenmaal per minuut voegt geen waarde toe. De willekeurige wachttijd is om meerdere sensoren naast elkaar te laten bestaan.
Zelfs als er sprake is van een verdubbeling en het signaal van beide zenders verloren gaat, zorgt het willekeurige interval ervoor dat hun volgende uitzendingen elkaar niet overlappen. De willekeurige seed voor dit interval wordt ingesteld vanaf een analogRead op een ongebruikte analoge poort die willekeurige waarden retourneert om ervoor te zorgen dat geen twee zenders hetzelfde patroon hebben.
De voorbeeldcode die de bovenstaande uitvoer genereert, is ingesteld om Fahrenheit te gebruiken. Je kan de ... zien TF: 60.79 identifier in de berichtentekenreeks die aangeeft dat mijn lab inderdaad slechts een haar is onder 61 graden. Maar de relatieve luchtvochtigheid RH: 44.00 is een comfortabele 44%. Je zou kunnen afleiden uit de koele, vochtige omgeving die mijn lab in mijn kelder heeft. Eén heeft misschien gelijk.
De zenders worden standaard ingesteld op 2 tot 5 minuten tussen uitzendingen. Als u dit wilt versnellen voor foutopsporing, wijzig dan de vertraging() waarde aan het einde van de schets is meer als 5000 (ms). Het wordt ten zeerste aanbevolen dat u dit terugzet en de code opnieuw uploadt naar uw zenders wanneer u klaar bent voor fulltime gebruik.
Het ontvangbord is verantwoordelijk voor het ontvangen van het broadcastbericht op de RF-ontvangercomponent en het verzenden van dat bericht via seriële draden naar de Raspberry Pi. Het Arduino-bord wordt gebruikt om het signaal voor een paar zeer belangrijke redenen te ontvangen. De VirtualWire-code maakt gebruik van de real-time aard van de Arduino om het moduleren en demoduleren van het signaal te beheren.
Dit betekent dat de ontvangende eenheid op dezelfde frequentie moet werken. Bovendien is er weinig ruimte voor jitter op de ontvangende processor, waar de Raspberry Pi gevoelig voor is, vanwege het preventieve, niet-realtime besturingssysteem. Als je de kosten van een Arduino Pro Mini plus de RF-ontvangermodule vergelijkt met die van een Zigbee-module die direct met de Raspberry Pi kon praten, bleek dat het gebruik van een externe Arduino nog steeds behoorlijk economisch was.
Bouw het ontvangerbord volgens het Fritzing-diagram hieronder.
Ontvanger diagramVerbind op dit moment de 5V en aardingsdraden van de Pi NIET met het breadboard. Houd de jumperdraden bij de hand, maar je wilt de Arduino niet van zowel de USB-poort als de Raspberry Pi van stroom voorzien.
Merk op dat de logica niveau-omzetter in de materialenlijst hierboven niet exact hetzelfde is als die in de Fritzing-bibliotheek, maar dat de pin-outs goed zijn gelabeld, alleen op verschillende plaatsen. Zorg ervoor dat de juiste draden zijn aangesloten op de juiste pinnen op de eigenlijke logische niveau-omzetter.
Deze component is vereist om het 5V Arduino-seriële signaal om te zetten in een 3,3V Raspberry Pi-serieel signaal en de Pi niet te beschadigen. Zie de afbeelding hieronder voor extra hulp.
Actuele Logic Level Converter BedradingMerk op dat de RX- en TX-draden door de logisch niveau-omzetter lopen, zodat de TX van de Arduino de RX van de Pi binnengaat. De volgende stappen omvatten het instellen van de Pi, je keert terug om de Arduino later te programmeren.
Er zijn verschillende handleidingen voor het aanschaffen en installeren van een OS op uw Raspberry Pi. Installeer het nieuwste Raspbian-besturingssysteem. De volgende stappen beschrijven het aansluiten van de randapparatuur op de Pi en het configureren.
Tip: Als je meer wilt weten over het flashen van een SD-kaart, voor je Raspberry Pi, raadpleeg dan onze tutorials: Hoe een SD-kaart te flashen voor Raspberry Pi en NOOBS installeren op een Raspberry Pi met een Mac.
sudo raspi-config
De Raspberry Pi gebruikt standaard de seriële poort als een seriële console. Het apparaat heeft een naam ttyAMA0. Wanneer het opstart, worden opstartberichten naar dit apparaat gedumpt en wordt een aanmeldingssessie gestart. Om het te gebruiken voor het ontvangen van gegevens van de Arduino, moet u de seriële console en sessie uitschakelen.
sudo pico / etc / inittab
#Spawn a getty op Raspberry Pi seriële lijn # T0: 23: respawn: / sbin / getty -L ttyAMA0 115200 vt100
sudo pico /boot/cmdline.txt
Het pythonscript dat de ontvanger voltooit, zal verschillende functies uitvoeren.
Om deze functies uit te voeren, moet u de vereiste modules installeren om de seriële bibliotheken en Xively-communicatie te installeren.
sudo apt-get installatie python-serieel python-setuptools sudo eenvoudig installatie pip sudo pip installatie --pre xively-python mkdir ~ / scripts
chmod u + x wirelessnetwork.py
De volgende verschillende stappen zullen u helpen bij het instellen internet van dingen accounts waarmee u kunt opnemen en reageren op de gegevens die uw apparaat opneemt.
Xively is een service die gegevens verzamelt van dingen. U kunt uw instellen en registreren ding of Raspberry Pi met Xively en gegevens kunnen vanuit je Pi naar de cloud worden geschoven voor tracking en triggering.
Om gegevens naar Xively te posten, de wirelessnetwork.py script moet de Feed-ID en API-sleutels die je hierboven hebt opgenomen. Bewerk het script met pico of je favoriete bewerkingstool (geen vi vs emacs oorlogen hier, alstublieft). Zie het voorbeeldfragment vanaf de bovenkant van wirelessnetwork.py script voor een voorbeeld van waar u de variabelen zou invoegen. Merk ook op dat je de uitvoer van het script kunt uitschakelen door de DEBUG variabele naar 0.
#som definieert voor Xively FEED_ID = "FEED ID HIER" # voer hier uw feed ID nummer in API_KEY = "API KEY HERE" # stel hier uw API-code in # initialiseer api client api = xively.XivelyAPIClient (API_KEY) #Create mapping from transmitter ID nummer tot namen. Dit kan op een dag een DB zijn DEV = '1': 'Bedroom', '2': 'Basement' DEBUG = True
Let erop dat u tijdens het bewerken van het script de DEV variabel. Deze variabele is een naamtoewijzing voor de ID kaarts die de sensormodules verzenden. In dit voorbeeld wanneer de sensormodule met ID kaart 1 verzendt een bericht, het script verzendt naar een Xively-kanaal met de beschrijvende naam Slaapkamer in plaats van ID1. Op dezelfde manier, de sensormodule met ID kaart 2 worden in het kanaal gerapporteerd Kelder.
De Raspberry Pi is nu klaar om gegevens te ontvangen met behulp van de wirelessnetwork.py script. De Arduino moet worden geprogrammeerd met de wirelessreceiver schetsen.
ID: 1: TS: 23143: TF: 60.79: RH: 44.00 ID: 1: TS: 24532: TF: 60.79: RH: 44.00 ID: 1: TS: 29324: TF: 60.79: RH: 44.00
Nu dat u de Arduino gegevens van een sensormodule ontvangt, kunt u het script op de Pi testen om ervoor te zorgen dat het de gegevens goed leest en naar Xively verzendt. Open een SSH of terminalsessie voor de Pi voor de volgende stappen.
cd / home / pi / scripts / ./wirelessnetwork.py
Ontvangen invoer: ID: 1: TS: 154075: TF: 73.39: RH: 39.00 Verwerkingsgegevens voor: Slaapkamer Posten temp Fahrenheit voor slaapkamer Aanmaken datastroom Updaten Xively feed met waarde: 73.39 Boekings relatieve vochtigheid voor slaapkamer Gevonden bestaande gegevensstroom Updaten Xively feed met waarde : 39.00 Ontvangen invoer: ID: 2: TS: 522: TF: 60.79: RH: 44.00 Verwerkingsgegevens voor: Kelderposting temp Fahrenheit voor Kelderverdieping Datastroom creëren Updaten van Xively feed met waarde: 60.79 Relatieve vochtigheidsgraad voor Kelder boeken Gevonden datastroom updaten Xively feed updaten met waarde: 44,00
Het script zal feeds creëren voor vochtigheid en temperatuur bij de eerste keer dat het wordt uitgevoerd. In het bovenstaande voorbeeld ziet u het script dat de berichten ontvangt, deze parseert en met succes naar Xively verzendt. Gebruik Besturing C om het script te verlaten voordat u doorgaat naar de volgende stap.
Schakel over naar de browservensters waar u uw Xively-account en -apparaat hebt gemaakt. De nieuwe datastromen en wat informatie erover moeten beschikbaar zijn en er ongeveer zo uitzien als de afbeelding hieronder.
Xive Channel geüpdatetOmdat de Raspberry Pi zonder kop wordt uitgevoerd, moet het script zo worden ingesteld dat het automatisch wordt gestart wanneer het wordt gevoed.
sudo -u pi /home/pi/scripts/wirelessnetwork.py &
ps ax | grep wirelessnetwork
De uitvoer zou er ongeveer zo uit moeten zien als het onderstaande fragment.
22000 pts / 1 S + 0:02 / usr / bin / python /home/pi/scripts/wirelessnetwork.py
Gefeliciteerd! Je hebt een lange handleiding doorgenomen en een zeer flexibel en uitbreidbaar draadloos netwerk van sensoren gebouwd. Je hebt verschillende vaardigheden uitgeoefend, zoals het bouwen van op Arduino gebaseerde breadboardcircuits, het verbinden van een Arduino met een Raspberry Pi, het veilig verzenden en ontvangen van seriële gegevens tussen de Arduino en Pi en het verzenden van sensorgegevens naar Xively's internet van dingen service.
Er is veel potentieel voor uitbreiding of verdere experimenten met dit project. U kunt ervoor kiezen om extra sensormodules te bouwen of sensoren aan de bestaande modules toe te voegen. Het formaat van het radioboodschap is een eenvoudige sleutel: waardepaar en het pythonscript heeft opmerkingen over het toevoegen van verschillende gegevenstypen. Probeer een permanent huis of behuizing voor de zenders te bouwen. Er is veel leuk potentieel om dit project te volgen.