Pulser per uur teller weergeven op display

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 10
Geregistreerd: 07 Feb 2014, 23:20
Woonplaats: Langeraar

Pulser per uur teller weergeven op display

Berichtdoor Thieu-s » 08 Feb 2014, 00:10

Hallo,

Ik ben nieuw hier en ook nieuw met Arduino.
Ik vind dit een uiterst interessant apparaat en ga me hier zéker in verdiepen en de taal leren!
Naar wat ik heb gelezen over de mogelijkheden weet ik zeker dat ik dit apparaat in heel veel van mijn machines ga integreren.
Het eerste wat ik ermee wil gaan doen is Pulsen per uur tellen en dit weergeven op een display.
Ik ga er vanuit dat dit mogelijk is maar wil dit even bevestigd hebben voor ik er 70 aanschaf... (de "snelheidsmeter" moet op zo'n 70 machines komen...)
Wat hij precies moet doen:

Hij moet Pulsen gaan tellen, na een aantal pulsen de berekening maken hoeveel dit er in een uur zouden zijn en dit weergeven op een display.
De pulsen komen van een initiator die een 24vdc puls van ongeveer 2 tiende sec geeft (dit kan natuurlijk een potentiaal vrij worden dmv een relais ertussen). Het aantal pulsen is erg laag: minimaal 500 en maximaal 6000 per UUR. (minimaal elke 7 sec 1 puls tot maximaal een halve sec per puls ongeveer)
Voorbeeld 1: Als er 5 seconden tussen de pulsen zit moet hij op het display "720" weergeven.
Voorbeeld 2: Als er 0,7 seconden tussen de pulsen zit moet hij op het display "5142" weergeven.
De "refresh rate" zal nooit sneller zijn dan de pulsen die binnen komen maar zolang de display de "oude" berekening blijft weergeven tot hij ververst wordt (dus maximaal zo'n 7 seconden) is dit geen probleem...

Is dit mogelijk met de Arduino Uno (of een andere versie)?

Ik heb er al één besteld met een 16x2 LCD...
Ik kan dit ook doen met een Siemens LOGO! met TD display mocht het niet lukken met de Arduino, maar dit is een erg duur alternatief, gezien de aantallen die ik wil gaan gebruiken...

Alvast dank!

(Leuk! Ik heb zin om met dit apparaat te gaan werken!)

Advertisement

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

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 08 Feb 2014, 08:57

Ik heb ooit al zoiets gebouwd : http://www.verelec.nl/?page_id=68. Voor de galvanische scheiding zou je een opto koppelaar kunnen gebruiken. Overigens bij mijn project bleken bij metingen dat de pulsen niet echt mooi waren (slingerende encoder schijf). Vandaar de Schmitt trigger om een mooie blokgolf van te maken.
Ik zou er trouwens eerst een bouwen en dan 70 aanschaffen. Maar dat ben ik :)
De uno is groot zat trouwens.

Er over nadenkend :)
Kijk je zal toch iets van een shield oid moeten (laten) ontwikkelen om een paar knappe verbindingen te maken (schroef terminals of fatsoenlijke stekkers). Een alternatief zou ook kunnen zijn:
- als je het geheel binnen de 8K code kan houden dan zou je een ATTiny kunnen overwegen (84 of 85).
- dan zou je een PCB kunnen (laten) maken die op de achterkant van het LCD (aangestuurd via I2C) gezet kan worden.
- je blijft dan de code in eerste instantie gewoon schrijven op de Arduino. en zet deze later over op het PCB via een ISP programmer.
- Als je geen 5V hebt, kun je ook nog een buck circuitje kopen/op de PCB toevoegen, om van die 24V (dat is vermoedelijk wel beschikbaar) een mooie zuinige voeding maken
Zo krijg je een compacte module.

Code vreters in dit soort oplossingen zijn vaak de teksten die op het LCD moeten komen. De tekst wordt namelijk altijd in het flash geheugen gezet en bij aanzetten gekopieerd naar het RAM geheugen(dit laatste is trouwens te vermijden).
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 » 10 Feb 2014, 20:18

Dank je Nico voor het meedenken! Maar ik zal het even kort toelichten. Ik wil het zo simpel mogelijk houden.
Het is eigenlijk heel simpel, het gaat hier om een Bloemenverwerkingslijn. Hier zit een "transportband" op met vakken, deze vakken moeten geteld worden. Dit gaat dmv een hardwarematige schakelaar. Ik heb dus gewoon een maak (of verbreek) contact die die elk vak 1 keer schakelt. Ik ga hier de Arduino Uno voor gebruiken, zonder optocoupler vanwege de "eigen" schakelaar, om deze zelfde reden ook geen Schmitt trigger nodig. Ik maak de schakelkasten voor deze bloemenlijnen, deze zijn door alle frequentieregelaars e.d. groot zat, erg compact hoeft het geheel dus niet te worden.
Ik heb in de kasten al een stabiele 5v voeding.
Is het mogelijk om simpelweg de schakelaar rechtstreeks op de Uno aan te sluiten, wat te programmeren en de output op de display weer te geven?

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

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 10 Feb 2014, 23:11

Nou het ging mij niet om het compacte maar meer dat je nu een productie lijn gaat installeren met gammele draadjes..... 't is wat je wilt.
Je kan een schakelaar gewoon aansluiten tussen de GND en Data Pin en dan pinMode(input_pin, INPUT_PULLUP) gebruiken.
Output op display ook geen probleem. Maar alles met gammele draadjes in een machine die aan alle kanten rammelt........
Verder moet je rekening houden dat mechanische schakelaars snel zullen slijten en trillings effecten gaan vertonen.
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 » 11 Feb 2014, 20:17

Op die manier, geen zorgen daar over, ik maak wel een knap din-rail terminaltje waar alles op komt... Komt goed. Wilde alleen weten of dit mogelijk is met de Uno.
Die "trillings effecten" zijn er wel uit te programmeren lijkt mij? "Binnen 2 tiende sec meerdere pulsen als 1 zien"... zoiets...
Bedankt voor de tip met INPUT_PULLUP, ben al even met de Arduino aan het stoeien, heb dat (en wat lcd output) al werkend!
Heb je (of mede forummers) nog meer tips voor dit projectje, want ik tast nog een beetje in het duister met deze programma taal... (voel weer een beetje dezelfde "onwetendheid-frustratie" als toen ik begon met html... maar ik wil en ik ga het leren!)

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

Re: Pulser per uur teller weergeven op display

Berichtdoor Thieu-s » 11 Feb 2014, 23:37

De trillings effecten zijn er ook al uit! Een stukje debounce vertraging van 50 milliseconden erin gestopt.

Ik heb nu simpelweg een "ontstoorde" schakelaar dmv een INPUT_PULLUP die "Aan" of "Uit" op het LCD weergeeft.
Nu zoek ik nog een manier om deze input pulsen te laten berekenen naar "Aantal per uur"......?

Ook heb ik een 2e Arduino geprogrammeerd om dmv een potmeter op verschillende snelheden de pulsen te simuleren die de Bloemenlijn zou geven... Om te testen dus!

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

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 12 Feb 2014, 10:27

Je maakt het jezelf wat lastiger als je zelf probeert de pulse mooi te maken. Dat betekent dat je ook programmatisch alles moet oplossen (via millis()) om de tijdsduur te bepalen.
Je zou dan nadat je een puls hebt gedetecteerd:
- het tijdstip opvragen (functie millis())
- bij de volgende puls wederom millis()
- het verschil tussen beide is het aantal milliseconden
- dan kan je omrekenen naar aantal per uur
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 » 12 Feb 2014, 23:07

Oké, dan laat ik de "deBounce" even voor wat het is, hier denk ik later wel over na.
Eerst de basis maar eens werkend krijgen.
Hieronder een uitgeklede versie van wat ik nu heb, het geeft nog niet het gewenste resultaat...
Er gaat nog ergens iets fout met het verwerken van de input (if digitalRead) maar ik zie het even niet...?


Code: Alles selecteren
#include <LiquidCrystal.h>

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

unsigned long time_new;
unsigned long time_old;

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

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

void loop()
{
  lcd.setCursor(10,1);
    if (digitalRead(inputPin)) {
    time_new = millis();
    bpu = (time_new - time_old) * 3600 / 1000;
    time_old = time_new;
  }
 
  lcd.print (bpu);
}


Ik heb een flikkerend getalletje als output zonder dat ik de input schakel. (ook als ik 'm wél schakel...)

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

Re: Pulser per uur teller weergeven op display

Berichtdoor nicoverduin » 12 Feb 2014, 23:26

Logisch :) je meet constant in de loop. Je moet in deze constructie als je een hoog krijgt, wachten tot hij klaar is en weer naar LOW gaat. Dan de tijd meten enz. Nu ben je constant aan het meten en vergelijken.....Daarnaast gaat je rekenwerk niet goed :)
bpu is gedefinieerd als int en heeft een bereik van -32768 to 32767. Ik zou bpu een unsigned long maken.
En de formule veranderen in : bpu = ((time_new - time_old) * 3600) / 1000;

Zelf zou ik eerder een betere hardware oplossing hebben gekozen:
- schmitt trigger een mooie puls laten maken
- interrupt laten triggeren
- gelijk een nieuw bordje laten maken met LCD erop en de rest + een 328P processor + paar componenten en een klemrails erop

Zeker als je er 70 moet maken.
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 » 12 Feb 2014, 23:50

Oké! Bedankt!
Een en ander aangepast. Maar kom er even niet uit hoe ik de tijd moet meten tussen "begin HIGH tot de volgende begin van HIGH"?

Code: Alles selecteren
#include <LiquidCrystal.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()
{
  lcd.setCursor(10,1);
    bpu = digitalRead(inputPin);
    if (bpu = HIGH); {                     // En dan???
    time_new = millis();
    bpu = ((time_new - time_old) * 3600) / 1000;
    time_old = time_new;
  }
 
  lcd.print (bpu);
}

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten