Циклическое переключение состояний переключателя

switch potentiometer led-strip

Я делаю настольную лампу из двух полосок 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);
    }
}

Регулировка яркости работает нормально, и переключатель переключается между цветами один раз, но полоса остается белой, даже если последовательный монитор показывает изменение состояния переключателя. Как я могу заставить полосу вернуться к красной?

, 👍0


2 ответа


Лучший ответ:

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");
  }
}
,

2

В ваших строках:

                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.

,