Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "TrinketHidCombo.h"
- #define PIN_ENCODER_A 0
- #define PIN_ENCODER_B 2
- #define PIN_BUTTON 1
- #define TRINKET_PINx PINB
- static uint8_t enc_prev_pos = 0;
- static uint8_t enc_flags = 0;
- void setup()
- {
- // set pins as input with internal pull-up resistors enabled
- pinMode(PIN_ENCODER_A, INPUT);
- pinMode(PIN_ENCODER_B, INPUT);
- pinMode(PIN_BUTTON, INPUT);
- digitalWrite(PIN_ENCODER_A, HIGH);
- digitalWrite(PIN_ENCODER_B, HIGH);
- TrinketHidCombo.begin(); // start the USB device engine and enumerate
- // get an initial reading on the encoder pins
- if (digitalRead(PIN_ENCODER_A) == LOW) {
- enc_prev_pos |= (1 << 0);
- }
- if (digitalRead(PIN_ENCODER_B) == LOW) {
- enc_prev_pos |= (1 << 1);
- }
- }
- void loop()
- {
- int8_t enc_action = 0; // 1 or -1 if moved, sign is direction
- // note: for better performance, the code will now use
- // direct port access techniques
- // http://www.arduino.cc/en/Reference/PortManipulation
- uint8_t enc_cur_pos = 0;
- // read in the encoder state first
- if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_A)) {
- enc_cur_pos |= (1 << 0);
- }
- if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_B)) {
- enc_cur_pos |= (1 << 1);
- }
- // if any rotation at all
- if (enc_cur_pos != enc_prev_pos)
- {
- if (enc_prev_pos == 0x00)
- {
- // this is the first edge
- if (enc_cur_pos == 0x01) {
- enc_flags |= (1 << 0);
- }
- else if (enc_cur_pos == 0x02) {
- enc_flags |= (1 << 1);
- }
- }
- if (enc_cur_pos == 0x03)
- {
- // this is when the encoder is in the middle of a "step"
- enc_flags |= (1 << 4);
- }
- else if (enc_cur_pos == 0x00)
- {
- // this is the final edge
- if (enc_prev_pos == 0x02) {
- enc_flags |= (1 << 2);
- }
- else if (enc_prev_pos == 0x01) {
- enc_flags |= (1 << 3);
- }
- // check the first and last edge
- // or maybe one edge is missing, if missing then require the middle state
- // this will reject bounces and false movements
- if (bit_is_set(enc_flags, 0) && (bit_is_set(enc_flags, 2) || bit_is_set(enc_flags, 4))) {
- enc_action = 1;
- }
- else if (bit_is_set(enc_flags, 2) && (bit_is_set(enc_flags, 0) || bit_is_set(enc_flags, 4))) {
- enc_action = 1;
- }
- else if (bit_is_set(enc_flags, 1) && (bit_is_set(enc_flags, 3) || bit_is_set(enc_flags, 4))) {
- enc_action = -1;
- }
- else if (bit_is_set(enc_flags, 3) && (bit_is_set(enc_flags, 1) || bit_is_set(enc_flags, 4))) {
- enc_action = -1;
- }
- enc_flags = 0; // reset for next time
- }
- }
- enc_prev_pos = enc_cur_pos;
- if (digitalRead(PIN_BUTTON == HIGH)){
- TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE);
- while(digitalRead(PIN_BUTTON == HIGH)){
- }
- }
- if (enc_action > 0) {
- TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
- }
- else if (enc_action < 0) {
- TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
- }
- else {
- TrinketHidCombo.poll(); // do nothing, check if USB needs anything done
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement