Pulser per uur teller weergeven op display
18 berichten
• Pagina 2 van 2 • 1, 2
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Pulser per uur teller weergeven op display
Probeer dit eens:
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.
- 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.
Advertisement
Re: Pulser per uur teller weergeven op display
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...
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...
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Pulser per uur teller weergeven op display
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.
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.
Re: Pulser per uur teller weergeven op display
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...
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...
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Pulser per uur teller weergeven op display
zoiets?
En als je het wat waard vind, moet je me maar pmén
- 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
Re: Pulser per uur teller weergeven op display
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!
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!
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Pulser per uur teller weergeven op display
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.
- 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.
Re: Pulser per uur teller weergeven op display
De machines gaan dagelijks uit, geen probleem dus!
Toch bedankt voor de "heads-up"!
Toch bedankt voor de "heads-up"!
18 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten