Использование прерывания, ИМХО, излишне. Прерывания создаются, когда вам нужно быстро ответить на стимул, а нажатие кнопки — это что-то медленное. Если ваш цикл не блокируется, что я очень не одобряю.
ДОПОЛНЕНИЕ: как заметил Патрик в комментариях, на самом деле есть еще одна причина для использования прерываний: спящий режим. На самом деле, если вы хотите перейти в спящий режим и проснуться с помощью кнопки, вам придется использовать прерывания, чтобы проснуться позже. Однако обычно вам приходится постоянно что-то делать, а не только отвечать на нажатия кнопок. Если вы не можете перейти в спящий режим, использование прерывания для обнаружения кнопок, на мой взгляд, по-прежнему излишне.
Итак, если вы правильно спроектировали свой цикл, чтобы он не блокировался, вот краткая часть кода, выполняющая то, что, по моему мнению, вам следует реализовать:
uint8_t buttonState;
unsigned long lastPressTime;
void setup()
{
...
buttonState = digitalRead(buttonPin);
lastPressTime = 0;
}
void loop()
{
uint8_t currRead = digitalRead(buttonPin);
if (buttonState != currRead)
{ // Button transition
buttonState = currRead;
if (buttonState == LOW)
{ // Button pressed, start tracking
lastPressTime = millis();
}
else
{ // Button released, check which function to launch
if (lastPressTime < 100)
{} // Discard (it is just a bounce)
else if (lastPressTime < 15000)
snooze();
else if (lastPressTime < 30000)
conf_Desk();
else
calibration();
}
}
...
}
Поскольку вы сделали три очень далеких интервала, я думаю, что эта часть лучше соответствует вашим потребностям:
if ((lastPressTime > 100) && (lastPressTime < 7000))
snooze();
else if ((lastPressTime > 12000) && (lastPressTime < 20000))
conf_Desk();
else if ((lastPressTime > 26000) && (lastPressTime < 40000))
calibration();
Таким образом, вы определяете диапазоны действия, поэтому, если кто-то нажимает кнопку в течение 10 секунд, ничего не происходит (это полезно, потому что, если кто-то нажимает кнопку в течение 14,9 секунд в предыдущем коде, это активирует функцию повтора).
person
frarugi87
schedule
07.01.2017