Контроль исправности насоса

Теперь надо наоборот, чтобы светодиод загорается через определённое время после отпускания кнопки.


#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.

Извините, не знаю как это сделать.

Жаль. Если не хотите/нет надобности учится, можете обратится в спец. раздел.

Какая изначально стоит задача?
Нужно уберечь насос от сухого хода и чтоб не затопило подвал при неисправности поплавкового выключателя? Или что-то другое?

1 лайк

Да, именно так.


двухпоплавковые датчики есть разной длины. Этот для примера.
Поплавки нужно сориентировать так, чтобы герконы замыкались при уровне воды ниже нижнего и выше верхнего. Герконы запараллелить и включить через них пищалку или другой какой звуковой оповещатель.
Но такой датчик для чистой воды, иначе поплавки могут заблокироваться мусором.

Тема называется “контроль исправности насоса”.
Неисправности могут быть:
залипание или обгорание контактов концевика поплавка
обрыв, замыкание обмотки электродвигателя
потеря емкости конденсатора
механическая блокировка вала ЭД
просто шланг сорвало
и т.д.
Представь сколько датчиков нужно поставить и какой код написать…

При всех перечисленных неисправностях насос будет постоянно работать или вообще не включится, что и зафиксирует ардуино.

Ой, прошу прощения. Всё работает, как задумано: при отпускании кнопки через 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); // Включаем светодиод 
    }
}
  
Что-то не получается со вставкой скетча, извините.
Всем спасибо.
Приятно было пообщаться.

:+1::+1::+1::+1::+1::+1::+1::+1: