WS2812B светодиодная лента. проблемы с запуском

mexme
Offline
Зарегистрирован: 18.10.2021

Добрый день Прошу помощи. Это первый раз) Запускаю ленту. лента светится.

Собрал схему, подключены три переменных резистора к аналоговым входам 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();
}

 

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

Похоже проблема в том, что Вы постоянно переписываете значения.

А переписывать надо только, если они изменились.

Запомните предыдущие значения и, если они не меняются, то и не делать ничего. и FastLED.show() тоже.

mexme
Offline
Зарегистрирован: 18.10.2021

Простите, но как реализовать в коде, я новенький, погуглил немного, что-то не понял(

sadman41
Offline
Зарегистрирован: 19.10.2016

Покажите первоначальный скетч, где не мерцало. Сравним и узнаем причину.

mexme
Offline
Зарегистрирован: 18.10.2021

там не было 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();
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Предположим, что проблема в кнопке. Засаживаем D12 прямо проводком на GND - мерцает? А на VCC?

mexme
Offline
Зарегистрирован: 18.10.2021

да, вы правы, если замкнута кнопка, стабильно работает плавный режим, если размыкаю барахлит статика, но стоит коснуться D12-м GND, начинает нормально работать статика.

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

#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();
}
}
}
​}
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Ну вот и выяснили - искать нужно в районе кнопки. Так, как схему не привели, то придётся без подсказок это делать.

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

mexme пишет:

да, вы правы, если замкнута кнопка, стабильно работает плавный режим, если размыкаю барахлит статика, но стоит коснуться D12-м GND, начинает нормально работать статика.

А у Вас кнопка хоть подтянута?

mexme
Offline
Зарегистрирован: 18.10.2021

Подтянута? не болтается

sadman41
Offline
Зарегистрирован: 19.10.2016

Резистор не тем концом припаян.

http://arduino.ru/tutorials/button

mexme
Offline
Зарегистрирован: 18.10.2021

Ура заработало! Спасибо большое!

mexme
Offline
Зарегистрирован: 18.10.2021

Спасибо, ознакомился с кодом, понял что вы имели ввиду, изящно, а дело и правда было в схеме.

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

Удачи