Перерыл весь интернет, решил здесь спросить. С прерыванием с delay все понятно, но как сделать при нажатии кнопки, чтобы шилд работал 5 секунд и отключался даже если кнопка нажата все время и запускался снова при следующем нажатии на кнопку и опять 5 секунд работал? (чайник я...не пинайте) Пример скетча с прерыванием без delay() Код (C++): int ledPin = 13; // пин со светодиодом long OnTime = 5000; // время свечения светодиода, мс int ledState = LOW; int pinButton = 8; // пин, к которому подключена кнопка int pinButton2 = 7; // пин, к которому подключена кнопка2 unsigned long previousMillis = 0; void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis; if (ledState == HIGH) // если светодиод светится { currentMillis = millis(); if (currentMillis-previousMillis >= OnTime)// проверяем сколько прошло времени,если больше заданного - //выключаем { ledState = LOW; previousMillis = 0; digitalWrite(ledPin,ledState); } } if (digitalRead(pinButton) == HIGH)// если кнопка нажата - включаем светодиод { previousMillis = currentMillis; // запоминаем время ledState = HIGH; digitalWrite(ledPin,ledState); } if (digitalRead(pinButton2) == HIGH)// если кнопка2 нажата - включаем светодиод { previousMillis = currentMillis; // запоминаем время ledState = HIGH; digitalWrite(ledPin,ledState); } }
1. В коде запускающем действие зафиксировать (сохранить в переменной) значение счетчика миллисекунд. См. https://www.arduino.cc/en/Reference/Millis 2. В loop() проверять, разность между текущим значением миллисекунд и сохраненным значением. Если разность не достигла нужного значения, то ничего не делать, если достигла - выполнить код останавливающий действие. 3. Предусмотреть переменную-флаг, при установке которой контроль времени в п. 2 производить не нужно, не забыть устанавливать этот флаг в п.2 и сбрасывать в п.1.
Первые 2 пункта я прописал в скетче выше. А вот как сделать проверку на удержание кнопки и "игнорировать это удержание" не могу понять.
Код (C++): bool BtnUp1 = true; /*....*/ loop() { if (!digitalRead(pinButton)) { Delay(5); if (!digitalRead(pinButton)) BtnUp1=true; }; /*,,,*/ if((digitalRead(pinButton) && BtnUp1) { // если кнопка нажата - включаем светодиод BtnUp1 = false; /*,,,,*/ } /*....*/ Например, так. Т.е. если кнопку не отпускать, то светодиод погаснет и загораться не будет. Для вдохновения имеет смысл разобраться с базовыми примерами из вики, в частности, работа с кнопками: http://wiki.amperka.ru/конспект-arduino:кнопочный-переключатель
Выкладываю код для нубят вроде меня, ищущих решения. Спасибо GhostX с ресурса "аврки". Там помогли...и я здесь помогу. Нажали кнопку(кликнули) или нажав удерживаем, светодиод горит заданное время (в нашем случае 1 секунда) и гаснет...независимо удерживаем мы кнопку или нет. Так же жмем(клик) вторую кнопку или нажав удерживаем, тот же светодиод горит заданное время (1 секунда) и гаснет...независимо удерживаем мы кнопку или нет. Код (C++): int ledPin = 13; // пин со светодиодом long OnTime = 1000; // время свечения светодиода, мс int ledState = LOW; int pinButton = 7; // пин, к которому подключена кнопка int pinButton2 = 9; // пин, к которому подключена кнопка2 unsigned long previousMillis = 0UL; bool key = true; bool keyLOW = true; void setup() { pinMode(ledPin, OUTPUT); pinMode(pinButton, INPUT); pinMode(pinButton2, INPUT); } void loop() { digitalWrite(ledPin,ledState); // включаем или гасим диод в зависимости от переменной ledState if (millis()- previousMillis >= OnTime){ // таймер пяти секунд ledState = LOW; //потушить по истечении времени } if ((digitalRead(pinButton2) == LOW) && (keyLOW == false)) keyLOW = true;// триггер на отжатие кнопки, пока не отожмешь не пустит в если где проверяет нажатие. if ((digitalRead(pinButton2) == HIGH) && (keyLOW == true)){ // если нажата кнопка и ключ true то previousMillis = millis(); // запоминаем время когда она нажалать ledState = HIGH; // взводим ключ на включение. keyLOW = false; } if ((digitalRead(pinButton) == LOW) && (key == false)) key = true; if ((digitalRead(pinButton) == HIGH) && (key == true)){ // если нажата кнопка и ключ true то previousMillis = millis(); // запоминаем время когда она нажалать ledState = HIGH; // взводим ключ на включение. key = false; } }