mirror of
				https://github.com/KevinMidboe/oled_workout_tracker.git
				synced 2025-10-29 17:50:28 +00:00 
			
		
		
		
	Working example of rotary encoder.
Example stolen from: https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/.
This commit is contained in:
		
							
								
								
									
										72
									
								
								rotaryEncoder/rotaryEncoder.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								rotaryEncoder/rotaryEncoder.ino
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | |||||||
|  | // 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); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user