Плавное изменение яркости светодиодной ленты

tip4ik
Offline
Зарегистрирован: 18.04.2021

Ребята помогите. Можете подсказать как сделать. Вроде тыкался но не получается изменять яркость плавно.

Суть такая. Данные из фоторезистора, каждые 5 минут, подключенного к А0 преобразуются в аналоговые и используются в качестве напряжения для светодиодной ленты. Стоит таймер на 1000 миллисекунд как тестовое и в будущем будет увеличен до 5 минут. Нужно что бы лента меняла яркость плавно  а не рывками. Для изменения яркости использовано ШИМ. 


#include "FastLED.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// Указываем, какое количество пикселей у нашей ленты.
#define LED_COUNT 29
#define LED_PIN  5
// Определение директивы для аналогового пина №0(A0), на котором находится фоторезистор
#define LDR_PIN  A0
// Значения с аналогового выхода A0. Подбираются эксперементально и зависят от степени освещенности, 
// типа фоторезистора и резистора R2, учавствующего в делителе напряжения. 
CRGB strip[LED_COUNT];
void setup()
{
  lcd.init();                     
  lcd.backlight();
  Serial.begin(9600); 
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(strip, LED_COUNT);
}
void loop()
{
// Получаем значение с аналогового входа A0
  int val = analogRead(LDR_PIN);
  delay(1000);
// Получение тестовых значений
// Выодим на монитор полученное значение
  Serial.print("brightness = "); // Название значения для наглядного представления
  Serial.println(1023 - val);    // Выводим значение и используем вызов println, те переноса строки
  int ledPower = map(val, 0, 1023, 0, 255);
  Serial.print("LedPower = ");
  Serial.println(ledPower);
  lcd.setCursor(0, 0);
  lcd.print("light level");
  lcd.setCursor(0, 1);
  lcd.print(1023 - val);
    for (int i = 0; i < LED_COUNT; i++)
    {
      strip[i] = CRGB::White; // Белый цвет.
      FastLED.setBrightness(ledPower);
    }
  // Передаем цвета ленте.
  FastLED.show();
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

tip4ik пишет:

Для изменения яркости использовано ШИМ. 

В каком месте Вы его используете? Строку(и) кода можете назвать?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Алгоритм такой - берете предыдущее значение яркости, увеличиваете (или уменьшаете) его на 1 и выводите на ленту, делаете паузу, опять увеличиваете (или уменьшаете) его на 1 и выводите на ленту, делаете паузу и т.д. до достижения требуемоего значения. Как-то так:

if(ledPower != oldledPower){
   if(ledPower-oldledPower){
      oldledPower++;
   }else{
      oldledPower--;
   }
}

И выводим, конечно

 FastLED.setBrightness(oldledPower);

Кстати - паузу можно не делать - у Вас там и так должно подтормаживать.