#define _DEBUG
#ifdef _DEBUG
#include <TinyDebug.h>
#else
#include "TrinketHidCombo.h"
#endif
#include <Adafruit_NeoPixel.h>
#define ENCODER_CLK PB2
#define ENCODER_DT PB1
#define ENCODER_BTN PB0
int8_t volume = 0;
boolean pause = false;
boolean mode = false;
int8_t last_clk = HIGH;
long int last_changed = 0;
boolean click = false, click_stop = false, rotate_press = false;
int8_t rotate = 0;
#define PIN PB3 //Pin 1 is DATA In on the bottom Ring
#define BRIGHTNESS 255 // brightness reduced (about 180mA max, 100mA average)
#define TOTAL_LED 16 // Fill by hand
Adafruit_NeoPixel strip = Adafruit_NeoPixel(TOTAL_LED, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_BTN, INPUT_PULLUP);
_delay_ms(40);
#ifdef _DEBUG
Debug.begin();
Debug.println(F("Hello, TinyDebug!"));
#endif
strip.begin();
strip.setBrightness(BRIGHTNESS); // set brightness
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
//rainbowCycle(100);
int bouton = digitalRead(ENCODER_BTN);
if (millis() - last_changed > 50) {
click_stop = (bouton == HIGH);
if ( bouton == LOW ) {
last_changed = millis();
click = true;
}
}
int new_clk = digitalRead(ENCODER_CLK);
if (new_clk != last_clk) {
last_clk = new_clk;
int dt = digitalRead(ENCODER_DT);
if (new_clk == LOW && dt == HIGH) rotate = 1;
if (new_clk == LOW && dt == LOW) rotate = -1;
}
if ( click && click_stop) {
if (rotate_press) { rotate_press = false; click = false; click_stop = false; }
else {
#ifdef _DEBUG
Debug.println("click ⏪");
#else
if (mode) TrinketHidCombo.pressMultimediaKey(MMKEY_PLAYPAUSE);
else TrinketHidCombo.pressMultimediaKey(MMKEY_PLAYPAUSE);
#endif
click = false;
click_stop = false;
pause = !pause;
}
}
if ( rotate < 0 ) {
if (!click)
#ifdef _DEBUG
Debug.println("Rotated counterclockwise ⏪");
#else
if (mode) { TrinketKeyboard.mouseMove(5, 0, MOUSEBTN_MIDDLE_MASK); }
else { TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN); }
#endif
else
#ifdef _DEBUG
Debug.println("Rotated counterclockwise + click ⏪");
#else
if (mode) { TrinketKeyboard.pressKey(0, KEYCODE_END); TrinketKeyboard.pressKey(0, 0); }
else { TrinketHidCombo.pressMultimediaKey(MMKEY_SCAN_PREV_TRACK); }
#endif
}
if ( rotate > 0 ) {
if(!click)
#ifdef _DEBUG
Debug.println("Rotated clockwise ⏩");
#else
if (mode) { TrinketKeyboard.mouseMove(-5, 0, MOUSEBTN_MIDDLE_MASK); }
else { TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP); }
#endif
else
#ifdef _DEBUG
Debug.println("Rotated clockwise ⏩ + Click");
#else
if (mode) { { TrinketKeyboard.pressKey(0, KEYCODE_HOME); TrinketKeyboard.pressKey(0, 0); }
else { TrinketHidCombo.pressMultimediaKey(MMKEY_SCAN_NEXT_TRACK); }
#endif
}
if (rotate && click ) rotate_press = true;
volume += rotate;
display();
rotate = 0;
}
void display() {
strip.clear();
if (pause)
strip.fill(strip.Color(0, 255, 255));
else
strip.fill(
(volume < 0
? strip.Color(125, 125, 0)
:(volume < 50
? strip.Color(0, 125, 0)
: strip.Color(125, 0, 0))), 0, map(volume, -128, 127, 0, TOTAL_LED - 1));
strip.show();
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t _wait) {
uint16_t i, j;
for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(_wait);
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}