Циклическое переключение состояний переключателя
Я делаю настольную лампу из двух полосок WS2811 (подключенных к тройным портам в правом верхнем углу платы внизу). Яркость полос регулируется потенциометром, а цвет переключателем. Каждое нажатие переключателя переключает красный, синий и белый цвета:
Вот код, который я придумал:
#include <FastLED.h>
#define strip_pin 7
#define NUM_LEDS 15
CRGB leds[NUM_LEDS];
int distance;
int brightness;
int brightnesspin = 2;
int pin_switch = 3;
// переменные для хранения нового и старого состояния переключателя
boolean oldSwitchState = LOW;
boolean newSwitchState1 = LOW;
boolean newSwitchState2 = LOW;
boolean newSwitchState3 = LOW;
byte state = 0;
void setup()
{
Serial.begin(9600);
FastLED.addLeds<WS2811, strip_pin, BRG>(leds, NUM_LEDS);
}
void loop()
{
delay(500);
// Управление цветом
//##############################################
newSwitchState1 = digitalRead(pin_switch);
delay(1);
newSwitchState2 = digitalRead(pin_switch);
delay(1);
newSwitchState3 = digitalRead(pin_switch);
// если все 3 значения совпадают, мы можем продолжить
if ( (newSwitchState1==newSwitchState2) && (newSwitchState1==newSwitchState3) )
{
if ( newSwitchState1 != oldSwitchState )
{
// был ли замкнут кнопочный переключатель?
if ( newSwitchState1 == HIGH )
{
// увеличить значение состояния
state++;
if (state > 3) { state = 0; }
for (int i = 0; i < NUM_LEDS; i++)
{
if (state==1) { leds[i].red = 100;Serial.println("Red"); }
if (state==2) { leds[i].blue = 100;Serial.println("Blue"); }
if (state==3) { leds[i].red = 100; leds[i].blue = 100; leds[i].green = 100;Serial.println("White");}
}
FastLED.show();
}
oldSwitchState = newSwitchState1;
}
// Управление яркостью
//##############################################
brightness = analogRead(brightnesspin); brightness = map(brightness, 0, 1024, 0, 255);
for (int i = 0; i<NUM_LEDS; i++)
{
FastLED.setBrightness(brightness);
}
FastLED.show();
Serial.print("Brightness: ");
Serial.println(brightness);
}
}
Регулировка яркости работает нормально, и переключатель переключается между цветами один раз, но полоса остается белой, даже если последовательный монитор показывает изменение состояния переключателя. Как я могу заставить полосу вернуться к красной?
@Jim421616, 👍0
2 ответа
Лучший ответ:
Проблема заключается в вашем цикле for.
- Если
(state == 1)
вы включаете красный цвет. - Если вы переключаете
(state == 2)
, синий цвет включен. Итак, в данный момент у вас есть красный и синий цвет, а не только синий. Я предполагаю, что выходной цвет фиолетовый. - Если
(state == 3)
, вы активируете красный (который уже включен), синий (который также уже включен) и зеленый (который меняет состояние с OFF на ON), поэтому вы получить белый цвет. В этот момент вы прошли все три возможных условия. - Затем вы возвращаетесь к
(state == 1)
. Все цвета уже активированы, поэтому с этого момента вы получаете только белый...
Решение:
for (int i = 0; i < NUM_LEDS; i++) {
if (state == 1) {
leds[i].red = 100;
leds[i].blue = 0;
leds[i].green = 0;
Serial.println("Red");
}
if (state == 2) {
leds[i].red = 0;
leds[i].blue = 100;
leds[i].green = 0;
Serial.println("Blue");
}
if (state == 3) {
leds[i].red = 100;
leds[i].blue = 100;
leds[i].green = 100;
Serial.println("White");
}
}
В ваших строках:
if (state==1) { leds[i].red = 100;Serial.println("Red"); }
if (state==2) { leds[i].blue = 100;Serial.println("Blue"); }
if (state==3) { leds[i].red = 100; leds[i].blue = 100; leds[i].green = 100;Serial.println("White");}
Светодиоды включены, но никогда не выключаются.
Последовательность:
1: горят красные светодиоды; полоса становится красной.
2: загораются синие индикаторы (вероятно, здесь они будут фиолетовыми, а не синими, поскольку красные индикаторы все еще горят)
3: Зеленые индикаторы включаются (красный и синий индикаторы уже включены); полоса выглядит белой
назад к началу:
1,2,3: ничего не меняется, так как все светодиоды уже горят, полоса остается белой.
Я предлагаю добавить:
leds[i].green = 0; leds[i].blue = 0;
к условию state == 1
и
leds[i].green = 0; leds[i].red = 0
к условию state == 2
.
- игнорирование изменений значения потенциометра
- Почему значение светодиодной ленты на потенциометре всегда равно 255?
- Как использовать этот 3-контактный ползунковый переключатель?
- Как эмулировать аналоговый потенциометр с помощью ШИМ
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Управлять несколькими полосками WS2812B с разным количеством светодиодов.