Как заблокировать вход кнопки с возможностью выбора задержки?
У меня есть программа, над которой я работаю, в которой реле включается -> ждет задержки -> затем выключается после того, как происходит одно из двух: 1) достигается заданное время r ИЛИ 2) кто-то нажимает кнопку, чтобы активировать его.
Сейчас 90% моего кода работает, и я застрял на том, как «заблокировать» кнопку, чтобы она не срабатывала при срабатывании реле, на выбираемое время задержки.
Часть кода с таймером, с выбираемым временем, работает. В зависимости от того, что видит аналоговый 1, он соответствующим образом включит реле после выбранного времени.
Я попытался реализовать этот же подход для таймера блокировки, используя аналоговый 2, чтобы определить длительность задержки. Я использовал переменную, которую назвал LOK, чтобы либо прочитать кнопку, если она разблокирована (LOK = 0), либо, если она заблокирована (LOK = 1), подождать отведенное время задержки перед разблокировкой и повторным считыванием кнопки.
Я перепробовал все виды вещей, но это все еще не работает правильно. Возможно, есть лучший или более простой способ сделать это, но я сломал голову, и поиск по ключевым словам не помогает.
Код ниже - простите за случайные комментарии. Я что-то резал и перемещал, я не редактировал комментарии, поэтому некоторые из них могут быть из других фрагментов кодов из других проектов.
int DUMP = 2; // Контакт подключен к большому реле дампа
int BUTTON = 3; // Контакт подключен к кнопке ручного сброса.
int BUTTONlight = 4; // Контакт подключен к кнопочной подсветке.
int BUTstate; // Текущее показание с контакта BUTTON
int lastBUTstate = LOW; // Предыдущее чтение с контакта BUTTON
long lastDebounce = 0; // Последний раз вывод был изменен
long Delay = 50; // Время дребезга
unsigned long DUMPTIME;
unsigned long LOT;
unsigned long prevTIME;
int a=0;
int d=0;
int LOK = 0;
void setup()
{
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode (BUTTON, INPUT);
pinMode (BUTTONlight, OUTPUT);
pinMode (DUMP, OUTPUT);
digitalWrite(DUMP, HIGH);
delay(10000);
digitalWrite(DUMP, LOW);
digitalWrite(BUTTONlight, HIGH);
}
int readTselector(int pin)
// возвращает номер нажатой кнопки или ноль, если кнопка не нажата
// int pin — номер аналогового контакта для считывания
{
int b,c = 1;
c=analogRead(pin); // получить аналоговое значение
if (c>1000)
{
b=0; // кнопки не были нажаты
}
else
if (c<1000 && c>600)
{
b=1; // кнопка 1 нажата
}
else
if (c<520 && c>400)
{
b=2; // кнопка 2 нажата
}
else
if (c>100 && c<400)
{
b=3; // кнопка 3 нажата
}
else
if (c<100)
{
b=4; // кнопка 4 нажата
}
return b;
}
void loop()
{
int DUMPTIME = DTselect();
int LOT = LOselect();
int reading = digitalRead(BUTTON);
unsigned long currTIME = millis();
if ((currTIME - prevTIME) >= DUMPTIME) // Считаем до 2 минут
{
LOK = 1;
digitalWrite(BUTTONlight, LOW);
digitalWrite(DUMP, HIGH);
delay(10000);
digitalWrite(DUMP, LOW);
prevTIME = currTIME;
}
if (reading != lastBUTstate)
{
lastDebounce = millis();
}
if (LOK == 1)
{
delay(LOT);
digitalWrite(BUTTONlight, HIGH);
LOK = 0;
}
if ((millis() - lastDebounce) > Delay && LOK == 0)
{
BUTstate = reading;
}
if (BUTstate == HIGH)
{
digitalWrite(BUTTONlight, LOW);
digitalWrite(DUMP, HIGH);
delay(10000);
digitalWrite(DUMP, LOW);
prevTIME = currTIME;
}
lastBUTstate = reading;
}
int DTselect()
{
a=readTselector(1);
if (a==0) // кнопки не нажаты
{
DUMPTIME = 210000;
}
else
if (a==1) // кто-то нажал кнопку!
{
DUMPTIME = 180000;
}
else
if (a==2) // кто-то нажал кнопку!
{
DUMPTIME = 150000;
}
else
if (a==3) // кто-то нажал кнопку!
{
DUMPTIME = 120000;
}
else
if (a==4) // кто-то нажал кнопку!
{
DUMPTIME = 90000;
}
return DUMPTIME;
}
int LOselect()
{
d=readTselector(2);
if (d==0) // кнопки не нажаты
{
delay(20000);
}
else
if (d==1) // кто-то нажал кнопку!
{
delay(15000);
}
else
if (d==2) // кто-то нажал кнопку!
{
delay(10000);
}
else
if (d==3) // кто-то нажал кнопку!
{
delay(5000);
}
else
if (d==4) // кто-то нажал кнопку!
{
delay(0);
}
}
@Adam Alexander, 👍2
0
- Как переключить светодиод при нажатии кнопки?
- Определение того, была ли нажата и отпущена кнопка
- Нажать клавишу Windows, используя «keyboard.press();»
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.