- Raspberry Pi slimme energiemeter blokschema
- Vereiste componenten
- De Pi voorbereiden
- Pi energiemeter schakelschema
- Python-code voor Pi-energiemeter
- Demo
Energiemonitors, of ze nu het hele appartement bestrijken of worden ingezet om slechts één apparaat te bewaken, bieden u een manier om uw verbruik bij te houden en de nodige aanpassingen te doen. Hoewel ze steeds meer op de markt beschikbaar komen, voelt de maker in mij nog steeds dat het een geweldig idee zal zijn om een doe-het-zelfversie te bouwen die kan worden aangepast aan specifieke persoonlijke vereisten. Daarom zullen we voor de tutorial van vandaag een Raspberry Pi Power Consumption-monitor bouwen die het energieverbruik kan meten en uploaden naar Adafruit.io.
Je kunt ook de op Arduino gebaseerde IoT Energy Meter en de Prepaid GSM Energy Meter bekijken die we eerder hebben gebouwd.
Raspberry Pi slimme energiemeter blokschema
Hieronder ziet u een blokschema dat laat zien hoe het systeem werkt.
Het is een feit dat u zich geen zorgen hoeft te maken.Om de eenheden een voor een te kiezen;
Stroomdetectie-eenheid: De stroomdetectie- eenheid bestaat uit de SCT -013 stroomsensor die tot 100A kan meten, afhankelijk van de versie die u koopt. De sensor zet de stroom die door de draad waarop hij is geklemd, om in een kleine stroom die vervolgens via een netwerk van spanningsdelers in de ADC wordt gevoerd.
Voltage Sensing Unit: hoewel ik niet in staat was om een spanningssensormodule te bemachtigen, zullen we een doe-het-zelf-een transformatorloze spanningssensor bouwen die spanning meet met behulp van het principe van spanningsdelers. De doe-het-zelf-spanningssensor omvat de fase van de spanningsdeler waar de hoogspanning wordt getransformeerd naar een waarde die geschikt is voor invoer in de ADC.
Verwerkingseenheid: De verwerkingseenheid omvat de ADC en de Raspberry pi. De ADC neemt het analoge signaal en stuurt het naar de Raspberry Pi, die vervolgens de exacte hoeveelheid stroom die wordt verbruikt, berekent en naar een aangewezen apparaatwolk stuurt. Voor deze tutorial gebruiken we Adafruit.io als onze Device Cloud. We hebben ook andere gebouwd
Disclaimer: Voordat we beginnen, is het belangrijk om te vermelden dat dit project betrekking heeft op aansluiting op een wisselstroomvoeding, wat gevaarlijk is en fataal kan zijn als het niet veilig wordt gehanteerd. Zorg ervoor dat u ervaring heeft met het werken met AC voordat u dit probeert.
Klaar? Laten we erin duiken.
Vereiste componenten
De volgende componenten zijn vereist om dit project te bouwen;
- Raspberry Pi 3 of 4 (het proces zou hetzelfde moeten zijn voor de RPI2 met een wifi-dongle)
- ADS1115 16-bits I2C ADC
- YHDC SCT-013-000
- 2,5 A 5 V MicroUSB-voedingsadapter
- 2W 10K weerstand (1)
- 1 / 2W 10K weerstand (2)
- 33ohms weerstand (1)
- 2W 3.3k weerstand (1)
- IN4007 Diode (4)
- 3.6v zenerdiode (1)
- 10k Potentiometer (of Preset) (1)
- 50v 1uf condensator
- 50v 10uf condensator (2)
- Broodplank
- Doorverbindingsdraad
- Andere accessoires voor het gebruik van de Raspberry Pi.
Naast de hierboven genoemde hardwarecomponenten, vereist het project ook enkele softwareafhankelijkheden en bibliotheken die we gaandeweg zullen installeren.
Hoewel deze tutorial zal werken ongeacht het Raspberry Pi OS dat wordt gebruikt, zal ik het Raspberry Pi buster OS gebruiken dat op een Pi 3 draait (zou ook moeten werken op een Pi 4) en ik neem aan dat je bekend bent met het instellen van de Raspberry Pi met het Raspbian Buster OS (vrijwel hetzelfde proces als de vorige versies), en je weet hoe je er SSH in moet doen met behulp van terminalsoftware zoals hyper. Als je hier problemen mee hebt, zijn er talloze Raspberry Pi-zelfstudies op deze website die kunnen helpen
De Pi voorbereiden
Voordat we beginnen met het bedraden van de componenten en het coderen, zijn er enkele eenvoudige taken die we op de Raspberry Pi moeten uitvoeren om er zeker van te zijn dat we klaar zijn voor gebruik.
Stap 1: de Pi I2C inschakelen
De kern van het huidige project is niet alleen de Raspberry Pi, maar ook de ADS1115 16bit I2C-gebaseerde ADC. De ADC stelt ons in staat om analoge sensoren aan te sluiten op de Raspberry Pi, aangezien de Pi zelf geen ingebouwde ADC heeft. Het neemt de gegevens op via zijn eigen ADC en stuurt deze via I2C door naar de Raspberry Pi. Als zodanig moeten we I2C-communicatie op de Pi inschakelen zodat deze ermee kan communiceren.
De I2C-bus van de Pi kan worden in- of uitgeschakeld via de configuratiepagina van de Raspberry Pi. Om het te starten, klikt u op het Pi-pictogram op het bureaublad en selecteert u voorkeuren gevolgd door Raspberry pi-configuratie.
Dit zou de configuratiepagina moeten openen. Controleer het ingeschakelde keuzerondje voor de I2C en klik op OK om het op te slaan en start de Pi opnieuw op om de wijzigingen door te voeren.
Als u de Pi in de headless-modus gebruikt, kan de Raspbian-configuratiepagina worden geopend door sudo raspi-config uit te voeren.
Stap 2: Installatie van de ADS11xx-bibliotheek van Adafruit
Het tweede dat we moeten doen, is de ADS11xx python-bibliotheek installeren die functies en routines bevat die het ons gemakkelijk maken om een python-script te schrijven om waarden op te halen uit de ADC.
Volg de onderstaande stappen om dit te doen.
- Update uw pi door te draaien; sudo apt-get update gevolgd door sudo apt-get upgrade dit zal de pi bijwerken en ervoor zorgen dat er geen compatibiliteitsproblemen zijn voor nieuwe software die u wilt installeren.
- Voer vervolgens de opdracht cd ~ uit om ervoor te zorgen dat u zich in de homedirectory bevindt.
- Installeer vervolgens de build-essentials door uit te voeren; sudo apt-get install build-essential python-dev python-smbus git
- Kloon vervolgens de Adafruit git-map met de ADS-bibliotheek door uit te voeren; git clone https://github.com/adafruit/Adafruit_Python_ADS1x15.git
- Ga naar de map van het gekloonde bestand en voer het installatiebestand uit met; cd Adafruit_Python_ADS1x1z gevolgd door sudo python setup.py install
Nu dit klaar is, zou de installatie nu voltooid moeten zijn.
U kunt de bibliotheekinstallatie testen door de ADS1115 aan te sluiten zoals getoond in de schematische sectie hieronder en de voorbeeldcode uit te voeren die bij de bibliotheek is geleverd door eerst naar de map te gaan met; cd-voorbeelden en het uitvoeren van het voorbeeld met; python simpletest.py
Stap 3: Installeer Adafruit.IO Python Module
Zoals vermeld tijdens de introducties, zullen we metingen publiceren van de spannings- en stroomsensoren naar de Adafruit IO Cloud van waaruit deze van over de hele wereld kan worden bekeken of verbonden met IFTTT om alle gewenste acties uit te voeren.
De Adafruit.IO python-module bevat subroutines en functies die we gebruiken om eenvoudig gegevens naar de cloud te streamen. Volg de onderstaande stappen om de module te installeren.
- Start de cd ~ om terug te keren naar de homedirectory.
- Voer vervolgens het commando uit; sudo pip3 installeer adafruit-io . Het zou de Adafruit IO python-module moeten installeren.
Stap 4: Stel uw Adafruit.io-account in
Om Adafruit IO te kunnen gebruiken, moet u beslist eerst een account aanmaken en een AIO-sleutel verkrijgen. Deze AIO-sleutel wordt samen met uw gebruikersnaam door uw python-script gebruikt om toegang te krijgen tot de Adafruit IO-cloudservice. Ga naar om een account aan te maken; https://io.adafruit.com/, klik op de knop gratis aan de slag en vul alle vereiste parameters in. Als Aanmelden voltooid is, zou u de knop AIO-sleutel weergeven aan de rechterkant van uw startpagina moeten zien.
Klik erop om uw AIO-sleutel te krijgen.
Met de sleutel gekopieerd, zijn we klaar om te gaan. Om het proces van het verzenden van gegevens naar de cloudservice te vergemakkelijken, kunt u echter ook de feeds maken waarnaar de gegevens worden verzonden. (meer informatie over wat AIO-feeds zijn, vindt u hier). Omdat we in feite stroomverbruik zullen verzenden, zullen we een feed voor stroom maken. Om een feed aan te maken, klikt u op "feeds" bovenaan de AIO-pagina en klikt u op nieuwe feed toevoegen.
Geef het een naam die je maar wilt, maar om het simpel te houden, zal ik het energieverbruik noemen. U kunt er ook voor kiezen om feeds voor spanning en stroom te maken en de code aan te passen om er gegevens naar te publiceren.
Nu dit alles op zijn plaats is, zijn we nu klaar om te beginnen met de bouw van het project.
Pi energiemeter schakelschema
Het schema voor het Raspberry Pi Energy Monitor- project is relatief complex en het omvat aansluiting op een wisselspanning, zoals eerder vermeld, zorg ervoor dat u alle voorzorgsmaatregelen neemt die nodig zijn om elektrische schokken te voorkomen. Als u niet vertrouwd bent met het veilig omgaan met wisselspanning, laat het plezier om dit op een breadboard te implementeren, zonder het aan te sluiten, voldoende zijn.
Het schema omvat het aansluiten van de spannings- en stroomsensoreneenheid op de ADC, die vervolgens de gegevens van de sensoren naar de Raspberry Pi stuurt. Om het volgen van de aansluitingen te vergemakkelijken, worden de schema's voor elke unit afzonderlijk weergegeven.
Huidige sensor schema
Sluit componenten voor de stroomsensor aan zoals weergegeven in het onderstaande schema.
De stroomtransformator die in dit project wordt gebruikt, wordt hieronder weergegeven, zoals u kunt zien, hebben we er drie draden van, namelijk aarde, Cout en 3.3V
Voltage Sensor Schema's
Sluit componenten voor de spanningssensor aan zoals weergegeven in het onderstaande schema.
Verwerkingseenheid Schema's
Verbind alles samen met de ADC (ADS1115) die is aangesloten op de Raspberry Pi en de uitgang van de stroom- en spanningssensoren die zijn aangesloten op respectievelijk pin A0 en A1 van de ADS1115.
Zorg ervoor dat de GND-pinnen van beide sensoreenheden zijn verbonden met de GND van de ADC of de Raspberry Pi.
Om de boel wat minder wankel te maken, heb ik de spannings- en stroomsensoren op een Protoboard geïmplementeerd. Het wordt ook niet aanbevolen om een wisselstroomcircuit op het breadboard te bouwen. Als u hetzelfde doet, ziet uw uiteindelijke configuratie eruit als in de onderstaande afbeelding;
Nu de verbindingen zijn voltooid, zijn we klaar om de code voor het project te schrijven.
Python-code voor Pi-energiemeter
Zoals gebruikelijk bij onze Raspberry Pi-projecten, zullen we de code voor het project ontwikkelen met python. Klik op het raspberry pi-pictogram op het bureaublad, selecteer programmeren en start de versie van python die u wilt gebruiken. Ik zal Python 3 gebruiken en sommige functies in python 3 werken mogelijk niet voor python 2.7. Het kan dus nodig zijn om een belangrijke wijziging in de code aan te brengen als je python 2.7 wilt gebruiken. Ik zal de code opsplitsen in kleine fragmenten en aan het einde de volledige code met je delen.
Klaar? Stoer.
Het algoritme achter de code is eenvoudig. Ons python-script vraagt de ADS1115 (via I2C) om spannings- en stroommetingen. De ontvangen analoge waarde wordt ontvangen, bemonsterd en de gemiddelde kwadraatwaarde van de spanning en stroom wordt verkregen. Het vermogen in kilowatt wordt berekend en na bepaalde intervallen naar de Adafruit IO-feed gestuurd.
We starten het script door alle bibliotheken op te nemen die we zullen gebruiken. Dit omvat ingebouwde bibliotheken zoals de tijd- en wiskundebibliotheek en de andere bibliotheken die we eerder hebben geïnstalleerd.
import tijd import Adafruit_ADS1x15 uit Adafruit_IO import * import wiskunde
Vervolgens maken we een instantie van de ADS1115-bibliotheek die in de toekomst zal worden gebruikt om de fysieke ADC aan te pakken.
# Maak een ADS1115 ADC (16-bit) instantie.. adc1 = Adafruit_ADS1x15.ADS1115 ()
Geef vervolgens uw adafruit IO-gebruikersnaam en "AIO" -sleutel op.
gebruikersnaam = 'voer uw gebruikersnaam in tussen deze aanhalingstekens' AIO_KEY = 'uw aio-sleutel' aio = Client (gebruikersnaam, AIO_KEY)
Bewaar de sleutel veilig. Het kan worden gebruikt om zonder uw toestemming toegang te krijgen tot uw adafruit io-account.
Vervolgens maken we een aantal variabelen, zoals de versterking voor de ADC, het aantal monsters dat we willen, en stellen we de afronding in die beslist niet kritisch is.
GAIN = 1 # zie ads1015 / 1115 documentatie voor mogelijke waarden. samples = 200 # aantal samples genomen van ads1115 plaatsen = int (2) # set afronding
Vervolgens maken we een while-lus om de stroom en het voltage te bewaken en sturen we de gegevens met tussenpozen naar Adafruit io. De while-lus begint door alle variabelen op nul in te stellen.
terwijl Ware: # reset variabelen telling = int (0) Datai = datav = maxIValue = 0 #maximum stroomwaarde binnen sample maxVValue = 0 #maximum voltagewaarde binnen sample IrmsA0 = 0 #root gemiddelde kwadratische huidige VrmsA1 = 0 # gemiddelde kwadratische wortel spanning ampère A0 = 0 # huidige piekspanning A1 = 0 # spanning kilowatt = float (0)
Omdat we met wisselstroomcircuits werken, zal de output van SCT-013 en de spanningssensor een sinusgolf zijn, dus om de stroom en de spanning van de sinusgolf te berekenen, moeten we de piekwaarden krijgen. Om de piekwaarden te krijgen, zullen we zowel spanning als stroom bemonsteren (200 monsters) en de hoogste waarden (piekwaarden) vinden.
voor count in range (samples): datai.insert (count, (abs (adc1.read_adc (0, gain = GAIN)))) datav.insert (count, (abs (adc1.read_adc (1, gain = GAIN)))) # kijk of je een nieuwe maxValue print (datai) hebt als datai> maxIValue: maxIValue = datai if datav> maxVValue: maxVValue = datav
Vervolgens standaardiseren we de waarden door de ADC-waarden om te zetten naar de werkelijke waarde, waarna we vervolgens de Root Mean Square-vergelijking gebruiken om de RMS-spanning en -stroom te vinden.
#bereken stroom met behulp van de gesamplede gegevens # de sct-013 die wordt gebruikt, is gekalibreerd voor 1000mV-uitvoer @ 30A. IrmsA0 = float (maxIValue / float (2047) * 30) IrmsA0 = rond (IrmsA0, plaatsen) ampsA0 = IrmsA0 / math.sqrt (2) ampsA0 = rond (ampsA0, plaatsen) # Spanning berekenen VrmsA1 = float (maxVValue * 1100 / float (2047)) VrmsA1 = rond (VrmsA1, plaatsen) voltsA1 = VrmsA1 / math.sqrt (2) voltsA1 = rond (voltsA1, plaatsen) print ('Spanning: {0}'. format (voltsA1)) print ('Huidig: {0} '. Formaat (ampsA0))
Hiermee wordt het vermogen berekend en worden de gegevens gepubliceerd op adafruit.io
#bereken power power = round (ampsA0 * voltsA1, plaatsen) print ('Power: {0}'. format (power)) #post data naar adafruit.io EnergyUsage = aio.feeds ('EnergyUsage') aio.send_data (' EnergyUsage ', vermogen)
Voor gratis accounts eist adafruit dat er enige vertraging zit tussen verzoeken of het uploaden van gegevens.
# Wacht voordat u de lustijd herhaalt. Sleep (0)
De volledige code voor het project staat onderaan deze pagina
Demo
Als de code compleet is, sla je deze op en druk je op de knop Uitvoeren op de python IDE. Zorg er eerst voor dat de Pi via wifi of LAN is verbonden met internet en dat je aio-sleutel en gebruikersnaam correct zijn. Na een tijdje zou je de energiegegevens (vermogen) moeten zien die worden weergegeven in de feed op Adafruit.io. Mijn hardware-installatie tijdens de demo was als volgt
Om verder te gaan, kunt u een dashboard maken op adafruit.io en een grafiekcomponent toevoegen, zodat u een grafische weergave van de gegevens kunt krijgen, zoals weergegeven in de onderstaande afbeelding.
Dat zijn het jongens, u kunt nu uw energieverbruik overal ter wereld volgen. Het is belangrijk op te merken dat er zeker nog veel meer afstemming en kalibraties moeten worden gedaan om het om te zetten in een echt nauwkeurige oplossing, maar ik geloof dat dit je bijna alles geeft wat je nodig hebt om verder te gaan.
Stel me gerust vragen over het project via het commentaargedeelte. Ik zal proberen er zo veel mogelijk te beantwoorden. Tot de volgende keer.