// https://www.reddit.com/r/FastLED/comments/zdqvtq/pausing_beatsin16_at_0_and_resuming_from_0/
#include <FastLED.h>
uint8_t tempIndex = 0;
uint8_t hue = 0;
enum PinAssignments {
encoderPinA = 2, // ขา S1
encoderPinB = 3, // ขา S2
clearButton = 5 // ขา Key
// จ่ายไฟที่ขา +5v และ gnd
// Example For Arduino Uno By www.ArduinoAll.com
};
int order = 0;
unsigned int CHsv[3];
unsigned int colorhsv[3];
unsigned int *color;
unsigned int *h;
unsigned int *s;
unsigned int *v;
int valueupdate = 5;
const int maxval = 255;
const int minval = 0;
volatile unsigned int encoderPos = 0; // สำหรับนับจำนวน
unsigned int lastReportedPos = 1; // change management
static boolean rotating = false; // debounce management
boolean A_set = false;
boolean B_set = false;
#define NUM_LEDS 28
CRGB leds[NUM_LEDS];
#define LED_PIN 4
void setup() {
pinMode(encoderPinA, INPUT_PULLUP); // กำหนดโหมดเป็นแบบ Input pullup
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(clearButton, INPUT_PULLUP);
attachInterrupt(0, doEncoderA, CHANGE); //ทำงานแบบ interrupt เบอร์ 0 ในนี้คือขา pin 2
attachInterrupt(1, doEncoderB, CHANGE); //ทำงานแบบ interrupt เบอร์ 1 ในนี้คือขา pin 3
Serial.begin(9600);
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(255);
FastLED.setCorrection(TypicalPixelString);
colorhsv[0] = 10;
colorhsv[1] = 200;
colorhsv[2] = 255;
color = colorhsv[0];
h = colorhsv[0];
s = colorhsv[1];
v = colorhsv[2];
}
void loop() {
///////////////// Rotary Encoder ////////////////////////////
rotating = true; // reset the debouncer
if (lastReportedPos != encoderPos) {
Serial.print("Index:");
Serial.println(encoderPos, DEC);
lastReportedPos = encoderPos;
color = &colorhsv[order];
Serial.print("Click:Reset Index(");
Serial.print(order);
Serial.print("): ");
Serial.print(*color);
Serial.print(", ");
Serial.print(colorhsv[0]);
Serial.print(", ");
Serial.print(colorhsv[1]);
Serial.print(", ");
Serial.println(colorhsv[2]);
}
if (digitalRead(clearButton) == LOW ) {
//encoderPos = 0;
order++;
if(order > 2)
{
order = 0;
}
color = &colorhsv[order];
Serial.print("Click:Reset Index(");
Serial.print(order);
Serial.print("): ");
Serial.print(*color);
Serial.print(", ");
Serial.print(colorhsv[0]);
Serial.print(", ");
Serial.print(colorhsv[1]);
Serial.print(", ");
Serial.println(colorhsv[2]);
delay(200);
}
//////////////////// FastLED /////////////////////////
for (int i = 0; i < NUM_LEDS; i++) {
//leds[i] = CHSV(hue, 255, 255);
leds[i] = CHSV(hue + ( i*colorhsv[0]), colorhsv[1], colorhsv[2]);
}
EVERY_N_MILLISECONDS(15){
hue++;
}
FastLED.show();
}
// คำสั่งทำงานแบบ interrupt เมื่อมีการหมุน
void doEncoderA() {
// debounce
if ( rotating ) delay (1); // หน่วงเวลาป้องกันสัญญาณบกวน debounce
// เช็คว่ามีบิดสวิตช์
if ( digitalRead(encoderPinA) != A_set ) { // debounce once more
A_set = !A_set;
// adjust counter + if A leads B
if ( A_set && !B_set )
encoderPos += valueupdate;
if(order == 1 )
{
encoderPos = encoderPos>maxval?0:encoderPos;
}else if( order == 2)
{
encoderPos = encoderPos>maxval?0:encoderPos;
}else
{
encoderPos = encoderPos>maxval?0:encoderPos;
}
*color = encoderPos;
rotating = false; // no more debouncing until loop() hits again
}
}
// Interrupt on B changing state, same as A above
void doEncoderB() {
if ( rotating ) delay (1);
if ( digitalRead(encoderPinB) != B_set ) {
B_set = !B_set;
// adjust counter - 1 if B leads A
if ( B_set && !A_set )
encoderPos -= valueupdate;
// if(encoderPos > maxval)
// {
// encoderPos = maxval;
// }
if(order == 1 )
{
encoderPos = encoderPos>maxval?maxval:encoderPos;
}else if( order == 2)
{
encoderPos = encoderPos>maxval?maxval:encoderPos;
}else
{
encoderPos = encoderPos>maxval?maxval:encoderPos;
}
*color = encoderPos;
rotating = false;
}
}