- Raspberry Pi Smart Energy Meter Block Diagram
- Nödvändiga komponenter
- Förbereder Pi
- Pi energimätares kretsschema
- Python-kod för Pi energimätare
- Demo
Energimonitorer, oavsett om de täcker hela lägenheten eller används för att övervaka bara en apparat, ger dig möjlighet att hålla koll på din förbrukning och göra nödvändiga justeringar. Medan de alltmer blir tillgängliga på marknaden känner tillverkaren i mig fortfarande att det kommer att vara en bra idé att bygga en DIY-version som kan skräddarsys för att möta specifika personliga krav. Som sådan, för dagens handledning, kommer vi att bygga en Raspberry Pi strömförbrukningsmonitor som kan få energiförbrukning och ladda upp den till Adafruit.io.
Du kan också kolla in den Arduino-baserade IoT-energimätaren och den förbetalda GSM-energimätaren som vi har byggt tidigare.
Raspberry Pi Smart Energy Meter Block Diagram
Nedan visas ett blockschema som visar hur systemet fungerar.
Att välja enheterna efter varandra;
Strömavkännande enhet: Strömavkännarenheten består av SCT -013-strömgivaren som kan mäta upp till 100A, beroende på vilken version du köper. Sensorn omvandlar strömmen som passerar genom kabeln på vilken den kläms fast i en liten ström som sedan matas in i ADC via ett nätverk av spänningsdelare.
Spänningsavkänningsenhet: Även om jag inte kunde lägga händerna på en spänningssensormodul kommer vi att bygga en DIY en transformatorfri spänningssensor som mäter spänning med principen om spänningsdelare. DIY-spänningssensorn involverar spänningsdelningssteget där högspänningen omvandlas till ett värde som är lämpligt för ingång till ADC.
Bearbetningsenhet: Bearbetningsenheten består av ADC och Raspberry pi. ADC tar den analoga signalen och skickar den till hallon pi, som sedan beräknar den exakta mängden ström som förbrukas och skickar den till ett bestämt enhetsmoln. I denna handledning kommer vi att använda Adafruit.io som vårt Device Cloud. Vi har också byggt andra
Friskrivningsklausul: Innan vi börjar är det viktigt att nämna att detta projekt innefattar anslutning till en växelströmsförsörjning som är farlig och kan vara dödlig om den inte hanteras säkert. Se till att du har erfarenhet av att arbeta runt AC innan du försöker.
Redo? Låt oss dyka in.
Nödvändiga komponenter
Följande komponenter krävs för att bygga detta projekt;
- Raspberry Pi 3 eller 4 (processen ska vara densamma för RPI2 med en WiFi-dongel)
- ADS1115 16bit I2C ADC
- YHDC SCT-013-000
- 2,5A 5V MicroUSB-nätadapter
- 2W 10K motstånd (1)
- 1 / 2W 10K motstånd (2)
- 33 ohm motstånd (1)
- 2W 3,3 k motstånd (1)
- IN4007-diod (4)
- 3.6v Zener-diod (1)
- 10k potentiometer (eller förinställd) (1)
- 50v 1uf kondensator
- 50v 10uf kondensator (2)
- Bakbord
- Bygeltråd
- Andra tillbehör för Raspberry Pi.
Förutom de hårdvarukomponenter som anges ovan kräver projektet också vissa programberoenden och bibliotek som vi kommer att installera när vi fortsätter.
Medan denna handledning fungerar oavsett vilket hallon pi OS som används, kommer jag att använda Raspberry Pi buster OS som körs på en Pi 3 (bör också fungera på en Pi 4) och jag antar att du är bekant med att ställa in Raspberry Pi med Raspbian Buster OS (ungefär samma process som tidigare versioner), och du vet hur man SSH in i det med hjälp av en terminalprogramvara som hyper. Om du har problem med något av detta finns det massor av Raspberry Pi-handledning på den här webbplatsen som kan hjälpa till
Förbereder Pi
Innan vi börjar koppla ihop komponenterna och kodningen finns det några enkla uppgifter vi behöver utföra på hallon pi för att se till att vi är redo att gå.
Steg 1: Aktivera Pi I2C
Kärnan i dagens projekt är inte bara hallon pi utan ADS1115 16bit I2C-baserad ADC. ADC tillåter oss att ansluta analoga sensorer till Raspberry Pi eftersom Pi själv inte har en inbyggd ADC. Den tar in data via sin egen ADC och vidarebefordrar den till hallon pi via I2C. Som sådan måste vi aktivera I2C-kommunikation på Pi så att den kan kommunicera med den.
Pi: s I2C-buss kan aktiveras eller inaktiveras via hallon Pi-konfigurationssidan. För att starta det, klicka på Pi-ikonen på skrivbordet och välj inställningar följt av Raspberry pi-konfiguration.
Detta bör öppna konfigurationssidan. Kontrollera den aktiverade alternativknappen för I2C och klicka på OK för att spara den och starta om Pi för att genomföra ändringarna.
Om du kör Pi i huvudlöst läge kan du komma åt Raspbian-konfigurationssidan genom att köra sudo raspi-config.
Steg 2: Installera ADS11xx-biblioteket från Adafruit
Det andra vi behöver göra är att installera pythonbiblioteket ADS11xx som innehåller funktioner och rutiner som gör det enkelt för oss att skriva ett pythonscript för att hämta värden från ADC.
Följ stegen nedan för att göra detta.
- Uppdatera din pi genom att köra; sudo apt-get uppdatering följt av sudo apt-get uppgradering detta kommer att uppdatera pi så att det inte finns några kompatibilitetsproblem för någon ny programvara du väljer att installera.
- Därefter kör cd ~ kommandot att säkerställa att du är i hemkatalogen.
- Installera sedan build-essentials genom att köra; sudo apt-get install build-essential python-dev python-smbus git
- Klona sedan Adafruit git-mappen som innehåller ADS-biblioteket genom att köra; git-klon https://github.com/adafruit/Adafruit_Python_ADS1x15.git
- Byt till den klonade filens katalog och kör installationsfilen med; cd Adafruit_Python_ADS1x1z följt av sudo python setup.py installation
När detta är gjort ska installationen nu vara klar.
Du kan testa biblioteksinstallationen genom att ansluta ADS1115 som visas i schematiska avsnittet nedan och köra provkoden som medföljde biblioteket genom att först ändra till dess mapp med cd-exempel och köra exemplet med; python simpletest.py
Steg 3: Installera Adafruit.IO Python-modul
Som nämnts under introduktionen kommer vi att publicera avläsningar från spännings- och strömgivarna till Adafruit IO Cloud där den kan ses från hela världen eller anslutas till IFTTT för att utföra de åtgärder du vill.
Adafruit.IO python-modulen innehåller underrutiner och funktioner som vi kommer att använda för att enkelt strömma data till molnet. Följ stegen nedan för att installera modulen.
- Kör cd ~ för att återgå till hemkatalogen.
- Kör sedan kommandot; sudo pip3 installera adafruit-io . Det bör installera Adafruit IO python-modulen.
Steg 4: Ställ in ditt Adafruit.io-konto
För att använda Adafruit IO måste du definitivt skapa ett konto och skaffa en AIO-nyckel. Den här AIO-nyckeln tillsammans med ditt användarnamn kommer att användas av ditt python-skript för att komma åt Adafruit IO-molntjänsten. För att skapa ett konto, besök; https://io.adafruit.com/, klicka på knappen Kom igång gratis och fyll i alla nödvändiga parametrar. När Registreringen är klar bör du se Visa AIO-nyckelknappen till höger på din hemsida.
Klicka på den för att hämta din AIO-nyckel.
Med den kopierade nyckeln är vi redo att gå. Men för att underlätta processen för att skicka data till molntjänsten kan du också skapa de flöden som data kommer att skickas till. (mer information om vad AIO-flöden är finns här). Eftersom vi i princip kommer att skicka strömförbrukning kommer vi att skapa ett flöde för kraft. För att skapa ett flöde, klicka på “flöden” högst upp på AIO-sidan och klicka på lägg till nytt flöde.
Ge det vilket namn du vill men för att hålla sakerna enkla, jag kommer att kalla det energiförbrukning. Du kan också välja att skapa flöden för spänning och ström och anpassa koden för att publicera data till dem.
Med allt detta på plats är vi nu redo att börja bygga projektet.
Pi energimätares kretsschema
Schemat för Raspberry Pi Energy Monitor- projektet är relativt komplicerat och det innebär att man ansluter till en växelspänning som tidigare nämnts, se till att du vidtar alla nödvändiga försiktighetsåtgärder för att undvika elchock. Om du inte känner till att hantera växelströmsspänningar på ett säkert sätt, låt glädjen att implementera detta på en brädbräda, utan att driva den, vara tillfredsställande.
Schemat inkluderar att ansluta spännings- och strömgivarenheten till ADC som sedan skickar data från sensorerna till Raspberry Pi. För att göra anslutningarna enklare att följa presenteras scheman för varje enhet på egen hand.
Strömgivarschema
Anslut komponenter för den aktuella sensorn enligt bilden nedan.
Den nuvarande transformatorn som används i detta projekt visas nedan, som du kan se har vi tre ledningar från den, nämligen jord, Cout och 3.3V
Spänningssensorscheman
Anslut komponenter till spänningssensorn enligt bilden nedan.
Bearbetningsenhet Scheman
Anslut allt tillsammans med ADC (ADS1115) ansluten till hallon pi och utgången från ström- och spänningssensorerna anslutna till stift A0 respektive A1 på ADS1115.
Se till att GND-stiften på båda avkänningsenheterna är anslutna till GND på ADC eller hallon pi.
För att göra saker lite mindre skakiga implementerade jag spännings- och strömgivarna på ett Protoboard. Det rekommenderas inte heller att bygga en AC-strömkrets på panelen. Om du gör detsamma kan din slutliga installation se ut som bilden nedan;
När anslutningarna är klara är vi nu redo att skriva koden för projektet.
Python-kod för Pi energimätare
Som vanligt med våra hallon pi-projekt kommer vi att utveckla koden för projektet med python. Klicka på ikonen hallon pi på skrivbordet, välj programmering och starta vilken version av python du vill använda. Jag kommer att använda Python 3 och vissa av funktionerna i python 3 kanske inte fungerar för python 2.7. Så det kan finnas ett behov av att göra någon betydande ändring av koden om du vill använda python 2.7. Jag kommer att göra en uppdelning av koden i små utdrag och dela hela koden med dig i slutet.
Redo? Häftigt.
Algoritmen bakom koden är enkel. Vårt pythonscript frågar ADS1115 (över I2C) för spännings- och strömavläsningar. Det mottagna analoga värdet tas emot, samplas och rotens medelvärde för spänning och ström erhålls. Effekten i kilowatt beräknas och skickas till Adafruit IO-foder efter specifika intervall.
Vi startar skriptet med att inkludera alla bibliotek som vi kommer att använda. Detta inkluderar inbyggda bibliotek som tids- och mattebiblioteket och de andra biblioteken vi installerade tidigare.
import tiden import Adafruit_ADS1x15 från Adafruit_IO import * import matematik
Därefter skapar vi en instans av ADS1115-biblioteket som kommer att användas för att adressera den fysiska ADC framöver.
# Skapa en ADS1115 ADC (16-bitars) instans.. adc1 = Adafruit_ADS1x15.ADS1115 ()
Ge sedan ditt adafruit IO-användarnamn och “AIO” -nyckel.
användarnamn = 'ange ditt användarnamn mellan dessa citat' AIO_KEY = 'din aio-nyckel' aio = klient (användarnamn, AIO_KEY)
Håll nyckeln säker. Den kan användas för att komma åt ditt adafruit io-konto utan din tillåtelse.
Därefter skapar vi några variabler som förstärkningen för ADC, antalet prover vi vill ha och ställer in avrundningen som definitivt inte är kritisk.
GAIN = 1 # se ads1015 / 1115 dokumentation för potentiella värden. prover = 200 # antal prover tagna från ads1115 platser = int (2) # uppsättning avrundning
Därefter skapar vi en stundslinga för att övervaka ström och spänning och skicka data till Adafruit io med intervaller. While-slingan börjar med att sätta alla variabler till noll.
medan sant: # återställ variabler räkna = int (0) datai = datav = maxIValue = 0 #max strömvärde inom samplet maxVValue = 0 #max spänningsvärde inom samplet IrmsA0 = 0 # root medelvärde kvadratström VrmsA1 = 0 # rot medelvärde kvadrat spänning ampsA0 = 0 # nuvarande toppvoltsA1 = 0 # volt kilowatt = float (0)
Eftersom vi arbetar med växelströmskretsar kommer utgången från SCT-013 och spänningssensorn att vara en sinusvåg, så för att beräkna strömmen och spänningen från sinusvåg måste vi få toppvärdena. För att få toppvärdena samplar vi både spänning och ström (200 sampel) och hittar de högsta värdena (toppvärdena).
för räkning i intervall (prover): 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) om datai> maxIValue: maxIValue = datai if datav> maxVValue: maxVValue = datav
Därefter standardiserar vi värdena genom att konvertera från ADC-värdena till det verkliga värdet, varefter vi sedan använder Rotationsmedelkvadratekvationen för att hitta RMS-spänning och ström.
#calculate current using the sampled data # sct-013 som används är kalibrerad för 1000mV utgång @ 30A. IrmsA0 = flyta (maxIValue / float (2047) * 30) IrmsA0 = runda (IrmsA0, platser) ampereA0 = IrmsA0 / matematik.sqrt (2) ampereA0 = runda (ampsA0, platser) # Beräkna spänning VrmsA1 = float (maxVValue * 1100 / float (2047)) VrmsA1 = rund (VrmsA1, platser) voltsA1 = VrmsA1 / matematik.sqrt (2) voltsA1 = rund (voltsA1, platser) tryck ('Spänning: {0}'. format (voltsA1)) tryck ('Aktuell: {0} '. Format (ampsA0))
Med detta gjort beräknas effekten och data publiceras på adafruit.io
#calculate power power = round (ampsA0 * voltsA1, places) print ('Power: {0}'. format (power)) # post data to adafruit.io EnergyUsage = aio.feeds ('EnergyUsage') aio.send_data (' EnergyUsage ', power)
För gratiskonton kräver adafruit att det är en viss tidsfördröjning mellan förfrågningar eller dataöverföring.
# Vänta innan du upprepar looptiden. Sleep (0)
Den fullständiga koden för projektet finns längst ner på denna sida
Demo
När koden är klar sparar du den och trycker på kör-knappen på python IDE. Innan detta, se till att Pi är ansluten till internet via WiFi eller LAN, och att din aio-nyckel och användarnamn är korrekta. Efter ett tag bör du börja se energidata (effekt) som visas på flödet på Adafruit.io. Min hårdvaruinstallation under demo var så här
För att ta saker vidare kan du skapa en instrumentpanel på adafruit.io och lägga till en grafkomponent så att du kan få en grafisk bild av data som visas i bilden nedan.
Det är det killar, du kan nu övervaka din energiförbrukning var som helst i världen. Det är viktigt att notera att det definitivt finns mycket mer finjustering och kalibreringar att göra för att förvandla det till en riktigt korrekt lösning, men jag tror att detta ger dig nästan allt du behöver för att fortsätta.
Skicka gärna frågor om projektet via kommentarsektionen. Jag ska försöka svara så många som möjligt. Tills nästa gång.