Устранение неполадок светодиодной ленты WS2812b с кнопкой включения/выключения

arduino-nano led-strip ws2812

У меня есть очень рудиментарная установка с arduino nano, светодиодной лентой, кнопкой и резистором.

Я пытался использовать кнопку в качестве переключателя, используя этот код

#include <stdio.h>
#include <stdlib.h>
#include<FastLED.h> // заголовочный файл

#define NUM_LEDS 14 // количество светодиодов, присутствующих в вашей полосе
#define DATA_PIN 12 // цифровой вывод вашего arduino

CRGB leds[NUM_LEDS];

const int button = 2;            // GPIO 8 для кнопки
int status = false;

void setup() {
  //Serial.begin(9600);
  pinMode(button, INPUT);         // определить кнопку как вход
  pinMode(DATA_PIN, OUTPUT);           // определить светодиод как выход
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
}

void loop() {
  if (digitalRead(button)==true) { // если кнопка нажата
    // флип статус
    //Serial.println("Изменение статуса");
    status = !status;
    //Serial.println(статус);
    toggle(status);
  }                           

  while (digitalRead(button) == true) {
    //Serial.println("цикл while");
    delay(50);
    //Serial.println(статус);
  }//
 
  delay(50);
} // начать сначала

void toggle(bool status) {
  if (status == true) {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::White;  //установите все светодиоды на белый цвет.
    }
    FastLED.show();
  } else {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::Black;  //выключите все светодиоды
    }
    FastLED.show();
  }
}

Это моя схема

Я питаю это от батареи (модель PNY 12200, 2200 мАч, выход 5 В = 1А) через USB в плату arduino. У меня возникли некоторые проблемы. В основном через некоторое время свет включался сам по себе, может быть, не на полную мощность, но все равно горел. Не уверен, в чем проблема, любые подсказки приветствуются.

Я также иногда выключаю свет, может быть, я подаю ток в неправильное место, и предохранительный механизм либо на arduino, либо на батарейке выключает все, чтобы защитить себя?

, 👍0

Обсуждение

вывод данных коммутатора плавает ... его значение неопределенно ... подключите выдвижной резистор к контакту данных (другая сторона переключателя)., @jsotola

используйте режим INPUT_PULLUP, чтобы вам не приходилось возиться с внешними резисторами., @dandavis

@jstola Если я не понял, что делать на уровне аппаратного обеспечения, подключение резистора с выхода кнопки к D2 не изменило поведение., @Matias Andina

@dandavis использование INPUT_PULLUP также не изменило поведение., @Matias Andina

while(digitalRead(button) == true);{- Сомневаюсь, что точка с запятой здесь поставлена намеренно. Это может помочь отформатировать ваш код. Инструменты / Автоформат` сделает это за вас. Если закомментированный код не имеет отношения к вопросу, вы можете удалить его., @timemage

"аккумулятор через USB", подробнее о батарее. Кроме того, что произойдет, если вы включите питание от USB-разъема через настенный адаптер, как вы использовали бы для зарядки планшета или телефона?, @timemage

@timemage спасибо за правки кода. См. Информацию о батарее в этом посте. На самом деле это может быть проблема с батареей, возможно, источник питания не стабилен, при подключении к розетке он, кажется, не включается самопроизвольно. Мне нужно, чтобы он работал от батареи для моего приложения, поэтому я попробую другой аккумулятор, @Matias Andina


1 ответ


Лучший ответ:

1

В руководстве для T2200, которое, как мне кажется, вы имеете в виду, говорится:

Примечание: Если блок питания не включается автоматически при подключении устройства , нажмите кнопку питания. Блок питания выключится через 90 секунд, если устройства не подключены.

Это общая функция для USB-аккумуляторов, предназначенных для зарядки телефонов и аналогичных устройств. Вероятно, он отключается, когда ток падает ниже некоторого установленного предела, скажем, 50 мА для более чем 90-х годов. Но он также может искать каждые 90-е годы средний ток в течение 10 мс. Они просто не говорят. Учитывая их описание, вполне вероятно, что он регулярно включается на некоторое короткое время, чтобы проверить нагрузку. В общем, незнание специфики этого дела может свести вас с ума. Следует иметь в виду, что кто-то, использующий эту штуку для зарядки мобильного телефона, не обязательно заметит или позаботится о том, чтобы она включалась и выключалась каждые несколько секунд. Если вы хотите использовать это для питания Arduino, стоит хорошенько разобраться в том, как он ведет себя, проведя некоторые эксперименты. У некоторых из этих банков питания есть способ отключить функцию обнаружения нагрузки и автоматического отключения; я ничего не видел об этом для этой модели.

Nano, во всяком случае, официальный, имеет полифузор PTC 500mA на USB VBUS ("5V"). Ваш код говорит #define NUM_LEDS 14. Светодиоды WS2812b используют что-то порядка 50 мА каждый на максимальной мощности. Вероятно, вам следует измерить то, что вы на самом деле рисуете, с той интенсивностью, с которой вы им командуете, чтобы убедиться, что у вас хороший запас ниже 500 мА. Если вы на самом деле используете 14 из них, и если возможно, что все они могут иметь полную яркость, то вы, возможно, пытаетесь использовать что-то вроде 735 мА, совсем немного выше 500 мА. Вы обнаружите, что необходимо проложить 5 В вокруг вашего Arduino к вашей светодиодной ленте, в идеале через его собственную защиту от перегрузки по току.

Каждый раз, когда вы включаете или сбрасываете свой проект, проходит некоторое время, прежде чем скетч установит вывод, подключенный к сигналу данных WS2812, на выход и некоторый определенный уровень. Возможно, будет хорошей идеей добавить внешний тянущий резистор к сигналу данных светодиода, возможно, к GND, чтобы во время включения питания и сброса сигнал данных светодиодной ленты не улавливал шум и не пытался интерпретировать его как цветовые данные и в процессе изменять нагрузку на источник питания. Наличие powerbank, потенциально включающего и выключающего ваш проект, дает дополнительные возможности для этого. Если вы отключите полифузор, либо приказав светодиодам рисовать слишком много, либо попросив плавающий вывод данных сделать то же самое, напряжение на его наночастице упадет. Когда напряжение падает, он может отключить детектор потемнения микроконтроллера AVR, который, в свою очередь, сбросит его AVR, снова вызвав плавающий вывод данных на вашей светодиодной ленте.

,