Циклический счетчик времени.

Raftor
Offline
Зарегистрирован: 09.06.2016

Добрый день, только начал изучать Arudino. есть задача выполнять действия, а именно:

1) подать сигнал на выход 1 

2) пауза 20 мин

3)выключить сигнал на выходе 1

4) включить сигнал на порт 2

И т.д. всего 3 исполнительных устройства.

потом надо обеспечить паузу в 23 часа. 

Возник вопрос: кие операторы использовать для работы со временем?

P.S.Есть идея после включения и выключения портов обнулять счетчик времени чтобы не переполнять память и делать паузу 23 часа.

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
millis()

 

Raftor
Offline
Зарегистрирован: 09.06.2016

Да, но смущает описание оператора:

Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Дык вам же каждые 23 часа надо. Чего мешает сбрасывать переменную, хранящую значение вызова millis, в 0? И потом - почитайте про переполнение беззнаковых чисел, и про беззнаковую арифметику вообще. И сразу поймёте, что страшилки - нет, если правильно писать код:

if (millis() - previousMillis > interval)
{
 do the job;
}

И пофиг на переполнение.

Raftor
Offline
Зарегистрирован: 09.06.2016

Спасибо. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Raftor, перечитайте свой вопрос. Вы не находите его странным?

Хорошо, давайте  объясню понятнее. Код, который я привел (чуть ниже) работает и абсолютно правильно делает то, что Вы просили! Вам это надо? А если нет, по подумайте как нормально сформулировать вопрос.

void setup() {
	pinMode(1, OUTPUT);
	pinMode(2, OUTPUT);
	pinMode(3, OUTPUT);
}

void loop() {
//1) подать сигнал на выход 1 
	digitalWrite(1, HIGH);
//2) пауза 20 мин
	delay(60000UL * 20);
//3)выключить сигнал на выходе 1
	digitalWrite(1, LOW);
//4) включить сигнал на порт 2
	digitalWrite(2, HIGH);
//5) пауза 20 мин
	delay(60000UL * 20);
//6)выключить сигнал на выходе 2
	digitalWrite(1, LOW);
//7) включить сигнал на порт 3
	digitalWrite(3, HIGH);
//8) пауза 20 мин
	delay(60000UL * 20);
//9)выключить сигнал на выходе 3
	digitalWrite(1, LOW);

//потом надо обеспечить паузу в 23 часа. 
	delay(60000UL * 60 * 23);
}

 

Raftor
Offline
Зарегистрирован: 09.06.2016

Большое спасибо, за такой подробный ответ. 

Действительно вопрос получился очень сумбурный, т.к. я первый раз столкнулся с написанием кода для Arudino. Вае решение с таким форматом времени меня устроит, т.к. не каких других действий контроллер делать не должен.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если устроит, то значит вопрос был задан правильно :) Удачи!