mirror of
				https://github.com/KevinMidboe/oled_workout_tracker.git
				synced 2025-10-29 17:50:28 +00:00 
			
		
		
		
	Example stolen from: https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/.
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Rotary Encoder Inputs
 | |
| #define CLK 2
 | |
| #define DT 3
 | |
| #define SW 4
 | |
| 
 | |
| int counter = 0;
 | |
| int currentStateCLK;
 | |
| int lastStateCLK;
 | |
| String currentDir ="";
 | |
| unsigned long lastButtonPress = 0;
 | |
| 
 | |
| void setup() {
 | |
|   
 | |
|   // Set encoder pins as inputs
 | |
|   pinMode(CLK,INPUT);
 | |
|   pinMode(DT,INPUT);
 | |
|   pinMode(SW, INPUT_PULLUP);
 | |
| 
 | |
|   // Setup Serial Monitor
 | |
|   Serial.begin(9600);
 | |
| 
 | |
|   // Read the initial state of CLK
 | |
|   lastStateCLK = digitalRead(CLK);
 | |
| }
 | |
| 
 | |
| void loop() {
 | |
|   
 | |
|   // Read the current state of CLK
 | |
|   currentStateCLK = digitalRead(CLK);
 | |
| 
 | |
|   // If last and current state of CLK are different, then pulse occurred
 | |
|   // React to only 1 state change to avoid double count
 | |
|   if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){
 | |
| 
 | |
|     // If the DT state is different than the CLK state then
 | |
|     // the encoder is rotating CCW so decrement
 | |
|     if (digitalRead(DT) != currentStateCLK) {
 | |
|       counter --;
 | |
|       currentDir ="CCW";
 | |
|     } else {
 | |
|       // Encoder is rotating CW so increment
 | |
|       counter ++;
 | |
|       currentDir ="CW";
 | |
|     }
 | |
| 
 | |
|     Serial.print("Direction: ");
 | |
|     Serial.print(currentDir);
 | |
|     Serial.print(" | Counter: ");
 | |
|     Serial.println(counter);
 | |
|   }
 | |
| 
 | |
|   // Remember last CLK state
 | |
|   lastStateCLK = currentStateCLK;
 | |
| 
 | |
|   // Read the button state
 | |
|   int btnState = digitalRead(SW);
 | |
| 
 | |
|   //If we detect LOW signal, button is pressed
 | |
|   if (btnState == LOW) {
 | |
|     //if 50ms have passed since last LOW pulse, it means that the
 | |
|     //button has been pressed, released and pressed again
 | |
|     if (millis() - lastButtonPress > 50) {
 | |
|       Serial.println("Button pressed!");
 | |
|     }
 | |
| 
 | |
|     // Remember last button press event
 | |
|     lastButtonPress = millis();
 | |
|   }
 | |
| 
 | |
|   // Put in a slight delay to help debounce the reading
 | |
|   delay(1);
 | |
| }
 |