Коллеги, добрый день! Заранее скажу, что новичек в этой теме, но немного интересующийся.
Идея проекта:
Есть двойной стол (один большой, за которым сидят 2 человека, столешница 2.7м длиной). По краю стола (во стороны стены) наклеена адресная светодиодна лента WS2812b, суммарно 78 светодиодов. два энкодера представляют два пульта управления для каждого из пользователей стола. каждый из них управляет своей половиной стедодиодной ленты.
Схема состоит из 2 экнодеров, Светодиоднйо ленты WS2812B на 78 светодиодов, ардуино нано и китайского БП AC/DC 5v 2a.
Где можно нормально рисовать схемы без скачивания сторонних программ я не нашел, поэтому накалякал где получилось.
Есть небольшие различия в пинах, но это не существенно. Единственное, что важно - на схеме + от блока питания подключается в путь VIN. Я же подключал к пину 5V ардуино.
Проблема:
Я собрал преокт на макетной плате - все работает практически идеально, за исключением некоторых недороботок в коде. Но тут не об этом, с фактической точки зрения - нет никаких нареканий.
Когда я спаиваю эту схему (Для подключения я использую Советский МГШВ 0.2 мм) система начинает работать некорректно.
Как проявляется:
1) включаю одну половину, выключиваю на максимальную яркость.
2) Включаю вторую половину - вся лента тухнет и не включается, пока не нажмешь кнопку RESET на ардуино, или не выключить и заново не включить Блок питания
или, если просто включить одну половину и подождать некоторое время - такой же исход. Лента выключается, и не реагирует на органы управления.
опять же повторюсь, на макетнйо плане все эффекты и обе половины работают отлично на максимальной яркости.
Примечание:
для удобства управления, 1 из энкодеров подключается по проводам длинной в ~2.5-3 метра. Однако, если я просто использую тестовый скрипт,который просто выводит полученный сигнал (нажатие, поворот вправо, влево, нажатие и поворот и тд), то все отрабатывает корректно на дистанции 3м.
2 Энкодер подключается на проводах ~0.8м.
Лента - 30см.
Подскажите пожалуйста, что я делаю не атк и где совершаю ошибки? Выглядит проблема так, как будто проблема в питании, но как исправить - не знаю. Буду благодарен любому совету или догадке. Спасибо.
на всякий случай прикладываю проект. Думаю, проблема не в нем, но может будет полезно:
Идея проекта:
Есть двойной стол (один большой, за которым сидят 2 человека, столешница 2.7м длиной). По краю стола (во стороны стены) наклеена адресная светодиодна лента WS2812b, суммарно 78 светодиодов. два энкодера представляют два пульта управления для каждого из пользователей стола. каждый из них управляет своей половиной стедодиодной ленты.
Схема состоит из 2 экнодеров, Светодиоднйо ленты WS2812B на 78 светодиодов, ардуино нано и китайского БП AC/DC 5v 2a.
Где можно нормально рисовать схемы без скачивания сторонних программ я не нашел, поэтому накалякал где получилось.
Есть небольшие различия в пинах, но это не существенно. Единственное, что важно - на схеме + от блока питания подключается в путь VIN. Я же подключал к пину 5V ардуино.
DIN ленты - D9;
Энкодер 1:
S1 - D6
S2 - D7
KEY - D8
Энкодер 2:
S1 - D3
S2 - D4
KEY - D5
Энкодер 1:
S1 - D6
S2 - D7
KEY - D8
Энкодер 2:
S1 - D3
S2 - D4
KEY - D5
Проблема:
Я собрал преокт на макетной плате - все работает практически идеально, за исключением некоторых недороботок в коде. Но тут не об этом, с фактической точки зрения - нет никаких нареканий.
Когда я спаиваю эту схему (Для подключения я использую Советский МГШВ 0.2 мм) система начинает работать некорректно.
Как проявляется:
1) включаю одну половину, выключиваю на максимальную яркость.
2) Включаю вторую половину - вся лента тухнет и не включается, пока не нажмешь кнопку RESET на ардуино, или не выключить и заново не включить Блок питания
или, если просто включить одну половину и подождать некоторое время - такой же исход. Лента выключается, и не реагирует на органы управления.
опять же повторюсь, на макетнйо плане все эффекты и обе половины работают отлично на максимальной яркости.
Примечание:
для удобства управления, 1 из энкодеров подключается по проводам длинной в ~2.5-3 метра. Однако, если я просто использую тестовый скрипт,который просто выводит полученный сигнал (нажатие, поворот вправо, влево, нажатие и поворот и тд), то все отрабатывает корректно на дистанции 3м.
2 Энкодер подключается на проводах ~0.8м.
Лента - 30см.
Подскажите пожалуйста, что я делаю не атк и где совершаю ошибки? Выглядит проблема так, как будто проблема в питании, но как исправить - не знаю. Буду благодарен любому совету или догадке. Спасибо.
на всякий случай прикладываю проект. Думаю, проблема не в нем, но может будет полезно:
Проект:
#include <EncButton.h>
#include <FastLED.h>
#define LED_COUNT 78
#define LED_PIN 9
CRGB leds[LED_COUNT];
class EncoderClass {
public:
EncButton state;
String name;
int brightness = 55;
int rainbow_speed = 155;
bool isRainbow = false;
bool isPressed = false;
bool isHold = false;
int first_led;
int last_led;
byte counter_static = 0; // Переменная для отслеживания положения энкодера в диапазоне 0-255
byte counter_dynamic = 0;
EncoderClass(EncButton _state, String _name, int _first_led, int _last_led) {
state = _state;
name = _name;
first_led = _first_led;
last_led = _last_led;
}
void tick(CRGB leds[], int R, int G, int B) {
state.tick();
int temp_brightness = -1;
int temp_rainbow_speed = -1;
if (state.right()) {
if (isPressed) {
temp_brightness = brightness - 10;
} else if (isRainbow) {
temp_rainbow_speed = rainbow_speed - 10;
}
}
if (state.left()) {
if (isPressed) {
temp_brightness = brightness + 10;
} else if (isRainbow) {
temp_rainbow_speed = rainbow_speed + 10;
}
}
if (state.rightH()) {
// При прокрутке с зажатием вправо увеличиваем счетчик
counter_static += 5;
}
if (state.leftH()) {
// При прокрутке с зажатием влево уменьшаем счетчик
counter_static -= 5;
}
// Обновляем счетчик в пределах от 0 до 255
counter_static = max(0, min(255, counter_static));
// Преобразуем значение счетчика в оттенок цвета по радуге
int hue = map(counter_static, 0, 255, 0, 255);
if (temp_brightness > 0 && temp_brightness < 256) {
brightness = temp_brightness;
Serial.print(name);
Serial.print(".brightness: ");
Serial.println(brightness);
}
if (temp_rainbow_speed > 0 && temp_rainbow_speed < 256) {
rainbow_speed = temp_rainbow_speed;
Serial.print(name);
Serial.print(".rainbow_speed: ");
Serial.println(rainbow_speed);
}
if (state.click()) {
isPressed = !isPressed;
Serial.print(name);
Serial.print(".isPressed: ");
Serial.println(isPressed);
}
if (state.hold()) {
if (!isHold) {
isRainbow = !isRainbow;
isHold = true;
}
Serial.print(name);
Serial.print(".isRainbow: ");
Serial.println(isRainbow);
} else {
isHold = false;
}
// Изменяем яркость каждого светодиода на отрезке
for (int i = first_led; i <= last_led; i++) {
if (!isPressed) {
leds[i] = CRGB(0, 0, 0); // Если не нажата кнопка, выключаем светодиоды
} else if (!isRainbow) {
leds[i] = CHSV(hue, 255, 255); // Устанавливаем цвет по радуге с учетом яркости
leds[i].fadeToBlackBy(255 - brightness); // Изменяем яркость светодиода
}
}
if (isRainbow) {
for (int i = first_led; i <= last_led; i++) {
if (state.click()) { // Если кнопка нажата, выходим из цикла
isRainbow = false;
break;
}
leds[i] = CHSV(counter_dynamic + i * 2, 255, 255);
}
counter_dynamic++;
delay(map(rainbow_speed, 5, 255, 0.0, 7.0));
}
}
};
EncoderClass encoder2(EncButton(3, 4, 5), "enc1", 0, LED_COUNT / 2);
EncoderClass encoder1(EncButton(6, 7, 8), "enc2", LED_COUNT / 2 + 1, LED_COUNT - 1);
void setup() {
Serial.begin(9600); // Инициализация последовательной связи
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_COUNT);
}
void loop() {
encoder1.tick(leds, 255, 255, 100); // Устанавливаем цвет и яркость для первого отрезка
encoder2.tick(leds, 255, 0, 0); // Устанавливаем цвет и яркость для второго отрезка
FastLED.show();
}
Изменено: