- Hindbær Pi Smart energimålerblokdiagram
- Nødvendige komponenter
- Forberedelse af Pi
- Pi energimåler kredsløbsdiagram
- Python-kode til Pi energimåler
- Demo
Energimonitorer, hvad enten de dækker hele lejligheden eller er implementeret til kun at overvåge et apparat, giver dig en måde at holde styr på dit forbrug og foretage de nødvendige justeringer. Mens de i stigende grad bliver tilgængelige på markedet, føler producenten i mig stadig, at det vil være en god idé at opbygge en DIY-version, der kan skræddersys til at opfylde specifikke personlige krav. Som sådan vil vi til dagens tutorial bygge en Raspberry Pi strømforbrugsmonitor, der er i stand til at opnå energiforbrug og uploade til Adafruit.io.
Du kan også tjekke det Arduino-baserede IoT-energimåler og det forudbetalte GSM-energimåler, som vi har bygget tidligere.
Hindbær Pi Smart energimålerblokdiagram
Nedenfor vises et blokdiagram, der viser, hvordan systemet fungerer.
At vælge enhederne efter hinanden;
Aktuelle Sensing Unit: Den nuværende sensing enhed består af SCT -013 aktuelle sensor, der kan måle op til 100 A, afhængigt af den version, du køber. Sensoren transformerer strømmen, der passerer gennem ledningen, hvorpå den er fastspændt, til en lille strøm, som derefter føres ind i ADC'en via et netværk af spændingsdelere.
Spændingsfølerenhed: Selvom jeg ikke kunne lægge mine hænder på et spændingssensormodul, bygger vi en DIY en transformerfri spændingsføler, der måler spænding ved hjælp af princippet om spændingsdelere. DIY-spændingssensoren involverer spændingsdeleren, hvor højspændingen omdannes til en værdi, der er egnet til input til ADC.
Behandlingsenhed: Behandlingsenheden består af ADC og Raspberry pi. ADC tager det analoge signal og sender det til hindbær pi, som derefter beregner den nøjagtige mængde strøm, der forbruges og sender det til en bestemt enhedssky. Med henblik på denne vejledning bruger vi Adafruit.io som vores Device Cloud. Vi har også bygget andre
Ansvarsfraskrivelse: Før vi begynder, er det vigtigt at nævne, at dette projekt involverer forbindelse til en vekselstrømsforsyning, der er farlig og kan være dødelig, hvis den ikke håndteres sikkert. Sørg for, at du har erfaring med at arbejde omkring AC, før du prøver dette.
Parat? Lad os dykke ind.
Nødvendige komponenter
Følgende komponenter er nødvendige for at opbygge dette projekt;
- Raspberry Pi 3 eller 4 (processen skal være den samme for RPI2 med en WiFi-dongle)
- ADS1115 16bit I2C ADC
- YHDC SCT-013-000
- 2,5A 5V MicroUSB strømadapter
- 2W 10K modstand (1)
- 1 / 2W 10K modstand (2)
- 33 ohm modstand (1)
- 2W 3,3k modstand (1)
- IN4007-diode (4)
- 3.6v Zener-diode (1)
- 10k potentiometer (eller forudindstillet) (1)
- 50v 1uf kondensator
- 50v 10uf kondensator (2)
- Brødbræt
- Jumper Wire
- Andet tilbehør til Raspberry Pi's brug.
Bortset fra hardwarekomponenterne, der er anført ovenfor, kræver projektet også nogle softwareafhængigheder og biblioteker, som vi installerer, mens vi fortsætter.
Selvom denne vejledning fungerer uanset det anvendte hindbær pi OS, bruger jeg Raspberry Pi buster OS, der kører på en Pi 3 (skal også fungere på en Pi 4), og jeg antager, at du er fortrolig med at opsætte Raspberry Pi med Raspbian Buster OS (stort set den samme proces som de tidligere versioner), og du ved hvordan man SSH ind i det ved hjælp af en terminalsoftware som hyper. Hvis du har problemer med noget af dette, er der masser af Raspberry Pi-vejledninger på dette websted, der kan hjælpe
Forberedelse af Pi
Før vi begynder at tilslutte komponenterne og kodningen, er der nogle enkle opgaver, vi skal udføre på hindbær pi for at sikre, at vi er klar til at gå.
Trin 1: Aktivering af Pi I2C
Kernen i dagens projekt er ikke kun hindbær pi, men ADS1115 16bit I2C-baseret ADC. ADC giver os mulighed for at forbinde analoge sensorer til Raspberry Pi, da Pi selv ikke har en indbygget ADC. Det tager dataene ind gennem sin egen ADC og videresender dem til hindbær pi via I2C. Som sådan er vi nødt til at aktivere I2C-kommunikation på Pi, så den kan kommunikere med den.
Pi's I2C-bus kan aktiveres eller deaktiveres via hindbær Pi's konfigurationsside. For at starte det skal du klikke på Pi-ikonet på skrivebordet og vælge præferencer efterfulgt af Raspberry pi-konfiguration.
Dette skal åbne konfigurationssiden. Kontroller den aktiverede radioknap for I2C, og klik på OK for at gemme den og genstarte Pi for at foretage ændringerne.
Hvis du kører Pi i hovedløs tilstand, kan du få adgang til Raspbian-konfigurationssiden ved at køre sudo raspi-config.
Trin 2: Installation af ADS11xx-biblioteket fra Adafruit
Den anden ting, vi skal gøre, er at installere ADS11xx python-biblioteket, der indeholder funktioner og rutiner, der gør det let for os at skrive et python-script for at hente værdier fra ADC.
Følg nedenstående trin for at gøre dette.
- Opdater din pi ved at køre; sudo apt-get opdatering efterfulgt af sudo apt-get opgradering dette opdaterer pi, så der ikke er nogen kompatibilitetsproblemer for ny software, du vælger at installere.
- Kør derefter cd ~ -kommandoen for at sikre, at du er i hjemmekataloget.
- Installer derefter build-essentials ved at køre; sudo apt-get install build-essential python-dev python-smbus git
- Derefter skal du klone Adafruit git-mappen, der indeholder ADS-biblioteket, ved at køre; git-klon https://github.com/adafruit/Adafruit_Python_ADS1x15.git
- Skift til den klonede fils bibliotek og kør installationsfilen ved hjælp af; cd Adafruit_Python_ADS1x1z efterfulgt af sudo python setup.py installation
Når dette er gjort, skal installationen nu være afsluttet.
Du kan teste biblioteksinstallationen ved at forbinde ADS1115 som vist i sektionen skemaer nedenfor og køre den prøvekode, der fulgte med biblioteket, ved først at skifte til dens mappe ved hjælp af; cd-eksempler og kørsel af eksemplet ved hjælp af; python simpletest.py
Trin 3: Installer Adafruit.IO Python-modul
Som nævnt under introduktionen vil vi offentliggøre aflæsninger fra spændings- og strømfølerne til Adafruit IO Cloud, hvorfra den kan ses fra hele verden eller er forbundet med IFTTT for at udføre de handlinger, du ønsker.
Adafruit.IO python-modulet indeholder underrutiner og funktioner, som vi vil udnytte, for nemt at streame data til skyen. Følg nedenstående trin for at installere modulet.
- Kør cd ~ for at vende tilbage til hjemmekataloget.
- Kør derefter kommandoen; sudo pip3 installer adafruit-io . Det skal installere Adafruit IO python-modulet.
Trin 4: Konfigurer din Adafruit.io-konto
For at bruge Adafruit IO er det absolut nødvendigt først at oprette en konto og få en AIO-nøgle. Denne AIO-nøgle sammen med dit brugernavn vil blive brugt af dit python-script til at få adgang til Adafruit IO-skygtjenesten. For at oprette en konto skal du besøge; https://io.adafruit.com/, klik på knappen Kom godt i gang gratis og udfyld alle de krævede parametre. Når Tilmelding er gennemført, skal du se knappen Vis AIO-nøgle til højre på din startside.
Klik på den for at få din AIO-nøgle.
Med den kopierede nøgle er vi klar til at gå. For at gøre processen med at sende data til cloudtjenesten lettere kan du dog også oprette de feeds, som dataene sendes til. (mere info om hvad AIO-feeds er kan findes her). Da vi stort set sender strømforbrug, opretter vi et feed til strøm. For at oprette et feed skal du klikke på “feeds” øverst på AIO-siden og klikke på tilføj nyt feed.
Giv det det navn, du vil have, men for at holde tingene enkle, vil jeg kalde det energiforbrug. Du kan også beslutte at oprette feeds til spænding og strøm og tilpasse koden til at offentliggøre data til dem.
Med alt dette på plads er vi nu klar til at begynde at bygge projektet.
Pi energimåler kredsløbsdiagram
Skemaerne til Raspberry Pi Energy Monitor- projektet er relativt komplekse, og det involverer tilslutning til en vekselstrømsspænding som nævnt tidligere. Sørg venligst for at tage alle nødvendige forholdsregler for at undgå elektrisk stød. Hvis du ikke er fortrolig med sikker håndtering af vekselstrøm, skal glæden ved at implementere dette på et brødbræt uden at tænde for det være tilfredsstillende.
Skemaerne involverer tilslutning af spændings- og strømfølerenheden til ADC, som derefter sender dataene fra sensorerne til Raspberry Pi. For at gøre forbindelserne nemmere at følge, vises skemaerne for hver enhed alene.
Nuværende sensor skematisk
Tilslut komponenter til den aktuelle sensor som vist i skemaerne nedenfor.
Den nuværende transformer, der bruges i dette projekt, er vist nedenfor, som du kan se, har vi tre ledninger fra den, nemlig jord, Cout og 3.3V
Skemaer for spændingsføler
Tilslut komponenter til spændingsføleren som vist i skemaerne nedenfor.
Behandlingsenhed Skemaer
Forbind alt sammen med ADC (ADS1115) tilsluttet hindbær pi og output fra strøm- og spændingssensorer, der er tilsluttet henholdsvis pin A0 og A1 på ADS1115.
Sørg for, at begge sensorenheders GND-ben er forbundet med ADD'ens GND eller hindbær-pi.
For at gøre tingene lidt mindre rystende implementerede jeg spændings- og strømfølerne på et Protoboard. Det anbefales heller ikke at oprette et vekselstrømsnet på kredsløbet. Hvis du gør det samme, kan din endelige opsætning se ud som billedet nedenfor;
Når forbindelserne er afsluttet, er vi nu klar til at skrive koden til projektet.
Python-kode til Pi energimåler
Som normalt med vores hindbær pi-projekter udvikler vi koden til projektet ved hjælp af python. Klik på hindbær pi-ikonet på skrivebordet, vælg programmering og start den version af python, du vil bruge. Jeg bruger Python 3, og nogle af funktionerne i python 3 fungerer muligvis ikke for python 2.7. Så der kan være behov for at foretage en betydelig ændring af koden, hvis du vil bruge python 2.7. Jeg vil opdele koden i små uddrag og dele den komplette kode med dig i slutningen.
Parat? Fedt nok.
Algoritmen bag koden er enkel. Vores python-script forespørger ADS1115 (over I2C) for spændings- og strømaflæsninger. Den modtagne analoge værdi modtages, samples, og den gennemsnitlige kvadratværdi for spænding og strøm opnås. Effekten i kilowatt beregnes og sendes til Adafruit IO-foder efter specifikke intervaller.
Vi starter scriptet med at inkludere alle de biblioteker, som vi vil bruge. Dette inkluderer indbyggede biblioteker som tids- og matematikbiblioteket og de andre biblioteker, vi installerede tidligere.
import tid import Adafruit_ADS1x15 fra Adafruit_IO import * import matematik
Dernæst opretter vi en forekomst af ADS1115-biblioteket, som vil blive brugt til at adressere den fysiske ADC fremover.
# Opret en ADS1115 ADC (16-bit) forekomst.. adc1 = Adafruit_ADS1x15.ADS1115 ()
Angiv derefter dit adafruit IO-brugernavn og “AIO” -nøglen.
brugernavn = 'indtast dit brugernavn mellem disse citater' AIO_KEY = 'din aio-nøgle' aio = klient (brugernavn, AIO_KEY)
Hold nøglen sikker. Det kan bruges til at få adgang til din adafruit io-konto uden din tilladelse.
Dernæst opretter vi nogle variabler som gevinst for ADC, antallet af prøver, vi ønsker, og indstiller afrundingen, som bestemt ikke er kritisk.
GAIN = 1 # se ads1015 / 1115 dokumentation for potentielle værdier. prøver = 200 # antal prøver taget fra ads1115 steder = int (2) # sæt afrunding
Dernæst opretter vi en while-loop for at overvåge strømmen og spændingen og sende dataene til Adafruit io med intervaller. While-loop starter med at indstille alle variabler til nul.
mens Sand: # reset variabler count = int (0) datai = datav = maxIValue = 0 #max aktuel værdi inden prøven maxVValue = 0 #max spændingsværdi inden prøven IrmsA0 = 0 #root mean square strøm VrmsA1 = 0 # RMS spænding ampsA0 = 0 # nuværende peak voltA1 = 0 # volt kilowatt = float (0)
Da vi arbejder med vekselstrømskredsløb, vil output fra SCT-013 og spændingssensoren være en sinusbølge, og for at beregne strømmen og spændingen fra sinusbølgen bliver vi nødt til at få topværdierne. For at få topværdierne prøver vi både spænding og strøm (200 prøver) og finder de højeste værdier (topværdier).
for optælling i rækkevidde (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 et nyt maxValue print (datai) hvis datai> maxIValue: maxIValue = datai if datav> maxVValue: maxVValue = datav
Dernæst standardiserer vi værdierne ved at konvertere fra ADC-værdierne til den faktiske værdi, hvorefter vi derefter anvender Root Mean Square-ligningen til at finde RMS-spænding og strøm.
#beregn strøm ved hjælp af de samplede data # den sct-013, der anvendes, er kalibreret til 1000mV output @ 30A. IrmsA0 = float (maxIValue / float (2047) * 30) IrmsA0 = round (IrmsA0, places) ampsA0 = IrmsA0 / math.sqrt (2) ampsA0 = round (ampsA0, places) # Beregn spænding VrmsA1 = float (maxVValue * 1100 / flyde (2047)) VrmsA1 = rund (VrmsA1, steder) voltsA1 = VrmsA1 / matematik.sqrt (2) voltA1 = rund (voltA1, steder) print ('Spænding: {0}'. format (voltsA1)) print ('Aktuel: {0} '. Format (ampsA0))
Når dette er gjort, beregnes effekten, og dataene offentliggøres på adafruit.io
#calculate power power = round (ampsA0 * voltA1, places) print ('Power: {0}'. format (power)) # post data til adafruit.io EnergyUsage = aio.feeds ('EnergyUsage') aio.send_data (' EnergyUsage ', strøm)
For gratis konti kræver adafruit, at der er en vis forsinkelse mellem anmodninger eller data upload.
# Vent inden gentagelse af loop-tid. Sleep (0)
Den komplette kode for projektet findes nederst på denne side
Demo
Når koden er færdig, skal du gemme den og trykke på køreknappen på python IDE. Inden dette skal du sikre dig, at Pi er forbundet til internettet via WiFi eller LAN, og at din aio-nøgle og brugernavn er korrekte. Efter et stykke tid skal du begynde at se energidataene (strøm), der vises på feedet på Adafruit.io. Min hardwareopsætning under demoen var sådan
For at tage tingene videre kan du oprette et dashboard på adafruit.io og tilføje en grafkomponent, så du kan få en grafisk visning af dataene som vist på billedet nedenfor.
Det er det fyre, du kan nu overvåge dit energiforbrug fra hvor som helst i verden. Det er vigtigt at bemærke, at der bestemt er meget mere finjustering og kalibreringer, der skal udføres for at omdanne det til en rigtig nøjagtig løsning, men jeg tror, det giver dig næsten alt hvad du behøver for at fortsætte.
Du er velkommen til at skyde mig spørgsmål om projektet via kommentarsektionen. Jeg vil prøve at svare så mange som muligt. Indtil næste gang.