Indholdsfortegnelse:

Superenkel Raspberry Pi 433MHz hjemmeautomatisering: 7 trin
Superenkel Raspberry Pi 433MHz hjemmeautomatisering: 7 trin

Video: Superenkel Raspberry Pi 433MHz hjemmeautomatisering: 7 trin

Video: Superenkel Raspberry Pi 433MHz hjemmeautomatisering: 7 trin
Video: Home Assistant Has Never Been This EASY! 2024, November
Anonim
Superenkel Raspberry Pi 433MHz hjemmeautomatisering
Superenkel Raspberry Pi 433MHz hjemmeautomatisering

Denne vejledning er en blandt mange, når det kommer til at bruge en Raspberry Pi til at styre trådløse enheder i hjemmet. Som mange andre vil det vise dig, hvordan du bruger et billigt sender/modtagerpar tilkoblet din Pi til at interagere med enheder, der fungerer på det almindeligt anvendte 433MHz radiofrekvensbånd. Det vil specifikt vise dig, hvordan du tænder eller slukker enhver elektrisk enhed ved hjælp af din Pi ved at overføre kommandoer til et sæt 433MHz fjernstyrede stikkontakter.

Hvorfor lavede jeg denne vejledning, hvis der allerede findes så mange? Hovedsagelig fordi stort set alle de andre tutorials, jeg stødte på, syntes at overkomplicere ting, især på softwaresiden. Jeg lagde mærke til, at de var stærkt afhængige af tredjepartsbiblioteker, scripts eller kodestykker for at udføre alt arbejdet. Mange ville ikke engang forklare, hvad den underliggende kode gjorde - de ville bare bede dig om at skubbe to eller tre stykker software på din Pi og udføre en masse kommandoer, uden at der blev stillet spørgsmål. Jeg ville virkelig prøve at bruge min Pi til at tænde og slukke for elektriske enheder rundt omkring i mit hjem ved hjælp af et sæt 433MHz fjernstyrede stik, men jeg ville oprette min egen version af systemet, som jeg kunne forstå, forhåbentlig eliminere behovet for bruge en andens biblioteker eller scripts.

Det er det, denne vejledning handler om. Softwaresiden af dette system består af to meget enkle Python -scripts - et til modtagelse og optagelse af signaler og et til overførsel af disse signaler tilbage til de trådløse stikkontakter. Selve modtagelsen/transmissionen af signalet afhænger kun af det brugervenlige RPi. GPIO-bibliotek, som i hvert fald for mig kom forudinstalleret med Raspbian. Dette bibliotek kan også importeres direkte til Python.

Til dette projekt skal du bruge:

En hindbær Pi. Enhver model burde fungere, jeg brugte et alt-i-et-startsæt, men måske har du kun brug for den centrale enhed

Et 433MHz sender/modtagerpar. Dem, der oftest bruges i denne type projekter, synes at være disse. Hvis du køber en pakke med fem som den, der er knyttet, sikrer du, at du har et par reservedele

Et sæt 433MHz fjernstyrede stikkontakter. Jeg brugte disse, som jeg vil anbefale, men der er utallige modeller til rådighed. Bare sørg for at de arbejder på denne frekvens

Nogle tilbehør til kredsløb. Jeg vil anbefale at bruge et brødbræt og nogle springkabler for at gøre kredsløbets byggeproces så let som muligt.

[Hvis du beslutter dig for at købe et af disse produkter, ville jeg sætte stor pris på det, hvis du får adgang til fortegnelserne ved hjælp af ovenstående links - på den måde får jeg en lille del af overskuddet uden ekstra omkostninger for dig!]

Trin 1: Opsætning af modtagerenheden

Opsætning af modtagerenheden
Opsætning af modtagerenheden

Inden du kan bruge din Pi til at sende kommandoer til de fjernstyrede stik, skal du vide, hvilke specifikke signaler de reagerer på. De fleste fjernstyrede stikkontakter leveres med et håndsæt, der kan bruges til at tænde eller slukke bestemte enheder. I tilfælde af dem, jeg købte, har håndsættet fire rækker af parrede ON/OFF -knapper, som hver sender et ON- eller OFF -signal til en bestemt stikkontakt.

Dette rejser et spørgsmål - hvordan ved vi, hvilke knapper der svarer til hvilken stikkontakt? Dette afhænger faktisk af den model, du har. En af hovedårsagerne til, at jeg valgte min særlige stikkontakt (linket i indledningen) er, at enhederne kan konfigureres med en fysisk switch til at få en bestemt stikkontakt til at reagere på et bestemt sæt ON/OFF -knapper på håndsættet. Dette betyder også, at du kan trække stikket ud og flytte stikkene rundt i huset vel vidende, at hver enhed altid vil reagere på de samme ON/OFF -signaler.

Når du har fundet ud af, hvordan dine stikkontakter interagerer med håndsættet, skal du bruge din 433MHz modtager (billedet ovenfor) til at 'snuse' de koder, der sendes ud af håndsættet. Når du har registreret bølgeformerne for disse koder, kan du replikere dem ved hjælp af Python og sende dem ud ved hjælp af senderenheden.

Den første ting at gøre her er at koble stifterne på din modtager til de korrekte GPIO -ben på Pi. Modtagerenheden har fire ben, men kun tre af dem er nødvendige. Jeg tror, at begge de centrale stifter giver det samme output, så du behøver kun at oprette forbindelse til en af dem (medmindre du vil streame de modtagne signaler til to separate GPIO -ben).

Billedet ovenfor opsummerer stort set ledningerne. Hver pin på modtageren kan forbindes direkte til den tilsvarende pin på Pi. Jeg bruger et brødbræt og jumperkabler til at gøre processen lidt mere elegant. Bemærk, at du kan vælge en hvilken som helst GPIO -datastift, der skal forbindes til en af de centrale modtagerstifter. Jeg brugte stiften markeret som '23' på mit Pi -header.

VIGTIGT: Hvis du slutter stiften mærket '3v3' i ovenstående billede til en højere spændingsstift på Pi (f.eks. 5v), vil du sandsynligvis beskadige Pi'en, da GPIO -benene ikke kan tåle spændinger over 3v3. Alternativt kan du forsyne den med 5v og oprette en spændingsdeler for at sende en sikker spænding til DATA -stiften.

Modtagerens rækkevidde vil ikke være særlig stor ved denne spænding, især hvis der ikke er tilsluttet en antenne. Du behøver dog ikke en lang rækkevidde her - så længe modtageren kan opfange signalerne fra håndsættet, når de holdes lige ved siden af hinanden, er det alt, hvad vi har brug for.

Trin 2: Sniffing af håndsætkoderne

Sniffing af håndsættets koder
Sniffing af håndsættets koder

Nu hvor din modtager er tilsluttet Pi, kan du starte den første spændende fase af dette projekt - sniffen. Dette indebærer at bruge det vedhæftede Python -script til at registrere det signal, der sendes af håndsættet, når der trykkes på hver knap. Scriptet er meget enkelt, og jeg vil varmt anbefale dig at kigge på det, før du kører det - pointen med dette projekt er jo, at du ikke bare blindt kører en andens kode!

Inden du starter denne proces, skal du sikre dig, at du har de Python -biblioteker, der er nødvendige for at køre sniffer -scriptet. De er angivet øverst i scriptet:

fra datetime import datetime

import matplotlib.pyplot som pyplot import RPi. GPIO som GPIO

RPi. GPIO- og datetime -bibliotekerne blev inkluderet i min Raspbian -distribution, men jeg var nødt til at installere matplotlib -biblioteket som følger:

sudo apt-get install python-matplotlib

Dette bibliotek er et almindeligt brugt grafplotbibliotek, der er meget nyttigt, selv uden for dette projekt, så installation af det kan bestemt ikke skade! Når dine biblioteker er opdaterede, er du klar til at begynde at optage data. Sådan fungerer scriptet:

Når den køres (ved hjælp af kommandoen 'python ReceiveRF.py'), konfigurerer den den definerede GPIO -pin som en dataindgang (pin 23 som standard). Det vil derefter løbende prøve stiften og logge om den modtager en digital 1 eller 0. Dette fortsætter i en bestemt varighed (5 sekunder som standard). Når denne tidsbegrænsning er nået, stopper scriptet optagelsen af data og lukker GPIO -input. Det udfører derefter en lille efterbehandling og tegner den modtagne inputværdi op mod tiden. Igen, hvis du har spørgsmål om, hvad scriptet laver, kan du sandsynligvis selv besvare dem efter at have set på, hvordan det fungerer. Jeg har forsøgt at gøre koden så læselig og enkel som muligt.

Det, du skal gøre, er at passe på, når scriptet angiver, at det har ** Startet optagelse **. Når denne meddelelse vises, skal du trykke på en af knapperne på håndsættet og holde den nede i cirka et sekund. Sørg for at holde den tæt på modtageren. Når scriptet er færdig med at optage, vil det bruge matplotlib til at plotte en grafisk bølgeform af det signal, det har modtaget under optagelsesintervallet. Bemærk, hvis du er tilsluttet din Pi ved hjælp af en SSH -klient som PuTTY, skal du også åbne et X11 -program for at lade kurven vises. Jeg bruger xMing til dette (og til andre ting såsom fjern-desktopping i min Pi). For at tillade plottet at blive vist skal du blot starte xMing, før du kører scriptet og vente på, at resultaterne vises.

Når dit matplotlib -vindue vises, skal interesseområdet inden for plottet være ret indlysende. Du kan bruge betjeningselementerne i bunden af vinduet til at zoome ind, indtil du er i stand til at vælge højder og nedture for signalet, der sendes af håndsættet, mens knappen blev holdt nede. Se billedet ovenfor for et eksempel på en komplet kode. Signalet vil sandsynligvis bestå af meget korte impulser adskilt af lignende tidsperioder, hvor der ikke modtages noget signal. Denne blok med korte impulser vil sandsynligvis blive fulgt af en længere periode, hvor intet modtages, hvorefter mønsteret vil gentage sig. Når du har identificeret mønsteret, der tilhører en enkelt forekomst af koden, skal du tage et lignende skærmbillede øverst på denne side og fortsætte til det næste trin for at fortolke det.

Trin 3: Transskribering af det resulterende signal

Transskribering af det resulterende signal
Transskribering af det resulterende signal

Nu hvor du har identificeret blokken med periodiske højder og nedture svarende til en bestemt knaps signal, skal du bruge en måde at lagre og fortolke det på. I ovenstående signaleksempel vil du bemærke, at der kun er to unikke mønstre, der udgør hele signalblokken. Nogle gange ser du en kort høj efterfulgt af en lang lav, og nogle gange er det modsat - en lang høj efterfulgt af en kort lav. Da jeg transskriberede mine signaler, besluttede jeg at bruge følgende navngivningskonvention:

1 = short_on + long_off0 = long_on + short_off

Kig igen på den mærkede bølgeform, og du vil se, hvad jeg mener. Når du har identificeret de ækvivalente mønstre i dit signal, er alt du skal gøre at tælle 1'erne og 0'erne for at opbygge sekvensen. Når det transskriberes, kan ovenstående signal skrives som følger:

1111111111111010101011101

Nu skal du bare gentage denne proces for at registrere og transskribere de signaler, der svarer til de andre knapper på dit håndsæt, og du har gennemført den første del af processen!

Inden du kan sende signalerne igen ved hjælp af senderen, er der lidt mere arbejde at gøre. Timingen mellem op- og nedture svarende til en 1 eller en 0 er meget vigtig, og du skal sikre dig, at du ved, hvor længe en 'short_on' eller en 'long_off' faktisk varer. For mine koder var der tre stykker tidsinformation, jeg skulle udtrække for at replikere signalerne:

  • Varigheden af et 'kort' interval, dvs. begyndelsen af et 1 eller slutningen af et 0.
  • Varigheden af et 'langt' interval, dvs. slutningen af et 1 eller begyndelsen af et 0.
  • Varigheden af et 'forlænget' interval. Jeg lagde mærke til, at da jeg holdt en knap nede på håndsættet, var der en forlænget_off -periode mellem hver gentagen forekomst af signalblokken. Denne forsinkelse bruges til synkronisering og har en fast varighed.

For at bestemme disse timingværdier kan du bruge zoomfunktionen i matplotlib -vinduet til at zoome helt ind og placere markøren over de relevante dele af signalet. Markørplaceringsaflæsning nederst i vinduet skal give dig mulighed for at bestemme, hvor bred hver del af signalet er, der svarer til et langt, kort eller forlænget interval. Bemærk, at diagrammet x-akse repræsenterer tid, og x-komponenten i markørudlæsning er i sekunder. For mig var bredderne som følger (i sekunder):

  • short_delay = 0,00045
  • lang_forsinkelse = 0,00090 (dobbelt så lang som en 'kort')
  • forlænget_forsinkelse = 0,0096

Trin 4: Opsætning af senderenheden

Opsætning af senderenheden
Opsætning af senderenheden

Når du har indsamlet dine koder og timedata, kan du afbryde din modtager, da du ikke længere har brug for det. Du kan derefter koble senderen direkte til de relevante Pi GPIO -ben som vist på billedet ovenfor. Jeg har fundet ud af, at benene på senderenhederne er mærket, hvilket gør processen lettere.

I dette tilfælde er det OK at forsyne enheden ved hjælp af 5v -forsyningen fra Pi, da DATA -stiften ikke sender signaler til Pi, kun modtager dem. En 5v strømforsyning vil også give mere transmissionsområde end at bruge 3v3 forsyningen. Igen kan du slutte DATA -stiften til en hvilken som helst passende pin på Pi. Jeg brugte pin 23 (det samme som for receiveren).

En anden ting, jeg vil anbefale at gøre, er at tilføje en antenne til det lille hul øverst til højre på senderen. Jeg brugte et 17 cm langt stykke lige tråd. Nogle kilder anbefaler en viklet tråd af lignende længde. Jeg ved ikke, hvad der er bedre, men den lige ledning giver nok rækkevidde til, at jeg kan tænde/slukke stikkontakterne fra ethvert sted i min lille lejlighed. Det er bedst at lodde antennen, men jeg har lige fjernet noget af plasten fra tråden og pakket kobberet gennem hullet.

Når senderen er tilsluttet, er det alt hardwareopsætningen udført! Det eneste, der er tilbage at gøre nu, er at sætte dine stikkontakter op omkring huset og se på senderprogrammet.

Trin 5: Overførsel af signaler ved hjælp af Pi

Det er her, det andet Python -script kommer ind. Det er designet til at være lige så simpelt som det første, hvis ikke mere. Igen, download det og se over koden. Du bliver nødt til at redigere scriptet for at overføre de korrekte signaler i henhold til de data, du registrerede i trin 3, så nu er det et godt tidspunkt at få et hurtigt blik på det.

De biblioteker, der var nødvendige for at køre dette script, var alle forudinstalleret på min Pi, så ingen yderligere installation var nødvendig. De er angivet øverst i scriptet:

importtid

import sys import RPi. GPIO som GPIO

Under bibliotekets import er de oplysninger, du skal redigere. Sådan ser det ud som standard (dette er de oplysninger, der svarer til mine stikkontakter som bestemt ved hjælp af trin 3):

a_on = '111111111111101101100101101'

a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101 '11_110011001110110011001110110011 (Forrige indlæg)

Her har vi otte kodestrenge (to for hvert par tænd/sluk -knapper på mit håndsæt - du har muligvis flere eller færre koder) efterfulgt af de tre stykker tidsinformation, der også bestemmes i trin 3. Tag dig tid til at sikre, at du har indtastede disse oplysninger korrekt.

Når du er tilfreds med de koder/forsinkelser, du har indtastet i scriptet (du kan omdøbe kodestrengvariablerne, hvis du vil), er du stort set klar til at prøve systemet! Inden du gør det, skal du kigge på funktionen transmit_code () i scriptet. Det er her, den faktiske interaktion med senderen sker. Denne funktion forventer, at en af kodestrengene sendes ind som et argument. Det åbner derefter den definerede pin som en GPIO -output og går igennem hvert tegn i kodestrengen. Den tænder eller slukker derefter senderen i henhold til de tidsoplysninger, du har indtastet, for at opbygge en bølgeform, der matcher kodestrengen. Den sender hver kode flere gange (10 som standard) for at reducere chancen for, at den går glip af, og efterlader en forlænget_forsinkelse mellem hver kodeblok, ligesom håndsættet.

For at køre scriptet kan du bruge følgende kommandosyntaks:

python TransmitRF.py code_1 code_2 …

Du kan overføre flere kodestrenge med et enkelt kørsel af scriptet. For eksempel, for at tænde sockets (a) og (b) til og socket (c) fra, skal du køre scriptet med følgende kommando:

python TransmitRF.py a_on b_on c_off

Trin 6: En bemærkning om timing nøjagtighed

Som nævnt er timingen mellem de transmitterede tænd/sluk -impulser ganske vigtig. TransmitRF.py -scriptet bruger pythons time.sleep () -funktion til at opbygge bølgeformerne med de korrekte pulsintervaller, men det skal bemærkes, at denne funktion ikke er helt nøjagtig. Den længde, som det får scriptet til at vente, før den næste operation udføres, kan afhænge af processorbelastningen på det givne øjeblik. Det er en anden grund til, at TransmitRF.py sender hver kode flere gange - bare hvis funktionen time.sleep () ikke er i stand til korrekt at konstruere en given forekomst af koden.

Jeg har personligt aldrig haft problemer med time.sleep (), når det kommer til at sende koderne. Jeg ved dog, at min time.sleep () har en tendens til at have en fejl på ca. 0,1 ms. Jeg bestemte dette ved hjælp af det vedhæftede SleepTest.py -script, som kan bruges til at give et skøn over, hvor præcis din Pi's time.sleep () -funktion er. For mine særlige fjernstyrede stikdåser var den korteste forsinkelse, jeg havde brug for at implementere, 0,45 ms. Som sagt har jeg ikke haft problemer med stikkontakter, der ikke reagerer, så det ser ud til, at 0,45 ± 0,1 ms er godt nok.

Der er andre metoder til at sikre, at forsinkelsen er mere præcis; for eksempel kan du bruge en dedikeret PIC -chip til at generere koderne, men sådan noget er uden for denne tutorials omfang.

Trin 7: Konklusion

Konklusion
Konklusion

Dette projekt har præsenteret en metode til styring af ethvert elektrisk apparat ved hjælp af en Raspberry Pi og et sæt 433MHz fjernstyrede stik, med fokus på enkelhed og gennemsigtighed. Dette er det mest spændende og fleksible projekt, jeg har brugt min Pi til, og der er ubegrænsede applikationer til det. Her er nogle ting, jeg nu kan gøre takket være min Pi:

  • Tænd for en elvarmer ved siden af min seng en halv time før min alarm går.
  • Sluk for varmelegemet en time efter jeg er gået i søvn.
  • Tænd mit sengelampe, når min alarm går, så jeg ikke falder i søvn igen.
  • og mange flere…

Til de fleste af disse opgaver bruger jeg crontab -funktionen i Linux. Dette giver dig mulighed for at konfigurere automatiske planlagte opgaver til at køre TransmitRF.py -scriptet på bestemte tidspunkter. Du kan også bruge kommandoen Linux at til at køre engangsopgaver (som for mig skulle installeres separat ved hjælp af 'sudo apt-get install at'). For eksempel, for at tænde min varmelegeme en halv time før min alarm går ud næste morgen, er alt, hvad jeg skal gøre, at skrive:

klokken 05:30

python TransmitRF.py c_on

Du kan også bruge dette projekt i forbindelse med mit Dropbox -hjemmemonitoreringssystem til at styre apparater over internettet! Tak fordi du læste, og hvis du gerne vil afklare noget eller dele din mening, så send en kommentar!

Anbefalede: