- Raspberry Pi Smart Energy Meter Block Diagram
- Nødvendige komponenter
- Forbereder Pi
- Pi energimåler kretsdiagram
- Python-kode for Pi energimåler
- Demo
Energimonitorer, enten dekker hele leiligheten eller distribuert for å overvåke bare ett apparat, gir deg en måte å holde oversikt over forbruket ditt og foreta nødvendige justeringer. Mens de i økende grad blir tilgjengelige på markedet, føler produsenten i meg fortsatt at det vil være en god idé å bygge en DIY-versjon som kan skreddersys for å oppfylle spesifikke personlige krav. Som sådan, for dagens opplæring, vil vi bygge en Raspberry Pi strømforbruksmonitor som kan oppnå energiforbruk og laste opp til Adafruit.io.
Du kan også sjekke ut den Arduino-baserte IoT Energy Meter og den forhåndsbetalte GSM Energy Meter som vi har bygget tidligere.
Raspberry Pi Smart Energy Meter Block Diagram
Nedenfor vises et blokkskjema som viser hvordan systemet fungerer.
Å plukke enhetene etter hverandre;
Current Sensing Unit: Current Sensing Unit består av SCT -013 strømføleren som kan måle opptil 100A, avhengig av hvilken versjon du kjøper. Sensoren transformerer strømmen som går gjennom ledningen den er festet på, til en liten strøm som deretter mates inn i ADC via et nettverk av spenningsdelere.
Voltage Sensing Unit: Selv om jeg ikke klarte å legge hendene på en spenningssensormodul, vil vi bygge en DIY en transformerfri spenningssensor som måler spenning ved å bruke prinsippet om spenningsdelere. DIY-spenningssensoren involverer spenningsdelerstrinnet hvor høyspenningen transformeres til en verdi som er egnet for inngang til ADC.
Behandlingsenhet: Behandlingsenheten består av ADC og Raspberry pi. ADC tar det analoge signalet og sender det til bringebær-pi, som deretter beregner den nøyaktige mengden strøm som forbrukes og sender den til en bestemt enhetssky. For formålet med denne opplæringen vil vi bruke Adafruit.io som vår Device Cloud. Vi har også bygget andre
Ansvarsfraskrivelse: Før vi begynner, er det viktig å nevne at dette prosjektet innebærer tilkobling til en strømforsyning som er farlig og kan være dødelig hvis den ikke håndteres på en sikker måte. Forsikre deg om at du har erfaring med å jobbe rundt AC før du prøver dette.
Klar? La oss dykke inn.
Nødvendige komponenter
Følgende komponenter kreves for å bygge dette prosjektet;
- Raspberry Pi 3 eller 4 (prosessen skal være den samme for RPI2 med en WiFi-dongel)
- ADS1115 16bit I2C ADC
- YHDC SCT-013-000
- 2,5A 5V MicroUSB strømadapter
- 2W 10K motstand (1)
- 1 / 2W 10K motstand (2)
- 33 ohm motstand (1)
- 2W 3,3 k motstand (1)
- IN4007 Diode (4)
- 3.6v Zener Diode (1)
- 10k potensiometer (eller forhåndsinnstilt) (1)
- 50v 1uf kondensator
- 50v 10uf kondensator (2)
- BreadBoard
- Jumper Wire
- Annet tilbehør for bruk av Raspberry Pi.
Bortsett fra maskinvarekomponentene som er oppført ovenfor, krever prosjektet også noen programvareavhengigheter og biblioteker som vi vil installere etter hvert.
Selv om denne opplæringen vil fungere uavhengig av raspberry pi OS som brukes, vil jeg bruke Raspberry Pi buster OS som kjører på en Pi 3 (bør også fungere på en Pi 4), og jeg antar at du er kjent med å sette opp Raspberry Pi med Raspbian Buster OS (ganske mye den samme prosessen som de forrige versjonene), og du vet hvordan du skal SSH inn i det ved hjelp av en terminalprogramvare som hyper. Hvis du har problemer med noe av dette, er det mange Raspberry Pi-veiledninger på dette nettstedet som kan hjelpe
Forbereder Pi
Før vi begynner å koble til komponentene og kodingen, er det noen enkle oppgaver vi trenger å utføre på bringebær-pi for å sikre at vi er klare til å gå.
Trinn 1: Aktivering av Pi I2C
Kjernen i dagens prosjekt er ikke bare bringebær-pi, men ADS1115 16bit I2C-basert ADC. ADC lar oss koble analoge sensorer til Raspberry Pi siden Pi selv ikke har en innebygd ADC. Den tar inn dataene gjennom sin egen ADC og videresender den til bringebær-pi via I2C. Som sådan må vi aktivere I2C-kommunikasjon på Pi slik at den kan kommunisere med den.
Pi's I2C-buss kan aktiveres eller deaktiveres via bringebær Pi-konfigurasjonssiden. For å starte den, klikk på Pi-ikonet på skrivebordet og velg preferanser etterfulgt av Raspberry pi-konfigurasjon.
Dette skal åpne konfigurasjonssiden. Sjekk den aktiverte alternativknappen for I2C og klikk på OK for å lagre den og starte Pi på nytt for å utføre endringene.
Hvis du kjører Pi i hodeløs modus, kan du få tilgang til Raspbian-konfigurasjonssiden ved å kjøre sudo raspi-config.
Trinn 2: Installere ADS11xx-biblioteket fra Adafruit
Den andre tingen vi trenger å gjøre er å installere ADS11xx python-biblioteket som inneholder funksjoner og rutiner som gjør det enkelt for oss å skrive et python-skript for å hente verdier fra ADC.
Følg trinnene nedenfor for å gjøre dette.
- Oppdater pi-en din ved å løpe; sudo apt-get oppdatering etterfulgt av sudo apt-get oppgradering. Dette vil oppdatere pi og sikre at det ikke er kompatibilitetsproblemer for ny programvare du velger å installere.
- Deretter kjører du cd ~ -kommandoen for å sikre at du er i hjemmekatalogen.
- Deretter installerer du det grunnleggende ved å kjøre; sudo apt-get install build-essential python-dev python-smbus git
- Klon deretter Adafruit git-mappen som inneholder ADS-biblioteket ved å kjøre; git klone https://github.com/adafruit/Adafruit_Python_ADS1x15.git
- Bytt til den klonede filens katalog og kjør installasjonsfilen ved hjelp av; cd Adafruit_Python_ADS1x1z etterfulgt av sudo python setup.py installasjon
Når dette er gjort, skal installasjonen nå være fullført.
Du kan teste biblioteksinstallasjonen ved å koble til ADS1115 som vist i skjemaoversikten nedenfor og kjøre eksempelkoden som fulgte med biblioteket ved først å endre til mappen ved hjelp av; cd-eksempler og kjører eksemplet ved hjelp av; python simpletest.py
Trinn 3: Installer Adafruit.IO Python-modul
Som nevnt under introduksjonene, vil vi publisere målinger fra spennings- og strømfølere til Adafruit IO Cloud, hvorfra den kan sees fra hele verden eller kobles til IFTTT for å utføre de handlingene du ønsker.
Adafruit.IO python-modulen inneholder underrutiner og funksjoner som vi vil utnytte for å enkelt streame data til skyen. Følg trinnene nedenfor for å installere modulen.
- Kjør cd ~ for å gå tilbake til hjemmekatalogen.
- Deretter kjører du kommandoen; sudo pip3 installer adafruit-io . Den skal installere Adafruit IO python-modulen.
Trinn 4: Konfigurer Adafruit.io-kontoen din
For å bruke Adafruit IO må du definitivt først opprette en konto og skaffe deg en AIO-nøkkel. Denne AIO-nøkkelen sammen med brukernavnet ditt vil bli brukt av python-skriptet ditt for å få tilgang til Adafruit IO-skytjenesten. For å opprette en konto, besøk; https://io.adafruit.com/, klikk på Kom i gang gratis-knappen og fyll ut alle nødvendige parametere. Når Registreringen er fullført, bør du se Vis AIO-nøkkel-knappen til høyre på hjemmesiden din.
Klikk på den for å hente AIO-nøkkelen.
Med nøkkelen kopiert er vi klare til å gå. For å gjøre prosessen med å sende data til skytjenesten enklere, kan du imidlertid også opprette feedene som dataene skal sendes til. (mer informasjon om hva AIO-feeder er finner du her). Siden vi i utgangspunktet vil sende strømforbruk, vil vi lage en strøm for strøm. For å opprette en feed, klikk på "feeds" øverst på AIO-siden og klikk på legg til ny feed.
Gi det hvilket navn du vil, men for å holde det enkelt, vil jeg kalle det energiforbruk. Du kan også bestemme deg for å lage strømmer for spenning og strøm og tilpasse koden for å publisere data til dem.
Med alt dette på plass, er vi nå klare til å begynne å bygge prosjektet.
Pi energimåler kretsdiagram
Skjemaene for Raspberry Pi Energy Monitor- prosjektet er relativt komplekse, og det innebærer tilkobling til en vekselstrøm som nevnt tidligere. Sørg for at du tar alle nødvendige forholdsregler for å unngå elektrisk støt. Hvis du ikke er kjent med sikker håndtering av vekselstrøm, må gleden ved å implementere dette på et brødbrett, uten å drive det, være tilfredsstillende.
Skjemaene innebærer å koble spennings- og strømfølerenheten til ADC som deretter sender dataene fra sensorene til Raspberry Pi. For å gjøre forbindelsene lettere å følge, presenteres skjemaene for hver enhet alene.
Skjema for gjeldende sensor
Koble komponenter til gjeldende sensor som vist i skjemaene nedenfor.
Den nåværende transformatoren som brukes i dette prosjektet er vist nedenfor, som du kan se at vi har tre ledninger fra den, nemlig bakken, Cout og 3.3V
Spenningssensorskjema
Koble komponenter til spenningssensoren som vist i skjemaene nedenfor.
Behandlingsenhet Skjemaer
Koble alt sammen med ADC (ADS1115) koblet til bringebær-pi og utgangen fra strøm- og spenningssensorene som er koblet til henholdsvis pin A0 og A1 på ADS1115.
Forsikre deg om at GND-pinnene på begge senseenhetene er koblet til GND på ADC eller bringebær-pi.
For å gjøre ting litt mindre rystende implementerte jeg spennings- og strømfølere på et Protoboard. Det anbefales heller ikke å bygge en AC-strømkrets på brødplaten. Hvis du gjør det samme, kan det endelige oppsettet ditt se ut som bildet nedenfor;
Når tilkoblingene er fullført, er vi nå klare til å skrive koden for prosjektet.
Python-kode for Pi energimåler
Som vanlig med våre bringebær-pi-prosjekter, vil vi utvikle koden for prosjektet ved hjelp av python. Klikk på raspberry pi-ikonet på skrivebordet, velg programmering og start hvilken versjon av python du vil bruke. Jeg skal bruke Python 3, og noen av funksjonene i python 3 fungerer kanskje ikke for python 2.7. Så det kan være behov for å gjøre noen vesentlige endringer i koden hvis du vil bruke python 2.7. Jeg vil gjøre en oversikt over koden i små utdrag og dele hele koden med deg på slutten.
Klar? Kul.
Algoritmen bak koden er enkel. Vårt python-skript spør ADS1115 (over I2C) for spennings- og strømavlesninger. Den mottatte analoge verdien mottas, samples og rotverdien av spenning og strøm oppnås. Effekten i kilowatt beregnes og sendes til Adafruit IO-fôret etter bestemte intervaller.
Vi starter skriptet med å inkludere alle bibliotekene vi skal bruke. Dette inkluderer innebygde biblioteker som tids- og mattebiblioteket og de andre bibliotekene vi installerte tidligere.
importtid import Adafruit_ADS1x15 fra Adafruit_IO import * import matematikk
Deretter oppretter vi en forekomst av ADS1115-biblioteket som vil bli brukt til å adressere den fysiske ADC fremover.
# Opprett en ADS1115 ADC (16-bit) forekomst.. adc1 = Adafruit_ADS1x15.ADS1115 ()
Deretter oppgir du Adafruit IO-brukernavnet og “AIO” -nøkkelen.
brukernavn = 'skriv inn brukernavnet ditt mellom anførselstegnene' AIO_KEY = 'din aio-nøkkel' aio = klient (brukernavn, AIO_KEY)
Vennligst hold nøkkelen trygg. Den kan brukes til å få tilgang til adafruit io-kontoen din uten din tillatelse.
Deretter lager vi noen variabler som gevinst for ADC, antall prøver vi ønsker og setter avrunding som definitivt ikke er kritisk.
GAIN = 1 # se ads1015 / 1115 dokumentasjon for potensielle verdier. prøver = 200 # antall prøver tatt fra ads1115 steder = int (2) # sett avrunding
Deretter lager vi en stundsløyfe for å overvåke strøm og spenning og sende dataene til Adafruit io med intervaller. Mens loop starter med å sette alle variablene til null.
while True: # reset variabler count = int (0) datai = datav = maxIValue = 0 #max current value within sample maxVValue = 0 #max voltage value in sample IrmsA0 = 0 #root mean square square VrmsA1 = 0 # root mean square voltage ampsA0 = 0 # nåværende topp voltA1 = 0 # volt kilowatt = float (0)
Siden vi jobber med vekselstrømskretser, vil utgangen fra SCT-013 og spenningssensoren være en sinusbølge, og for å beregne strømmen og spenningen fra sinusbølgen, må vi få toppverdiene. For å få toppverdiene, prøver vi både spenning og strøm (200 prøver), og finner de høyeste verdiene (toppverdier).
for telling i rekkevidde (prøver): datai.insert (count, (abs (adc1.read_adc (0, gain = GAIN)))) datav.insert (count, (abs (adc1.read_adc (1, gain = GAIN)))) # se om du har en ny maxValue- utskrift (datai) hvis datai> maxIValue: maxIValue = datai if datav> maxVValue: maxVValue = datav
Deretter standardiserer vi verdiene ved å konvertere fra ADC-verdiene til den faktiske verdien, hvorpå vi deretter bruker Root Mean Square-ligningen for å finne RMS-spenning og strøm.
#calculate current using the sampled data # sct-013 som brukes er kalibrert for 1000mV utgang @ 30A. IrmsA0 = float (maxIValue / float (2047) * 30) IrmsA0 = round (IrmsA0, places) ampsA0 = IrmsA0 / math.sqrt (2) ampsA0 = round (ampsA0, places) # Beregn spenning VrmsA1 = float (maxVValue * 1100 / float (2047)) VrmsA1 = rund (VrmsA1, steder) voltsA1 = VrmsA1 / matematikk.sqrt (2) voltA1 = rund (voltA1, steder) print ('Voltage: {0}'. format (voltsA1)) print ('Current: {0} '. Format (ampsA0))
Når dette er gjort, beregnes kraften og dataene blir publisert på adafruit.io
#calculate power power = round (ampsA0 * voltA1, places) print ('Power: {0}'. format (power)) # post data to adafruit.io EnergyUsage = aio.feeds ('EnergyUsage') aio.send_data (' EnergyUsage ', strøm)
For gratis kontoer krever adafruit at det er en viss tidsforsinkelse mellom forespørsler eller dataopplasting.
# Vent før du gjentar loop-tiden. Sleep (0)
Den komplette koden for prosjektet er tilgjengelig nederst på denne siden
Demo
Når koden er fullført, lagrer du den og trykker på Run-knappen på python IDE. Før dette må du sørge for at Pi er koblet til internett via WiFi eller LAN, og aio-nøkkelen og brukernavnet ditt er riktig. Etter en stund bør du begynne å se energidataene (kraften) som vises på strømmen på Adafruit.io. Maskinvareoppsettet mitt under demoen var slik
For å ta ting videre, kan du opprette et dashbord på adafruit.io og legge til en grafkomponent slik at du kan få en grafisk oversikt over dataene som vist i bildet nedenfor.
Det er det gutta, du kan nå overvåke energiforbruket ditt hvor som helst i verden. Det er viktig å merke seg at det definitivt er mye mer finjustering og kalibreringer som skal gjøres for å transformere det til en virkelig nøyaktig løsning, men jeg tror dette gir deg nesten alt du trenger for å fortsette.
Skyt meg gjerne spørsmål om prosjektet via kommentarseksjonen. Jeg vil prøve å svare så mange som mulig. Til neste gang.