Sida 7 av 7

Re: Läsa av elmätaren mha en PIC

Postat: 11 oktober 2009, 16:04:30
av blueint
Dra en Cat.5 kabel ström på ett par, data i retur på ett annat?

Re: Läsa av elmätaren mha en PIC

Postat: 11 oktober 2009, 20:34:27
av jadler
AndLi: Jo, pinchange interrupt känns som en självklar lösning, men just nu vill jag först och främst få det att fungera som jag vill på en Arduino. När det gör det blir det kanske ett fristående program på en dedikerad AVR. 9V-batteri var mest för att se om det gick att föra över data med Xbee från insidan av ett plåtskåp, jag vet att det är en av de sämre batterityperna. :-)

blueint: Jag har dragit en Cat5e till elskåpet, tillfällig dragning via fönster, men för ögonblicket behåller jag min Arduino inomhus så att det blir lite lättare att programmera om den.

Borre: Självklart! Här är en tidigare version, just nu försöker jag få till temperaturavläsning med en KTY81-120, rapportering av korrekt tid direkt från Arduinon med en DS1307 och förbereda visning på en LCD, med följden att inget fungerar och jag vet inte säkert varför. Delar av denna grundläggande kod är uppsnyggad sedan jag skrev den, får återkomma när det fungerar som jag vill igen.

interval-funktionen är för att se till att det inte blir ett felaktigt värde var 50:e dygn (eller vad det nu blir, antalet ms som ryms i en unsigned long).

Kod: Markera allt

#define xbee Serial
#define pinVarh 8
#define pinWh 9

byte ioPin[2] = {pinWh, pinVarh};
byte statePin[2];
unsigned long lastHigh[2];

boolean pulseStart(byte varSelect) {
  if(digitalRead(ioPin[varSelect]) == HIGH) {
    if(statePin[varSelect] == 0) {
      statePin[varSelect] == 1;
      return(true);
    } else {
      return(false);
    }
  } else {
    statePin[varSelect] == 0;
    return(false);
  }
}

unsigned long interval(unsigned long lastTime, unsigned long tickNow) {
  return( (lastTime <= tickNow) ? (tickNow - lastTime) : ((lastTime - 2 ^ 16) - (tickNow + 2 ^ 16)) );
}

unsigned long usedEnergy(unsigned long useInterval) {
  const unsigned long timeConst = 3600000UL;

  return(timeConst / useInterval);
}

void setup() {
  byte seenHigh[2] = {0, 0};

  for(byte i=0; i<2; i++) {
    pinMode(ioPin[i], INPUT);
  }
  xbee.begin(9600);

  while(seenHigh[0] == 0 || seenHigh[1] == 0) {
    for(byte i=0; i<2; i++) {
      if(pulseStart(i)) {
        seenHigh[i] = 1;
        lastHigh[i] = millis();
      }
    }
  }

  xbee.println("channel,interval,energy");
}

void loop() {
  unsigned long thisInterval, tickNow;
  for(int i=0; i<2; i++) {
    if(pulseStart(i)) {
      tickNow = millis();
      xbee.print(i);
      xbee.print(",");
      thisInterval = interval(lastHigh[i], tickNow);
      xbee.print(thisInterval);
      xbee.print(",");
      xbee.println(usedEnergy(thisInterval));
      lastHigh[i] = tickNow;
    }
  }
}

Re: Läsa av elmätaren mha en PIC

Postat: 12 oktober 2009, 09:31:50
av jadler
Senare igår kväll kom jag fram till att det nog inte är mjukvaran som gör att jag får tokiga värden, utan hårdvaran. Jag använder en mycket enkel mjukvarulösning för att känna av pulser, och det verkar som att jag får orena signaler som registreras som två eller flera pulser.

Kanske är det inte helt optimalt att köra logiska signaler via breadbord och fem meter Cat5 till µC, så jag får nog göra som blueint föreslog och spänningsmata hela enheten inne i elskåpet istället. Med Xbee går signalerna fram som de skall i vilket fall som helst. På sikt blir det lite vettigare signalanalys och signalbehandling i µC också, inte bara loopa och kolla efter hög eller låg nivå.

Förresten, jag har bara sett knasiga värden från temperatursensorn, en KTY81-120 som också sitter ute i skåpet. Den är kopplad från 5V till tråd till ADC och via 10k till jord. Skall det över huvudtaget gå att göra mätningen över en lång kabel, kring fem meter? Den ledare jag använder är inte tvinnad kring någon annan signal- eller spänningsbärande ledare.

Re: Läsa av elmätaren mha en PIC

Postat: 12 oktober 2009, 10:58:26
av blueint
Logiksignalerna bör klara sig iaf om dom håller sig under switchtid på ~1 ms. Lite extra pulser osv.. kanske man får ta i utvecklingsfasen.

Re: Läsa av elmätaren mha en PIC

Postat: 12 oktober 2009, 22:13:24
av v-g
Vafasen det ska ju synas att det bor en elektroniknörd i kåken med diverse signalkablar och sensorer överallt :mrgreen:

Själv har jag en tunn tvåtrådsledare ut till stolpen och den stör mig inte nämnvärt nu när den hänger i luften. Min är säkert 40 meter lång sammanlagt (kabeln alltså). Inne går den mestadels nere i källaren som är min helgedom ;)

Konstigt nog får jag inte in så mycket felvärden via denna kabel heller men jag har sett till att inte dra den bredvid andra ledningar, det sitter även en 20 st DS1820 på samma ledning (ej samma ledare dock) och inga större problem :humm:

Re: Läsa av elmätaren mha en PIC

Postat: 12 oktober 2009, 22:49:54
av AndLi
Jag blev så inspirerad så jag var tvungen att laga min ellogger :)
Det var en TechTrade från början, men den var instabil och väldigt känslig för vinkel.

Så jag tog samma fotodiod och en LM258 istället, matade den +/-7 V från serieporten och fick till något som verkade mycket stabilt och enkelt att ställa tröskelvärdet. Men efter 341 pulser tvärdog den :( (Det visade sig vara tejpen som släppt och givaren glidit lite, så nu trillar pulserna in var 6 sekund igen.. (1/1000 kWh)

För att snabbtetsa den med ökad förbrukning tänkte jag dra igång elpatroenen i Acktanken. Då ser jag att den står på 40 grader och arbetsbrytaren är på... Ooops, det var ju inte riktigt meningen.. Så lite pengar har jag sparat idag :)

Re: Läsa av elmätaren mha en PIC

Postat: 13 oktober 2009, 02:38:17
av MiaM
Om signalkabeln är partvinnad och/eller skärmad och framförallt om den INTE är jordad mer än som mest i ena änden så borde inducerade störningar från elledningar o.s.v. inte innebära nåt större problem.

Re: Läsa av elmätaren mha en AVR

Postat: 14 oktober 2009, 20:35:58
av jadler
Det verkar fungera bra nu, den grundläggande avläsningen. När jag insåg att jag enkelt kan hämta utetemperatur från den trådlösa termometerns givare struntade jag i min KTY81 för ögonblicket, och jag har också skippat avläsning av varh-LED:en så länge. Nu står en Arduino-klon (Modern Device RBBB) i fönstret, Cat5E-kabel till elskåpet med själva avläsardelen.

Mjukvarumässigt har jag slängt ihop en ringbuffer också för att lättare kunna se trender. Det blir annars ganska spretigt med varje enskilt mätvärde. Utdata som skickas till datorn är formatterat för att enkelt kunna importeras som CSV till OpenOffice där jag kan få diagram över förbrukningen. För att hjälpa mig att få snygga diagram har jag kopplat en RTC till min µC, och tiden skickas tillsammans med mätvärden.

Borre efterfrågade källkod tidigare, jag vet inte om andra är intresserade, men här är den:

Kod: Markera allt

#include <Wire.h>
#define xbee Serial
#define xbeeBps 57600
#define pinWh 5
#define saRtc 0x68  // Slave Address of DS1307 I2C RTC

int ioPin = pinWh;
unsigned long lastPulse;
const unsigned long msPerHour = 3600000UL;
const unsigned long pulseTimeout = 25000000UL;
const unsigned long pulseMinLength = 12000UL;  // in milliseconds; pulses are about 14 ms (13 - 14,6)

#define buffSize 32
unsigned int buffData[buffSize];
byte buffPtr;

char rtcString[] = "42-42-42 42:96:96,";

void rtcRead(void) {
  char ds1307Raw[7];
  char ds1307Mask[7] = {0x7f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff};
  byte rtcXlat[6][2] = {{0, 6}, {3, 5}, {6, 4}, {9, 2}, {12, 1}, {15, 0}};
  
  Wire.beginTransmission(saRtc);
  Wire.send(0x00);
  Wire.endTransmission();
  Wire.requestFrom(saRtc, 7);
  for(byte i=0; i<7; i++) { ds1307Raw[i] = Wire.receive() & ds1307Mask[i]; }
  for(byte i=0; i<6; i++) {
    rtcString[rtcXlat[i][0]]     = '0' + ((ds1307Raw[rtcXlat[i][1]] & 0xf0) >> 4);
    rtcString[rtcXlat[i][0] + 1] = '0' +  (ds1307Raw[rtcXlat[i][1]] & 0x0f);
  }
}

unsigned int avgInterval(void) {
  unsigned long buffSum = 0;
  
  for(byte i=0; i<buffSize; i++) { buffSum += buffData[i]; }
  return((unsigned int)(buffSum / (unsigned long)buffSize));
}

void reportData(void) {
  unsigned long foo;
  
  rtcRead();
  foo = avgInterval();
  xbee.print(rtcString);
  xbee.print(buffData[buffPtr]);                        xbee.print(",");
  xbee.print(msPerHour / buffData[buffPtr]);            xbee.print(",");
  xbee.print((foo * (unsigned long)buffSize) / 1000UL); xbee.print(",");
  xbee.print(msPerHour / foo);                          xbee.println();
}

boolean getData(void) {
  unsigned long tickNow;

  if((pulseIn(ioPin, HIGH, pulseTimeout) > pulseMinLength)) {
    tickNow = millis();
    buffPtr = ++buffPtr % buffSize;
    buffData[buffPtr] = (lastPulse <= tickNow) ? (tickNow - lastPulse) : ((lastPulse - 2 ^ 16) - (tickNow + 2 ^ 16));
    lastPulse = tickNow;
    return(true);
  } else return(false);
}

void setup() {
  Wire.begin();
  pinMode(ioPin, INPUT);
  xbee.begin(xbeeBps);
  for(byte i=0; i<buffSize; i++) { while(!getData()); }
  xbee.println("date time,Wh-interval,Wh,averaged seconds,average Wh");
}

void loop() {
  while(!getData());
  reportData();
}
v-g: Apropå nördhus, ta en titt på SM0BKZ:s sommarstuga... (Titta på "The Antenna Story"!! Stig är tydligen nu känd som SM7BKZ. Jag beundrar honom och vore stolt om mitt hus kunde vara så imponerande. Lite mer amatörradiobakgrund på http://web.comhem.se/sk0tm/sm0bkz.html) Villan i Rosersberg, där familjen bodde när jag hade kontakt med dem, fick dåvarande sovjetiska ambassaden att verka klart amatörmässig.

Re: Läsa av elmätaren mha en PIC

Postat: 14 oktober 2009, 21:06:17
av danielr112
jadler: du har inga bilder på dina xbee enheter?

Re: Läsa av elmätaren mha en PIC

Postat: 14 oktober 2009, 22:01:11
av jadler
danielr112: Ärligt talat har jag inte det just nu, men de ser ut som alla andra Xbee-moduler. Jag har några Xbee ZB moduler och ett iDigi™ X4 Starter Kit ZB. Det du ser på bilderna där är det jag har. De lösa modulerna sitter mestadels på Sparkfuns XBee Explorer Regulated för att fixa rätt matningsspänning och signalnivåer, och för att konvertera 2.0 mm delning till 2.54 mm delning.

I princip skulle jag kanske kunna skippa Arduino/AVR/µC på sensorsidan och koppla sensorn direkt till en digital I/O-pinne på Xbee, men jag har valt att ha lite "intelligens" närmare sensorn.

Re: Läsa av elmätaren mha en PIC

Postat: 15 oktober 2009, 19:23:19
av bose
Har som andra med blivit lite inspirerad att bygga min egen logger, eller till att börja med, effekt-visare 8)

Jag har bara precis börjat och byggt upp på labbplatta med en atmega168 och en 4x20 display och testat att skriva ut lite tecken.

Eftersom jag inte hade någon phototransistor hemma började jag fundera i banorna kring att använda en LED till att känna av ljuspulsen med.. Tänkte först göra någon enkel OP-koppling, men med brist på OP och oscilloscope fick jag ta till en attiny45 istället. Lysdioden kopplade jag med katoden på ADC ingången och anoden till jord, detta nollar ut de läckströmmar som finns på ADC pinnen och värdet blir 0. Snubblade över denna koppling på nätet någonstans men hittar inte länken nu.
Var nyss ute och testade detta och det verkar fungera fin fint :)

Re: Läsa av elmätaren mha en PIC

Postat: 15 oktober 2009, 23:21:02
av AndLi
Nu har jag räknat 68817 pulser, verkar ju funka rätt så bra det här :)
nästan 69kWh altså, på 72h..medelförbrukning på nästan 1kWh per timme