Попытка включить RGB с помощью кнопок с analogWrite не работает.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я только что запустил Arduino, как 2 дня назад, я следил за некоторыми учебными пособиями на YouTube, и я пытался сделать это сам, но я не могу понять, почему это не работает, не могу найти, что я делаю неправильно.
НАСТРОЙКА (я уже протестировал ее с помощью другого кода, который доказал мне, что настройка работает, каждая кнопка и каждый вывод RGB-светодиода, я точно знаю, что этот код не работает)
Я пытаюсь зажечь светодиод КРАСНЫМ цветом благодаря второй кнопке (слева), зеленым - с третьей, синим - с четвертой, и первой, чтобы выключить светодиод. Я также пытаюсь сделать идеальный визуальный переход между каждым цветом от 255 до 0 десятичных знаков.
Вот мой код:
#define BLUE 10
#define GREEN 11
#define RED 5
int buttonBlueOn = 9;
int buttonGreenOn = 8;
int buttonRedOn = 3;
int buttonRgbLedOff = 2;
void setup() {
// поместите сюда свой установочный код, чтобы запустить его один раз:
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(buttonRedOn, INPUT_PULLUP);
pinMode(buttonGreenOn, INPUT_PULLUP);
pinMode(buttonBlueOn, INPUT_PULLUP);
pinMode(buttonRgbLedOff, INPUT_PULLUP);
}
int redValue;
int greenValue;
int blueValue;
void loop() {
// поместите сюда свой основной код для повторного запуска:
// -------------------------------- КРАСНЫЙ ------------------------------ //
#define delayTime 20
if (digitalRead(buttonRedOn) == LOW)
{
digitalWrite(RED, HIGH);
redValue = 255;
}
if (digitalRead(buttonRedOn) == LOW and GREEN == HIGH)
{
for (int i = 0; i < 255; i += 1) // зеленый исчезает, красный становится полным
{
redValue += 1;
greenValue -= 1;
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
delay(delayTime);
}
}
if (digitalRead(buttonRedOn) == LOW and BLUE == HIGH)
{
for (int i = 0; i < 255; i += 1) // синий исчезает, красный становится полным
{
redValue += 1;
blueValue -= 1;
analogWrite(RED, redValue);
analogWrite(BLUE, blueValue);
delay(delayTime);
}
}
// -------------------------------- ЗЕЛЕНЫЙ ------------------------------ //
if (digitalRead(buttonGreenOn) == LOW)
{
digitalWrite(GREEN , HIGH);
greenValue = 255;
}
if (digitalRead(buttonGreenOn) == LOW and RED == HIGH)
{
for (int i = 0; i < 255; i += 1) // исчезает красный, появляется зеленый.
{
greenValue += 1;
redValue -= 1;
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
delay(delayTime);
}
}
if (digitalRead(buttonGreenOn) == LOW and BLUE == HIGH)
{
for (int i = 0; i < 255; i += 1) // исчезает синий, появляется зеленый.
{
greenValue += 1;
blueValue -= 1;
analogWrite(BLUE, blueValue);
analogWrite(GREEN, greenValue);
delay(delayTime);
}
}
// -------------------------------- СИНИЙ ------------------------------ //
if (digitalRead(buttonBlueOn) == LOW)
{
digitalWrite(BLUE, HIGH);
blueValue = 255;
}
if (digitalRead(buttonBlueOn) == LOW and RED == HIGH)
{
for (int i = 0; i < 255; i += 1) // исчезает красный, синий становится полным
{
blueValue += 1;
redValue -= 1;
analogWrite(RED, redValue);
analogWrite(BLUE, blueValue);
delay(delayTime);
}
}
if (digitalRead(buttonBlueOn) == LOW and GREEN == HIGH)
{
for (int i = 0; i < 255; i += 1) // зеленый исчезает, синий становится полным
{
blueValue += 1;
greenValue -= 1;
analogWrite(BLUE, blueValue);
analogWrite(GREEN, greenValue);
delay(delayTime);
}
}
// -------------------------------- ВЫКЛЮЧЕН ------------------------------ //
if (digitalRead (buttonRgbLedOff) == LOW)
{
digitalWrite(GREEN, LOW);
digitalWrite(RED, LOW);
digitalWrite(BLUE, LOW);
}
}
ЧТО ОН ДЕЛАЕТ: Вообще ничего, ничего не загорается, ничего не происходит, я немного сбит с толку
Я такой новичок в этом, извините, если я делаю что-то не так на этом форуме
@salfysox, 👍1
Обсуждение1 ответ
Ваша программа делает вещи слишком сложными. Вам следует переосмыслить всю свою стратегию.
Мой предпочтительный метод - иметь "целевой" цвет и "текущий" цвет. Когда вы нажимаете кнопку, вы просто меняете свой целевой цвет. И затем на каждой итерации с помощью функции loop()
(либо замедленной с небольшой задержкой ()
, либо запускаемой с помощью millis()
) вы сравниваете целевой и текущий цвета, и если они отличаются, то перемещаете текущий цвет на шаг ближе к целевому цвету.
Таким образом, вы удаляете всю логику "если это нажато, но не это, то исчезнет между этими двумя цветами", вместо этого это просто "если это нажато, тогда я хочу перейти к этому цвету", и изменение цвета полностью независимо.
Некоторое время назад я написал сообщение в блоге на эту тему, которое может оказаться вам полезным.
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Прерывание при нажатии кнопки + устранение дребезга
- Светодиод с кнопочным управлением Arduino со сборкой AVR
- Как повторить другое действие внутри цикла?
- Изменение состояния светодиода с помощью кнопки приводит к нестабильному результату
Похоже, вы не подключили кнопки к заземлению., @Edgar Bonet
Вы подключили кнопки к синей шине питания макетной платы, но не подключили ее к заземлению на Arduino, @chrisl
вставьте слой разделения между обнаружением нажатия клавиши и результирующим изменением яркости светодиода ... не выполняйте команду "при нажатии кнопки установить яркость светодиода
... вместо этого сделайте "если нажата кнопка, установите переменную deltaRed=1" ... затем далее в loop() делаем
redValue += deltaRed; горит красный светодиод`, @jsotolaЗЕЛЕНЫЙ == ВЫСОКИЙ
никогда не будет истинным, это сравнение между двумя константами, @Ben Voigt