P
P
Pavel2020-10-10 18:53:39
Arduino
Pavel, 2020-10-10 18:53:39

Why is the arduino milis timer not running 2 times?

Background: I have a light on the street and in the house, on the street I turn on the light with a button or a reed switch sensor if it is dark outside, I wanted to add a motion sensor to the house to turn on the light, for this I had to abandon the delay because it slowed down the entire code for the period of inclusion , I wrote this code, but it does not work correctly, the time does not count as it should, and most importantly, it works only 1 time

poke your nose please6zNm7NR.png

#define knopka 2  // кнопка
#define rele_dom 3    // пин реле в доме
#define rele_ul 4    // пин реле на улице
#define dsveta 5     // пин датчика света 
#define gerkon 7  // геркон 
#define green_1 A0
#define green_2 A1
#define green_3 A2
#define green_4 A3


unsigned long previousMillis_dom = 0;        // храним время последнего переключения
unsigned long previousMillis_ul = 0;
bool rele_dom_on = false;
bool rele_ul_on = false;

void setup() {
  pinMode(green_1, OUTPUT);
  pinMode(green_2, OUTPUT);
  pinMode(green_3, OUTPUT);
  pinMode(green_4, OUTPUT);

  pinMode(rele_dom, OUTPUT);
  pinMode(rele_ul, OUTPUT);

  digitalWrite(rele_dom, HIGH); // выключаем реле по умолчанию
  digitalWrite(rele_ul, HIGH);

  pinMode(dsveta, INPUT);
  pinMode(gerkon, INPUT);
  pinMode(knopka, INPUT);


}

void loop()
{
  unsigned long currentMillis = millis(); // переменная для таймеров

  // индикация светодиодами
  if (digitalRead(dsveta) == 1) {
    digitalWrite(green_1, HIGH);
  } else {
    digitalWrite(green_1, LOW);
  }

  if (digitalRead(ddvij) == 1) {
    digitalWrite(green_2, HIGH);
  } else {
    digitalWrite(green_2, LOW);
  }

  if (digitalRead(gerkon) == 1) {
    digitalWrite(green_3, HIGH);
  } else {
    digitalWrite(green_3, LOW);
  }

  if (digitalRead(knopka) == 1) {
    digitalWrite(green_4, HIGH);
  } else {
    digitalWrite(green_4, LOW);
  }
  //

  // принудительный свет на улице от кнопки
  if (!rele_ul_on && (digitalRead(knopka) == 1)) {
    digitalWrite(rele_ul, LOW); // включить
    rele_ul_on = true; // запомнить состояние
    previousMillis_ul = currentMillis; // запомнить момент включения
  }
  if (rele_ul_on && currentMillis - previousMillis_ul > 5000) { // время в милисекундах

    digitalWrite(rele_ul, HIGH); // прошло больше N секунд - выключаем
    rele_ul_on = false;
  }
  //

  // включение света на улице от геркона и датчика света
  if (digitalRead(gerkon) == 0 && digitalRead(dsveta) == 1) {
    digitalWrite(rele_ul, LOW); // включить
    rele_ul_on = true; // запомнить состояние
    previousMillis_ul = currentMillis; // запомнить момент включения
  }
  if (rele_ul_on && currentMillis - previousMillis_ul > 7000) { // время в милисекундах
    digitalWrite(rele_ul, HIGH); // прошло больше N секунд - выключаем
    rele_ul_on = true;
  }
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
Dmitry Pavlov, 2020-10-10
@mrusklon


millis()
Returns the number of milliseconds since the current program on the Arduino board started executing.
This number is reset to zero due to a value overflow after approximately 50 days.


You might be having issues with overflow plus you are overriding
unsigned long currentMillis = millis(); // переменная для таймеров
variable currentMillis
at the beginning of each pass . I also recommend that you reviewvoid loop()

// включение света на улице от геркона и датчика света
  if (digitalRead(gerkon) == 0 && digitalRead(dsveta) == 1) {
    digitalWrite(rele_ul, LOW); // включить
    rele_ul_on = true; // запомнить состояние
    previousMillis_ul = currentMillis; // запомнить момент включения
  }


, as

previousMillis_ul = currentMillis; // запомнить момент включения

will assign the start time to loop .

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question