WS2812B светодиодная лента. проблемы с запуском
- Войдите на сайт для отправки комментариев
Добрый день Прошу помощи. Это первый раз) Запускаю ленту. лента светится.
Собрал схему, подключены три переменных резистора к аналоговым входам A0-A2.
Было два скетча. В одном регулировал цветовую схему HSV резисторами. В другом было плавное изменение цвета. Все работало. Добавил выключатель с резистором на цифровой вход D12 для выбора между этими двумя режимами, что - то сломалось.
В одном положении кнопки происходит плавная смена цвета как и задумано, в другом вместо статического свечения с возможностью регулировки осталось автоматическое изменение, но добавилось легкое мерцание, хотя прослеживается отклик на регулировки. Прошу подсказать что где кривенько написал. Надеюсь понятно сформулировал вопрос. Спасибо.
#include <FastLED.h> // подключаем библиотеку
#define NUM_LEDS 52 // указываем количество светодиодов на ленте
#define PIN 13 // указываем пин для подключения ленты
const int buttonPin = 12; // подключена кнопка, подает логическую "1"
CRGB leds[NUM_LEDS];
uint8_t hue = 0;
int hue_m; // Hue переменный регулятор
int sat_m; // Saturation переменный регулятор
int val_m; // Value переменный регулятор
void setup()
{
// основные настройки для адресной ленты
FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(100);
pinMode(buttonPin, INPUT);
}
void loop()
{
hue_m = analogRead (A0);
hue_m = map(hue_m, 0, 1023, 0, 255);
sat_m = analogRead (A1);
sat_m = map(sat_m, 0, 1023, 0, 255);
val_m = analogRead (A2);
val_m = map(val_m, 0, 1023, 0, 255);
int buttonState = digitalRead(buttonPin);
if(buttonState == HIGH)
{
for (int i = 0; i < NUM_LEDS; i++)
{
leds[i] = CHSV(hue, 255, 255);
}
EVERY_N_MILLISECONDS(40){hue++;}
}
else
{
for (int i = 0; i < NUM_LEDS; i++)
{
leds[i] = CHSV(hue_m, sat_m, val_m);
}
}
FastLED.show();
}
Похоже проблема в том, что Вы постоянно переписываете значения.
А переписывать надо только, если они изменились.
Запомните предыдущие значения и, если они не меняются, то и не делать ничего. и FastLED.show() тоже.
Простите, но как реализовать в коде, я новенький, погуглил немного, что-то не понял(
Покажите первоначальный скетч, где не мерцало. Сравним и узнаем причину.
там не было if else соответственно, кнопки еще не было
1. Ручной режим
#include <FastLED.h> // подключаем библиотеку #define NUM_LEDS 51 // указываем количество светодиодов на ленте #define PIN 13 // указываем пин для подключения ленты CRGB leds[NUM_LEDS]; int hue_m; // Hue int sat_m; // Saturation int val_m; // Value void setup() { // основные настройки для адресной ленты FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(100); } void loop() { hue_m = analogRead (A0); hue_m = map(hue_m, 0, 1023, 0, 255); sat_m = analogRead (A1); sat_m = map(sat_m, 0, 1023, 0, 255); val_m = analogRead (A2); val_m = map(val_m, 0, 1023, 0, 255); for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(hue_m, sat_m, val_m); } FastLED.show(); }2. Автоматически плавно меняется цвет
#include <FastLED.h> // подключаем библиотеку #define NUM_LEDS 52 // указываем количество светодиодов на ленте #define PIN 13 // указываем пин для подключения ленты CRGB leds[NUM_LEDS]; uint8_t hue = 0; void setup() { // основные настройки для адресной ленты FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(100); } void loop() { for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(hue, 255, 255); } EVERY_N_MILLISECONDS(40){hue++; } FastLED.show(); }Предположим, что проблема в кнопке. Засаживаем D12 прямо проводком на GND - мерцает? А на VCC?
да, вы правы, если замкнута кнопка, стабильно работает плавный режим, если размыкаю барахлит статика, но стоит коснуться D12-м GND, начинает нормально работать статика.
#include <FastLED.h> // подключаем библиотеку #define NUM_LEDS 52 // указываем количество светодиодов на ленте #define PIN 13 // указываем пин для подключения ленты const int buttonPin = 12; // подключена кнопка, подает логическую "1" CRGB leds[NUM_LEDS]; uint8_t hue = 0; int hue_m; // Hue переменный регулятор int sat_m; // Saturation переменный регулятор int val_m; // Value переменный регулятор nt oldhue_m; // Hue переменный регулятор int oldsat_m; // Saturation переменный регулятор int oldval_m; // Value переменный регулятор void setup() { // основные настройки для адресной ленты FastLED.addLeds <WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(100); pinMode(buttonPin, INPUT); oldhue_m=0; oldsat_m=0; oldval_m=0; } void loop() { hue_m = analogRead (A0); hue_m = map(hue_m, 0, 1023, 0, 255); sat_m = analogRead (A1); sat_m = map(sat_m, 0, 1023, 0, 255); val_m = analogRead (A2); val_m = map(val_m, 0, 1023, 0, 255); int buttonState = digitalRead(buttonPin); if(buttonState == HIGH) { for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(hue, 255, 255); } EVERY_N_MILLISECONDS(40){hue++;} } else { if((oldhue_m != hue_m)||(oldsat_m != sat_m)||(oldval_m != val_m)){ for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(hue_m, sat_m, val_m); oldhue_m = hue_m; oldsat_m = sat_m; oldval_m = val_m; FastLED.show(); } } } }Ну вот и выяснили - искать нужно в районе кнопки. Так, как схему не привели, то придётся без подсказок это делать.
да, вы правы, если замкнута кнопка, стабильно работает плавный режим, если размыкаю барахлит статика, но стоит коснуться D12-м GND, начинает нормально работать статика.
А у Вас кнопка хоть подтянута?
Подтянута? не болтается
Резистор не тем концом припаян.
http://arduino.ru/tutorials/button
Ура заработало! Спасибо большое!
Спасибо, ознакомился с кодом, понял что вы имели ввиду, изящно, а дело и правда было в схеме.
Удачи