Нужно переключать яркость светодиода
Так что это в значительной степени объяснительно. Я новичок в 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);
}
Приведенный выше код включает светодиод и меняет яркость, как и должно быть, однако по какой-то причине он отключает кнопку. Выньте аналоговые записи, кроме первой, и кнопка будет переключать светодиод. какие-нибудь предложения о том, что я мог бы сделать? Я новичок в этом деле.
@Steven , 👍-1
Обсуждение2 ответа
Лучший ответ:
Что-то вроде этого, с объявлениями переменных & 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
Все линии задержки (200) не позволяют скетчу читать нажатия кнопок.
Вам нужно изучить функцию «Моргание без задержки», чтобы ваш эскиз мог делать что-то иное, а не сидеть вслепую, ожидая, пока время пройдет.
Так что теперь я без промедления читаю о блинке. Если бы мне пришлось удалить дополнительные части кода AnalogWrite(led,ledLevel), как бы я это реализовал. Первое нажатие кнопки включит светодиод и будет непрерывно переключать следующие ШИМ (51, 102, 153, 204, 255). Второе нажатие кнопки выключит светодиод независимо от того, в каком режиме ШИМ установлен светодиод. Третье нажатие кнопки перезапустит процесс. Если бы нужно было реализовать millis(), как я мог бы сделать это с помощью AnalogWrite(), чтобы иметь возможность поэтапно регулировать яркость светодиода? Я получаю только примеры с digitalWrite., @Steven
Что вы делаете, так это проверяете, сколько времени прошло, и когда пройдет достаточно времени, вы делаете что-то еще. Точно так же, как смотреть на часы на стене во время выпечки торта. Зафиксируйте время сейчас, чтобы начать, затем зафиксируйте время при каждом прохождении цикла() после этого и посмотрите, прошло ли достаточно времени, чтобы что-то сделать., @CrossRoads
- Как использовать SPI на Arduino?
- Как создать несколько запущенных потоков?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Если вы не уверены, как продолжить, разделите проблему на более мелкие и убедитесь, что какая-то часть работает, прежде чем использовать ее с другими частями. Вы можете разделить свой эскиз на разные части. Я вижу четыре части: кнопку чтения с устранением дребезга, уведомление о нажатии кнопки, обработку этой информации для трех состояний (яркость, выключение, перезапуск) и установку яркости светодиода. Если вы четко покажете четыре части на своем эскизе, то при нажатии кнопки будет легко распечатать сообщение. Это облегчает тестирование этой части., @Jot