Go Down

Topic: pulsenteller dmv interrupts (Read 5 times) previous topic - next topic

postbus24

Hoi allen,

Gebeten door het Arduino virus naar aanleiding van deze webpagina:
http://www.fun-tech.se/FunTechHouse/ElectricityMeter/index.php

Ben ik druk bezig om ongeveer hetzelfde te bouwen met mijn Arduino Uno rev3
een weerstand van 10K tussen GND en pin2
+5V via de opto coupel van de kWh meter verbonden met pin 2
Alleen registreert de Arduino soms meerdere pulsen van de kWh teller terwijl er in werkelijkheid maar ééntje geweest is.

Ik heb al geprobeerd om een delay in de interrupt functie te zetten maar dat is helaas niet de oplossing. Blijkbaar worden alle pulsen gebufferd en als er 5 pulsen tegelijk komen gebeurt die vertraging ook 5x na mekaar.

Bestaat hier een oplossing voor ?

Alvast bedankt,
Bart

astrofrostbyte

Ik heb al een tijdje iets soortgelijks,  ik lees echter het knipperledje uit. blijkbaar heb jij een echt schakelcontact.

Google sites webpage https://sites.google.com/site/yaeuls/
De energiemeter(kWh) via de knipperled die daar opzit (1pulse/Wh) uitlezen en via ethernet/internet versturen naar een 'internet of things' logging server Cosm.


Laat ff je code zien, kijken we even mee.
Gear: Arduino- Uno,Due,Ethernet,  OLS, Buspirate, J-Link, TDS1002, Rigol DG1022

postbus24

Ik heb de code niet zo direkt bij de hand maar ze is zowat één op één dezelfde als in de link hierboven, alleen dan voor één meter ipv 2.
Code: [Select]
void onPulse1()
{
    //pulseCounter
    pulseCount1_Wh++;
    if(pulseCount1_Wh == 1000)
    {
        pulseCount1_Wh = 0;
        pulseCount1_kWh++;
    }
}

maar dit stukje van uw link is zeer interessant:
Code: [Select]
/-------------------------------------------------------------------------------------
//- Interupt routine - count number of pulses, initialized in setup()
//-                                                                                   -
//-------------------------------------------------------------------------------------
void Int_LedPulse()
{ if ( digitalRead(LEDPIN) == LOW )            // to flush false triggers
  { LedPulse.EventMillis = millis();           // capture timer
    LedPulse.Event=true;                       // set flag to signal PulseSensor_manager()
    LedPulse.Watthour++;
    if (LedPulse.Cnt++ == 0)
      LedPulse.Overflow = true;
  }
}//Int_LedPulse


// to flush false triggers  XD

... eigelijk is dat hele programma wel interessant, bedankt hiervoor !
Ook het ethernet gedeelte, voorlopig zit ik met een laptop die op de kast ligt te prutsen, maar je moet ergens beginnen, toch ?

Ik hou jullie op de hoogte  ;)


robtillaart


Wat je moet doen is de tijd vd puls meten en onthouden en vergelijken met de vorige tijdstempel
Dit is zo ongeveer de simpelste vorm
Code: [Select]

volatile unsigned long prevTime = 0;

ISR()
{
  if (millis() - prevTime < 10) // minder dan 10 millisec geleden?
  {
    return;  // ignore irq
  }
  // langer dan 10 millis.. dat is een echte
  prevTime = millis();
  kwhCount++;
}

   

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

postbus24

Om een of andere reden kreeg ik tussendoor en snachts af en toe nog een 'puls' ingelezen terwijl dit onmogelijk kon. Na wat ge-experimenteer  lijkt deze code redelijk waterdicht te zijn als ik mijn pulsenteller vergelijk met de kWh meter zelf.
Mocht iemand hier nog wat aan hebben :
Code: [Select]
void onPulse1()
{

   if (millis() - prevTime < 10000) // minder dan 10 sec geleden?
  {
    return;  // dit kan niet goed zijn  ...
  }

  if ( digitalRead(PULSEPIN) == HIGH ) {           // kijken hoelang de pin hoog blijft ...
    delay(10);   //30 mili sec 
    if ( digitalRead(PULSEPIN) == HIGH ) {         // na 30 ms nog steeds hoog ?
       pulseCount1_10Wh++;                              // is een echte puls
        prevTime = millis();                                  // start 10 sec timer
        Serial.println("PULS");
    }
  }
  return;
}

Go Up