Arduino – Bygg en elmätare

Arduino-projekt för att logga strömförbrukning hemma.

Genom att räkna och spara blinkningar på elmätaren så går det att räkna strömförbrukning mellan olika tidpunkter i efterhand.

Detta görs med hjälp av en Arduino och en PC.

ElMatare0

 

 

 

 

Lösningen är inte helt helt klar men fungerar.

Material

  • 1st – LDR
  • 1st – Resistor (10K Ohm)
  • 1st – Arduino UNO R3
  • 1st – labbplatta
  • 1st – PC (dator med Windows om du vill nyttja mitt Powershell script)

 

Övergripande information

På elmätaren klistras en labbplatta med ett motstånd samt en LDR, dvs ett ljuskänsligt motstånd. LDR:en ska placeras framför den blinkade dioden på elmätaren.

För att slippa ha en dator i närheten av elskåpet så valde jag att ha en uppklippt nätverkskabel mellan Arduinon och kopplingsplattan. Det går att enbart montera LDR:en på elmätaren och ha motståndet kopplat direkt på Arduinon.

Varje blinkning skickas från Arduinon till PC:n via com porten. När datorn tar emot detta så skrivs tidpunkten ner i en fil. Varje timme skapas en ny fil.

 

ElMatare01

 

 

 

 

 

Genom att registrera elmätarens blinkningar så går det att se hur mycket man förbrukar (ett blink = 1W)

 

ElMatare02

 

 

 

 

 

 

 

 

 

 Arduinon kopplas direkt i PC:n via USB och skickar data via Com porten. Ingen extra strömförsörjning behövs.

 

Kopplingsschema:

Koppla ett 10K ohms motstånd parallellt med A0 (analog) och GND (jord)

Koppla LRD direkt till +5V och andra benet till A0 (analog)

ElMatare03

 

 

 

 

 

 

 

Arduinokoden:

Jag har gjort en loop som kontrollerar om A0 har ett värde över 600, har den det så skickas värdet via serieporten till datorn en gång. Sedan avvaktar Arduinon på att porten ska gå låg igen.

Om ljuset runt LDR:en varierar så går det att ändra vädret “600” till ett högre eller lägre för att undvika brus och felaktiga avläsningar.

Kod:

const int analogInPin = A0;    // Analog pinne dit LDR:en kopplas
const int analogOutPin = 13; // port 13 Arduinon (inbyggd led för att visa att allt är ok)

int AnalogState = 0;          // sätter senast lästa värde.
int AnalogLastState = 0;  // sätter näst senaste värdet
int AnalogCounter = 0;    // Räknar pulser
int sensorValue = 0;       // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup()

{
Serial.begin(9600);
}

void loop()

{
sensorValue = analogRead(analogInPin);
outputValue = map(sensorValue, 200, 800, 0, 255); // räknar värde 200 som 0, och 800 som 255)

if (sensorValue > 600 && AnalogState == 0){

AnalogState = 1;
//Serial.print(“HIGH”);
Serial.println(sensorValue);

}

else if (sensorValue < 600 && AnalogState == 1)

{
AnalogState = 0; // Sensorn gick nu under 600, dvs nolla och börja räkna igen.

}

else

{
// om man inte har ett värde över 600 och att Analogstate inte va 1

}

analogWrite(analogOutPin, outputValue);
AnalogLastState = AnalogState;

}

 

 

PowerShell script

För att spara data på PC:n så har jag gjort ett PowerShell script som lyssnar på Com port, skrivs något på Com porten så sparas tidpunkten ner till en fil. En ny fil skapas varje timme.

ElMatare11

 

 

 

Genom att starta scriptet så loggas varje blinkning på din elmätare till en fil. Ändra sökvägen $loggmapp dit du vill ha loggarna sparad. Ändra $comport till porten som Arduinon har presenterat sig på.

 

### Start script
$loggmappen = “D:\PowerLoggen”  # Sökvägen dit alla loggar skapas
$comport       = “COM3”                     # Ange den aktuella porten som Arduinon hamnar på!

if (!(Test-Path $loggmappen)){New-Item $loggmappen -ItemType directory -Force -Confirm | Out-Null; Write-Verbose “Skapade en mapp”}

$loggmappen = Join-Path -Path $loggmappen -ChildPath “Ström-”

[System.IO.Ports.SerialPort]::getportnames()
$port= new-Object System.IO.Ports.SerialPort $($comport),9600,None,8,one
$port.open()

while ($true){

$tillf = “”
$tillf = $port.ReadLine()
if ($tillf -ne “”){

Write-Verbose $tillf

Out-File -FilePath “$($loggmappen)$(Get-Date -UFormat %y-%m-%d_%H_00).log”  -InputObject “$((get-date).ToString(“HH:mm:ss:fff”))” -Append

}

}

$port.Close() # detta måste köras för att stänga porten när man är klar!

### slut på scriptet.

På följande sätt ser loggen ut för 10W.

  • 22:58:44:350
  • 22:58:46:475
  • 22:58:48:585
  • 22:58:50:710
  • 22:58:52:850
  • 22:58:54:929
  • 22:58:57:069
  • 22:58:59:147
  • 22:59:01:304
  • 22:59:03:413

 

 

Schemalägg scriptet så det alltid körs

1: Öppna schemaläggaren på datorn

2: Högerklicka och välj skapa ny standardaktivitet, hitta sedan på ett bra namn

ElMatare05

 

 

 

 

 

 

3: Välj att aktiviteten ska köras varje gång datorn startas.

ElMatare06

 

 

 

 

 

 

4: Välj “starta ett program

ElMatare07

 

 

 

 

 

 

5: Ange nu följande:

Program eller script:

  • C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

argument: (Ändra till sökväg och namn på ditt sparade script)

  • “D:\dittScript.ps1”

ElMatare08

 

 

 

 

 

 

9: Välj nu slutför

ElMatare09

 

 

 

 

 

 

10: Öppna aktiviteten du just skapade och ändra till “kör oavsett om användaren är inloggad eller inte

ElMatare10

 

 

 

 

 

 

 

Nu loggas förbrukningen extremt noggrant, det går att se direkt vilken millisekund en watt drogs. Jag kommer att lägga upp ett script för att summera detta till snygga grafer så fort jag hinner.

 

// Markus

 

Arduino – Bygg en elmätare
Ge ett betyg på innehållet

3 kommentarer

  1. Detta är en pulsmätare, inte en elmätare.
    Stor skillnad.

    • Ispep

      2017-04-02 at 08:50

      Hej, stämmer att benämning kanske inte tekniskt är helt korrekt nu, tänkte bara på själva funktionen. Ber om ursäkt för det.

      Men till mitt försvar så kan man hjälp av pulserna den läser beräkna hur mycket energi huset gör av med. dvs resultatet när det behandlats i datorn är en elmätare.

      Nästa version av min Esp8266 kommer att nyttja en 219 INA219 I2C, vilket är en mer korrekt “elmätare” som klarar att mäta åt båda håll. 🙂

      // Ispep

      • Kul!
        Jag har kollat på lite alternativ för att göra billiga mätare, och har ett gäng INA219 och några av dens syskonprodukter hemma. Tyvärr blev det projektet liggande…
        TI har också en serie av kraftmätande msp430-baserade MCUer som även klarar trefas.

        Hur omvandlar du växelströmmen till likström?
        (Mina tänkta projekt baserade sig på likströmsmätning)
        Det är alltid lite knöligt och farligt med isolering när man jobbar med sånt här. Vad jag märkt är det vanligt att en MCU isoleras helt så slipper man böka med isolering av A/D.

Kommentera

E-postadressen publiceras inte.

*

© 2017

Tema av Anders NorenUpp ↑

%d bloggare gillar detta: