прерывание функции
- Войдите на сайт для отправки комментариев
Пнд, 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 .
Точнее спросите у того, кто запретил Вам вставлять полный код и обкорнал его перед вставкой.
const int button2Pin = 9; const int led2Pin = 8; const int led1Pin = 7; #define sensor 5 unsigned long led2OnTime; bool led2On; bool led1On; bool ledOff; bool timer; bool lastButton; bool lastButton2; int status_led1Pin; void setup() { pinMode(led2Pin, OUTPUT); pinMode(led1Pin, OUTPUT); pinMode(sensor, INPUT); pinMode(button2Pin, INPUT); led2On = false; led1On = false; ledOff = false; timer = false; lastButton = LOW; lastButton2 = LOW; } void loop() { 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; } } //if(ledOff) }кто подскажет как прервать экстренно if(led1On)
а зачем прерывать? приведенный код - неблокирующий, его исполнение занимает микросекунды и потом программа сама перейдет к проверке кнопки.
Добавте вначале условие, что-то типа
и ничего прерывать не надо
led1On - зажигает светодиод датчика и необходимо экстренно прервать свечение если кнопка LOW. иначе устройство №2 выдаст ошибку датчика. Потому что led1On продолжает выполнение в течении 5000 миллисекунд если ее не прервать.
Потому что led1On продолжает выполнение в течении 5000 миллисекунд если ее не прервать.
Вы ошибаетесь.
Если код выше соответвует тому, что вы заливаете в контроллер, в течении этих 5 секунд у вас кнопка проверяется десятки тысяч раз. Если вы добавите ту строчку, что я написал - по условию digitalRead(button2Pin) == LOW у вас led1On будет выключаться практически мгновенно.
пробовал добавлять условия но диод led1On уходил в цикл либо загорался после того как перевести кнопку в HIGH а потом в LOW. так и не понял где ошибка написал вам
ок проверяю. результат отпишу
пробовал добавлять условия но диод led1On уходил в цикл либо загорался после того как перевести кнопку в HIGH а потом в LOW. так и не понял где ошибка написал вам
код показывайте. как пробовали
добавил в код
if (digitalRead(button2Pin) == LOW) led1On = false; if (digitalRead(button2Pin) == HIGH && lastButton == LOW){ timer = true; led2OnTime = millis(); lastButton = HIGH; ledOff = true; }теперь led1On не выполняется даже когда button2Pin HIGH
монитор
Да
добавил в код
я бы сделал так:
if(led1On) 54 if(millis() - led2OnTime >= 200) { 55 digitalWrite(led1Pin, HIGH&&digitalRead(нужная кнопка)); 56 if(millis() - led2OnTime >= 5000) { 57 digitalWrite(led1Pin, LOW); 58 led1On = false; 59 lastButton = LOW; 60 61 // ledOff = true; 62 }я бы сделал так:
Так проверка кнопки будет вызываться только с частотой таймера в строке 54, а это не то, что хочет ТС
Это только направление куда смотреть а не готовое решение
const int button2Pin = 9; const int led2Pin = 8; const int led1Pin = 7; #define sensor 5 unsigned long led2OnTime; bool led2On; bool led1On; bool ledOff; bool timer; bool lastButton; bool lastButton2; int status_led1Pin; void setup() { Serial.begin(9600); pinMode(led2Pin, OUTPUT); pinMode(led1Pin, OUTPUT); pinMode(sensor, INPUT); pinMode(button2Pin, INPUT); led2On = false; led1On = false; ledOff = false; timer = false; lastButton = LOW; lastButton2 = LOW; } void loop() { status_led1Pin = digitalRead(button2Pin); Serial.print("button2Pin "); Serial.println(status_led1Pin); Serial.print("led1On "); Serial.println(led1On); if (digitalRead(button2Pin) == LOW) led1On = false; 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; } } }const int button2Pin = 9; const int led2Pin = 8; const int led1Pin = 7; #define sensor 5 unsigned long led2OnTime; bool led2On; bool led1On; bool ledOff; bool timer; bool lastButton; bool lastButton2; int status_led1Pin; void setup() { Serial.begin(9600); pinMode(led2Pin, OUTPUT); pinMode(led1Pin, OUTPUT); pinMode(sensor, INPUT); pinMode(button2Pin, INPUT); led2On = false; led1On = false; ledOff = false; timer = false; lastButton = LOW; lastButton2 = LOW; } void loop() { status_led1Pin = digitalRead(button2Pin); Serial.print("button2Pin "); Serial.println(status_led1Pin); Serial.print("led1On "); Serial.println(led1On); //if (digitalRead(button2Pin) == LOW) led1On = false; 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 && digitalRead(button2Pin) == HIGH); if(millis() - led2OnTime >= 5000) { digitalWrite(led1Pin, LOW); led1On = false; lastButton = LOW; } } }результат
+ логике в этой строке я не понял))
Arduinchlk
Во-первых, значение lastButton кто за вас будет правильно выставлять?
Во-вторых - как подключены кнопки? замыкаются на питание или на GND ? подтяжка есть7
И вообще, вы бы задачу правильно сформулировали... а то сейчас я вам сделаю, что таймер работает только при нажатой кнопке - а вы мне потом скажете. что это не то, что вы хотели.
Чтобы нам не тратить время зря - пишите четко, что должен делать этот код, нафига тут таймер и все булевские переключатели типа led1On и аналогичные
кнопка замыкается на землю GND. в не нажатом состоянии HIGH
Во-первых, значение lastButton - подскажите получается в setup задать значение неправильно? должно быть считывание кнопки и если оно LOW только тогда присвоить lastButton LOW?
кнопка замыкается на землю GND. в не нажатом состоянии HIGH
подтяжку кнопки к питанию включайте. без этого будет нестабильно
сетап не трогайте, а вот это верно:
>>> если оно LOW только тогда присвоить lastButton LOW
const int button2Pin = 9; const int led2Pin = 8; const int led1Pin = 7; #define sensor 5 unsigned long led2OnTime; bool led2On; bool led1On; bool ledOff; bool timer; bool lastButton; bool lastButton2; int status_led1Pin; void setup() { Serial.begin(9600); pinMode(led2Pin, OUTPUT); pinMode(led1Pin, OUTPUT); pinMode(sensor, INPUT); pinMode(button2Pin, INPUT); led2On = false; led1On = false; ledOff = false; timer = false; // lastButton = LOW; // lastButton2 = LOW; } void loop() { status_led1Pin = digitalRead(button2Pin); Serial.print("button2Pin "); Serial.println(status_led1Pin); Serial.print("led1On "); Serial.println(led1On); if (digitalRead(button2Pin) == LOW) lastButton = 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 && digitalRead(button2Pin) == HIGH) { digitalWrite(led1Pin, LOW); led1On = false; lastButton = LOW; } } }монитор
пипец...
Мыслей никаких, да?
Если вы не будете пытаться думать сами - я ухожу из темы. писать код за вас я не собираюсь. И слушайте внимательно, когда вам говорят. Я вас просил включить подтяжку - игнорируете?
кнопка замыкается на землю GND. в не нажатом состоянии HIGH
подтяжку кнопки к питанию включайте. без этого будет нестабильно
сетап не трогайте, а вот это верно:
>>> если оно LOW только тогда присвоить lastButton LOW
1. создать процедуру от дребезга кнопки с задержкой?
2. как выполнить подтяжку кнопки правильно в данном случае?
сейчас попробую пару идей реализовать напишу. по замечаниям я выше отписался
Что значит остановить участок кода-это значит убрать событие (условие), его вызывающее,
if(led1On){if(условие останова)
{
led1On=!led1On;}
}вернуть выходы в нач. состояние,
счетчики в ноль
упростил код думал найду проблему в итоге имею контакт 12 он же кнопка +5 вольт но условие срабатывает когда замыкаю на землю
if (digitalRead(button2Pin) == HIGH){в чем может быть проблема или мое упущение (пробовал другой контакт 9 ранее также) пробовал и так pinMode(button2Pin, INPUT_PULLUP); но все равно происходит инверсия какая то. прошу пояснить знающих условие срабатывает при замыкании на землю/ дабы исключить в моем исполнение дребезг кнопки. перед загрузкой скетча сразу замыкаю кнопку на землю. загружаю скетч функция срабатывает
const int button2Pin = 12; const int led2Pin = 8; const int led1Pin = 7; #define sensor 5 unsigned long led2OnTime; bool led2On; bool led1On; bool ledOff; bool timer; bool lastButton; bool lastButton2; int status_led1Pin; bool status_led1; bool status_led2; void setup() { Serial.begin(9600); pinMode(led2Pin, OUTPUT); pinMode(led1Pin, OUTPUT); pinMode(sensor, INPUT); pinMode(button2Pin, INPUT); led2On = false; led1On = false; ledOff = false; timer = false; // lastButton = LOW; // lastButton2 = LOW; } void loop() { Serial.print("button2Pin "); Serial.println(digitalRead(button2Pin)); Serial.print("led1 "); Serial.println(digitalRead(led1Pin)); Serial.print("led2 "); Serial.println(digitalRead(led2Pin)); if (digitalRead(button2Pin) == HIGH){ led2OnTime = millis(); digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); } if (millis() - led2OnTime >= 1000){ digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, HIGH); } if(millis() - led2OnTime >= 1200) { digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, HIGH); } if(millis() - led2OnTime >= 2200) { digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, LOW); } if(millis() - led2OnTime >= 7200) { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); } }когда ставлю условие
if (digitalRead(button2Pin) == LOW){ pinMode(button2Pin, INPUT_PULLUP);срабатывает при положительно контакте 5+ на кнопке (нормально замкнута на землю)
так и не должно работать я правильно понимаю?
срабатывает при положительно контакте 5+ на кнопке (нормально замкнута на землю)
На схему можно посмотреть?
Если плюс на минус замыкать, то ещё и не такие спецэффекты попрут.
Вот и я ж про то же. Только, боюсь, схемы нам не увидеть.
Схему обрисовать завтра могу. Может действительно обвязку спалил
Мультиметр тоже могу показания снять
Обвязывать получается в любом случае нужно. Эх ютуб не учебник)
Если можно, выскажу своё дилетантское мнение: комментирование действий очень помогает понять, что должно происходить, за что отвечает каждая переменная.
Если можно, выскажу своё дилетантское мнение: комментирование действий очень помогает понять, что должно происходить, за что отвечает каждая переменная.
Можно я тоже выскажу?
Если кнопка
Ну я надеюсь, просто автор недосказал и схема такая
автор недосказал
Пока ТС не приведёт схемы, лично я ничего обсуждать не буду.
А то мы тут как-то целый день пальцы об клавиши били, пока из автора клещами не вытащили схему, и не увидели, что на ATiny85 аналоговый сигнал с ADC0 читает.
Нефиг, если ТС в лом привести схему для решения СВОЕЙ проблемы, то мне ещё более в лом разводить кофейную гущу для решения ЕГО проблемы.
добрался до компа всем привет
готов продолжить поиск ошибки
Ну я надеюсь, просто автор недосказал и схема
Полюбуйтесь на его схему!
А я Вам что говорил?! Не первый день тут время убиваю.
что скажете доктор?
Вам в посте #20 говорил про подтяжку, где она? Почему её нет ни в схеме, ни в коде? Как минимум в строке 26 (по коду из #26) заменяйте INPUT на INPUT_PULLUP.
Где токоограничивающие резисторы у светодиодов? Как Вы могли их вот так поставить? Покажите мне хоть один забор, на котором написано, что так можно!
UPD:
Это сделайте обязательно, потом выложите снова схему и код (тот бред, что Вы называете кодом) в одном посте. Тогда продолжим.
да в коде поменял на INPUT_PULLUP
по резисторам извиняюсь не указал просто поторопился отправить схему
и условие поменял
48if(digitalRead(button2Pin) == LOW){49led2OnTime = millis();50digitalWrite(led1Pin, LOW);51digitalWrite(led2Pin, LOW);52}теперь корректно работает все и любой оператор прерывает функцию
Спасибо огромное
Тваюждивизию!
Т.е. вместо актуальной схемы и актуального кода я сидел и разбирался в каком-то фуфле из-за того, что Вы поторопились?
Ну-ну!
Быстро поменял просто. условие срабатывания и пин мод кнопки.
ничего больше не менял
const int button2Pin = 12; const int led2Pin = 8; const int led1Pin = 7; #define sensor 5 unsigned long led2OnTime; bool led2On; bool led1On; bool ledOff; bool timer; bool lastButton; bool lastButton2; int status_led1Pin; bool status_led1; bool status_led2; void setup() { Serial.begin(9600); pinMode(led2Pin, OUTPUT); pinMode(led1Pin, OUTPUT); pinMode(sensor, INPUT); pinMode(button2Pin, INPUT_PULLUP); led2On = false; led1On = false; ledOff = false; timer = false; // lastButton = LOW; // lastButton2 = LOW; } void loop() { Serial.print("button2Pin "); Serial.println(digitalRead(button2Pin)); Serial.print("led1 "); Serial.println(digitalRead(led1Pin)); Serial.print("led2 "); Serial.println(digitalRead(led2Pin)); if (digitalRead(button2Pin) == LOW){ led2OnTime = millis(); digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); } if (millis() - led2OnTime >= 1000){ digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, HIGH); } if(millis() - led2OnTime >= 1200) { digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, HIGH); } if(millis() - led2OnTime >= 2200) { digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, LOW); } if(millis() - led2OnTime >= 7200) { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); } }Программа выглядит бредово, но это ладно. Но зачем что-то делать (вычислять), когда кнопка не нажата? Процессор тренировать?
И кроме того строки 42-44 постоянно гасят светодиоды при нажатой кнопке (каждый цикл программы).