I am reading a value from an encoder "volume knob" and I have a function called void fn_on were I am having sum int to zero and counting until it reaches the set value of volume. I tried posting to serial but my sum counter does not work. I want my relay to run "volume" number of times until sum > volume in my function "fn_on" I believe I am not storing or updating my volume correctly. Thank you for taking the time to look through this.

#include <LiquidCrystal_I2C.h>
#include <Rotary.h>
#include <LCD_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

/* Rotary Encoder - Polling Example

The circuit:
  encoder pin A to Arduino pin 2
  encoder pin B to Arduino pin 3
  encoder ground pin to ground (GND)
#define PINA 2 
#define PINB 3 
#define RelayPin 8 

const char PUSHB = 5;
bool pressed = false;
long volume = 0; // this may not set the volumue

Rotary r = Rotary(2, 3);

void setup()
    Serial.begin(115200); // setup Pin modes
    pinMode(PUSHB, INPUT);
    lcd.setCursor(0, 3);
    digitalWrite(PINA, HIGH); // enable pull-ups
    digitalWrite(PINB, HIGH);
    // digitalWrite (PUSHB, HIGH); 
    pinMode(RelayPin, OUTPUT); // Relay Pin ini

void loop()
    bool currentState = digitalRead(PUSHB);

    if (currentState == pressed)

        while (digitalRead(PUSHB) == pressed)
            // do nothing 

    unsigned char result = r.process();

    if (result)
        // Serial.println(result == DIR_CW ? "Right" : "Left"); 
        if (result == DIR_CCW)
            volume = volume - 1000; // change ++ to mulpes of 1000
            lcd.setCursor(0, 3);
            lcd.print("                                ");

            int sum = 0;
            for (sum = 1; sum < volume; sum++ && currentState = true)
                lcd.setCursor(0, 2);
                digitalWrite(RelayPin, LOW); // run test
                digitalWrite(RelayPin, HIGH); // run test
                digitalWrite(RelayPin, LOW); // run test
            volume = volume + 1000; // change volume++ to mulpes of 1000
            // initialize display_menu to 1st line
            lcd.setCursor(0, 3);
            lcd.print("                                 ");
  • 2
    Where are you calling fn_on() in your code? And do you know you have two variables called “sum”: one as a const int in your global scope and one as an int within the fn_on() function?
    – StarCat
    Commented Jul 13, 2021 at 18:08
  • your code is quite messy ... please fix the indentation so that the code is easier to read and easier to understand
    – jsotola
    Commented Jul 13, 2021 at 18:31
  • I changed some of the logic Okay I am trying to read a value from a rotary encoder, the value that I am reading is "volume (cycles)". I want to dial the encoder to a number and set it with a push button and run a relay N number of cycles. I am using a "for loop" to run my relay once the push button is pressed and when volume is greater than one
    – voltaty
    Commented Jul 13, 2021 at 19:35
  • 2
    Does the LCD display the correct volume? What do you get if you serial print the volume? The whole relay thing isn't relevant until that part works correctly
    – chrisl
    Commented Jul 13, 2021 at 19:48

1 Answer 1


I believe the issue is that you're setting your encoder pins high with digitalWrite(). Those pins need to be configured as inputs for the interrupts to work correctly. This will be handled by the encoder library when you call r.begin(true). In fact, true in that call tells the library to enable the pullups for you.

Removing those lines should fix your issue.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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