Arduino - Hjälp att räkna pulser under 36s intervaller

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Gamma
Inlägg: 4
Blev medlem: 14 oktober 2018, 21:37:34

Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av Gamma »

Hej,
Undrar om någon vill vara snäll och hjälpa mig med kod till en pulsräknare som skall räkna antalet pulser på ingång 9 (= High) i 36 sekunders intervaller. Antalet pulser skall sedan visas i Seriell monitor (och sedan på en display). Efter 36 s skall räknaren nollställas och automatiskt börja räkna pulser under ny period om och om igen.

Har kikat på exemplen med BlinkWithoutDelay och puch-button Debounce, båda med milis-funktionen för att undvika delay, men känner att jag är ljusår från att lyckas få detta att fungera.

Tacksam för hjälp
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av SeniorLemuren »

Överför gärna din kod så kanske man kan tala om vad som är fel.
jah
Inlägg: 659
Blev medlem: 16 januari 2009, 13:00:08
Ort: Eslöv

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av jah »

Hur långa är pulserna som ska räknas, och vad genereras de av?
Gamma
Inlägg: 4
Blev medlem: 14 oktober 2018, 21:37:34

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av Gamma »

Hej,
Pulserna genereras av en energimätare. Har försökt mäta pulslängden genom att filma i slow motion med min mobil. Genom att stega fram olika bildrutor kommer jag fram till att pulslängden är ca 20 ms. Tiden mellan pulserna varierar naturligtvis med förbrukningen.

Tack på förhand
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av arvidb »

Generellt så är väl interrupt rätt sätt att hantera detta. D.v.s. sätt upp ett flank-interrupt ("edge interrupt") på ingången där pulserna kommer in, och räkna upp en variabel i interruptrutinen.

Om du vill göra något var 36:e sekund så bör väl detta också gå att lösa med hjälp av en räknare ("Counter") + interrupt på denna. Eller om Arduino har något Timerbibliotek så är nog det enklare.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av Icecap »

Jag hade använd någon form av flank-interrupt ihop med en tidräknare med skaplig upplösning, då kunde jag få strömförbrukningen mellan varje puls.

Men nu är det väl Arduino det gäller och det borde finnas hårdvara för det trots allt.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av sodjan »

> Pulserna genereras av en energimätare.

Du kanske vet fabrikat och modell? Inte osannolikt
att data för pulsutgången finns dokumenterat.
Gamma
Inlägg: 4
Blev medlem: 14 oktober 2018, 21:37:34

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av Gamma »

Hej,
Jag har kollat mätaren och den verkar ha en pulslängd på 20 ms. Jag få fundera och läsa på hur jag skall komma vidare med era råd. Inte helt enkelt detta.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av Icecap »

Jo, det är rent faktisk ganska enkelt. Men har man aldrig programmerat förut kan det nog verka svårt.

Steg 1 är att avkänna när lampan blinkar. Det är en puls på 20ms vilket ska gå att detektera i main-loop om man inte vill/kan använda interrupt-on-change. Dock kräver den pollning att inget annat låser µC'n under för lång tid,t.ex. kommunikation. Man kan helt enkelt kolla om ingången är '1' nu medan förra avläsningen var '0', om det är så har det kommit en stigande kant.

Steg 2 är att kolla tiden. Arduino har något som kallas systime() (menar jag), den kan nog användas för detta - men gärna med lite klurighet då den går till noll var 42 dag.

Steg 3 är hur mätningen ska kommuniceras. Det ska ske snabbt och effektivt om man ska använda pollningen, detta kan göras antingen vid att ha en interrupt-styrd sändning av data så att data som ska sändas läggs i en buffer och en interrupt skickar efter som det blir möjligt - eller vid att sända en byte åt gången (på samma vis egentligen) när det finns möjlighet.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av svanted »

Hej,
Jag har kollat mätaren och den verkar ha en pulslängd på 20 ms. Jag få fundera och läsa på hur jag skall komma vidare med era råd. Inte helt enkelt detta.
det verkar lite konstigt?
20ms är 50Hz?
det är inte så att det blinket är p.g.a. nätfrekvensen?

elmätare brukar blinka typ 1 puls/kWh...
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av Klas-Kenny »

*pulslängd*, inte *period*.

Antagligen är det typ 1/10/100/1000 blink per kWh, men där varje blink har en pulslängd på 20ms.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av svanted »

att man inte kan läsa ordentligt :lol:
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av SeniorLemuren »

För att ta in en puls till Arduino använder du funktionen: attachInterrupt() Läs här.. Du kan välja att registrera pulsen på :
LOW to trigger the interrupt whenever the pin is low,

CHANGE to trigger the interrupt whenever the pin changes value

RISING to trigger when the pin goes from low to high,

FALLING for when the pin goes from high to low.
Använd t.ex RISING för att fånga pulsen när den startar om den går från 0 till +5 V.

Sedan gör du en rutin som räknar pulserna i 36 sekunder därefter nollställer och skriver till displayen.

Har har hafsat ihop hur den senare rutinen kan se ut i grova drag här.

Kod: Markera allt

#include <elapsedMillis.h>
elapsedMillis timer0;
 
void setup() {
  // put your setup code here, to run once: 
    timer0 = 0 ; 
}

void loop() {
  // put your main code here, to run repeatedly:
  checkPuls();
}

void checkPuls() {  
    if (timer0 > 36000) {      
      timer0 -= 36000 ; 
      // Nollställ pulsräkningen här och skriv ut resultat.
    }else{
    //addera pulserna från fattachInterrupt() funktionen här 
    }
}
Andra som är bra på programmering kan säkert komma med bättre förslag men detta är en början. :)
Gamma
Inlägg: 4
Blev medlem: 14 oktober 2018, 21:37:34

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av Gamma »

Hej,
Korrekt att pulsens längd är ca 20 ms och att mätaren avger 1000 pulser per kWh. Jag fångar LED-pulsen med en enkel ljussensor så jag får ut 0-3,3V

Stort tack för exemplet. Jag tror jag förstår upplägget. Nu har jag något att utgå ifrån.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino - Hjälp att räkna pulser under 36s intervaller

Inlägg av SeniorLemuren »

Ok. I stället för att addera pulserna i checkPuls() gör en egen rutin som bara adderar pulser och som du pekar på med ISR.

Ta alltså bort dessa rader i checkPuls():

Kod: Markera allt

}else{
    //addera pulserna från fattachInterrupt() funktionen här 
    }
Skriv svar