Таймер на большие промежутки времени
- Войдите на сайт для отправки комментариев
Пт, 13/08/2021 - 17:53
Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 5760 минут, тогда digitalWrite (25, HIGH); Можно пример? С помощью millis() это реализовываетя?
ДА
Нет.
Да.
а мне не жалко, правда миллис не нужен, от слова совсем, тем более, что существует 99 способов:
void setup() { pinMode(13, OUTPUT); start_Buzzer(); } void start_Buzzer() { pinMode(13, OUTPUT); attachInterrupt(1, Buzzer, RISING ); analogWrite(3, 0x80); //установим на пине частоту //490 гц скважность 2 } void Buzzer(void) { static int i = 490 * 60 * 5760 / 2; if (!i--) { digitalWrite(13, ! digitalRead(13)); i = 490 * 60 * 5760 / 2; } } void loop() { }а мне не жалко,
очень показательный пример... те, кто умеют, не пишут... а пишут только те, кто не умеют :)
очень показательный пример... те, кто умеют, не пишут... а пишут только те, кто не умеют :)
ты о строке 15? )))
ты о строке 15? )))
и 19
ты о строке 15? )))
и 19
вот сразу чё палить, пусть бы поразбирался с переменными, тем более там их всего одна
из анекдота:
- а тринадцатым пином зачем мигают?!
- дикари-с...
из анекдота:
- а тринадцатым пином зачем мигают?!
- дикари-с...
отож, просил жеж 25-й, а сегодня Пятница, 13-е, так что только 13-м...
PS Да, не надо попрекать, что не учитываю лямбда член из уравнения Эйнштейна
Вопрос был:
Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 5760 минут, тогда digitalWrite (25, HIGH); Можно пример? С помощью millis() это реализовываетя?
а не 490 раз в сек) Эт каждый сможет)) Так что без миллис никак. Дергаем D2 через миллис раз в минуту, вызывается прерывание, а дальше зависть индуса)))
Вопрос был:
Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 5760 минут, тогда digitalWrite (25, HIGH); Можно пример? С помощью millis() это реализовываетя?
а не 490 раз в сек) Эт каждый сможет)) Так что без миллис никак. Дергаем D2 через миллис раз в минуту, вызывается прерывание, а дальше зависть индуса)))
так я жеж сказал, что существует 99 способов, послушаем, что скажет профессор, боюсь что окажется 100 )))
Что-то Адольф засветился в онлайне, но комментировать побоялся, лови, тут 0,1Гц )))
void setup() { pinMode(13, OUTPUT); start_Buzzer(); } void start_Buzzer() { pinMode(13, OUTPUT); attachInterrupt(1, Buzzer, RISING ); analogWrite(3, 0x80); //установим на пине частоту //490 гц скважность 2 } void Buzzer(void) { static uint32_t i = 490 * 10 / 2; // static uint32_t i = 490 * 60 * 5760 / 2; if (!i--) { digitalWrite(13, ! digitalRead(13)); i = 490 * 10 / 2; // i = 490 * 60 * 5760 / 2; } } void loop() { }Поигрался тут с миллис. Сделал по аналогии с банальной моргалкой. Вроде работает.
int16_t State = LOW; // Объявляем переменную State и присваиваем низкий уровень. uint32_t previousMillis; // const long period = 120000; // Интервал ключения таймера каждые 2 минуты const long time2 = 20000; // Держать таймер включенным на протяжении 20 сек. float time1 = (period-time2); // Определяем переменную для первого интервала. void loop() { // Захренячить работу таймера в цикл unsigned long currentMillis = millis ( ); if ( State == LOW ) { // Если в выключенном состоянии, то включаем. if ( currentMillis - previousMillis > time1 ) { previousMillis = currentMillis; State = HIGH; digitalWrite (25, HIGH); // Отправляем высокй ур. на GPIO25 }} if ( State == HIGH ) { if ( currentMillis - previousMillis > time2 ) { previousMillis = currentMillis; State = LOW; digitalWrite (25, LOW);Для проверки работоспособности юзал на малых интервалах времени. Как будет себя вести на интерваах по несколько суток, не знаю. Позже попробую. Планирую включение в цикле: Включение на 4 часа, каждые четверо суток. Правильным путем иду? Костылей много?
Интересно, зачем float в 5 строчке.
Дак точность хода повышается до многотысячных знаков после запятой.
не, не зачёт, ни
вох не работает ни дэхов не слышносчетчика нет ни прерывание не задействованоВопрос был:
Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 5760 минут, тогда digitalWrite (25, HIGH); Можно пример? С помощью millis() это реализовываетя?
а не 490 раз в сек) Эт каждый сможет)) Так что без миллис никак. Дергаем D2 через миллис раз в минуту, вызывается прерывание, а дальше зависть индуса)))
так я жеж сказал, что существует 99 способов, послушаем, что скажет профессор, боюсь что окажется 100 )))
Что-то Адольф засветился в онлайне, но комментировать побоялся, лови, тут 0,1Гц )))
void setup() { pinMode(13, OUTPUT); start_Buzzer(); } void start_Buzzer() { pinMode(13, OUTPUT); attachInterrupt(1, Buzzer, RISING ); analogWrite(3, 0x80); //установим на пине частоту //490 гц скважность 2 } void Buzzer(void) { static uint32_t i = 490 * 10 / 2; // static uint32_t i = 490 * 60 * 5760 / 2; if (!i--) { digitalWrite(13, ! digitalRead(13)); i = 490 * 10 / 2; // i = 490 * 60 * 5760 / 2; } } void loop() { }Не надоело еще?
Интересно, зачем float в 5 строчке.
Можно было конечно и без этого обойтись. Указав time1 явным образом. Но тогда в этом случае будет не совсем удобно. Цикл включения сотоит из двух интервалов (time1+time2). Т.е если я захочу включать таймер каждые 24 часа, независимо от времени действия таймера (time2), то просто указываю нужно время и все.
Интересно, зачем float в 5 строчке.
Можно было конечно и без этого обойтись. Указав time1 явным образом. ...
Вопрос был не зачем time1, а зачем он float. Использование типа float в данном случае ошибка.
Не надоело еще?
надо жеж помочь:
// зажигаем с периодичностью 10 секунд, время горения 2 секунды uint16_t my_constsec = 490; // число тиков для секундного интервала uint16_t my_constmin = 1; // для подсчета в минутах - 60 uint32_t timer_1 = 10; // периодичность включения светодиода (сек) uint32_t timer_2 = 2; // время горения светодиода (сек) bool flag_led = 0; int LED = 13; void setup() { pinMode(13, OUTPUT); start_Buzzer(); } void start_Buzzer() { pinMode(13, OUTPUT); attachInterrupt(1, Buzzer, RISING ); analogWrite(3, 0x80); //установим на пине частоту //490 гц скважность 2 } void Buzzer(void) { static uint32_t i = my_constsec * my_constmin * timer_1; static uint32_t j = my_constsec * my_constmin * timer_2; if (!i--) { flag_led = 1; digitalWrite(LED, HIGH); i = my_constsec * my_constmin * timer_1; } if (flag_led) { if (!j--) { digitalWrite(LED, LOW); flag_led = 0; j = my_constsec * my_constmin * timer_2; } } } void loop() { }