Здравствуйте уважаемые форумчане! Помогите пожалуйста исправить (дописать) скетч. Идея такая: при нажатии и удержании кнопки, светодиод горит с минимальной яркостью. Отпускаем кнопку- светодиод гаснет, нажимаем (и удерживаем) снова- светодиод горит ярче и т.д по кругу. Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 1 секунды. Если пауза более одной секунды, то независимо в каком предидущем состоянии яркости был светодиод, он зажигался с минимальной яркостью. Типа цикл начинается сначала. Вот сам скетч: int switchPin = 10; int ledPin = 11; boolean lastButton = LOW; int ledLevel = 0; // boolean currentButton = LOW; int stepp = 51; void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if (last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp } lastButton = currentButton; if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255 // и вместо нуля включаем мин яркость if (currentButton==HIGH) analogWrite(ledPin, ledLevel); // эта строчка будет зажигать светодиод с нужной яркостью //но только если кнопка нажата else analogWrite(ledPin, 0); // а иначе выключаем все }
[ code=cpp] тут код на языке C++ // пробелы убрать надо [ /code] В ардуино IDE есть функция "копировать для форума" (CTRL + SHIFT + C)
Код (C++): int switchPin = 10; int ledPin = 11; boolean lastButton = LOW; int ledLevel = 0; // boolean currentButton = LOW; int stepp = 51; void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if (last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp } lastButton = currentButton; if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255 // и вместо нуля включаем мин яркость if (currentButton==HIGH) analogWrite(ledPin, ledLevel); // эта строчка будет зажигать светодиод с нужной яркостью //но только если кнопка нажата else analogWrite(ledPin, 0); // а иначе выключаем все }
Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 1 секунды. Если пауза более одной секунды, то независимо в каком предидущем состоянии яркости был светодиод, он зажигался с минимальной яркостью. Типа цикл начинается сначала.
Сколько всего градаций яркости должно быть? То есть сколько раз нужно правильно нажать чтобы светодиод загорелся максимально ярко. И что должно произойти после этого? Цикл начнется сначала или что?
Код (C++): bool CheckButton() { bool CheckButton() { if(!(digitalRead(BUTTONPIN))) return false; unsigned long time = millis(); while(digitalRead(BUTTONPIN)) { while(!(digitalRead(BUTTONPIN)){} } if (millis() - time < 1000) return true; else return false; } } Функция проверки кнопки.
Градаций будет пять, или шесть или три... это не важно. Значение 51 изменить не проблемма. и после самого яркого включения светодиода, при след нажатии, он загорается с минимальной яркостью, цикл начинается сначала.
Не знаю даже как помочь. Мне править чужой код, тем более с чуждой обработкой дребезга, не хочется вообще. Проще свой написать.
Сразу предупреждаю, код на работоспособность не проверял. Код (C++): void loop() { static unsigned long prev_millis = 0; currentButton = debounce(lastButton); if (currentButton != lastButton) { if (currentButton == HIGH) { if ( (millis() - prev_millis <= 1000) && (ledLevel + stepp <= 255)) { ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp } else { ledLevel = stepp; } } else { ledLevel = 0; prev_millis = millis(); } lastButton = currentButton; } analogWrite(ledPin, ledLevel); }
Всё получилось! Всем БОЛЬШОЕ спасибо!!! Кажется разобрался... сделал вот так и всё заработало. Код (C++): int switchPin = 10; int ledPin = 11; boolean lastButton = LOW; int ledLevel = 0; // boolean currentButton = LOW; int stepp = 85; void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if (last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { static long unsigned lastButtonPressedTime = 0; if (millis() - lastButtonPressedTime > 1000) ledLevel = 0; currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { lastButtonPressedTime = millis(); ledLevel = ledLevel + stepp; // Меняем значение яркости на stepp } lastButton = currentButton; if (ledLevel > 255) ledLevel = stepp; // Ограничиваем макс. значение в 255 // и вместо нуля включаем первую скорость if (currentButton==HIGH) analogWrite(ledPin, ledLevel); // эта строчка будет зажигать светодиод с нужной яркостью //но только если кнопка нажата else analogWrite(ledPin, 0); // а иначе выключаем все }