Нужно переключать яркость светодиода

Так что это в значительной степени объяснительно. Я новичок в Arduino и учусь как можно лучше. Мне нужно набросать код, в котором будет циклически переключаться между 5 различными настройками яркости светодиода. Одно нажатие будет переключаться между пятью, другое нажатие кнопки выключит светодиод, а еще одно нажатие перезапустит цикл.

const int led =11;
const int BUTTON = 7;
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledLevel = 0;


void setup()
{
  pinMode(led,OUTPUT);
  pinMode(BUTTON,INPUT);
}
boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);
  if (last != current)
{
  delay(5);
  current = digitalRead(BUTTON);
}
return current;
}

void loop()
{
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    ledLevel = ledLevel + 51;
  }
  lastButton = currentButton;
  if (ledLevel > 255) ledLevel = 0;
  analogWrite(led, ledLevel);
  analogWrite(led, ledLevel + 51);
  delay(200);
  analogWrite(led, ledLevel + 102);
  delay(200);
  analogWrite(led, ledLevel + 153);
  delay(200);
  analogWrite(led, ledLevel + 204);
  delay(200);
  analogWrite(led, ledLevel + 255);
}

Приведенный выше код включает светодиод и меняет яркость, как и должно быть, однако по какой-то причине он отключает кнопку. Выньте аналоговые записи, кроме первой, и кнопка будет переключать светодиод. какие-нибудь предложения о том, что я мог бы сделать? Я новичок в этом деле.

, 👍-1

Обсуждение

Если вы не уверены, как продолжить, разделите проблему на более мелкие и убедитесь, что какая-то часть работает, прежде чем использовать ее с другими частями. Вы можете разделить свой эскиз на разные части. Я вижу четыре части: кнопку чтения с устранением дребезга, уведомление о нажатии кнопки, обработку этой информации для трех состояний (яркость, выключение, перезапуск) и установку яркости светодиода. Если вы четко покажете четыре части на своем эскизе, то при нажатии кнопки будет легко распечатать сообщение. Это облегчает тестирование этой части., @Jot


2 ответа


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

0

Что-то вроде этого, с объявлениями переменных & setup() остается за вами. Все элементы времени имеют тип unsigned long.

pwmValue {} = [51, 102, 153, 204, 255];

void loop(){
  if (digitalRead(startButton) == LOW && pwmCycling == 0){ 
    // кнопка запуска нажата, но еще не запущена
    startTime = millis(); // фиксируем время нажатия кнопки
    pwmCycling = 1; // отслеживаем рабочее состояние. 0 — выключено, 1 — включено.
    }
  if (pwmCycling == 1){ // езда на велосипеде выполняется
    // вот где моргание без задержки:
    currentTime = millis(); // фиксируем время сейчас
    elapsedTime = currentTime - startTime; // смотрим, сколько времени прошло
    if (elapsedTime >= eventDuration){  // достаточно? начать следующую яркость
      currentTime = startTime; // настраиваем время следующего события
      brightNumber = brightNumber +1; // отслеживаем уровень яркости
      if (brightNumber >= 5){ brightNumber = 0; } // сброс после последнего уровня
      analogWrite (ledPin, pwmValue[brightNumber]); // записываем вывод светодиода
      }
    }
  if (digitalRead(startButton) == LOW && pwmCycling == 1){ 
    // кнопка запуска нажата, пока светодиоды вращаются, останавливаем их
    pwmCycling = 0;
    analogWrite (ledPin, 0);
    brightNumner = 4; //сбрасываем уровень яркости до конца
    delay (100); // немного глупой задержки устранения дребезга
    }
}
,

Мне удалось написать объявления и настройку. int pwmValue[] = {51, 102, 153, 204, 255}; const intledPin = 13; ИНТ startButton = 2; интервал pwmCycling; интервал начала времени = 0; интервал истекшего времени; интервал текущего времени; интервал событияDuration; INT BrightNumber; недействительная настройка() { pinMode (ledPin, ВЫХОД); pinMode (startButton, INPUT); startButton = миллис(); Я не получаю ошибок при компиляции эскиза. Однако кнопка вообще не включает светодиод. Я предполагаю, что проблема в настройке(). что мне следует искать?, @Steven

также не знаю, почему у меня не работает 4 пробела. Я попытался сохранить строки кода последней кнопки и текущей кнопки, ошибок по-прежнему не было, все равно не работало., @Steven

изменился на unsigned long и все равно ничего. Не уверен, чего мне не хватает., @Steven

Я не могу сделать больше, пока не вернусь домой и не попробую это сам., @CrossRoads


-1

Все линии задержки (200) не позволяют скетчу читать нажатия кнопок.

Вам нужно изучить функцию «Моргание без задержки», чтобы ваш эскиз мог делать что-то иное, а не сидеть вслепую, ожидая, пока время пройдет.

,

Так что теперь я без промедления читаю о блинке. Если бы мне пришлось удалить дополнительные части кода AnalogWrite(led,ledLevel), как бы я это реализовал. Первое нажатие кнопки включит светодиод и будет непрерывно переключать следующие ШИМ (51, 102, 153, 204, 255). Второе нажатие кнопки выключит светодиод независимо от того, в каком режиме ШИМ установлен светодиод. Третье нажатие кнопки перезапустит процесс. Если бы нужно было реализовать millis(), как я мог бы сделать это с помощью AnalogWrite(), чтобы иметь возможность поэтапно регулировать яркость светодиода? Я получаю только примеры с digitalWrite., @Steven

Что вы делаете, так это проверяете, сколько времени прошло, и когда пройдет достаточно времени, вы делаете что-то еще. Точно так же, как смотреть на часы на стене во время выпечки торта. Зафиксируйте время сейчас, чтобы начать, затем зафиксируйте время при каждом прохождении цикла() после этого и посмотрите, прошло ли достаточно времени, чтобы что-то сделать., @CrossRoads