Подсчёт секунд с помощью millis()

эта патамушта радист обслуживал станки с точностью один микрон на два метра, это не рушилка какая, панимать нада

Вот же словоблуд, прости господи.

один стакан на два литра! :rofl:


Лехаим! לחיים
по русски это просто “За жизнь!”, самый популярный тост в наших местах.

Еще вариант.

Создаем отдельную задачу и выполняем ее 1 раз в сек.

void myTask(void *pvParameters) {
  TickType_t xLastWakeTime = xTaskGetTickCount();
  const TickType_t xFrequency = pdMS_TO_TICKS(1000); // 1 секунда

  for (;;) {
    // Ждём ровно 1 секунду от предыдущего пробуждения
    vTaskDelayUntil(&xLastWakeTime, xFrequency);

    uint32_t seconds = xLastWakeTime * portTICK_PERIOD_MS / 1000;
    Serial.printf("Task: прошло %u секунд\n", seconds);
  }
}

void setup() {
  Serial.begin(115200);
  xTaskCreate(myTask, "SecTask", 2048, NULL, 1, NULL);
}

Не, ну на ардуинке это уже перебор ))

Подыму. Уже самим бы выжить.( В пору генератор доставать, так бензина нету.( В 2014-м только света небыло, а сейчас ни света, ни бензина. Ужос. И, главное, никаких предпосылок к улучшению.

Спасибо, понятно. Эта тема уже обсуждалась на форуме, но- “повторение-мать учения”, я, к примеру, нюансы подзабыл, сейчас ты помог вспомнить.
Я к тому, что код Деда, за один цикл(секунду) ни одной миллисекунды точно не накапливает, я даже вот проверил ,. “прикрутив” таймер TMR1:


Если бы на каждую секунду накапливалась хотя-бы одна миллисекунда, то на 17 минуте произошёл бы сбой. Однако его нет. Секунды идут “ноздря в ноздрю” с таймером. Микросекунды, может и накапливаются, но это норм. как по мне. Кому не нравится - купите РТС…
P.S.
Если в loop() добавить, скажем delay(300) - да, сбой произойдёт очень быстро, но это уже будет другой код)))

Не привыкайте к плохому. Блокирующий код и любой дурак напишет, пробуйте освоить работу с миллис, потом не раз пригодится (ИМХО)
https://forum.arduino.ru/t/primer-blink-migaem-svetodiodom/9361

хороший хозяин ничего не выбрасывает )))

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

у меня плохое - в 27й строке. :slight_smile:

Согласен, стремление к лучшему должно быть у человеков…

Согласен. Иногда да..

Так это не блокирующий - это “ожидающий” код. :sweat_smile: Он ничего не блокирует. Когда процессору нечего больше делать - он просто ждёт , когда придёт время)))

С этого момента по подробнее пожалуйста.

Пожалуйста

Ну и развитие метода

Какой парашют? Крутился перед зеркалом , но парашюта не видел за собой. Попрошу кого-нибудь посмотреть из рейхсканцелярии- может со зрением у меня не то..

Я не про это.

Я хочу уловить саму мысль данной фразы.

А что там улавливать? Вот классический блинк без делеев, неблокирующий

#define LED1_PIN 13

void setup()
{
  pinMode(LED1_PIN, OUTPUT);
}

void loop()
{
  static uint32_t led1_timer = millis(); // таймер работы светодиода
  static uint32_t led1_interval = 500;   // интервал работы светодиода в милисекундах
  if (millis() - led1_timer >= led1_interval)
  {
    static bool led_state = false; // флаг состояния светодиода

    led1_timer = millis();  
    led_state = !led_state; 

    digitalWrite(LED1_PIN, led_state); 
  }
}

А вот с делеями, блокирующий

#define LED1_PIN 13

void setup()
{
  pinMode(LED1_PIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED1_PIN, true);
  delay(500);
  digitalWrite(LED1_PIN, false);
  delay(500);
}

Ну и какой проще написать?

Ну мы же уже говорили… И не раз.

inline void toggle(int pin) { digitalWrite(pin, !digitalRead(pin)); }

void loop() {
  toggle(LED1_PIN);
  delay(500);
}

Это не будет работать - pinMode() где? ))

Ну в сетапе же)

А сетап где? Я ж говорю - работать не будет ))