Lekt litt med Arduino – wattwatcher 0.1

Har lenge logget strømforbruk manuelt. Jeg byttet ut sikringsskap og strømmåler for en stund siden, den nye måleren har en pulsdiode, som pulserer 10.000 ganger pr kWh forbrukt strøm.  Dette kan man bruke til å logge hvor mye strøm man bruker.

Jeg har i det siste lekt litt med Sebastian Stenmarks «EKKO» (klikk for info) og dette vekket interessen for microkontrollere.

Det ene førte til det andre og så satt jeg med en stor pappeske fra Sparkfun. Deriblandt en rekke sensorer, arduino brett, og div utstyr som loddestasjon osv. Det begynte med en enkel krets som inkluderte en 10k resistor og en LDR. (light dependent resistor) Arduinoen ble programmert til å telle antall pulser, og sende verdiene serielt til pc`n samt vise de på en LCD skjerm.

Men så ville jeg at den skulle registrere dette rett i en database. Heldigvis finnes det et veldig stort utvalg av tilbehør til Arduino (også 3.part) deriblandt et Ethernet shield. Dette ble kjøpt inn. men så viste det seg at ethernet kortet tok opp 4 digitale pinner fra arduinoen, (10,11,12,13) Og disse var allerede i bruk til LCD displayet. Løsningen ble et «Serial Enabled LCD Display» (aka SerEnLCD) fra Sparkfun. Dette får data seriellt, og trenger da kun 1 digital pinne i tilegg til Vcc og Gnd. Problemet var at Seriell pinnene til Arduino (1 og 0) blir heftig brukt i det man uploader ny firmware til den. Dette leser LCD skjermen og viser da en del rubbish. Jeg lastet da ned SoftwareSerial library, og konfigurerte pin 2 og 3 til seriell data mot LCD.

Nå så «wattwatcher» slik ut:

Jeg begynte med å ta tiden mellom hver puls, og legge dette i et array. Men pga begrensende kunnskaper i C så fikk jeg problemer med den første verdien da den ikke hadde noe tidspunkt for forrige puls. Kunne sikkert kodet en grisete hack for å unngå dette, men men. Endte  med å telle antall pulser pr 10 sek i stedet. Da unngår jeg også et potensiellt problem, langsiktig ønsker jeg å gjøre dette med flere typer målere. Og det finnes de som kun har 100 pulser pr kWh. Hvis jeg da skal fylle et 20 tegns array med verdier kan dette ta lang tid om det går lite eller ingen strøm. Ved å telle antall pulser pr gitt tid i stedet ungår man dette, da får man også forutsigbarhet over hvor lang tid det tar å kjøre igjennom koden.

Så ved å telle pulser i 10 sek, summere opp og regne ut gjennomsnitt så har jeg en løsning som jeg er fornøyd med. Og som er portabel til andre målere.

Litt enkel matte, jeg telte 89 pulser i løpet av 10 sekunder:

A = pulser pr 10 sek:  89

B =pulser pr minutt:  (A*6) = 534

C=pulser pr time: (B * 60) = 32040

Siden vi vet at det er 10.000 pulser pr kWh, så vil disse 10sekundene representere et forbruk på 3,2kWh, dvs nåværende last er 3204 watt. Dette kan forenkles ved å ta pulser pr 10sek * 36. (89*36 = 3204) «pulsefaktoren» blir da 36.

Jeg har et par [link] andre målere [/link] som gir 3200 pulser pr kWh, der blir  «pulsfaktoren» 112.5.

Litt kode ble lagt til for å kalle GET mot en php fil som da hentet variabler fra URL og la det i databasen en gang i minuttet.

Arduino koden som kjørte på dette tidspunket var denne

#include
#include
#include
#define rxPin 2
#define txPin 3

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };
byte gw[] = {10,0,0,101};
byte server[] = { 88,87,42,5 }; // gmx.no
byte subnet[] = { 255, 255, 255, 0 };

SoftwareSerial lcdSerial = SoftwareSerial(rxPin, txPin);
int ledPin = 6;
int avgwatt = 5;
int switchPin = 7;
const int numReadings = 20;
unsigned long period_start;
unsigned long period_length = 59000;
unsigned long period_total;
unsigned long period_stop;
unsigned long run = 0;
int period_average;
int period_counter;
//TimedAction timedAction = TimedAction(500000,sendData); // run sendData() every 1 minute

void setup()
{
Serial.begin(9600);
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
lcdSerial.begin(9600);
}
void loop()
{
lcdcls();
period_total = 0;
period_counter = 0;
period_start = millis();
period_stop = period_start + period_length;
if (run > 0) {
lcdgoTo(0);
lcdSerial.print(avgwatt);
lcdSerial.print(» Current. «);
lcdgoTo(17);
lcdSerial.print(period_average);
lcdSerial.print(» Average. «);

}
else { // First run.. write no data.
lcdgoTo(0);
lcdSerial.print(«No data.»);
lcdgoTo(17);
lcdSerial.print(«No data.»);

}

while( millis()

4 replies
  1. Henrik
    Henrik says:

    Hej!

    Jag undrar hur din PHP-kod ser ut till detta projekt?

    Vore kanon om du kunde hjälpa mig med detta

    /Henrik

  2. Espen
    Espen says:

    @Henrik
    Hallo Henrik.

    Hvilken del av php koden er du interessert i?
    Dette består av en hel del forskjellige filer.
    En registreringsdel, som henter data verdiene fra GET når Arduino enheten laster siden.
    Samt en del php filer som genererer grafer og statestikker. -> http://gmx.no/strom/grafer.php

  3. Henrik
    Henrik says:

    Jag har aldrig använt PHP innan och jag har precis skaffat mig ett web hotell med en hemsida.

    Det jag vill göra är att läsa av min mätare (1000imp/kWh) och skriva ut average watts och eventuellt periodtid som jag sedan kan komma åt genom att länka på min hemsida till liknande adress http://193.15.95.2

    Om jag kan få till detta kanske jag kan lära mig databaser och PHP för att få till lika fina grafer som du har gjort

Legg igjen et svar

Want to join the discussion?
Feel free to contribute!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *