Arduino - Hjälp att räkna pulser under 36s intervaller
Arduino - Hjälp att räkna pulser under 36s intervaller
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
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: 8071
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Arduino - Hjälp att räkna pulser under 36s intervaller
Ö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
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
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
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
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.
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
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.
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
> Pulserna genereras av en energimätare.
Du kanske vet fabrikat och modell? Inte osannolikt
att data för pulsutgången finns dokumenterat.
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
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.
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
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.
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
det verkar lite konstigt?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.
20ms är 50Hz?
det är inte så att det blinket är p.g.a. nätfrekvensen?
elmätare brukar blinka typ 1 puls/kWh...
- Klas-Kenny
- Inlägg: 11541
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Arduino - Hjälp att räkna pulser under 36s intervaller
*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.
Antagligen är det typ 1/10/100/1000 blink per kWh, men där varje blink har en pulslängd på 20ms.
- SeniorLemuren
- Inlägg: 8071
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Arduino - Hjälp att räkna pulser under 36s intervaller
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å :
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.
Andra som är bra på programmering kan säkert komma med bättre förslag men detta är en början.
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.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.
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
}
}
Re: Arduino - Hjälp att räkna pulser under 36s intervaller
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.
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: 8071
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
Re: Arduino - Hjälp att räkna pulser under 36s intervaller
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():
Ta alltså bort dessa rader i checkPuls():
Kod: Markera allt
}else{
//addera pulserna från fattachInterrupt() funktionen här
}