Добрый вечер, можете подсказать советом, мне необходимо, при получении сигнала с пульта ДУ, действие выполнялось определенное время, пытаюсь разобраться с millis, но возникли затруднения, почему-то действие не завершается после пройденного интервала времени Код (C++): #include <IRremote.h> int RECV_PIN = 2; IRrecv irrecv(RECV_PIN); decode_results results; int IN1 = 8; int IN2 = 7; int engineStartMoment = 0; int engineWrokingPeriod = 5000; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode (IN2, OUTPUT); pinMode (IN1, OUTPUT); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value); if (results.value == 2246090081) { digitalWrite (IN2, HIGH); digitalWrite (IN1, LOW); engineStartMoment = millis(); } if (results.value == 3419589885) { digitalWrite (IN2, LOW); digitalWrite (IN1, HIGH); engineStartMoment = millis(); } irrecv.resume(); if (engineStartMoment) { if (millis() - engineStartMoment >= engineWrokingPeriod) { digitalWrite (IN2, LOW); digitalWrite (IN1, LOW); engineStartMoment = 0; } } } }
Попробуйте изменить код функции loop() -- вынести проверку if (engineStartMoment) за пределы проверки if (irrecv.decode(&results)): Код (C++): void loop() { if (irrecv.decode(&results)) { Serial.println(results.value); if (results.value == 2246090081) { digitalWrite (IN2, HIGH); digitalWrite (IN1, LOW); engineStartMoment = millis(); } if (results.value == 3419589885) { digitalWrite (IN2, LOW); digitalWrite (IN1, HIGH); engineStartMoment = millis(); } irrecv.resume(); } if (engineStartMoment) { if (millis() - engineStartMoment >= engineWrokingPeriod) { digitalWrite (IN2, LOW); digitalWrite (IN1, LOW); engineStartMoment = 0; } } }
Вот это действие что должно делать? У вас оно отнимает от кол-ва миллисекунд прошедших с начала запуска программы ноль и сравнивает с 5000. То есть условие выполнится после 5 сек после начала запуска программы и будет постоянно выполнятся далее. В чем смысл?