Sida 1 av 2

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

Postat: 14 oktober 2018, 22:05:36
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

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

Postat: 15 oktober 2018, 12:33:09
av SeniorLemuren
Överför gärna din kod så kanske man kan tala om vad som är fel.

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

Postat: 15 oktober 2018, 12:43:08
av jah
Hur långa är pulserna som ska räknas, och vad genereras de av?

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

Postat: 15 oktober 2018, 13:31:05
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

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

Postat: 15 oktober 2018, 18:53:27
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.

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

Postat: 15 oktober 2018, 20:31:16
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.

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

Postat: 15 oktober 2018, 20:34:01
av sodjan
> Pulserna genereras av en energimätare.

Du kanske vet fabrikat och modell? Inte osannolikt
att data för pulsutgången finns dokumenterat.

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

Postat: 17 oktober 2018, 00:49:18
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.

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

Postat: 17 oktober 2018, 07:34:49
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.

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

Postat: 17 oktober 2018, 09:07:37
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...

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

Postat: 17 oktober 2018, 09:12:46
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.

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

Postat: 17 oktober 2018, 09:21:26
av svanted
att man inte kan läsa ordentligt :lol:

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

Postat: 17 oktober 2018, 11:03:10
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. :)

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

Postat: 18 oktober 2018, 07:32:56
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.

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

Postat: 18 oktober 2018, 08:07:46
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 
    }