прерывание функции
- Войдите на сайт для отправки комментариев
Пнд, 12/04/2021 - 13:47
привет знатокам
кто подскажет как прервать экстренно if(led1On) если (digitalRead(button2Pin) == LOW ?
if (digitalRead(button2Pin) == HIGH && lastButton == LOW){ timer = true; led2OnTime = millis(); lastButton = HIGH; ledOff = true; } if(timer) if (millis() - led2OnTime >= 1000){ digitalWrite(led2Pin, HIGH); digitalWrite(led1Pin, LOW); led2On = true; led1On = true; led2OnTime = millis(); timer = false; } if(led2On) if(millis() - led2OnTime >= 1200) { digitalWrite(led2Pin, LOW); led2On = false; } if(led1On) if(millis() - led2OnTime >= 200) { digitalWrite(led1Pin, HIGH); if(millis() - led2OnTime >= 5000) { digitalWrite(led1Pin, LOW); led1On = false; lastButton = LOW; // ledOff = true; } }
return или break .
Точнее спросите у того, кто запретил Вам вставлять полный код и обкорнал его перед вставкой.
кто подскажет как прервать экстренно if(led1On)
а зачем прерывать? приведенный код - неблокирующий, его исполнение занимает микросекунды и потом программа сама перейдет к проверке кнопки.
Добавте вначале условие, что-то типа
и ничего прерывать не надо
led1On - зажигает светодиод датчика и необходимо экстренно прервать свечение если кнопка LOW. иначе устройство №2 выдаст ошибку датчика. Потому что led1On продолжает выполнение в течении 5000 миллисекунд если ее не прервать.
Потому что led1On продолжает выполнение в течении 5000 миллисекунд если ее не прервать.
Вы ошибаетесь.
Если код выше соответвует тому, что вы заливаете в контроллер, в течении этих 5 секунд у вас кнопка проверяется десятки тысяч раз. Если вы добавите ту строчку, что я написал - по условию digitalRead(button2Pin) == LOW у вас led1On будет выключаться практически мгновенно.
пробовал добавлять условия но диод led1On уходил в цикл либо загорался после того как перевести кнопку в HIGH а потом в LOW. так и не понял где ошибка написал вам
ок проверяю. результат отпишу
пробовал добавлять условия но диод led1On уходил в цикл либо загорался после того как перевести кнопку в HIGH а потом в LOW. так и не понял где ошибка написал вам
код показывайте. как пробовали
добавил в код
теперь led1On не выполняется даже когда button2Pin HIGH
монитор
Да
добавил в код
я бы сделал так:
я бы сделал так:
Так проверка кнопки будет вызываться только с частотой таймера в строке 54, а это не то, что хочет ТС
Это только направление куда смотреть а не готовое решение
результат
+ логике в этой строке я не понял))
Arduinchlk
Во-первых, значение lastButton кто за вас будет правильно выставлять?
Во-вторых - как подключены кнопки? замыкаются на питание или на GND ? подтяжка есть7
И вообще, вы бы задачу правильно сформулировали... а то сейчас я вам сделаю, что таймер работает только при нажатой кнопке - а вы мне потом скажете. что это не то, что вы хотели.
Чтобы нам не тратить время зря - пишите четко, что должен делать этот код, нафига тут таймер и все булевские переключатели типа led1On и аналогичные
кнопка замыкается на землю GND. в не нажатом состоянии HIGH
Во-первых, значение lastButton - подскажите получается в setup задать значение неправильно? должно быть считывание кнопки и если оно LOW только тогда присвоить lastButton LOW?
кнопка замыкается на землю GND. в не нажатом состоянии HIGH
подтяжку кнопки к питанию включайте. без этого будет нестабильно
сетап не трогайте, а вот это верно:
>>> если оно LOW только тогда присвоить lastButton LOW
монитор
пипец...
Мыслей никаких, да?
Если вы не будете пытаться думать сами - я ухожу из темы. писать код за вас я не собираюсь. И слушайте внимательно, когда вам говорят. Я вас просил включить подтяжку - игнорируете?
кнопка замыкается на землю GND. в не нажатом состоянии HIGH
подтяжку кнопки к питанию включайте. без этого будет нестабильно
сетап не трогайте, а вот это верно:
>>> если оно LOW только тогда присвоить lastButton LOW
1. создать процедуру от дребезга кнопки с задержкой?
2. как выполнить подтяжку кнопки правильно в данном случае?
сейчас попробую пару идей реализовать напишу. по замечаниям я выше отписался
Что значит остановить участок кода-это значит убрать событие (условие), его вызывающее,
if
(led1On)
{
if(условие останова)
{
led1On=!
led1On;}
}
вернуть выходы в нач. состояние,
счетчики в ноль
упростил код думал найду проблему в итоге имею контакт 12 он же кнопка +5 вольт но условие срабатывает когда замыкаю на землю
в чем может быть проблема или мое упущение (пробовал другой контакт 9 ранее также) пробовал и так pinMode(button2Pin, INPUT_PULLUP); но все равно происходит инверсия какая то. прошу пояснить знающих условие срабатывает при замыкании на землю/ дабы исключить в моем исполнение дребезг кнопки. перед загрузкой скетча сразу замыкаю кнопку на землю. загружаю скетч функция срабатывает
когда ставлю условие
срабатывает при положительно контакте 5+ на кнопке (нормально замкнута на землю)
так и не должно работать я правильно понимаю?
срабатывает при положительно контакте 5+ на кнопке (нормально замкнута на землю)
На схему можно посмотреть?
Если плюс на минус замыкать, то ещё и не такие спецэффекты попрут.
Вот и я ж про то же. Только, боюсь, схемы нам не увидеть.
Схему обрисовать завтра могу. Может действительно обвязку спалил
Мультиметр тоже могу показания снять
Обвязывать получается в любом случае нужно. Эх ютуб не учебник)
Если можно, выскажу своё дилетантское мнение: комментирование действий очень помогает понять, что должно происходить, за что отвечает каждая переменная.
Если можно, выскажу своё дилетантское мнение: комментирование действий очень помогает понять, что должно происходить, за что отвечает каждая переменная.
Можно я тоже выскажу?
Если кнопка
Ну я надеюсь, просто автор недосказал и схема такая![](/sites/default/files/resize/u62009/img_20210416_181818-280x145.jpg)
автор недосказал
Пока ТС не приведёт схемы, лично я ничего обсуждать не буду.
А то мы тут как-то целый день пальцы об клавиши били, пока из автора клещами не вытащили схему, и не увидели, что на ATiny85 аналоговый сигнал с ADC0 читает.
Нефиг, если ТС в лом привести схему для решения СВОЕЙ проблемы, то мне ещё более в лом разводить кофейную гущу для решения ЕГО проблемы.
добрался до компа всем привет
готов продолжить поиск ошибки
Ну я надеюсь, просто автор недосказал и схема
Полюбуйтесь на его схему!
А я Вам что говорил?! Не первый день тут время убиваю.
что скажете доктор?
Вам в посте #20 говорил про подтяжку, где она? Почему её нет ни в схеме, ни в коде? Как минимум в строке 26 (по коду из #26) заменяйте INPUT на INPUT_PULLUP.
Где токоограничивающие резисторы у светодиодов? Как Вы могли их вот так поставить? Покажите мне хоть один забор, на котором написано, что так можно!
UPD:
Это сделайте обязательно, потом выложите снова схему и код (тот бред, что Вы называете кодом) в одном посте. Тогда продолжим.
да в коде поменял на INPUT_PULLUP
по резисторам извиняюсь не указал просто поторопился отправить схему
и условие поменял
48
if
(digitalRead(button2Pin) == LOW){
49
led2OnTime = millis();
50
digitalWrite(led1Pin, LOW);
51
digitalWrite(led2Pin, LOW);
52
}
теперь корректно работает все и любой оператор прерывает функцию
Спасибо огромное
Тваюждивизию!
Т.е. вместо актуальной схемы и актуального кода я сидел и разбирался в каком-то фуфле из-за того, что Вы поторопились?
Ну-ну!
Быстро поменял просто. условие срабатывания и пин мод кнопки.
ничего больше не менял
Программа выглядит бредово, но это ладно. Но зачем что-то делать (вычислять), когда кнопка не нажата? Процессор тренировать?
И кроме того строки 42-44 постоянно гасят светодиоды при нажатой кнопке (каждый цикл программы).