Плавное изменение яркости светодиодной ленты
- Войдите на сайт для отправки комментариев
Вс, 18/04/2021 - 23:21
Ребята помогите. Можете подсказать как сделать. Вроде тыкался но не получается изменять яркость плавно.
Суть такая. Данные из фоторезистора, каждые 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();
}
Для изменения яркости использовано ШИМ.
В каком месте Вы его используете? Строку(и) кода можете назвать?
Алгоритм такой - берете предыдущее значение яркости, увеличиваете (или уменьшаете) его на 1 и выводите на ленту, делаете паузу, опять увеличиваете (или уменьшаете) его на 1 и выводите на ленту, делаете паузу и т.д. до достижения требуемоего значения. Как-то так:
if(ledPower != oldledPower){ if(ledPower-oldledPower){ oldledPower++; }else{ oldledPower--; } }И выводим, конечно
Кстати - паузу можно не делать - у Вас там и так должно подтормаживать.