Таймер на большие промежутки времени

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 5760 минут, тогда digitalWrite (25, HIGH); Можно пример? С помощью millis() это реализовываетя? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ДА

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

Adolf_Balalaykin пишет:
Можно пример?

Нет.

Adolf_Balalaykin пишет:
С помощью millis() это реализовываетя?

Да.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а мне не жалко, правда миллис не нужен, от слова совсем, тем более, что существует 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() {
}

 

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

а мне не жалко,

 

очень показательный пример...  те, кто умеют, не пишут... а пишут только те, кто не умеют :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

очень показательный пример...  те, кто умеют, не пишут... а пишут только те, кто не умеют :)

ты о строке 15? )))

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

ты о строке 15? )))

и 19

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

ты о строке 15? )))

и 19

вот сразу чё палить, пусть бы поразбирался с переменными, тем более там их всего одна

b707
Offline
Зарегистрирован: 26.05.2017

из анекдота:

 - а тринадцатым пином зачем мигают?!

 - дикари-с...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

из анекдота:

 - а тринадцатым пином зачем мигают?!

 - дикари-с...

отож, просил жеж 25-й, а сегодня Пятница, 13-е, так что только 13-м...

PS Да, не надо попрекать, что не учитываю лямбда  член из уравнения Эйнштейна

Pyotr
Offline
Зарегистрирован: 12.03.2014

Вопрос был: 

Adolf_Balalaykin пишет:

Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 5760 минут, тогда digitalWrite (25, HIGH); Можно пример? С помощью millis() это реализовываетя? 

а не 490 раз в сек) Эт каждый сможет)) Так что без миллис никак. Дергаем D2 через миллис раз в минуту, вызывается прерывание, а дальше зависть индуса)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

Вопрос был: 

Adolf_Balalaykin пишет:

Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 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() {
}

 

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

Поигрался тут с миллис. Сделал по аналогии с банальной моргалкой. Вроде работает.

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 часа, каждые четверо суток. Правильным путем иду? Костылей много?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Интересно, зачем float в 5 строчке.  

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак точность хода повышается до многотысячных знаков после запятой.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не, не зачёт, ни вох не работает ни дэхов не слышно счетчика нет ни прерывание не задействовано

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

ua6em пишет:

Pyotr пишет:

Вопрос был: 

Adolf_Balalaykin пишет:

Как запустить таймер на прерывание раз минуту + счетчик в этом прерывании прирастить, как насчитает 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() {
}

Не надоело еще?

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

DetSimen пишет:

Интересно, зачем float в 5 строчке.  

Можно было конечно и без этого обойтись. Указав time1 явным образом. Но тогда в этом случае будет не совсем удобно. Цикл включения сотоит из двух интервалов (time1+time2). Т.е если я захочу включать таймер каждые 24 часа, независимо от времени действия таймера (time2), то просто указываю нужно время и все.

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Adolf_Balalaykin пишет:

DetSimen пишет:

Интересно, зачем float в 5 строчке.  

Можно было конечно и без этого обойтись. Указав time1 явным образом. ...

Вопрос был не зачем time1, а зачем он float. Использование типа float в данном случае ошибка.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Adolf_Balalaykin пишет:

Не надоело еще?

надо жеж помочь:
 

// зажигаем с периодичностью 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() {
}