Как правильно работать с таймером

artur222
Offline
Зарегистрирован: 25.07.2020

Добрый день! У меня есть задача , включить реле на три секунды по нажатию кнопки  , кнопка фиксируемая , кнопка остаётся во включеном состоянии , по выключению кнопки реле опять включается на три секунды. У меня не работает вторая половина кода на выключение . прошу помощи с 61 строчки

[code]
#include <Bounce2.h>
#define PIN_RELAY = 12;
#define ledPin = 13;
#define buttonPin = 14;  
#define buttonPin = 15; 
long previousMillis = 0; 
long previousMillis2 = 0;
boolean i;
boolean k;
int value;
int value2 = 0;
int buttonState; 
int lastButtonState = 0; 
Bounce debouncer1 = Bounce();
void setup() {
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  debouncer1.attach(14); 
  debouncer1.interval(500);
  pinMode(14, INPUT_PULLUP);
  pinMode(15, INPUT);
  pinMode(15, INPUT_PULLUP);
  

}

void loop() {
  // Просто моргалка на плате ( при работающей программе )
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(200);                       // wait for a second
  
  debouncer1.update();
  int value1 = debouncer1.read();
  if (value1 == LOW )
  {
    i = 1;
    digitalWrite(12, HIGH);
  }
  if ( millis() - previousMillis > 100 && value1 == LOW)
  {
    previousMillis = millis();
    value++;
  }
  else
  {
    value = 0;
  }
  if (value >= 5)
  {
    digitalWrite(12, LOW);
    value = 0;
    k = 1;
  }

  if ( k == 1 && value1 == LOW)
  {
    digitalWrite(12, LOW);
  }
  if ( k == 1 && value1 == HIGH)
  {
    digitalWrite(12, HIGH);
    k = 0;
    if ( millis() - previousMillis > 100 && value1 == HIGH && k== 0)
    {
      previousMillis = millis();
      value++;
    }
    else
    {
      value = 0;
    }
    if (value >= 5)
    {
      digitalWrite(12, LOW);
      value = 0;
    }
  }

}
[/code]

if ( k == 1 && value1 == HIGH)

  {
    digitalWrite(12, HIGH);
    k = 0;
    if ( millis() - previousMillis > 100 && value1 == HIGH && k== 0)
    {
      previousMillis = millis();
      value++;
    }
    else
    {
      value = 0;
    }
    if (value >= 5)
    {
      digitalWrite(12, LOW);
      value = 0;
    }
  }
 
}
[/code]
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

вот тут для образца, 2000 поменять на 3000

artur222
Offline
Зарегистрирован: 25.07.2020

Спасибо за помощь , я с флагами ещё не работал буду разбираться. В этом коде осталось дописать только включение реле на сбросе кнопки. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Просто добавляем переменную "предыдущее состояние кнопки".
Если вдруг предыдущее и текущее отличаются, то включаем реле на 3секунды и обновляем предыдущее=текущее