Pulser per uur teller weergeven op display

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 13 Feb 2014, 00:13

Probeer dit eens:
Code: Alles selecteren
#include <LiquidCrystal.h>
#include "Arduino.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

unsigned long time_new;
unsigned long time_old;
unsigned long bpu;            // bos per uur
int inputPin = 2;             // potentiaal vrij puls-relais tussen GND en pin2

void setup() {
   pinMode(2, INPUT_PULLUP);
   lcd.begin(16, 2);
   lcd.setCursor(1, 1);
   lcd.print("Bos/uur:");
}

void loop() {
   //
   // wacht tot we een high krijgen
   //
   while(digitalRead(inputPin) == LOW) {};
   //
   // we hebben de stijgende flank te pakken
   //
   time_new = millis();
   //
   // nu wachten tot de puls afgelopen is
   //
   while(digitalRead(inputPin) == HIGH) {};
   //
   // bpu uitrekenen
   //
   bpu = ((time_new - time_old) * 3600) / 1000;
   //
   // en bewaar de oude tijd
   //
   time_old = time_new;
   //
   // en laat de nieuwe waarde zien
   //
   lcd.setCursor(10, 1);
   lcd.print(bpu);
}


Wat hij doet is eerst wachten tot de puls HOOG wordt. En start de teller. Vervolgens wacht hij tot de puls afgelopen is. Daarna gaat het resultaat berekenen en displayen. Daarna begint het feest opnieuw.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Berichten: 10
Geregistreerd: 07 Feb 2014, 23:20
Woonplaats: Langeraar

Re: Pulser per uur teller weergeven op display

Berichtdoor Thieu-s » 14 Feb 2014, 00:31

Ja! Hij werkt (na wat kleine aanpassingen) heel mooi! Waarvoor dank!!!
Had ook een andere werkend gekregen die was gebaseerd op een snelheidsmeter maar die zat mij té ingewikkeld in elkaar...
Deze werk heel mooi maarrr...

Bij een interval van 1 seconde geeft hij mooi 3600 aan...
Bij een interval van 2 seconden zou hij dus 1800 aan moeten geven... (want dit is langzamer)
Bij een interval van 0,5 seconden zou hij dus 7200 aan moeten geven... (want dit is sneller)

Maar het gaat precies andersom...
Als de pulsen korter op elkaar komen gaat het "aantal per uur" omlaag...
Het "aantal per uur" moet uiteraard omhoog als de pulsen korter op elkaar komen...

Er gaat dus waarschijnlijk iets fout met "bpu = ((time_new - time_old) * 3600) / 1000;"

Kom er weer niet uit... :oops:

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 15 Feb 2014, 09:45

Je meet de tijd tussen 2 pulsen in milli seconden
Dus het aantal pulsen per seconde is 1000 / (tijd tussen 2 pulsen in milliseconden)
Een uur heeft 3600 seconden = 3600000 milliseconden.
Dus aantal pulsen per uur = 3600000 / (tijd tussen pulsen in mSeconden)

bpu = 3600000L / (time_new - time_old);

Die L is om de compiler te vertellen dat het een LONG is.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 07 Feb 2014, 23:20
Woonplaats: Langeraar

Re: Pulser per uur teller weergeven op display

Berichtdoor Thieu-s » 15 Feb 2014, 21:37

Nico, mijn dank is zéééér groot! Je hebt me een flinke stap in de goede richting geduwd met dit eerste project!
Ondanks dat de Arduino me door meerdere mensen is afgeraden voor deze toepassing denk ik toch dat dit het gaat worden voor mijn klant.
Deze is opzoek naar een snelle, goedkope (waarschijnlijk tijdelijke) toepassing. Een knappe industriële oplossing die ook betaalbaar is kan ik op korte termijn niet vinden. Heb het geprobeerd met een Siemens LOGO! maar deze heeft niet de capaciteit om deze berekening te maken en kom ik dus al gauw bij duurdere échte PLC's...
Ik wil je graag een vergoeding geven als ik nog één beroep op je mag doen: Het programma zit nu mooi en eenvoudig in elkaar (zodat het voor mij, als beginner, ook nog redelijk begrijpelijk is) maar als je er nog een optie in kan verwerken zodat hij een gemiddelde over een aantal pulsen berekend dan zou het helemaal mooi zijn! Dit om dat de tijd tussen de pulsen vrijwel zeker niet exact gelijk zult blijven. Dus om te teller niet na elke puls omhoog en omlaag te laten schieten zou hij een gemiddelde van bv 5 pulsen moeten berekenen waardoor de output een stuk stabieler is...

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 17 Feb 2014, 17:01

zoiets?

Code: Alles selecteren
#include <LiquidCrystal.h>
#include "Arduino.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define SAMPLE_COUNT   10

unsigned long time_new;
unsigned long time_old;
unsigned long bpu;                  // bos per uur
unsigned long bpuGemiddeld;         // gemiddeld aantal bossen per uur
int inputPin = 2;                   // potentiaal vrij puls-relais tussen GND en pin2
unsigned long samples[SAMPLE_COUNT];// array voor het berekenen van gemiddelden
unsigned long sampleTotaal;         // dit is het totaal van alle samples
unsigned int sampleCnt;            // wordt gebruikt zolang we nog geen 10 samples hebben
unsigned int sampleIndex;         // verwijst naar de entry in de gemiddelden   die bijgewerkt gaat worden

void setup() {
   pinMode(2, INPUT_PULLUP);
   lcd.begin(16, 2);
   lcd.setCursor(1, 1);
   lcd.print("Bos/uur:");
   //
   // wissen sample tabel en sample totaal
   //
   sampleTotaal = 0L;
   for (unsigned int i = 0; i < SAMPLE_COUNT; i++){
      samples[i] = 0l;
   }
   sampleCnt = 0;
}

void loop() {
   //
   // wacht tot we een high krijgen
   //
   while(digitalRead(inputPin) == LOW) {};
   //
   // we hebben de stijgende flank te pakken
   //
   time_new = millis();
   //
   // nu wachten tot de puls afgelopen is
   //
   while(digitalRead(inputPin) == HIGH) {};
   //
   // bpu uitrekenen
   //
   bpu = 3600000L / (time_new - time_old);   
   //
   // en bewaar de oude tijd
   //
   time_old = time_new;
   //
   // nu gaan we de samples totaal bijwerken. De laatste SAMPLE_COUNT waarden worden bewaard
   // in de samples tabel. Elke keer als er een nieuwe waarde is, wordt deze in de tabel
   // gezet. Echter vooraf wordt eerst het totaal bijgewerkt door de oude waarde in de tabel
   // eraf te halen en de nieuwe erbij op te tellen. Op deze manier voorkom je dat je elke keer
   // bij een nieuwe bpu moet gaan totaliseren.
   //
   sampleTotaal = sampleTotaal - samples[sampleIndex] + bpu;
   samples[sampleIndex] = bpu;
   //
   // update het aantal samples totdat we SAMPLE_COUNT hebben bereikt
   //
   sampleCnt++;
   if (sampleCnt > SAMPLE_COUNT) {
      sampleCnt = SAMPLE_COUNT;
   }
   //
   // verhoog de index voor de volgende keer. Zijn we bij het max dan beginnen we gewoon
   // weer opnieuw.
   //
   sampleIndex++;
   if (sampleIndex == SAMPLE_COUNT) {
      sampleIndex = 0;
   }
   //
   // nu het gemiddelde uitrekenen
   //
   bpuGemiddeld = sampleTotaal / sampleCnt;
   //
   // en laat de nieuwe waarde zien
   //
   lcd.setCursor(10, 1);
   lcd.print(bpuGemiddeld);
}


En als je het wat waard vind, moet je me maar pmén
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 07 Feb 2014, 23:20
Woonplaats: Langeraar

Re: Pulser per uur teller weergeven op display

Berichtdoor Thieu-s » 17 Feb 2014, 21:11

Nico, je bent mijn held!
Heb wat kleine aanpassingen gedaan:
Een delay van 50 om een bounce van het relais op te vangen en een lcd clear om te voorkomen dat "duizendtallen" blijven staan als de klok onder de duizend komt.
Verder helemaal perfect!
Ik pm je wel even!

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 18 Feb 2014, 10:06

Let wel even op het volgende:
- Het programma maakt gebruik van millis(). Deze functie geeft de waarde terug van een teller die loopt van 0 - 4294967295 milliseconden. Daarna gaat hij weer door 0.
- Dat punt bereik je na ongeveer 49 dagen.
- Als je net in zo'n overgang zit dan kloppen de begin en eindtijd niet meer (eventjes).
- Daarna gaat het weer goed.
Gezien de aard van het programma was ik uitgegaan van de situatie dat die machines wel eens uitgezet worden dus geen noodzaak om hier een voorziening voor te treffen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 07 Feb 2014, 23:20
Woonplaats: Langeraar

Re: Pulser per uur teller weergeven op display

Berichtdoor Thieu-s » 18 Feb 2014, 23:26

De machines gaan dagelijks uit, geen probleem dus!
Toch bedankt voor de "heads-up"!

Vorige

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten