И снова о millis()

Главное стоять на своём. Можно обнулять миллис перед выставлением интервала и вычитать из интервала “обнулённый миллис”.
… пока разность не превратится в ноль, или его окрестности.

1 лайк

Где Вы взяли stop? Сложением? Я же Вам написал, что так делать нельзя ни при каких обстоятельствах. Или где?

1 лайк

И спрашивать не надо. Достаточно это утвердительно сказать.

Я как-то даме (подруге жены) комплимент сделал, так дулась потом как мышь на крупу. А всего-то делов было:

Она: Ты что, считаешь, что я полная дура?
Я: Да, боже упаси, почему полная – очень даже стройная!

Ну, ведь, комплимент же! Хрен их этих баб поймёт :frowning:

1 лайк

бляха, в действительно, даже утвердительно звучит агрессивно) а что женщина на это подумает - то затрудняюсь предположить, но вряд ли вариант комплимента будет на первом месте.

1 лайк

Здесь речь идет о том, что я выставил раньше, чем Вы написали. А Вашу статью я изучаю с большим интересом.

Напомнило вот что:

  • Вы голубой?
  • Как вы узнали?
  • Да я просто спросил.

Ну, тут ещё от человека зависит. Я когда был студентом, мы изобрели довольно точный датчик дураков (библиотеки для Ардуино нет – сами пишите).

К потолку был подвешен такой шарик на резиночке (была такая игрушка - его кидаешь, а он в руку возвращается). Каждый заходивший и видевший его в первый раз, тут же начинал за него дёргать, а потом спрашивать “что это такое?”. Мы с невинным видом отвечали, что это мол дуракометр. Так вот, дураки на это обижались, а нормальные парни улыбались и отшучивались. Очень точный был датчик.

1 лайк

Журналист спрашивает главврача психбольницы, какой тест является
критерием для выписки пациента.

  • Мы наливаем полную ванну воды, кладем рядом чайную ложечку и большую
    кружку и предлагаем освободить ванну от воды.
  • Ну, любой нормальный человек, естесственно, возмет кружку.
  • Нет, нормальный человек вынет пробку.

Учитывая настоятельные рекомендации ЕвгенийП по использованию millis(),
скетч переделан следующим образом:

static uint32_t period13 = 500;
static uint32_t moment13;
static uint32_t stopor;
static uint32_t delta;

static uint32_t tiktik;

bool trigger;
bool flag = true;

void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(9600);
  stopor = 2 * 60000;
  tiktik = millis();
}
void loop()
{
  if (millis() - moment13 >= period13)
  {
    moment13 = millis();
    trigger = !trigger;
    digitalWrite(13, trigger);
    if (trigger)
    {
      if (flag)
      {
        if (millis() - tiktik >= stopor)
        {
          // здесь  сигнал об окончании периода
          flag = false;
        }
      }
      // дальше вычисляется и выводится остаток до окончания периода в минутах и секундах
      // прошу не смеяться, если что не так, а помочь реализовать эту часть
      if (flag)
      {
        delta = stopor - millis(); 
        delta = (int) (delta / 1000);
        int min_min = (int) (delta / 60);
        int sec_sec = delta - (min_min * 60);

//        String stroka = "";
        stroka = String(min_min);
        stroka += " ";
        stroka += String(sec_sec);
        Serial.println(stroka);
      }
    }
  }
  // если после этой строки будут какие-то задержки delay(), например, то строка 28 не выполнится 3600 раз за час
  // а мне надо чтобы она выполнилась 3600 раз
}

в строках 40-49 вычисляется и выводится остаток в минутах и секундах до окончания периода.
Прошу помочь упростить эту часть.
Спасибо!

В вопросе сортировки дураков, главное быть в себе уверенным ИМХО)))

Код, который не компилируется нельзя ни упростить, ни усложнить. Напишите его для начала по-человечески, чтобы хотя бы компилировался. Потом сформулируйте цель упрощения - чего хотите достичь. Тогда можно будет и подумать.

Прошу прощения.

static uint32_t period13 = 500;
static uint32_t moment13;
static uint32_t stopor;
static uint32_t delta;

static uint32_t tiktik;

bool trigger;
bool flag = true;

void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  Serial.begin(9600);
  stopor = 2 * 60000;
  tiktik = millis();
}
void loop()
{
  if (millis() - moment13 >= period13)
  {
    moment13 = millis();
    trigger = !trigger;
    digitalWrite(13, trigger);
    if (trigger)
    {
      if (flag)
      {
        if (millis() - tiktik >= stopor)
        {
          // здесь  сигнал об окончании периода
          flag = false;
        }
      }
      // дальше вычисляется и выводится остаток до окончания периода в минутах и секундах
      // прошу не смеяться, если что не так, а помочь реализовать эту часть
      if (flag)
      {
        delta = stopor - millis(); 
        delta = (int) (delta / 1000);
        int min_min = (int) (delta / 60);
        int sec_sec = delta - (min_min * 60);

//        String stroka = "";
        String stroka = String(min_min);
        stroka += " ";
        stroka += String(sec_sec);
        Serial.println(stroka);
      }
    }
  }
  // если после этой строки будут какие-то задержки delay(), например, то строка 28 не выполнится 3600 раз за час
  // а мне надо чтобы она выполнилась 3600 раз
}

В строке 40 я нахожу время в миллисекундах delta, оставшееся до истечения периода stopor.
Необходимо преобразовать delta в минуты и секунды. В этом скетче это преобразование работает (строки 40 - 49). Можно ли это сделать проще?

Простите, Вы читать умеете? Я же Вам сказал:

Ну, вот, скажите, кто, кроме Вас знает, что Вы понимаете под слово “проще”? Короче по буквам? Быстрее работает? Меньше памяти занимает? Что?

Кстати, грабли там по коду нехило так разбросаны, если Вам это интересно.

2 лайка

Очень интересно о граблях.

Что касается упрощения, то сделать это грамотней.

Интервалы более пары минут (ну десятка минут, допустим) грамотнее брать с RTC, а не через millis()

3 лайка

и не обсуждать это две недели)

1 лайк

Мне это надоело, я устал и ухожу. Похоже, Вы не знаете сами, что именно Вам нужно. Ну, или старательно троллите.

А до грамотнее, напишите в 43-ей строке нормальный остаток от деления, зачем так “через Альпы-то”?

Если речь идет об этом, то провода не хочу плодить.

Простейший код на два таймера.Больше вывод в сериал занимает.
Если надо вывод дни/часы/минуты - дописать общую функцию несложно

Спойлер
uint32_t sectmr = 0;
uint32_t stop1 = 604800;//7 * 24 * 60 * 60 т.е 7 дней
bool STOP1 = true;
uint32_t stop2 = 3600;//1 час
bool STOP2 = true;

void setup() {
 Serial.begin(9600);
}

void loop() {
 if(millis() - sectmr >= 1000)
 {//каждую секунду
  sectmr = millis();

  if(--stop1 && STOP1)
  {
    Serial.print("stop1 ");
    Serial.println(stop1);
  }
  else
  {
    if(STOP1)
    {
    Serial.println("stop1 done");
    STOP1 = false;
    //время 604800сек вышло
    }
   stop1 = 0;//остановка таймера
  }
  
  if(--stop2 && STOP2)
  {
    Serial.print("stop2 ");
    Serial.println(stop2);
    //выполняем что-то(что длится менее секунды + код) 3600 раз
  }
  else
  {
    if(STOP2)
    {
    Serial.println("stop2 done");
    STOP2 = false;
    //время 3600 вышло
    //чтобы повторить, перезапускаем таймер
    //stop2 = 3600;//в этом случае флаг STOP2 не сбрасываем
    }
    //stop2 = 0;//если надо остановить таймер
  }

 }
 
}

P.S. чуть дополнил

1 лайк

Какой же это троллинг, если здесь Ваше благославление?