variabelen vergelijken

Hardware geleverd door Arduino
Berichten: 16
Geregistreerd: 14 Feb 2024, 09:55

variabelen vergelijken

Berichtdoor BartM » 16 Mrt 2024, 08:23

Goede dag, ik ben een sturing aan maken voor een vouwbank, om platen te plooien. er is een rotary encoder die de hoek meet en een hand encoder waarmee ik de buighoek wil ingeven. die encoders werken, kan een waarde ingeven en de andere begint te tellen als ik de vouwbank bedien.
Echter ik krijg het niet klaar om de beweging van de machine te stoppen zodra de waarden van de encoders gelijk zijn ?
kan iemand me hier mee op de juiste weg helpen aub, Bart


// pulseteller hand en encoder voor vouwbank 15/3/24
#include <LiquidCrystal_I2C.h>
// Initialize the LCD library with I2C address and LCD size
LiquidCrystal_I2C lcd (0x27, 20,4);

// Rotary Encoder Inputs
#define inputCLK 10
#define inputDT 11

int sethoek = 0;
int currentStateCLK;
int previousStateCLK;

#define led_pin 13


int PinA = 2;
int PinB = 3;
int Counter = 1;
int PinALastState = LOW;
int pinAState = LOW;
int prevRotaryVal;

void setup() {
pinMode(led_pin,OUTPUT);
pinMode (inputCLK,INPUT); // handencoder
pinMode (inputDT,INPUT);
// Read the initial state of inputCLK
// Assign to previousStateCLK variable
previousStateCLK = digitalRead(inputCLK);

pinMode (PinA, INPUT_PULLUP); // pulse teller
pinMode (PinB, INPUT_PULLUP);
lcd. init ();
// Turn on the backlight on LCD.
lcd.backlight();

lcd.print ("Bart Machiels 1");
lcd. setCursor (0, 1);
lcd.print ("ROTARY ENCODER");

delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pulseteller");

lcd.setCursor(1, 1);
lcd.print("pulsen:");

lcd.setCursor(1, 2);
lcd.print("Buighoek:");
lcd.setCursor(11, 2);


}

int rotaryVal()
{
pinAState = digitalRead(PinA);
if (pinAState != PinALastState)
{
if (digitalRead(PinB) != pinAState) {
Counter++;
} else {
Counter--;
}

}
PinALastState = pinAState;

return Counter >> 1;



}

void loop()
{
// Read the current state of inputCLK
currentStateCLK = digitalRead(inputCLK);

// If the previous and the current state of the inputCLK are different then a pulse has occured
if (currentStateCLK != previousStateCLK){

// If the inputDT state is different than the inputCLK state then
// the encoder is rotating counterclockwise
if (digitalRead(inputDT) != currentStateCLK) {
sethoek --;

} else {
// Encoder is rotating clockwise
sethoek ++;


}
lcd.setCursor(11, 2);
lcd.print(" "); // pos leeg maken voor displ var
lcd.setCursor(11, 2);
lcd.print(sethoek);



}
// Update previousStateCLK with the current state
previousStateCLK = currentStateCLK;
if (prevRotaryVal != rotaryVal())
{
prevRotaryVal = rotaryVal();
// Serial.println(rotaryVal() * 2); // pulsen x ?? is afstandmaat;
lcd.setCursor(9, 1);
lcd.print(" "); // pos leeg maken voor displ var
lcd.setCursor(9, 1);
lcd.print(rotaryVal());

if (sethoek == rotaryVal) { // als deze 2 var idem zijn uitgang hoog maken
// Serial.println("waarde gelijk");
digitalWrite(led_pin,HIGH); // turn the LED on
delay(100); // wait a second
digitalWrite(led_pin,LOW); // turn the LED off

}
}
}

Advertisement

Berichten: 83
Geregistreerd: 02 Nov 2022, 13:03

Re: variabelen vergelijken

Berichtdoor ThHe » 16 Mrt 2024, 14:07

delay(100); // wait a second
Moet zijn een delay van 1000 dat is 1sec
delay(1000); // wait a second

Berichten: 83
Geregistreerd: 02 Nov 2022, 13:03

Re: variabelen vergelijken

Berichtdoor ThHe » 16 Mrt 2024, 16:00

if (sethoek == rotaryVal) is fout
moet worden:
if (sethoek == rotaryVal())

Berichten: 16
Geregistreerd: 14 Feb 2024, 09:55

Re: variabelen vergelijken

Berichtdoor BartM » 16 Mrt 2024, 16:14

Bedankt, nu werkt het !!

Berichten: 16
Geregistreerd: 14 Feb 2024, 09:55

Re: variabelen vergelijken

Berichtdoor BartM » 24 Mrt 2024, 13:12

goede dag, heb nu volgend probleem: heb dus 2 motoren (x en Y- as) waarvan ik de spindel afstand moet meten, deze motoren hebben laag en hoog snelheid.
bij laag snelheid werkt het perfect bij beide x en Y as, maar als ik x of Y in hoog snelheid beweeg, dan is de uitlezing van die as ok, maar de uitlezing van de andere as begint ook random te tellen ?? dan komt er precies een storing waardoor de niet bediende as ook begint te tellen, al staat die stil.
de bediende as meet wel de juiste afstand. hoe kan die niet bediende encoder toch tellen ? moet ik ergens een condersator plaatsen ?
Bart

Berichten: 83
Geregistreerd: 02 Nov 2022, 13:03

Re: variabelen vergelijken

Berichtdoor ThHe » 25 Mrt 2024, 21:36

Een paar opmerkingen over je programma die misschien ook je probleem oplossen.
Ik kijk zuiver naar het programma en weet absoluut niets van de hardware.
Opmerkingen:

1.
Code: Alles selecteren
if (prevRotaryVal != rotaryVal()) {
      prevRotaryVal = rotaryVal();

Het statement is om een eventuele wijziging vast te leggen.
Maar verder op gebruikt je rotaryVal() ipv prevRotaryVal.
Het is volgens mij beter om door te gaan met prevRotaryVal
omdat rotaryVal() nog een side effect heeft namelijk Counter ophogen of verlagen.

2.
Code: Alles selecteren
if (sethoek == rotaryVal()) { // als deze 2 var idem zijn uitgang hoog maken
      // Serial.println("waarde gelijk");
      digitalWrite(led_pin,HIGH); // turn the LED on
      delay(100); // wait a second
      digitalWrite(led_pin,LOW); // turn the LED off
   }

Dit statement staat binnen "if (prevRotaryVal != rotaryVal())".
Dus alleen als de toestaan veranderd treedt het in werking.
Het is dan jammer dat het hele proces door de delay wordt opgehouden.
Zet "if (sethoek == prevRotaryVal)" buiten de "if (prevRotaryVal != rotaryVal())" tak.
Dan start je de timer op zodat de LED 1 sec blijft branden en geen delay.
Omdat de test buiten het if statement is geplaatst zal zolang de hoek niet veranderd ook de LET blijven branden.

In onderstaande code heb de wijzigen aangebracht en bekijk zelf in hoeverre de wijzigen je aanspreken.

Code: Alles selecteren
int prevRotaryVal;
unsigned long timer = 0;   // *** timer variabele opnemen ***

void setup() {
................

void loop() {
................

  // Update previousStateCLK with the current state
  previousStateCLK = currentStateCLK;
  if (prevRotaryVal != rotaryVal()) {
    prevRotaryVal = rotaryVal();
    // Serial.println(rotaryVal() * 2); // pulsen x ?? is afstandmaat;
    lcd.setCursor(9, 1);
    lcd.print(" "); // pos leeg maken voor displ var
    lcd.setCursor(9, 1);
    lcd.print(prevRotaryVal);  // *** prevRotaryVal ipv rotaryVal()
  }
 
  // *** buiten het if (prevRotaryVal != rotaryVal()) geplaatst.
  if (sethoek == prevRotaryVal)  // *** prevRotaryVal ipv rotaryVal()
  { // als deze 2 var idem zijn uitgang hoog maken *** Timer wordt aangezet
    // Serial.println("waarde gelijk");
    timer = millis() + 1000;  // Led moet 1 sec aan blijven
  }

  // Indien de timer nog niet is verstreken zal de LET aan blijven.
  if (timer > millis()) {
    digitalWrite(led_pin, HIGH);
  } else {
    digitalWrite(led_pin, LOW);
  }
}


Succes met je project.
Groetjes Theo.

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten