Een draadloos sensorsysteem bouwen in uw huis

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.

Verzamel de componenten en gereedschappen

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.


Ontvanger 

  • Raspberry Pi-Model B met voeding, behuizing en SD-kaart - Zorg dat de GPIO-pinnen toegankelijk zijn met de case die u kiest
  • Pi-compatibele wifi-adapter
  • Arduino
  • Breadboard jumperdraden
  • Man-vrouw-jumper Draden
  • Logisch niveau-omzetter
  • 434 MHz RF-ontvanger
  • Half broodplank

Zenders (twee eenheden)

  • 2 x Arduino
  • 2 x temperatuur / vochtigheidssensoren
  • 2 x 434 MHz RF-zender
  • 2 x Half breadboard
  • 2 x Breadboard-vriendelijke 2,1 mm DC vat jack
  • 2 x 9V voedingsadapter met 2,1 mm x 5
  • Breadboard jumperdraden

Hulpmiddelen

  • PC / Mac met Arduino programmeren IDE geïnstalleerd
  • USB-kabel voor het programmeren van Arduino-kaarten
  • USB-toetsenbord en muis. Gecombineerd of met een hub zodat beide kunnen worden gebruikt met een enkele USB-poort.
  • Het bronpakket dat is gekoppeld aan deze zelfstudie op uw programmeerwerkstation

Verzamel zenders

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 diagram

De 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.

Bibliotheken voor componenten downloaden

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.

  • Download de VirtualWire bronpakket voor deze zelfstudie en pak het uit wirelesstransmitter schets map in uw Arduino schetsen map
  • In de wirelesstransmitter map maak een map met de naam bibliotheken
  • Download de nieuwste versie van de VirtualWire-code, 1.23 vanaf dit schrijven, vanaf de projectpagina
  • Pak het VirtualWire map in de wirelesstransmitter / Bibliotheken / map zodat u een andere submap met de naam VirtualWire
  • Download de DHT-sensorbibliotheek van de projectgithub-pagina
  • Pak ook de DHT-map uit in de map Bibliotheken. U zou nu de twee vereiste bibliotheekmappen moeten hebben DHT en VirtualWire in uw wirelesstransmitter / Bibliotheken map.

Programmeer het Arduino-bord

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.

  • Open de wirelesstransmitter schetsen vanuit het bronarchief in de Arduino IDE en lokaal een kopie opslaan
  • Zorg ervoor dat de Arduino NIET op de voeding wordt aangesloten via de vatconnector
  • Verbind het bord met uw programmeerwerkstation op een geschikte USB-kabel
  • Stel het bordtype in op het door u geselecteerde Arduino-bord onder de Hulpmiddelen> Bord menu
  • Stel de seriële poort in op de poort die werd gedetecteerd toen u het Arduino-bord onder de Hulpmiddelen> Poort menu
  • Zorg ervoor dat de MYID-definitie is ingesteld op 1 en de TRANSPIN en DHTPIN correct zijn ingesteld op de pennen die respectievelijk zijn aangesloten op de RF-zendmodule en de DHT-sensor. Als je je bord hebt gebouwd volgens het bovenstaande diagram, zou dit allemaal al moeten zijn. Zie het codevoorbeeld hieronder.  
  • Zorg ervoor dat de EENHEID is naar behoren ingesteld voor uw voorkeur Fahrenheit of Celsius
#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.

  • Controleer de code door op te drukken Besturing R om ervoor te zorgen dat de bibliotheken correct worden opgenomen en gecompileerd.
  • Druk de code naar het bord door op te klikken Uploaden knop op de werkbalk. 
  • Open de Seriële monitor vensters door op te drukken Ctrl-Shift-M

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.

  • Bouw de tweede zenderkaart
  • Wijzig de zenderschets zodat de MIJN ID define is ingesteld op 2 
  • Upload de code naar het tweede bord
  • Open de Seriële monitor vensters door op te drukken Ctrl-Shift-M en controleer of de uitvoer lijkt op de eerste zenderkaart met de uitzondering dat het verzonden bericht begint met ID: 2

Bouw de ontvangerkaart

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 diagram

Verbind 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 Bedrading

Merk 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.

Stel de Raspberry Pi in

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.

  • Plaats de USB Wi-Fi-adapter in de bovenste USB-poort op de Pi
  • Sluit de USB-hub aan op de onderste USB-poort op de Pi
  • Sluit de muis en het toetsenbord aan op de USB-hub
  • Sluit de HDMI-monitor aan
  • Plaats de SD-kaart
  • Sluit de voeding aan
  • Voer de eerste installatieconfiguratie uit, waarbij u de standaardoptie om naar een grafisch bureaublad op te starten, verlaat
  • Nadat de Pi opnieuw op een bureaublad is opgestart, volgt u deze instructies voor het gebruik van de GUI-tool om uw wifi-netwerk te configureren.
  • Open een terminalvenster door te dubbelklikken op de LXTerminal icoon.
  • Voer het commando uit sudo raspi-config
  • Selecteer de Schakel Boot to Desktop / Scratch> Console Text console in, waarbij u zich moet aanmelden keuze
  • Selecteer de Geavanceerde opties> SSH om toegang tot de opdrachtregel in het netwerk in te schakelen
  • kiezen Af hebben en laat de Pi opnieuw opstarten naar de tekstconsole
  • Noteer het IP-adres dat de Pi meldt wanneer het wordt opgestart. Dit zal in latere stappen worden gebruikt voor SSH naar de Pi. De onderstaande stappen voor het configureren van de Pi zijn gemakkelijker gedaan van een SSH-sessie naar de Pi.

Configureer Raspberry Pi

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.

  • Bewerk het inittab-bestand dat tekstaanmeldingssessie beheert met de onderstaande opdracht. Het wordt altijd aanbevolen om een ​​back-up van het originele bestand te maken voordat je het bewerkt, voor het geval er iets misgaat.
sudo pico / etc / inittab
  • Zoek de regels onderaan het bestand die naar het apparaat verwijzen ttyAMA0 en voeg een toe # naar het begin van de regel met deze apparaatnaam. Het moet er uitzien als de onderstaande regels als je klaar bent
#Spawn a getty op Raspberry Pi seriële lijn # T0: 23: respawn: / sbin / getty -L ttyAMA0 115200 vt100
  • Bewerk de /boot/cmdline.txt met de onderstaande opdracht. Vergeet niet om een ​​back-up te maken voor het geval dat.
sudo pico /boot/cmdline.txt
  • Verwijder de argumenten die verwijzen ttyAMA0.  Ze willen dat je uiterlijk eruit ziet als volgt: console = ttyAMA0,115200 kgdboc = ttyAMA0,115200
  • Sla het bestand op en start de Pi opnieuw op

Installeer Python Script en Vereisten

Het pythonscript dat de ontvanger voltooit, zal verschillende functies uitvoeren.

  1. Lezen van de seriële poort
  2. Ontleed de invoer en zorg ervoor dat deze gezond is
  3. Interpreteer de seriële gegevens
  4. Post de gegevens naar Xively in de juiste feed

Om deze functies uit te voeren, moet u de vereiste modules installeren om de seriële bibliotheken en Xively-communicatie te installeren.  

  • Log in op de Pi en voer de onderstaande commando's uit om ze te installeren.
sudo apt-get installatie python-serieel python-setuptools sudo eenvoudig installatie pip sudo pip installatie --pre xively-python mkdir ~ / scripts

  • Kopieer het script wirelessnetwork.py van het bronpakket voor deze zelfstudie naar de scriptmap die u zojuist hebt gemaakt. U kunt dat doen door de inhoud te kopiëren en te plakken of door het script naar de Pi te scoppen.
  • Zorg ervoor dat het script uitvoerbaar is met het commando
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.

Stel uw Xively-account in voor de Pi

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.

Configureer het Python-script

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.

Programmeer de ontvanger Arduino

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.

  • Open de wirelessreceiver schetsen vanuit het bronpakket en lokaal een kopie opslaan
  • Kopieer de VirtualWire bibliotheek van de wirelesstransmitter / Library map naar de Bibliotheek map onder de nieuwe wirelessreceiver directory
  • Bevestig de ontvanger Arduino-ontvanger aan uw programmeerwerkstation en zorg ervoor dat het poort- en bordtype correct zijn ingesteld.
  • Zorg ervoor dat de RXPIN define is ingesteld op het pincode die is verbonden met de RF-ontvangstmodule. Als het volgens het diagram wordt gebouwd, zou de schets zonder wijzigingen goed moeten zijn.
  • Verifieer en upload de schets naar de Arduino
  • Open de Seriële monitor vensters door op te drukken Ctrl-Shift-M.  Als de zenders niet werken, ziet u niet uitgezet worden.
  • Sluit een van de transmittermodules aan met behulp van de 9V-muuradapter en de vatconnector op het breadboard. Je zou nu de berichten moeten zien die worden ontvangen op de Arduino. Het ziet er ongeveer zo uit als de onderstaande gegevens.
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
  • Ontkoppel de USB-kabel van de Arduino
  • Bevestig de grond- en power-jumpers van de Raspberry Pi

Test het ontvangerscript

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.

  • Activeer de tweede draadloze zender door hem aan te sluiten op de tweede 9V-adapter
  • Voer het script wirelessnetwork.py uit vanuit de map / home / pi / scripts met de volgende opdrachten
cd / home / pi / scripts / ./wirelessnetwork.py
  • Bekijk de uitvoer in de console en op de Xively-website.  
 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üpdatet

Stel het script in om bij opstarten te starten

Omdat de Raspberry Pi zonder kop wordt uitgevoerd, moet het script zo worden ingesteld dat het automatisch wordt gestart wanneer het wordt gevoed.

  • Voeg de volgende regel toe aan de /etc/rc.local het dossier. Gebruik je favoriete editor, maar zorg ervoor dat je de opdracht edit sudo uitvoert /etc/rc.local is een root-bestand. Het script zelf kan als gebruiker pi worden uitgevoerd in plaats van als root.
sudo -u pi /home/pi/scripts/wirelessnetwork.py &
  • Start de Pi opnieuw op
  • Meld u aan bij de Pi nadat deze opnieuw is opgestart en controleer of het script wordt uitgevoerd met de volgende opdracht.
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

Samenvatting

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.