0

My question is related to my previous question. These encoder programs outputs two line per pule/tick.

Here is the part of the code I want to use:

void loop()
{
    // Read the status of the inputs
    debouncerA.update();
    debouncerB.update();

    int8_t EncVariation = 0;

    if (debouncerA.rose())
    { // if input A changed from low to high, it was CW if B is high too
        EncVariation = (debouncerB.read()) ? 1 : -1;
    }
    else if (debouncerA.fell())
    { // if input A changed from high to low, it was CW if B is low too
        EncVariation = (debouncerB.read()) ? -1 : 1;
    }
    else if (debouncerB.rose())
    { // if input B changed from low to high, it was CCW if A is high too
        EncVariation = (debouncerA.read()) ? -1 : 1;
    }
    else if (debouncerB.fell())
    { // if input B changed from high to low, it was CCW if B is low too
        EncVariation = (debouncerA.read()) ? 1 : -1;
    }
//
  if (EncVariation != 0) {

        encoder0Pos = encoder0Pos + EncVariation;

        int degs = (encoder0Pos * 6) % 360 ;

        if(degs<0){ degs = 360 + degs; }

        Serial.println (degs);
   }
}

For three inputs/ticks this outputs like:

6

12

18

24

30

36

But I only need the second ones like:

12

24

36

How can I do that? (I need it to send the relevant data do a PC.)

I spend so long time on it couldnt find any solution.

  • This line looks like its a mistake if(degrees<0){ deg = 360 + degs; } is it correct? You do the calculation of degrees and then start using degs. – Code Gorilla Jan 26 '17 at 13:51
  • was a mistype now i corrected – HelpMee Jan 26 '17 at 13:53
1

IF and only IF you want exactly what you have asked for which is alternate lines not to be output then this is a very crude and quick solution.

Outside of loop() add this declaration:

bool skipNextLine = true;  // true skips the odd lines, false skips even lines

And change the end of your code like this:

  if (EncVariation != 0) {
    encoder0Pos = encoder0Pos + EncVariation;
    int degrees = (encoder0Pos * 6) % 360 ;
    if(degrees<0){ deg = 360 + degs; }
    if (!skipNextLine)
    {  // This will skip alternate lines
        Serial.println (deg);
        skipNextLine = true;
    }
    else
    {
        skipNextLine = false;
    }
  }
  • Just tried it didnt work. It doesnt output anything – HelpMee Jan 26 '17 at 13:57
  • Can it be there maybe another Serial.println (deg); needed before the last if? – HelpMee Jan 26 '17 at 14:06
  • should skipNextLine be false at some place? – HelpMee Jan 26 '17 at 14:34
  • Blush Whoops. Thanks Mark for editing it. – Code Gorilla Jan 26 '17 at 14:53
0

Use a static variable to count loop execution and only prohibit the very first of every 3 counts.

  • I tried to use a variable and odd number selection but couldnt achive. – HelpMee Jan 26 '17 at 14:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.