Помогите иправить скетч.
- Войдите на сайт для отправки комментариев
Ср, 28/09/2016 - 18:33
Здравствуйте уважаемые форумчане!
Помогите пожалуйста исправить (дописать) скетч.
Идея такая: при нажатии и удержании кнопки, светодиод горит с минимальной яркостью. Отпускаем кнопку- светодиод тухнет, нажимаем (и удерживаем) снова- светодиод горит ярче и т.д по кругу.
Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 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);
// а иначе выключаем все
}
Ну?
Этот скетч как-то не так работает? Или выглядит криво? Или некошерный?
Вы забыли описать свою проблему. Проблема-то Ваша в чём?
Или ни в чём и Вы просто этот скетч выложили как урок для начинающих?
Да, кстати, перевыловжите по правилам - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Задача сделать так, чтоб условие выполнения цикла выполнялось в том случае, если пауза между нажиманиями кнопки была не более 1 секунды. Если пауза более одной секунды, то независимо в каком предидущем состоянии яркости был светодиод, он зажигался с минимальной яркостью. Типа цикл начинается сначала.
В строке 33 Вы не ограничиваете занчением 255, а начинаете с начала (с 51).
А по поводу секунды. ну, при каждом нажатии кнопки запоминайте текущее значение millis(), а при каждом входе в loop сравнивайте текущиё millis с запомненным при последнем нажатии. И если разница больше секунды, сьрасывайте ledLevel в 0
Я примерно себе это так и представляю... но как это всё правильно должно выглядеть, и где должно находиться не знаю. Я в програмировании почти полный ноль, поэтому и прошу помощи
Ну, не знаю, Вы где меняеете яркость? В строке 29! Вот и присобачьте рядом с ней (поеред или после) запоминание времени, когда в последний раз меняли:
Саму переменную lastButtonPressedTime опишите в самом начале функции loop() примерно так
И сразу после её описания поставьте проверку о которой я говорил
Кажется, всё. Должно как-то работать.
Ура! Всё получилось!!! ОГРОМНОЕ ВАМ СПАСИБО!!!
Незачто
Вот только что заметил... оказывается немного не так всё работает... с паузами всё в порядке, а вот со свечением светодиода какая-то фигня. Он горить всего секунду и гаснет, не зависимо в какой градации яркости, при этом кнопка нажата. А нужно чтоб горел когда кнопка нажата.
Поправьте пожалуйста...
Тогда Вам нужно кроме факта нажатия, ловить ещё и факт отпускания. И время считать не от последнего нажатия, а от последнего отпускания, а впромежутке между нажатием и отпусканием яркость вообще не менять. Раньше Вы про это вроде не говорили. Ну, в общем, модификация-то несложная. Только Вы продумайте всё в комплексе, а то опять потом что-то вылезет.
Всё. проблемма решилась. Всем спасибо!!! Тему можно закрывать))
C Победой!