pulsteller met LCD

Arduino specifieke Software
Berichten: 12
Geregistreerd: 22 Dec 2015, 12:51

pulsteller met LCD

Berichtdoor pedro » 19 Nov 2020, 19:16

Ik wil graag een pulsteller realiseren om de beitelpositie van m'n draaibankje te kunnen monitoren . Ik vond bijgevoegde scetch. Werkt prima, echter in mijn geval zijn de pulsen van ongedefinieerde lengte. Zowel ''hoog'' als ''laag' kunnen oneindig lang duren. De teller mag bij ''hoog'' de tellerstand 1 keer met 1 verhogen, maar pas als de ingang weer laag geweest is. Weet iemand wat ik moet toevoegen om dit te bereiken?

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int a =0;
int e = 7;

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Ali Al Karkuki");
pinMode(e,INPUT);
}

void loop() {
int button = digitalRead(e);


lcd.setCursor(3, 1);
lcd.print(a);


if (button == HIGH) {
a ++;
lcd.setCursor(3, 1);
lcd.print(a);
delay(200);
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: pulsteller met LCD

Berichtdoor Koepel » 20 Nov 2020, 11:39

Als je iets hebt gevonden, kun je er dan een link naar geven ?
Eerlijk gezegd, de sketch slaat nergens op. Ik kan me niet voorstellen dat het werkt :?

Kun je vertellen wat voor signalen het zijn ?
Is het van een rotary encoder ? is het signaal van microswitches die kunnen denderen ? Is het een langzaam signaal, om hoeveel pulsen per seconde gaat het ? enzovoorts.

Er is een library voor een rotary encoder: https://www.pjrc.com/teensy/td_libs_Encoder.html.
Wat jouw sketch mist, is het detecteren van het moment dat het signaal verandert, ongeacht hoe lang het HIGH of LOW is. Daar is de State Change Detection voor: https://www.arduino.cc/en/Tutorial/BuiltInExamples/StateChangeDetection. Dat voorbeeld heeft echter een rare delay(50) om het denderen van knoppen tegen te gaan.

Berichten: 4068
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: pulsteller met LCD

Berichtdoor shooter » 20 Nov 2020, 18:32

je hebt nog een schakeling nodig want je kunt nu niet zien of het schakelt en al helemaal niet welke richting dus kijk naar koepel of zoek naar hoe een encoder werkt
paul deelen
shooter@home.nl

Berichten: 12
Geregistreerd: 22 Dec 2015, 12:51

Re: pulsteller met LCD

Berichtdoor pedro » 21 Nov 2020, 23:11

Iedereen bedankt voor de reactie. Ik heb het inmiddels werkend. Idd werk ik met een schijf met gaatjes en een lichtsluisje. Dit systeem werkt alleen 1 kant uit, maar bij het nauwkeurig draaien van kleine inwendige gaten scheelt het veel lastig meetwerk.

Berichten: 12
Geregistreerd: 22 Dec 2015, 12:51

Re: pulsteller met LCD

Berichtdoor pedro » 22 Nov 2020, 11:37

Hier is de listing van de sketch zoals die nu geworden is. Functioneert nu voor mijn toepassing prima.


#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int a =14950; // 25mm diameter, noteren als 25000. Dit ivm notatie in hele getallen. stapgrootte ingeven als 25 (= 0,025 mm)diameter vergroting of verkleining
int b = 0; //Als Button =high op het moment van laden, wordt direct de eerste stap verrekend. Dus opstarten bij ledje blink(op 13)uit.
//Bij de eerstvolgende HOOG wordt dan een stap verwerkt.
//Bij ongelukkige beginstand (led aan) schakelaar op doosje omzetten. (inverteert het signaal)
//Bij inwendige diameter regel 38 van - naar + omzetten.
//werkt alleeen nauwkeurig als beitelpunt exact centerhoogte is.
const int BUTTON = 7; // puls komt binnen op pin 7

//int button = digitalRead(BUTTON);
int val=0;
int old_val = 0;
int state = 0; // gecopieerd van p58 van startersgids
const int LED =13;

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Draaibankteller");
pinMode (LED,OUTPUT);
pinMode(BUTTON,INPUT);
lcd.setCursor(6, 1);//(eerste getal is kar pos vanaf 0, 2e getal is het regelnr vanaf 0)
lcd.print(a);
Serial.begin(9600);
}
void loop() {
val=digitalRead(BUTTON);
if (val==1){
digitalWrite(LED, HIGH);
}
else {digitalWrite (LED, LOW);}

if((val == HIGH)&&(b==0)) {
a = a + 25;
lcd.setCursor(6, 1);
lcd.print(a);
delay (10);
b= b+1;
}
if((val==LOW)&&(old_val==HIGH)){ // zie p 111
b=b-1;
delay(10);} //tbv contactdender
old_val=val;
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: pulsteller met LCD

Berichtdoor Koepel » 22 Nov 2020, 12:29

Dat ziet er gelukkig een stuk beter uit :D

De delay(10) maakt dat je niet sneller kunt detecteren dan ongeveer 50 pulsen per seconde. Als dat de bedoeling is, dan is dat prima.

Er zit nog wel iets raars in:
Code: Alles selecteren
val = digitalRead(BUTTON);
if (val == 1)


Zoals je kunt lezen, geeft de digitalRead() een HIGH of LOW terug: https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/.
Je vergelijkt het vervolgens met 1.
Er staat echter nergens dat het is toegestaan om het met één te vergelijken. Ik weet ook wel dat bijna iedereen dat doet, maar ik doe dat niet.

Dus 'val' is HIGH of LOW and je wilt een led zetten.
Code: Alles selecteren
  val = digitalRead(BUTTON);   // read HIGH or LOW
  digitalWrite(LED, val);   // set led according to 'val'


Je variabele 'b' mag je een betere naam geven. Ik vraag me zelfs af of je die variabele nodig hebt.

Sommige variabelen gebruik je alleen in de loop(), die zou je lokaal in de loop() kunnen declareren in plaats van globaal. Pas op dat je niet twee variabelen van dezelfde naam aanmaakt. Daar geeft de compiler geen waarschuwing op.

Je zou dichter bij het State Change Detection voorbeeld kunnen blijven: https://www.arduino.cc/en/Tutorial/BuiltInExamples/StateChangeDetection.
Het maakt voor de sketch verder niet uit, maar misschien ziet dit er logischer uit:
Code: Alles selecteren
  if( val != old_val)
  {
    if( val == HIGH)
    {
      // De 'val' ging zojuist van LOW naar HIGH
      ...
    }
    else
    {
      // De 'val' ging zojuist van HIGH naar LOW
      ...
    }
    old_val = val;       // bewaar de waarde om de volgende keer te kunnen vergelijken
  }


Je variabele 'a' mag je ook een betere naam geven. Bijvoorbeeld "deStapGrootteInMicroMeters", maar dan korter. Misschien kan een 'int' het getal niet bevatten.
Zie hier: https://www.arduino.cc/reference/en/language/variables/data-types/int/.
Voor een stapgrootte van bijvoorbeeld stappenmotors wordt meestal 'long' of 'unsigned long' gebruikt.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten