Buggfix Plus
Aktuellt datum och tid: 14.20 2018-11-17

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 17 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
InläggPostat: 21.05 2018-10-14 

Blev medlem: 20.37 2018-10-14
Inlägg: 4
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


Upp
 Profil  
 
InläggPostat: 11.33 2018-10-15 

Blev medlem: 11.20 2009-05-26
Inlägg: 5331
Ort: Kristinehamn
Överför gärna din kod så kanske man kan tala om vad som är fel.


Upp
 Profil  
 
InläggPostat: 11.43 2018-10-15 

Blev medlem: 13.00 2009-01-16
Inlägg: 562
Ort: Eslöv
Hur långa är pulserna som ska räknas, och vad genereras de av?


Upp
 Profil  
 
InläggPostat: 12.31 2018-10-15 

Blev medlem: 20.37 2018-10-14
Inlägg: 4
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


Upp
 Profil  
 
InläggPostat: 17.53 2018-10-15 
Användarvisningsbild

Blev medlem: 11.56 2004-05-08
Inlägg: 2855
Ort: Stockholm
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.


Upp
 Profil  
 
InläggPostat: 19.31 2018-10-15 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23215
Ort: Kristinehamn
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.


Upp
 Profil  
 
InläggPostat: 19.34 2018-10-15 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 36914
Ort: Söderköping
> Pulserna genereras av en energimätare.

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


Upp
 Profil  
 
InläggPostat: 23.49 2018-10-16 

Blev medlem: 20.37 2018-10-14
Inlägg: 4
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.


Upp
 Profil  
 
InläggPostat: 06.34 2018-10-17 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23215
Ort: Kristinehamn
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.


Upp
 Profil  
 
InläggPostat: 08.07 2018-10-17 

Blev medlem: 20.20 2010-08-30
Inlägg: 2982
Ort: Umeå
Citera:
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...


Upp
 Profil  
 
InläggPostat: 08.12 2018-10-17 
Användarvisningsbild

Blev medlem: 18.06 2010-05-17
Inlägg: 8573
Ort: Växjö/Alvesta
*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.


Upp
 Profil  
 
InläggPostat: 08.21 2018-10-17 

Blev medlem: 20.20 2010-08-30
Inlägg: 2982
Ort: Umeå
att man inte kan läsa ordentligt :lol:


Upp
 Profil  
 
InläggPostat: 10.03 2018-10-17 

Blev medlem: 11.20 2009-05-26
Inlägg: 5331
Ort: Kristinehamn
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å :

Citera:
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
#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. :)


Upp
 Profil  
 
InläggPostat: 06.32 2018-10-18 

Blev medlem: 20.37 2018-10-14
Inlägg: 4
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.


Upp
 Profil  
 
InläggPostat: 07.07 2018-10-18 

Blev medlem: 11.20 2009-05-26
Inlägg: 5331
Ort: Kristinehamn
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
}else{
    //addera pulserna från fattachInterrupt() funktionen här
    }


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 17 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 3 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010