Bygg et trådløst sensornettverk i ditt hjem

Denne opplæringen vil lære deg hvordan du oppretter et nettverk av kostnadseffektive, trådløse sensormoduler. Mange av de ferdige trådløse modulene kan være for dyre for bruk i flere sensorenheter. Mens Wi-Fi og Zigbee-moduler er populære og enkle å bruke, kan deres kostnader gjøre bruk av dem i en rekke sensorer upraktiske. Det er imidlertid lave kostnader RF-moduler uten alle de dyre funksjonene som vil fungere fint disse formålene. Arduino-plattformen kan bruke enkle radiomoduler til å kommunisere lett og pålitelig.  

Når maskinvaren er satt sammen, vil du utnytte Raspberry Pi-plattformen til å sende dataene til Xives tjeneste for Internett av ting der du kan spore verdiene over tid og utløse terskelforholdene.

Samle komponentene og verktøyene

Dette prosjektet vil inneholde tre deler, to sender enheter og en mottaker enhet. Senderen består av en Arduino bord, sensor og RF sender. Mottakerenheten består av et Arduino-kort, en RF-mottaker, en logisk nivåomformer og en Raspberry Pi. 

Det finnes et bredt utvalg av Arduino-kompatible plater som kan brukes til dette prosjektet. Minimumskravet til styret for dette prosjektet er to digitale GPIO-pinner og en analog pinne. Velg et Arduino-kompatibelt kort som samsvarer med kostnadene og enkelhetsbehovene for dette prosjektet.  

I denne opplæringen har jeg brukt et sett med Arduino Nano-brett som passer godt i et brettbrett og er enkle å programmere. Men 5V-versjonene av Arduino pro mini eller trinket vil også fungere godt og til et mye lavere prispunkt. Disse krever imidlertid litt mer erfaring å programmere og bruke. Velg smart.


mottaker 

  • Raspberry Pi-Modell B med strømforsyning, etui og SD-kort - Kontroller at GPIO-pinnene er tilgjengelige med det tilfellet du velger
  • Pi-kompatibel Wi-Fi-adapter
  • Arduino
  • Brødbrett jumper ledninger
  • Mann til kvinnelig jumper Wires
  • Logisk nivåomformer
  • 434 MHz RF mottaker
  • Halvbrett

Sendere (to enheter)

  • 2 x Arduino
  • 2 x Temperatur / fuktighetsfølere
  • 2 x 434 MHz RF sender
  • 2 x Halvbrett
  • 2 x Brettbrettvennlig 2.1 mm DC fatjakke
  • 2 x 9V strømadapter med 2,1 mm x 5
  • Brødbrett jumper ledninger

Verktøy

  • PC / Mac med Arduino programmering IDE installert
  • USB-kabel for programmering av Arduino boards
  • USB tastatur og mus. Enten kombinert eller med et nav, så begge kan brukes med en enkelt USB-port.
  • Kildepakken knyttet til denne opplæringen på programmerings arbeidsstasjonen

Monter senderen

Senderen selv er relativt enkle kretser. Det er bare en pinne som brukes til å hente informasjonen fra temperatur- og fuktighetssensoren, og en pinne brukes til å sende dataene til RF-senderen. Brødbrettdiagrammet er vist nedenfor.

9V strømforsyningen vil feste til fatningskoblingen som gjør bunnskinner 9V. Strømregulatoren i Arduino vil produsere 5V som er trygt å bruke til radio og sensorer, den øverste strømskinnen på diagrammet.

Sensoren leveres med en 10k ohm motstand som kobler datapinnen til strøm som en trekkmotstand mens en annen ledning kobler den til GPIO D3.  

Vær forsiktig med å følge oppsettet under og sørg for at du dobbeltsjekker databladet for sensoren og RF-modulen for å sikre at komponentene er riktig plassert i brødbrettet og at strøm-, jord- og signalpinnene er koblet til høyre pinner. Fritzing-diagrammet er inkludert i kildepakken for flere detaljer.

Senderdiagram

Antennen er en viktig del av brettet fordi RF-modulen ikke har en innebygd antenne. Jeg brukte en 6-tommers jente til mannlig jumper wire plugget i breadboard og det fungerte bra nok til å tillate mottak fra alle deler av mitt hjem og litt utenfor. Som angitt i diagrammet, er 6,5-tommers optimal for denne antennen hvis du trenger ekstra rekkevidde.

Et notat om RF-bruk. Det er forskjellige lover og regler om bruk av frekvenser i forskjellige land. Vennligst vær sikker på at du overholder disse reglene før kringkasting. Når det er sagt, er signalene fra disse modulene knapt kraftige nok til å passere utenfor ditt hjem. Under perfekte forhold kan disse modulene imidlertid sende opp til 500 fot.

Last ned biblioteker for komponenter

Senderen bruker to biblioteker som ikke er bundet med Arduino IDE. Last ned bibliotekene som beskrevet nedenfor og dekomprimert dem inn i skissekatalogen din i en underkatalog kalt Biblioteker.

  • Last ned VirtualWire kildepakke for denne opplæringen og pakke ut wirelesstransmitter skisse mappe inn i din Arduino skisse mappe
  • I wirelesstransmitter mappe opprette en mappe som heter biblioteker
  • Last ned den nyeste versjonen av VirtualWire-koden, 1.23 som av denne skrivingen, fra prosjektsiden
  • Trekk ut VirtualWire mappe inn i wirelesstransmitter / Bibliotek / mappe slik at du har en annen undermappe som heter VirtualWire
  • Last ned DHT-sensorbiblioteket fra prosjektgitubsiden
  • Trekk ut DHT-mappen i bibliotekets mappe også. Du bør nå ha de to nødvendige biblioteksmappene DHT og VirtualWire i din wirelesstransmitter / Libraries mappe.

Program Arduino styret

Denne opplæringen forutsetter at du har erfaring med Arduino og hvordan du programmerer dem ved hjelp av Arduino IDE. Hvis du ikke gjør det, er det veldig gode instruksjoner på det offisielle Arduino-nettstedet.

  • Åpne wirelesstransmitter skisse fra kildearkivet i Arduino IDE og lagre en kopi lokalt
  • Forsikre deg om at Arduino ikke er koblet til strøm via tønnkontakten
  • Koble styret til programmeringsstasjonen med en passende USB-kabel
  • Sett styretypen til ditt valgte Arduino bord under Verktøy> Styret Meny
  • Sett seriell port til porten oppdaget når du koblet Arduino-kortet under Verktøy> Port Meny
  • Kontroller at MYID-definisjonen er satt til 1 og TRANSPIN og DHTPIN er riktig satt til pinnene som er koblet til henholdsvis RF sender modul og DHT sensor. Hvis du bygget bordet ditt etter diagrammet ovenfor, bør alt settes allerede. Se koden eksempelet nedenfor.  
  • Sørg for at ENHET er satt riktig for din preferanse Fahrenheit eller Celsius
#define MYID 1 // ID-nummeret til dette forumet. Endre dette for hvert bord du blinker. // ID vil bli overført med dataene slik at du kan se hvilken enhet som overfører #define TRANSPIN 3 // hvilken pin som skal overføres på #define DHTPIN 4 // hvilken pin DHT er koblet til #define UNIT 0 // 0 for Fahrenheit og 1 for Celsius

MYID-definisjonen er en numerisk ID som senderen bruker for å identifisere seg selv. Fordi du vil ha flere sendere på forskjellige steder, er det viktig å ha en unik ID for hver enkelt. Dette nummeret vil bli brukt igjen når du konfigurerer mottakerskriptet.

  • Bekreft koden ved å trykke på Kontroll-R for å sikre at bibliotekene er inkludert og kompilert på riktig måte.
  • Skyv koden til styret ved å klikke på Laste opp knappen på verktøylinjen. 
  • Åpne Seriell skjerm vinduer ved å trykke Kontroll-Shift-M

De Seriell skjerm vinduet tilbakestiller Arduino slik at du bør se en linje med kode på skjermen som ser ut som:

Luftfuktighet: 44.00% Temperatur: 60.80 * F Sende melding: ID: 1: TS: 23143: TF: 60.79: RH: 44.00

Meldingen består av Navn: Verdi par som mottakeren vil håndtere. Senderen vil lese og sende signalet sitt på et langt tilfeldig intervaller. Sensorene endres ikke veldig mye eller ofte, slik at kringkasting oftere enn en gang i minuttet gir ingen verdi. Den tilfeldige ventetiden er å tillate at flere sensorer sameksisterer.  

Selv om det er dobling og signalet fra begge sendere går tapt, vil tilfeldig intervall sikre at de neste sendingene ikke overlapper. Den tilfeldige frø for dette intervallet er satt fra en analogRead på en ubrukt analog port som vil returnere tilfeldige verdier for å sikre at ingen to sendere er i samme mønster.  

Eksempelkoden som genererer utgangen ovenfor er satt til å bruke Fahrenheit. Du kan se TF: 60,79 identifikator i meldingsstrengen som indikerer at laboratoriet mitt egentlig er bare et hår under 61 grader. Men den relative fuktigheten RH: 44.00 er en behagelig 44%. Man kan komme fra det kjølige, fuktige miljøet som laboratoriet mitt ligger i kjelleren min. Det kan være riktig.

Senderen er satt til å vente 2 til 5 minutter mellom sendinger som standard. Hvis du ønsker å fremskynde dette for feilsøkingsformål, endrer du utsette() verdi på slutten av skissen for å være mer som 5000 (ms). Det anbefales på det sterkeste at du endrer dette tilbake og laster opp koden til senderen når du er klar for bruk i full tid.

  • Bygg det andre senderkortet
  • Endre senderskissen slik at MYID define er satt til 2 
  • Last opp koden til andre styret
  • Åpne Seriell skjerm vinduer ved å trykke Kontroll-Shift-M og kontroller at utgangen ser ut som det første senderbordet med unntak av at den overførte meldingen starter med ID: 2

Bygg mottakerstyret

Mottakerkortet vil være ansvarlig for å motta sendingsmeldingen på RF-mottakerkomponenten og sende den meldingen over serielle ledninger til Raspberry Pi. Arduino-brettet brukes til å motta signalet for et par svært viktige grunner. VirtualWire-koden bruker Arduino i sanntid for å administrere modulering og demodulering av signalet.  

Dette betyr at mottakerenheten må fungere med samme frekvens. I tillegg er det lite rom for jitter på mottakerprosessoren, som Raspberry Pi er utsatt for, på grunn av sin preemptive, ikke-sanntids operativsystem. Sammenligning av kostnadene for en Arduino Pro Mini pluss RF mottakermodulen til en Zigbee-modul som kunne snakke direkte med Raspberry Pi viste at bruk av en ekstern Arduino fortsatt var ganske økonomisk.

Bygg mottakerbordet på Fritzing-diagrammet nedenfor.

Mottaker diagram

På dette punktet må du IKKE koble 5V og jordledningene fra Pi til brødbrettet. Hold jumperens ledninger praktisk, men du vil ikke koble Arduino fra både USB-porten og Raspberry Pi.

Legg merke til at logikknivåomformeren i materiallisten ovenfor ikke er akkurat den samme som i Fritzing-biblioteket, men pin-outs er godt merket, bare på forskjellige steder. Vær sikker på at de riktige ledningene er koblet til de riktige pinnene på den faktiske logiske nivåkonverteren.  

Denne komponenten er nødvendig for å konvertere 5V Arduino serielt signal til et 3.3V Raspberry Pi serielt signal og ikke skade Pi. Se bildet nedenfor for mer hjelp.

Faktisk logisk nivåomformerkabel

Legg merke til at RX- og TX-ledningene krysser gjennom logisk nivåomformeren slik at TX fra Arduino går inn i RX til Pi. De neste trinnene innebærer å sette opp Pi, du kommer tilbake til å programmere Arduino senere.

Sett opp Raspberry Pi

Det er flere guider for å kjøpe og installere et OS på Raspberry Pi. Installer det nyeste Raspbian-operativsystemet. Følgende trinn beskriver å koble til eksterne enheter til Pi og konfigurere.

Tips: Hvis du trenger å vite mer om å blinke et SD-kort, for din Raspberry Pi, bare se vår veiledning: Slik blar du et SD-kort for Raspberry Pi og Slik installerer du NOOBS på en Raspberry Pi med en Mac.

  • Sett inn USB Wi-Fi-adapteren i den øverste USB-porten på Pi
  • Koble USB-hubben til den nedre USB-porten på Pi
  • Koble musen og tastaturet til USB-huben
  • Koble HDMI-skjermen
  • Sett inn SD-kortet
  • Koble strømforsyningen
  • Utfør konfigurasjonskonfigurasjon for første gang, og gå ut av standardalternativet for å starte opp på et grafisk skrivebord
  • Etter at Pi har startet opp på et skrivebord, følg disse instruksjonene om hvordan du bruker GUI-verktøyet til å konfigurere Wi-Fi-nettverket.
  • Åpne et terminalvindu ved å dobbeltklikke på LXTerminal ikon.
  • Kjør kommandoen sudo raspi-config
  • Velg Aktiver Boot to Desktop / Scratch> Konsolltekstkonsoll som krever pålogging alternativ
  • Velg Avanserte alternativer> SSH for å aktivere nettverkskommandolinjens tilgang
  • Å velge Bli ferdig og la Pi på nytt starte på tekstkonsollen
  • Legg merke til IP-adressen Pi rapporterer når den starter opp. Dette vil bli brukt til SSH til Pi i senere trinn. Trinnene nedenfor for å konfigurere Pi er lettere ferdig fra en SSH-økt til Pi.

Konfigurer Raspberry Pi

Raspberry Pi bruker sin serielle port som standard som en seriekonsoll. Enheten er oppkalt ttyAMA0.  Når den støtter det, dumper oppstartsmeddelelser til denne enheten og setter opp en innloggingsøkt på den. For å kunne bruke den til å motta data fra Arduino må du deaktivere seriekonsollen og økten.

  • Rediger inittab-filen som styrer innloggingsøkten med kommandoen nedenfor. Det anbefales alltid å sikkerhetskopiere den opprinnelige filen før du redigerer bare hvis noe går galt.
sudo pico / etc / inittab
  • Finn linjene nederst på filen som refererer til enheten ttyAMA0 og legg til en # til starten av linjen som inneholder dette navnet på enheten. Det skal se ut som linjene under når du er ferdig
#Spawn a getty on Raspberry Pi seriell linje # T0: 23: respawn: / sbin / getty -L ttyAMA0 115200 vt100
  • Rediger /boot/cmdline.txt med kommandoen nedenfor. Ikke glem å lage en sikkerhetskopi bare i tilfelle.
sudo pico /boot/cmdline.txt
  • Fjern argumentene som refererer ttyAMA0.  De delene du vil fjerne, ser noe ut som dette: konsoll = ttyAMA0,115200 kgdboc = ttyAMA0,115200
  • Lagre filen og start på Pi

Installer Python Script og Forutsetninger

Python-skriptet som vil fullføre mottakeren, utfører flere funksjoner.

  1. Les fra serieporten
  2. Parse inngangen og sørg for at den er sane
  3. Tolk seriell data
  4. Legg inn dataene til Xively i riktig feed

For å utføre disse funksjonene må du installere forutsetningsmodulene for å installere serielle biblioteker og Xively-kommunikasjon.  

  • Logg inn på Pi og utfør kommandoene under for å installere dem.
sudo apt-install install python-seriell python-setuptools sudo easy_install pip sudo pip installere - pre xively-python mkdir ~ / scripts

  • Kopier skriptet wirelessnetwork.py fra kilden pakken for denne opplæringen i scripts katalogen du nettopp opprettet. Du kan gjøre det ved å kopiere og lime inn innholdet eller ved å skape skriptet til Pi.
  • Kontroller at skriptet kan kjøres med kommandoen
chmod u + x wirelessnetwork.py

De neste trinnene vil ta deg gjennom oppsettet Internett av ting kontoer som gjør at du kan ta opp og reagere på dataene enheten din registrerer.

Oppsett Xively-kontoen din for Pi

Xively er en tjeneste som samler data fra tingene. Du kan sette opp og registrere din ting eller Raspberry Pi med Xively, og data kan skyves fra Pi til skyen for å spore og utløse.

Konfigurer Python Script

For å sende data til Xively the wirelessnetwork.py Skriptet må ha Feed ID og API-nøkler som du har spilt inn over. Rediger skriptet ved hjelp av pico eller ditt favorittredigeringsverktøy (ikke vi vs emacs kriger her, vær så snill). Se prøvestykket fra toppen av wirelessnetwork.py Skript for et eksempel på hvor du vil sette inn variablene. Vær også oppmerksom på at du kan bytte utgangene til skriptet ved å bytte DEBUG variabel til 0.

#some definerer for Xively FEED_ID = "FEED ID HERE" #enter ditt feed ID nummer her API_KEY = "API KEY HERE" #sett API-nøkkelen her # initialiser api klient api = xively.XivelyAPIClient (API_KEY) #Create kartlegging fra sender ID nummer til navn. Dette kan være en DB noen dag DEV = '1': 'Soverom', '2': 'Kjeller' DEBUG = Sant 

Mens du redigerer skriptet, må du sørge for å redigere DEV variabel. Denne variabelen er en navnekartlegging for IDs at sensormodulene skal sendes. I dette eksemplet når sensormodulen med ID 1 sender en melding, vil skriptet sende til en Xively-kanal med det vennlige navnet Soverom i stedet for ID1.  På samme måte, sensormodulen med ID 2 vil bli rapportert til kanalen Kjeller.

Program mottaker Arduino

Raspberry Pi er nå klar til å motta data ved hjelp av wirelessnetwork.py manus. Arduino må programmeres med wirelessreceiver skisse.

  • Åpne wirelessreceiver skisse fra kilden og lagre en kopi lokalt
  • Kopier VirtualWire bibliotek fra wirelesstransmitter / Library katalog til Bibliotek katalog under det nye wirelessreceiver katalog
  • Fest mottakerens Arduino-mottaker til programmeringsarbeidsstasjonen, og kontroller at port- og brettetypen er riktig innstilt.
  • Sørg for at RXPIN define er satt til pin nummeret som er koblet til RF mottaker modulen. Hvis det er bygget per diagrammet, skal skissen være bra uten endringer.
  • Bekreft og last opp skissen til Arduino
  • Åpne Seriell skjerm vinduer ved å trykke Kontroll-Shift-M.  Hvis senderen ikke kjører, ser du ikke ut.
  • Koble en av sendermodulene til strøm ved hjelp av 9V-veggadapteren og fatet på brødbrettet. Du bør nå se meldingene som blir mottatt på Arduino. Det vil se ut som dataene nedenfor.
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
  • Trekk ut USB-kabelen fra Arduino
  • Fest bakken og strømpe fra Raspberry Pi

Test mottakerskriptet

Nå som du har Arduino mottatt data fra en sensormodul, kan du teste skriptet på Pi for å sikre at det er korrekt å lese dataene og sende det til Xively. Åpne en SSH eller terminal økt til Pi for følgende trinn.

  • Aktiver den andre trådløse senderen ved å koble den inn med den andre 9V-adapteren
  • Utfør scriptet wirelessnetwork.py fra katalogen / home / pi / scripts med følgende kommandoer
cd / home / pi / scripts / ./wirelessnetwork.py
  • Se gjennom utgangen i konsollen og på Xives nettside.  
 Mottatt inngang: ID: 1: TS: 154075: TF: 73.39: RH: 39.00 Prosessering av data for: Soverom Posting temp fahrenheit for Soverom Opprette datastream Oppdatere Xively feed med verdi: 73.39 Oppgi relativ luftfuktighet for soverom Funnet eksisterende datastream Oppdatere Xively feed with value : 39.00 Mottatt inngang: ID: 2: TS: 522: TF: 60.79: RH: 44.00 Prosessering av data for: Kjeller Posting temp fahrenheit for Kjeller Opprett datastream Oppdatere Xively feed with value: 60.79 Publisering av relative fuktighet for kjelleren Funnet eksisterende datastream Oppdaterer Xively feed med verdi: 44,00 

Skriptet vil skape strømmer for fuktighet og temperatur første gang den går. Eksemplet ovenfor viser skriptet som mottar meldingene, analyserer dem og legger dem til Xively vellykket. Bruk Kontroll-C å gå ut av skriptet før du fortsetter til neste trinn.

Bytt til nettleservinduene der du opprettet din Xive-konto og -enhet. De nye datastreams og litt informasjon om dem skal være tilgjengelige og se noe som bildet nedenfor.

Xively Channel oppdatert

Sett skriptet til å starte på Boot

Fordi Raspberry Pi kommer til å bli kjørt hodeløst, bør skriptet settes til å starte automatisk når enheten er drevet.

  • Legg til følgende linje i /etc/rc.local fil. Bruk din favorittredigerer, men sørg for å sudo rediger kommandoen som /etc/rc.local er en roten eid fil. Skriptet selv kan kjøre som brukeren pi heller enn som rot.
sudo -u pi /home/pi/scripts/wirelessnetwork.py &
  • Start på nytt pi
  • Logg inn på Pi etter at den har startet på nytt og bekreft at skriptet kjører med følgende kommando.
ps øks | grep wirelessnetwork

Utgangen skal se ut som utsnittet nedenfor.

22000 pts / 1 S + 0:02 / usr / bin / python / home/pi/scripts/wirelessnetwork.py

Sammendrag

Gratulerer! Du har gjennomgått en ganske lang opplæring og bygget et svært fleksibelt og utvidbart trådløst nettverk av sensorer. Du har utøvd en rekke ferdigheter som å bygge Arduino-baserte brødbrett, kobler en Arduino til Raspberry Pi, sender og mottar seriell data trygt mellom Arduino og Pi, og sender deg sensordata til Xives Internett av ting service.

Det er mye potensial for utvidelse eller videre eksperimentering med dette prosjektet. Du kan velge å bygge flere sensormoduler eller legge til sensorer til de eksisterende modulene. Formatet på radiobeskjeden er en enkel nøkkel: verdi par og python skriptet har kommentarer om hvordan du legger til forskjellige datatyper. Prøv å bygge et fast bolig eller bolig for senderen. Det er mye moro potensial for hvor å ta dette prosjektet.