Läsa av elmätaren mha en PIC

Berätta om dina pågående projekt.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

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

Inlägg av blueint »

Dra en Cat.5 kabel ström på ett par, data i retur på ett annat?
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

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

Inlägg 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;
    }
  }
}
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

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

Inlägg 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.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

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

Inlägg 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.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

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

Inlägg 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:
Användarvisningsbild
AndLi
Inlägg: 18251
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

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

Inlägg 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 :)
Användarvisningsbild
MiaM
Inlägg: 12832
Blev medlem: 6 maj 2009, 22:19:19

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

Inlägg 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.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

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

Inlägg 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.
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

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

Inlägg av danielr112 »

jadler: du har inga bilder på dina xbee enheter?
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

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

Inlägg 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.
Användarvisningsbild
bose
Inlägg: 241
Blev medlem: 20 oktober 2005, 20:48:10
Ort: Blekinge

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

Inlägg 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 :)
Användarvisningsbild
AndLi
Inlägg: 18251
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

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

Inlägg 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
Skriv svar