#define LED_RED_PIN 16
#define LED_GREEN_PIN 2
#define LED_BLUE_PIN 15
#define RGBLED_RED_PIN 18
#define RGBLED_GREEN_PIN 19
#define RGBLED_BLUE_PIN 21
#define BUTTON_PIN 12
#define BUTTON_SEL_PIN 13
#define ENCODER_CLK 5
#define ENCODER_DT 4
#define RED 0
#define GREEN 1
#define BLUE 2
void LED_Red_On(uint8_t brightness)
{
pinMode(LED_RED_PIN, OUTPUT);
analogWrite(LED_RED_PIN, 255 - brightness);
}
void LED_Red_Off()
{
pinMode(LED_RED_PIN, OUTPUT);
digitalWrite(LED_RED_PIN, HIGH);
}
void LED_Green_On(uint8_t brightness)
{
pinMode(LED_GREEN_PIN, OUTPUT);
analogWrite(LED_GREEN_PIN, 255 - brightness);
}
void LED_Green_Off()
{
pinMode(LED_GREEN_PIN, OUTPUT);
digitalWrite(LED_GREEN_PIN, HIGH);
}
void LED_Blue_On(uint8_t brightness)
{
pinMode(LED_BLUE_PIN, OUTPUT);
analogWrite(LED_BLUE_PIN, 255 - brightness);
}
void LED_Blue_Off()
{
pinMode(LED_BLUE_PIN, OUTPUT);
digitalWrite(LED_BLUE_PIN, HIGH);
}
void ColorLED_On(uint32_t rgb)
{
analogWrite(RGBLED_RED_PIN, 255 - (rgb >> 16 & 0xff));
analogWrite(RGBLED_GREEN_PIN, 255 - (rgb >> 8 & 0xff));
analogWrite(RGBLED_BLUE_PIN, 255 - (rgb & 0xff));
}
void ColorLED_Off()
{
pinMode(RGBLED_RED_PIN, OUTPUT);
pinMode(RGBLED_GREEN_PIN, OUTPUT);
pinMode(RGBLED_BLUE_PIN, OUTPUT);
digitalWrite(RGBLED_RED_PIN, HIGH);
digitalWrite(RGBLED_GREEN_PIN, HIGH);
digitalWrite(RGBLED_BLUE_PIN, HIGH);
}
bool button_up = true;
bool button_sel_up = true;
bool led_stat = false;
uint8_t brightness_red_set = 127;
uint8_t brightness_red_last = 0;
uint8_t brightness_green_set = 127;
uint8_t brightness_green_last = 0;
uint8_t brightness_blue_set = 127;
uint8_t brightness_blue_last = 0;
uint32_t color_set;
uint8_t color_select = RED;
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
if (!led_stat)
led_stat = true;
switch (color_select)
{
case RED:
if (brightness_red_set >= 255 - 8)
brightness_red_set = 255;
if (brightness_red_set < 255 - 8)
brightness_red_set += 8;
break;
case GREEN:
if (brightness_green_set >= 255 - 8)
brightness_green_set = 255;
if (brightness_green_set < 255 - 8)
brightness_green_set += 8;
break;
case BLUE:
if (brightness_blue_set >= 255 - 8)
brightness_blue_set = 255;
if (brightness_blue_set < 255 - 8)
brightness_blue_set += 8;
break;
}
}
if (dtValue == LOW) {
switch (color_select)
{
case RED:
if (brightness_red_set > 8)
brightness_red_set -= 8;
if (brightness_red_set <= 8)
{
brightness_red_set = 0;
}
break;
case GREEN:
if (brightness_green_set > 8)
brightness_green_set -= 8;
if (brightness_green_set <= 8)
{
brightness_green_set = 0;
}
break;
case BLUE:
if (brightness_blue_set > 8)
brightness_blue_set -= 8;
if (brightness_blue_set <= 8)
{
brightness_blue_set = 0;
}
break;
}
}
}
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUTTON_SEL_PIN, INPUT_PULLUP);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(RGBLED_RED_PIN, OUTPUT);
pinMode(RGBLED_GREEN_PIN, OUTPUT);
pinMode(RGBLED_BLUE_PIN, OUTPUT);
LED_Red_Off();
LED_Green_Off();
LED_Blue_Off();
ColorLED_Off();
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW)
{
if (button_up)
{
button_up = false;
led_stat = !led_stat;
}
}
else
{
button_up = true;
}
if (digitalRead(BUTTON_SEL_PIN) == LOW)
{
if (button_sel_up)
{
button_sel_up = false;
if (led_stat)
{
color_select++;
if (color_select == 3)
color_select = 0;
if (color_select == GREEN)
{
LED_Red_Off();
LED_Blue_Off();
LED_Green_On(brightness_green_set);
}
if (color_select == BLUE)
{
LED_Red_Off();
LED_Green_Off();
LED_Blue_On(brightness_blue_set);
}
if (color_select == RED)
{
LED_Green_Off();
LED_Blue_Off();
LED_Red_On(brightness_red_set);
}
}
}
}
else
{
button_sel_up = true;
}
if (led_stat)
{
if (color_select == RED)
{
if (brightness_red_last != brightness_red_set)
{
LED_Red_On(brightness_red_set);
brightness_red_last = brightness_red_set;
}
}
if (color_select == GREEN)
{
if (brightness_green_last != brightness_green_set)
{
LED_Green_On(brightness_green_set);
brightness_green_last = brightness_green_set;
}
}
if (color_select == BLUE)
{
if (brightness_blue_last != brightness_blue_set)
{
LED_Blue_On(brightness_blue_set);
brightness_blue_last = brightness_blue_set;
}
}
color_set = brightness_red_set << 16 | brightness_green_set << 8 | brightness_blue_set;
ColorLED_On(color_set);
}
else
{
LED_Red_Off();
LED_Green_Off();
LED_Blue_Off();
ColorLED_Off();
}
delay(10); // this speeds up the simulation
}