Untitled

 avatar
unknown
plain_text
21 days ago
3.7 kB
1
Indexable
Для обработки чисел от 1 до 100 в качестве яркости и преобразования их в диапазон от 1 до 255 нужно использовать пропорциональное преобразование. Вот обновленный скетч:

#include <FastLED.h>

#define NUM_LEDS 98   // Количество светодиодов в ленте
#define DI_PIN 6      // Пин, к которому подключена лента

CRGB leds[NUM_LEDS];  // Создаем массив для светодиодов
uint8_t brightness = 255;  // Начальная яркость (1-255)

void setup() {
  Serial.begin(9600);  // Инициализация порта
  FastLED.addLeds<WS2812, DI_PIN, GRB>(leds, NUM_LEDS);  // Инициализация ленты
  FastLED.setBrightness(brightness);  // Устанавливаем начальную яркость
  FastLED.clear();  // Выключаем ленту на старте
  FastLED.show();
}

void loop() {
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');  // Чтение команды
    
    // Обработка команд цвета
    if (command == "RED") {
      fill_solid(leds, NUM_LEDS, CRGB::Red);  // Красный
    }
    else if (command == "GREEN") {
      fill_solid(leds, NUM_LEDS, CRGB::Green);  // Зеленый
    }
    else if (command == "BLUE") {
      fill_solid(leds, NUM_LEDS, CRGB::Blue);  // Синий
    }
    else if (command == "OFF") {
      FastLED.clear();  // Выключаем ленту
    }
    else if (command.startsWith("B")) {  
      // Изменение яркости, например, "B50" (от 1 до 100)
      int newBrightness = command.substring(1).toInt();
      if (newBrightness >= 1 && newBrightness <= 100) {
        brightness = map(newBrightness, 1, 100, 1, 255);  // Преобразование 1-100 в 1-255
        FastLED.setBrightness(brightness);
      }
    }
    else if (command.startsWith("COLOR")) {  
      // Установка цвета в формате "COLOR,R,G,B", например, "COLOR,255,100,50"
      int firstComma = command.indexOf(',');
      int secondComma = command.indexOf(',', firstComma + 1);
      int thirdComma = command.indexOf(',', secondComma + 1);

      if (firstComma > 0 && secondComma > 0 && thirdComma > 0) {
        int r = command.substring(firstComma + 1, secondComma).toInt();
        int g = command.substring(secondComma + 1, thirdComma).toInt();
        int b = command.substring(thirdComma + 1).toInt();
        fill_solid(leds, NUM_LEDS, CRGB(r, g, b));
      }
    }

    FastLED.show();  // Обновляем ленту после каждой команды
  }
}

Что изменено:

1. Преобразование яркости:

Используется функция map(), чтобы преобразовать значения от 1 до 100 в диапазон от 1 до 255.

map(newBrightness, 1, 100, 1, 255) — это линейное масштабирование яркости.



2. Пример расчета:

Если передано B50, то яркость будет map(50, 1, 100, 1, 255) = 128 (примерно 50% от максимальной яркости).

Если передано B10, то яркость будет map(10, 1, 100, 1, 255) = 25 (10% от максимальной яркости).




Теперь яркость будет правильно масштабироваться в зависимости от полученного значения в диапазоне от 1 до 100.

Leave a Comment