Хитрый таймер!
- Войдите на сайт для отправки комментариев
Вс, 13/12/2020 - 23:23
Доброе время суток!!! Прошу помощи в корректировки кода, идея такова при нажатии и удержании PIN_BUTTON1, analogOutPin2 становиться HIGH на время outputValue, после чего код останавливается и ждет повторного нажатия PIN_BUTTON1, но у меня получился только блинк при удержании PIN_BUTTON1. Прошу Вашей помощи!!!
const int analogInPin1 = A0; // потенциометр к A0 const int analogOutPin1 = 13; // светодиод на выводе 13 const int analogOutPin2 = 12; // светодиод на выводе 12 const int PIN_BUTTON1 = 2; // кнопка 1 uint32_t myTimer; // таймер int sensorValue = 0; // значения от потенциометра int outputValue = 0; // значения для PWM int buttonState = 0; // переменная кнопки void setup() { pinMode(12, OUTPUT); pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { buttonState = digitalRead(PIN_BUTTON1); sensorValue = analogRead(analogInPin1); outputValue = map(sensorValue, 0, 1023, 100, 3000); // печатаем результаты в Serial Monitor Serial.print("sensor = "); Serial.print(sensorValue); Serial.print("\t output = "); Serial.println(outputValue); if (buttonState == HIGH) { if (millis() - myTimer >= outputValue) { myTimer = millis(); // сбросить таймер digitalWrite(analogOutPin2, HIGH); delay(1); } else { // иначе выключаем светодиод digitalWrite(analogOutPin2, LOW); } } }
Непонятно, как возможно повторное нажатие на кнопку, которую еще не отпустили.
Извините...как только отпустили кнопку код должен ждать следующего нажатия.
Ваша ошибка в том, что Вы пытаетесь оттолкнуться от состояния кнопки, тогда как нужно отслеживать не само состояние, а переход из одного состояния в другое.
И, кстати, осталось непонятным, почему в исходном сообщении Вы пишете о нажатии и удержании.
Это только часть кода(начало), надо чтобы таймер начинал отсчет именно когда кнопка удерживается и значение менялось на LOW даже если время вышло но кнопка нажата. Когда время вышло но кнопка нажата надо ожидать следующего нажатия и удержания.
Не следующего нажатия, а отпускания и последующего нажатия с удержанием.
andriano на это и выводит - если вы сумеете описать все действия формальным языком, когда все детали операции будут вербализованы, а не домысливаться - тогда и сможете перевести свой алгоритм в исходный код. А до того времени ничего и не получится, ибо МК не собирается гадать, что вы за картинку у себя в голове нарисовали.
Это только часть кода(начало), надо чтобы таймер начинал отсчет именно когда кнопка удерживается и значение менялось на LOW даже если время вышло но кнопка нажата. Когда время вышло но кнопка нажата надо ожидать следующего нажатия и удержания.
Еще раз:
Непонятно, как возможно повторное нажатие на кнопку, которую еще не отпустили.
Oksymoron, Вы уж распишите подробно, что при каких условиях должно происходить. Пока Вы путаетесь в показаниях, ничего сделать невозможно.
еще один подход к решению задачи: если вы смотрели ДШ на какой нить лог элемент там часто встречается картинка график с логикой работы по шкале времени ну или таблица истинности. В вашем случае нужно нарисовать логику работы, а потом составить таблицу истинности - будет значительно проще, как для написания , так и для понимания.
Все понял. Проблема в отслеживании состояния кнопки, а если её не отслеживается, а как ещё можно остановить ход выполнения программы по условию?
Остановить выполнение программы нельзя. Но можно сделать так, чтобы работающая программа не совершала никаких полезных действий.
По простому:
while(условие) ;
Остановить выполнение программы нельзя.
Почему нельзя? Закрыть прерывания и завалиться спать в режиме POWER_DOWN. Это разве не "остановить"?
Остановить выполнение программы нельзя.
Почему нельзя? Закрыть прерывания и завалиться спать в режиме POWER_DOWN. Это разве не "остановить"?
Ну, вообще говоря, существуют и более радикальные методы, начиная с простого обесточивания, и заканчивая электроинструментом и взрывчатыми веществами.
Вот про последнее не надо - мы люди законопослушные и нам ст. 223.1 УК тут нафиг не нужна.
Хорошо, мы по простому
while(условие) abort();
Доброе время суток!!! Прошу помощи в корректировки кода, идея такова при нажатии и удержании PIN_BUTTON1, analogOutPin2 становиться HIGH на время outputValue, после чего код останавливается и ждет повторного нажатия PIN_BUTTON1, но у меня получился только блинк при удержании PIN_BUTTON1. Прошу Вашей помощи!!!
Может так
БОЛЬШОЕ СПАСИБО!!! То что надо...еще рас спасибо!!!