onsdag, desember 02, 2009

DIY strømmåler...

Hardware
For det første må man ha en strømmåler med impulslampe som blinker med ulik rytme, alt ettersom hvor mye strøm som brukes. Antall blink pr. kWh er oppgitt på strømmåleren. Hos meg tilsvarer 600 blink 1kWh.
Deretter trenger vi en enhet som kan avlese disse lys pulsene. Jeg valgte utstyr fra Phidgets Inc. (Canada) Phidgets Inc. - Unique and Easy to Use USB Interfaces.

Jeg valgte PhidgetInterfaceKit 8/8/8 som kobles til PC via USB. Denne har 8 analoge innganger, 8 digitale utganger samt 8 digital innganger. Her har man mange ekstra I/O å leke seg med etterhvert.

Phidgets Inc. - Unique and Easy to Use USB Interfaces

Strømmåleren min har en utgang som med fordel kunne brukes for å telle pulsene. Da kunne denne utgangene kobles til en av inngangene på interface kittet, men elektrisitetsverket nektet meg blankt å koble noe som helst til denne utgangen.

Så derfor valgte jeg heller en lys sensor som settes på strømmåleren for å telle pulsene.

Phidgets Inc. - Unique and Easy to Use USB Interfaces

Denne plasseres (u)elegant foran lys puls indikatoren på strømmåleren ved hjelp av teip.

Dette er ikke den fineste løsningen, men siden det er plassert inni sikringsskapet så er det ikke synlig til daglig.

Mitt server rom er plassert rett under sikringsskapet, så her var det bare å trekke signal kabelen rett ned til interface kittet.

For å visuelt vise at den leser av pulsene, koblet jeg en LED til en av utgangene. Denne styres av programvaren.

Software
Neste steg er nå å lage et program som kan telle pulsene og lagre disse i en database.
Jeg har laget et program i .NET og som leser den analoge inngangen. Phidgets har API'er for Windows, Mac, Linux og Windows Mobile/CE. Samt en rekke andre populære utviklings språk.

InterfaceKit API'et har en event handler som trigges hver gang verdien endres en bestemt mengde. Hvis inngangsverdien endrer seg +/- n, sendes en event. Verdien n kan justeres i programvaren fra 1 og oppover. Etter mye om og men fant jeg ut at denne ikke var helt å stole på. Den rett og slett hoppet over en del pulser. Selv om sensitiviteten på inngangen var satt til 1. Vet ikke om denne har et annet innebygget filter som forårsaker dette. Løsningen ble at jeg laget en egen thread som leser rå verdien kontinuerlig. Ved hjelp av en flanke kan jeg telle pulser på en reell måte.

using System;
using System.Threading;
using Phidgets;

namespace PowerMeter
{
public class PowerMeter : IDisposable
{
private readonly InterfaceKit _ifKit;
private int _lightSensorPort;
private int _ledOutPort;
private long _rawMinTickValue;
private long _tickTimeSpan;
private Thread _lsThread;
private bool _threadRun;
private bool _gThreadRuning;

private static long _kWhCounter;
private static long _tickkWhWrap;
private static long _tickCounter;
private static long _kWhUsage;



///
/// Get the last exception
///
public Exception LastException { get; private set; }



///
/// Hi value trigger for light sensor
/// Default: 3
///
public int LightSensorHiTrigger { get; set; }


///
/// Get current kWh usage
///
public double KWhUsage
{
get { return Interlocked.Read(ref _kWhUsage) / 10.0; }
set { Interlocked.Exchange(ref _kWhUsage, (long)(value * 10.0)); }
}



///
/// Get meter ticks
///
public long KWhTicker
{
get { return Interlocked.Read(ref _tickCounter); }
}



///
/// ticks/kWh (default 600 ticks/kWh)
///
public long KWhTickWrap
{
get { return _tickkWhWrap; }
set { _tickkWhWrap = value; }
}



///
/// Ticks Output port
///
public int LedOutPort
{
get { return _ledOutPort; }
set { _ledOutPort = value; }
}



///
/// Power metere class
///
/// Analog port for reading the light sensor. Default 0
public PowerMeter(int lightSensorPort)
{
InitValues();
_lightSensorPort = lightSensorPort;

// We use one USB local connected interface kit.
_ifKit = new InterfaceKit();
_ifKit.open();

// Create a hi priority thread
_lsThread = new Thread(RunThread) { Priority = ThreadPriority.Highest };
_lsThread.Start();
}



///
/// Initialize all values
///
private void InitValues()
{
_tickkWhWrap = 600;
_lightSensorPort = 0;
LightSensorHiTrigger = 3;

_ledOutPort = -1;
_threadRun = true;
_gThreadRuning = false;
_kWhCounter = 0;
_tickCounter = 0;
_rawMinTickValue = 0;
_tickTimeSpan = 0;
_kWhUsage = 0;

_lsThread = null;
}



///
/// Current kWh usage
///
public long KWhMeter
{
get { return Interlocked.Read(ref _kWhCounter); }
set { Interlocked.Exchange(ref _kWhCounter, value); }
}



///
/// Thread for reading the light sensor
///
private void RunThread()
{
bool hiValue = false;
DateTime startTime = DateTime.Now;
TimeSpan timeUsed;

_gThreadRuning = true;
_threadRun = true;
while (_threadRun)
{
Thread.Sleep(1);
try
{
int value = _ifKit.sensors[_lightSensorPort].RawValue;

//
if (value >= LightSensorHiTrigger)
{
if (hiValue == false)
{
// Calcule the time between ticks
timeUsed = DateTime.Now.Subtract(startTime);
startTime = DateTime.Now;
Interlocked.Exchange(ref _tickTimeSpan, (long)(timeUsed.TotalMilliseconds * 1000.0));

// Safety: When the door is open the triger may run fast. 200ms = 28.6 kWh max power usage
if (timeUsed.TotalMilliseconds > 200)
{
// Calculate kWh usage
if (timeUsed.TotalSeconds > 0.0 && _tickkWhWrap > 0)
{
double usage = ((60.0 / timeUsed.TotalSeconds) * 60.0) / _tickkWhWrap; // KWh
Interlocked.Exchange(ref _kWhUsage, (long)Math.Round(usage * 10.0));
}

// After _tickkWhWrap ticks, increment the kWh counter and resett ticker
Interlocked.Increment(ref _rawMinTickValue);
if (Interlocked.Increment(ref _tickCounter) >= _tickkWhWrap)
{
Interlocked.Exchange(ref _tickCounter, 0); // Zero ticks
Interlocked.Increment(ref _kWhCounter); // inrement kWh meter
}
}

hiValue = true;
if (_ledOutPort > 0) _ifKit.outputs[_ledOutPort] = true;
}
}
else if (hiValue)
{
hiValue = false;
if (_ledOutPort > 0) _ifKit.outputs[_ledOutPort] = false;

}
} catch (Exception er)
{
// catch error - and continue
LastException = er;
}
}
_gThreadRuning = false;
}



///
///
///
/// The current power usage
public override string ToString()
{
return "Current usage " + KWhUsage + " kWh.";
}


///
/// Stop the power meter and release resources.
///
public void Dispose()
{
// Stop the running thread
for (int i = 0; i <>
{
_threadRun = false;
Thread.Sleep(10);
if (_gThreadRuning == false) break;
}
_lsThread.Abort();

// close the connection to the kit
if (_ifKit != null) _ifKit.close();
}


}

}


Presentasjon
Når man nå har utstyr til å lese strømmen må man ha et sted der man kan lese verdiene. Hos oss skal vi ha en SyncMaster LD220Z MultiTouch skjerm som skal henge på veggen.

Denne skal også virke som en sentral oppslags tavle for husstanden med kobling til Google Calendar. Dette vil komme under værvarselet.

lørdag, august 08, 2009

Ny trapp i hagen

Her er skråningen ryddet for jord, steiner og ikke minst røtter. Alt er nå klart for muring av ny trapp

Her skal trappen ligge. Trappens høyde mellom bunn og topp er 190 cm. Avstanden mellom toppen og bunnen er 300 cm.

Så har vi trappeformelen:
2 x opptrinn + 1 x inntrinn = 63 cm

Opptrinn bør ligge mellom 15 og 18 cm for at trappen ikke skal virke for bratt.

Skal vi ha 11 trinn blir opptrinnet og inntrinnet slik:
Opptrinn: 190 cm : 11 ≈ 17,3 cm
Inntrinn: 63 cm – 34,6 cm = 28,4 cm

Skal vi ha 12 trinn:
Opptrinn: 190 cm : 12 ≈ 15,8 cm
Inntrinn: 63 cm – 31,6 cm = 31,4 cm

Men jeg er ikke sikker på om man skal bruke standard mål i en hagen. Vil det virke litt industriellt og unaturlig?
Så jeg går for en løsning med variable trinn som følger typografien.
Problemet vil da være toppen av trappen som er har en veldig høy stigning, men det tar vi når vi kommer så langt.

Denne nye trappen er den andre i selve hagen. Jeg har en som går fra forsiden av huset til terrassen.

Den jeg skal lage til nå går fra forsiden av huset til gressplenen. Mellom trappene skal det gå en sti som forbinder disse sammen.

Så blander vi sement

Jeg er ikke utdannet murer, så følgende oppskrift er kun basert på erfaringer.
Jeg har funnet ut at den beste blandingen ved muring av stein er 4 deler sand og 1 del standard sement. Som ved baking blander man første det tørre godt sammen, før man tilsetter vann. Ved muring av stein er det veldig viktig å ikke tilsette for mye vann, ellers vil man få en for bløt blanding som er vanskelig å bearbeide. Tilsett litt vann om gangen, sjekk sementen mellom hver gang. Når du hører sementen slipper i store klatter, er den ferdig. Renner den rundt i blanderen er den altfor bløt.
Sement er veldig etsende, noe som jeg selv har smertelig erfart. Som alt annet i verden, bruk gummi!
Har prøvd dyre syrefaste hansker, men disse var for klumpete å jobbe med. Så jeg bruker rett og slett gule oppvaskhansker. De er lette å jobbe med, og billige siden det gjerne går med noe par i arbeidet.

Så murer vi

Før man begynner på selve muringen er det viktig å trekke en snor der muren skal gå. Dette for at muren skal være rett og får at høyden på muren skal bli jevn. Jeg har arbeidet meg ned til grunnfjellet så underlaget er solid. Har du ikke ikke denne muligheten må du gå ned minst 30 cm. og støpe et fundament med jern i, ellers vil muren bare sprekke i løpet av kort tid grunnet telehiv.
Stein som jeg bruker skal være flate på minst en side. Disse finner jeg på tomten eller på min hemmelige stein åre som det sprenges mye på fortiden. Stein fra denne åren inneholder mye jern og er derfor veldig rustbrun. Veldig flott stein til hagen. Mange foretrekker at de skal være flate på tre sider og stabler de oppå hverandre. Det synes jeg er kjempe flott, men det er ikke lett å finne mange slike steiner. Derfor bruker jeg stein som er flate på en side og bruker flatesiden utover. Hvis de er tynne bruker jeg "skrap stein" som støtte på baksiden.
Før jeg begynner å mure fukter jeg alltid steinen. Dette for å vaske vekk jord og annet smusk, men også for at sementen skal feste seg bedre. Når jeg murer passer jeg alltid på å få glatte sementen rundt steinen, dette for å unngå at vann kan komme inn i sprekkene og ødelegge muren ved frost. Pass på å dytte sementen godt inn mellom steinene slik at det er god kontakt mellom steinene.

Her bruker jeg hendene for å glatte sementen rundt steinen på baksiden for å unngå at vann samler seg.

Så lar jeg det tørke til at sementen er overflate tørr. Jeg liker dype fuger mellom steinene for at steinen skal fremheves bedre og sementen tones ned.
Såkalt "ålesundsfuger" synes jeg ikke er så veldig da det fremhever sementen for mye.


"Ålesundsfuger"

Etter noen timer avhengig av temperatur er sementen overflate tørr.



Så tar jeg en helt vanlig oppvaskkost og fjerner overflate sementen. Er den for tørr bruker jeg en stålkost. Ved hjelp av litt rennende vann børster jeg godt inn i fugene. Har du godt med sement mellom steinene er det bare å børste i vei.

Børste vekk sement med kost til du får dype fuger.

Jeg jobber med et lag om gangen slik at sementen kan tørke før jeg begynner på neste lag. Dagens muring gjøres unna på et par timer. Neste dag begynner man på lag to av muren.


Første lag er ferdig og skal tørke til neste dag

For å lette arbeidet litt begynte jeg på muren på den andre siden og lagde første trappetrin. Da er det enklere å beregne høyden på side veggene samt at det blir letter å bygge oppover.


Første trappetrinn ferdig

Trappe mal.
Jeg bruker en mal for hvert trappetrinn, da vil trappens høyde og bredde bli like.


Så var 6 trappetrinn ferdig og jeg er kommet over halvveis.

Muren på venstre side er delvis ferdig på innersiden.

På den siste delen har jeg 125 cm. innover og høyden er på 60 cm.
Hvert trappetrinn som jeg har brukt er 15 cm. høye.
Det vil si at jeg har 60 cm. / 15 cm. = 4 trappetrinn igjen + topptrinnet.

Trappen er ferdig

Omsider er selve trappen ferdig. Har laget en mur som forbinder den gamle trappen til den nye trappen.


I området mellom var det en gammel skråning som ble flatet ut. Her var det mye røtter og stein som måtte fjernes. Fylte på ny jord, et lag med skikkelig tykk fiberduk (kjøpes på felleskjøpet) og så et lag med bark. Det med fiberduk er veldig viktig for at ikke ugress skal vokse fritt. Har hørt så mange si at de har fylt på med bark eller kaffeskall og klager over at ugress vokser frem uansett. Du må ha fiberduk for å forhindre ugress. Dessuten beskytter det røttene mot frost og bevarere fuktigheten i jorden. Men du vil alltid få ugress som vokser ut i kantene av fiberduken, men der lar du det vokse litt for så å kverke det med Roundup.
Jeg legger også fiberduk der jeg skal ha en gangstien av subus.