Едем дальше?
/*
* Абзавём входные данные, а именно пины для КНОПКИ и ТРЁХ РЕЛЕ
*/
#define BUTTON_PIN 12 // Кнопка
#define RELE1_PIN 2 // Реле 1
#define RELE2_PIN 3 // Реле 2
#define RELE3_PIN 4 // Реле 3
#define TIME_BOUNCE 70 // 70мс время "фильтрации" дребезга контактов
#define LONG_PRESS_TIME 2000 // 2 секунды время удержания кнопки
enum BUTTON_RESULT : uint8_t {
NOT_PRESS,
PRESS,
LONG_PRESS
};
BUTTON_RESULT current_button_res = NOT_PRESS;
void setup() {
// Крутая вставка от DetSimen для отладки
Serial.begin(9600);
stdout = fdevopen([](char ch, FILE* f)->int {return Serial.print(ch); }, NULL);
// puts("Program started...");
// Теперь настроим пины
pinMode(BUTTON_PIN, INPUT_PULLUP); // На вход и подтянуть к +питания (экономим на резисторах для "подтяжки")
pinMode(RELE1_PIN, OUTPUT); // А пины реле на выход
pinMode(RELE2_PIN, OUTPUT);
pinMode(RELE3_PIN, OUTPUT);
// И зададим начальное значение - все реле выключены
digitalWrite(RELE1_PIN, LOW);
digitalWrite(RELE2_PIN, LOW);
digitalWrite(RELE3_PIN, LOW);
}
void loop() {
// С чего начать основную программу?
// А начну-ка с чтения состояния кнопки. ТС, как думаешь - это правильное решение?
uint8_t button_state = digitalRead(BUTTON_PIN); // Ну во, вот тут мы её и "уконтропупили".
// Теперь в переменной button_state содержится состояние кнопки
// LOW - если кнопка нажата, и HIGH - если кнопка не нажата
// Ещё нам понадобятся дополнительные переменные, оставим место тут для них
uint32_t _millis = millis(); // Запомним текущее значение миллисекунд
static uint32_t timeHoldBegin; // Время начала удержания кнопки
static uint32_t timeHold; // Длительность удержания кнопки
// А дальше нам нужно узнать - нажимал кто на кнопку? А если нажимал - то как долго удерживал?
if (!button_state) { // Если кнопка нажата
timeHold = _millis - timeHoldBegin; // Считаем длительность удержания
} else { // Еслди кнопку отпустили
timeHoldBegin = _millis; // Сбрасываем
timeHold = 0;
current_button_res = NOT_PRESS;
}
if (timeHold > TIME_BOUNCE && timeHold < LONG_PRESS_TIME) { // Если время удержание в интервале между временем подавления дребезга и удержанием
current_button_res = PRESS; // То нужно как-то "зарегистрировать нажатие"
}
if (timeHold > LONG_PRESS_TIME) { // Если время удержание больше времени удержаниея (2 сек)
current_button_res = LONG_PRESS; // То нужно как-то "зарегистрировать долгое удержание"
}
// Состояние кнопки узнали.
// А дальше пошла "жара" (то есть обработка нажатий)
switch (current_button_res) {
case PRESS: // Если кликнули один раз
// Обрабатываем короткие нажатия
break;
case LONG_PRESS: // Если долго держали
// Обрабатываем долгое удержание
break;
case NOT_PRESS: // Если кнопку не нажимали
// Ничего не делаем. Это просто для наглядности
break;
default:
break;
}
}