Моргаем светодиодом n-раз без Delay
- Войдите на сайт для отправки комментариев
Приветствую всех. Нужна подсказка. Суть такова. При нажатии кнопки (без фиксаци) светодиоды должны моргнуть n-раз (указано через переменную byte). При нажатии и удержании кнопки светодиоды моргают пока удерживается кнопка. Все это надо без delay. Перепробовал уже кучу вариантов, прочитал и перечитал множество статей на форуме и и в нете. Не работает. Вернее при постоянном нажатии моргает как и задумано, а от кратковременного нет. Пытался использовать оператор for, безрезультатно. Уже и пробовал библиотеку #include <TimeHelpers.h> не работает в операторе for. Подскажите или лучше укажите что читать.
Вот рабочий скетч но с Delay; /*на лишниее переменые в заголовке не обращайте внимание это были наработки для продолжения написания скетча, но завис на этих 2 моргулях*/
#include <Bounce.h>
#define BUTTON1 8
#define BUTTON2 9
#define LED1 2
#define LED2 3
#define pressed_long 500 // долговременное нажатие = 0.5 секунды
boolean ledState = LOW; // состояние светодиода
byte buttonState1 = 0;
byte buttonState2 = 0;
byte k=2;
long interval = 600; // интервал между включение/выключением светодиода (1 секунда)
long OnTime = 250; // длительность свечения светодиода (в миллисекундах)
long OffTime = 750; // светодиод не горит (в миллисекундах)
unsigned long previousMillis1 = 0; // храним время последнего переключения светодиода
unsigned long pressed_moment; // момент нажатия кнопки
unsigned long previousMillis = 0;
Bounce bouncer1 = Bounce( BUTTON1, 8);
Bounce bouncer2 = Bounce( BUTTON2, 9);
void setup() {
pinMode(BUTTON1,INPUT);
pinMode(BUTTON2,INPUT);
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
}
void loop()
{
buttonState1 = digitalRead(BUTTON1);
if (buttonState1 == HIGH) { //если кнопка нажата
unsigned long currentMillis = millis(); // текущее время в миллисекундах
// если светодиод включен и светится больше чем надо
if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
{
ledState = LOW; // выключаем
previousMillis = currentMillis; // запоминаем момент времени
digitalWrite(LED1, ledState); // реализуем новое состояние
}
else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
{
ledState = HIGH; // выключаем
previousMillis = currentMillis ; // запоминаем момент времени
digitalWrite(LED1, ledState); // реализуем новое состояние
}
}
if(buttonState1 == LOW)
{
ledState = LOW;
digitalWrite(LED1, ledState); // реализуем новое состояние
}
if (bouncer1.update())
{ //если произошло событие
if (bouncer1.read()==HIGH)
{ //если кнопка нажата
pressed_moment = millis(); // запоминаем время нажатия
}
else
{ // кнопка отпущена
if((millis() - pressed_moment) < pressed_long)
{ // если кнопка была нажата кратковременно
for (int a=0;a<k;a++)
{
ledState = HIGH;
digitalWrite(LED1, ledState);
delay(500);
ledState = LOW;
digitalWrite(LED1, ledState);
delay(500);
}
}
else { // кнопка удерживалась долго
pressed_moment = 0; // обнуляем момент нажатия
}
}
}
}
может я слищком усложнил скетч, для такой незначительной задачи? Ардуину ( также как и Си) узучаю не так давно.
Нажатие кнопки -флаг подняли, если флаг-поднят,отработал блинк н-ое количество раз - сбросили флаг. Как-то так , навскидку.
Если что почитать, то "конечные автоматы".
По поводу флага: в данном случае - один из вариантов.
В более общем случае - переменная состояния, которая может принимать не 2 (как флаг), а несколько состояний. Например:
0 - исходное состояние.
нечетные от 1 до 2n-1 - светодиод включен.
четные от 2 до 2n-2 - светодиод выключен.
2n - финальное состояние.
По нажатию кнопки в состоянии 0 система переходит в состояние 1 и дальше последовательно проходит все состояния (в каждом задерживаясь на нужное время) вплоть до финального. Из финального сбрасывается в начальное.
Если в каком-то из промежуточных состояний произошло какое-то событие (например, снова нажаьта кнопка и ли нажата другая кнопка или датчик температуры...), можно осуществить переход в любое другое состояние: например, в 0, прекратив таким образом серию миганий либо в 1 - возобновив отсчет миганий с начала. Либо ничего не делать, тогда скетч не будет реагировать на кнопку и просто "домигает" до конца.