Теперь надо наоборот, чтобы светодиод загорается через определённое время после отпускания кнопки.
#define BUTTON_PIN 2
#define BTN_DEB 50 // таймаут смены состояния, мс
//#define BTN_HOLD 3000 // таймаут удержания, мс
int ledPin = 13; // Светодиод подключён к пину 13
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); // Настроим пин как выход
}
void loop() {
static bool pState = false;
static bool hold = false; // флаг удержания
static uint32_t tmr;
bool state = !digitalRead(BUTTON_PIN);
if (pState != state && millis() - tmr >= BTN_DEB) {
tmr = millis();
pState = state;
hold = false; // сброс флага удержания
if (state) Serial.println("Кнопка нажата");
else Serial.println("Кнопка отпущена");
}
// кнопка удерживается дольше 3000 мс
if (pState && !hold && millis() - tmr >= 3000) {
hold = true; // флаг удержания
Serial.println("Кнопка удержана");
digitalWrite(ledPin, HIGH); // Включаем светодиод
}
Друзья, я использую этот скетч.
Итак, при удержании кнопки более 3 сек. загорается светодиод.
для контроля паузы я решил проинвертировать входной сигнал, убрав '!'
в строке bool state = !digitalRead(BUTTON_PIN);
Но это не повлияло на работу программы. В чём дело?
Для
начала
правильно
выложить
скетч
!
#define BUTTON_PIN 2
#define BTN_DEB 50 // таймаут смены состояния, мс
//#define BTN_HOLD 3000 // таймаут удержания, мс
int ledPin = 13; // Светодиод подключён к пину 13
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); // Настроим пин как выход
}
void loop() {
static bool pState = false;
static bool hold = false; // флаг удержания
static uint32_t tmr;
bool state = !digitalRead(BUTTON_PIN);
if (pState != state && millis() - tmr >= BTN_DEB) {
tmr = millis();
pState = state;
hold = false; // сброс флага удержания
if (state) Serial.println("Кнопка нажата");
else Serial.println("Кнопка отпущена");
}
// кнопка удерживается дольше 3000 мс
if (pState && !hold && millis() - tmr >= 3000) {
hold = true; // флаг удержания
Serial.println("Кнопка удержана");
digitalWrite(ledPin, HIGH); // Включаем светодиод
}
}
А вы распишите комментарии для if.
Извините, не знаю как это сделать.
Жаль. Если не хотите/нет надобности учится, можете обратится в спец. раздел.
Какая изначально стоит задача?
Нужно уберечь насос от сухого хода и чтоб не затопило подвал при неисправности поплавкового выключателя? Или что-то другое?
Да, именно так.
двухпоплавковые датчики есть разной длины. Этот для примера.
Поплавки нужно сориентировать так, чтобы герконы замыкались при уровне воды ниже нижнего и выше верхнего. Герконы запараллелить и включить через них пищалку или другой какой звуковой оповещатель.
Но такой датчик для чистой воды, иначе поплавки могут заблокироваться мусором.
Тема называется “контроль исправности насоса”.
Неисправности могут быть:
залипание или обгорание контактов концевика поплавка
обрыв, замыкание обмотки электродвигателя
потеря емкости конденсатора
механическая блокировка вала ЭД
просто шланг сорвало
и т.д.
Представь сколько датчиков нужно поставить и какой код написать…
При всех перечисленных неисправностях насос будет постоянно работать или вообще не включится, что и зафиксирует ардуино.
Ой, прошу прощения. Всё работает, как задумано: при отпускании кнопки через 3 сек. загорается светодиод. Теперь попробую совместить оба этих варианта.
Обязательно держите нас в курсе!
Ура! Мой первый скетч заработал
#define BUTTON_PIN 2
#define BTN_DEB 50 // таймаут смены состояния, мс
int ledPin = 13; // Светодиод подключён к пину 13
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); // Настроим пин как выход
}
void loop() {
static bool pState = false;
static bool hold = false; // флаг удержания
static uint32_t tmr;
static bool pState2 = false;
static bool hold2 = false; // флаг удержания
static uint32_t tmr2;
bool state = !digitalRead(BUTTON_PIN);
if (pState != state && millis() - tmr >= BTN_DEB) {
tmr = millis();
pState = state;
hold = false; // сброс флага удержания
if (state) Serial.println("Кнопка нажата");
else Serial.println("Кнопка отпущена");
}
// кнопка удерживается дольше 3с;
if (pState && !hold && millis() - tmr >= 3000) {
hold = true; // флаг удержания
Serial.println("Кнопка удержана");
digitalWrite(ledPin, HIGH); // Включаем светодиод
}
bool state2 = digitalRead(BUTTON_PIN);
if (pState2 != state2 && millis() - tmr2 >= BTN_DEB) {
tmr2 = millis();
pState2 = state2;
hold2 = false; // сброс флага удержания
if (state2) Serial.println("Кнопка отпущена");
else Serial.println("Кнопка нажата");
}
// кнопка отпущена дольше 9с;
if (pState2 && !hold2 && millis() - tmr2 >= 9000) {
hold2 = true; // флаг удержания
Serial.println("Кнопка отпущена долго ");
digitalWrite(ledPin, HIGH); // Включаем светодиод
}
}
#define BUTTON_PIN 2
#define BTN_DEB 50 // таймаут смены состояния, мс
int ledPin = 13; // Светодиод подключён к пину 13
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(ledPin, OUTPUT); // Настроим пин как выход
}
void loop() {
static bool pState = false;
static bool hold = false; // флаг удержания
static uint32_t tmr;
static bool pState2 = false;
static bool hold2 = false; // флаг удержания
static uint32_t tmr2;
bool state = !digitalRead(BUTTON_PIN);
if (pState != state && millis() - tmr >= BTN_DEB) {
tmr = millis();
pState = state;
hold = false; // сброс флага удержания
if (state) Serial.println("Кнопка нажата");
else Serial.println("Кнопка отпущена");
}
// кнопка удерживается дольше 3с;
if (pState && !hold && millis() - tmr >= 3000) {
hold = true; // флаг удержания
Serial.println("Кнопка удержана");
digitalWrite(ledPin, HIGH); // Включаем светодиод
}
bool state2 = digitalRead(BUTTON_PIN);
if (pState2 != state2 && millis() - tmr2 >= BTN_DEB) {
tmr2 = millis();
pState2 = state2;
hold2 = false; // сброс флага удержания
if (state2) Serial.println("Кнопка отпущена");
else Serial.println("Кнопка нажата");
}
// кнопка отпущена дольше 9с;
if (pState2 && !hold2 && millis() - tmr2 >= 9000) {
hold2 = true; // флаг удержания
Serial.println("Кнопка отпущена долго ");
digitalWrite(ledPin, HIGH); // Включаем светодиод
}
}
Что-то не получается со вставкой скетча, извините.
Всем спасибо.
Приятно было пообщаться.
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()