Несколько таймеров в одном

Пытаюсь организовать таймер так сказать один на всех тк раньше особо не надо было один мах нужен был через millis делал

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

как в цикле правильно сделать для всех отсчет в сек ?

#define TIME_SENS_UPDATE     = 60 ;    // 1 мин
#define TIME_ERRSENS_UPDATE  = 600 ;   // 10 мин
#define TIME_RSSI_UPDATE     = 5 ;     // 5 сек


enum {
  TIMER_SENS,       //таймер обновления вн датч
  TIMER_ERRSENS,    //таймер обновления данных с беспр датчика
  TIMER_RSSI,       //таймер обновления уровня сигнала 
  TIMERS_COUNT      //количество таймеров
};
uint16_t _timer_sec[TIMERS_COUNT]; //таймер 


void setup() {
  Serial.begin(9600);
 _timer_sec[TMR_SENS] = #define TIME_SENS_UPDATE
}

void loop() {
 for (uint8_t tmr = 0; tmr < TIMERS_COUNT; tmr++) { 
    
    тут у меня загвоздка 
     

      }
  
if (!_timer_sec[TIMER_SENS]) { //пришло время запроса температуры
  Serial.println("TIMER_SENS DONE");  
}
}

Делайте на миллис - этого достаточно для вашего случая.

1 лайк

нет, у тебя загвоздка везде, из-за недостаточных знаний

#define TIME_SENS_UPDATE     60    // 1 мин (60 сек)
#define TIME_ERRSENS_UPDATE  600   // 10 мин (600 сек)
#define TIME_RSSI_UPDATE     5     // 5 сек

enum {
  TIMER_SENS,       // таймер обновления вн датч
  TIMER_ERRSENS,    // таймер обновления данных с беспр датчика
  TIMER_RSSI,       // таймер обновления уровня сигнала 
  TIMERS_COUNT      // количество таймеров
};

uint16_t _timer_sec[TIMERS_COUNT];    // текущие значения таймеров
uint32_t _lastMillis[TIMERS_COUNT];   // время последнего обновления

void setup() {
  Serial.begin(9600);
  
  // инициализация таймеров
  _timer_sec[TIMER_SENS] = TIME_SENS_UPDATE;
  _timer_sec[TIMER_ERRSENS] = TIME_ERRSENS_UPDATE;
  _timer_sec[TIMER_RSSI] = TIME_RSSI_UPDATE;
  
  // запоминаем текущее время
  for (uint8_t i = 0; i < TIMERS_COUNT; i++) {
    _lastMillis[i] = millis();
  }
}

void loop() {
  uint32_t currentMillis = millis();
  
  // проверяем каждый таймер
  for (uint8_t tmr = 0; tmr < TIMERS_COUNT; tmr++) {
    // если прошло нужное количество секунд
    if (currentMillis - _lastMillis[tmr] >= (_timer_sec[tmr] * 1000UL)) {
      
      // обновляем время последнего срабатывания
      _lastMillis[tmr] = currentMillis;
      
      // выполняем соответствующее действие
      switch (tmr) {
        case TIMER_SENS:
          Serial.println("TIMER_SENS DONE - обновление датчика");
          // здесь код обновления датчика
          break;
          
        case TIMER_ERRSENS:
          Serial.println("TIMER_ERRSENS DONE - обновление беспроводного датчика");
          // здесь код обновления беспроводного датчика
          break;
          
        case TIMER_RSSI:
          Serial.println("TIMER_RSSI DONE - обновление уровня сигнала");
          // здесь код обновления RSSI
          break;
      }
    }
  }
  
  // остальной код loop() здесь
  // delay не используйте, чтобы millis() работал корректно
}

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

если без case я ведь могу проверять ?

if (!_timer_sec[TIMER_SENS]) 

Цель какая?

#define TIME_SENS_UPDATE     60    // 1 мин
#define TIME_ERRSENS_UPDATE  600   // 10 мин
#define TIME_RSSI_UPDATE     5     // 5 сек

enum {
  TIMER_SENS,
  TIMER_ERRSENS,
  TIMER_RSSI,
  TIMERS_COUNT
};

uint16_t _timer_sec[TIMERS_COUNT];
uint32_t _lastMillis[TIMERS_COUNT];

void setup() {
  Serial.begin(9600);
  
  _timer_sec[TIMER_SENS] = TIME_SENS_UPDATE;
  _timer_sec[TIMER_ERRSENS] = TIME_ERRSENS_UPDATE;
  _timer_sec[TIMER_RSSI] = TIME_RSSI_UPDATE;
  
  for (uint8_t i = 0; i < TIMERS_COUNT; i++) {
    _lastMillis[i] = millis();
  }
}

void loop() {
  uint32_t currentMillis = millis();
  
  for (uint8_t tmr = 0; tmr < TIMERS_COUNT; tmr++) {
    if (currentMillis - _lastMillis[tmr] >= 1000) {  // прошла 1 секунда
      _lastMillis[tmr] = currentMillis;
      
      if (_timer_sec[tmr] > 0) {
        _timer_sec[tmr]--;  // декремент каждую секунду
      }
    }
  }
  
  // теперь проверяем нулевые таймеры
  if (_timer_sec[TIMER_SENS] == 0) {
    Serial.println("TIMER_SENS DONE");
    _timer_sec[TIMER_SENS] = TIME_SENS_UPDATE;  // перезапускаем
  }
  
  if (_timer_sec[TIMER_ERRSENS] == 0) {
    Serial.println("TIMER_ERRSENS DONE");
    _timer_sec[TIMER_ERRSENS] = TIME_ERRSENS_UPDATE;
  }
  
  if (_timer_sec[TIMER_RSSI] == 0) {
    Serial.println("TIMER_RSSI DONE");
    _timer_sec[TIMER_RSSI] = TIME_RSSI_UPDATE;
  }
}
1 лайк

если память и задача позволяет, забудьте вы про эти миллис и таймеры

#include <Arduino_FreeRTOS.h>

void TaskBlink1(void *pvParameters);
void TaskBlink2(void *pvParameters);
void TaskBlink3(void *pvParameters);

void setup() {

  Serial.begin(9600);
  
  xTaskCreate(TaskBlink1, "Task1", 128, NULL, 1, NULL);
  xTaskCreate(TaskBlink2, "Task2 ", 128, NULL, 1, NULL);
  xTaskCreate(TaskBlink3, "Task3 ", 128, NULL, 1, NULL);

  vTaskStartScheduler();
}

void loop() {
}

void TaskBlink1(void *pvParameters) {
  while (1) {
    vTaskDelay(5000 / portTICK_PERIOD_MS);
    Serial.println("Task1");
  }
}
void TaskBlink2(void *pvParameters) {
  while (1) {
    vTaskDelay(10000 / portTICK_PERIOD_MS);
    Serial.println("Task2");
  }
}
void TaskBlink3(void *pvParameters) {
  while (1) {
    vTaskDelay(15000 / portTICK_PERIOD_MS);
    Serial.println("Task3");
  }
}

если не позволяет, возьмите контроллер пожирней и опять забудьте))

2 лайка

как мне показалось так лучше будет чем кажный по отдельности считать)

Вы как всегда за современный подход , изучу этот вариант .

Т.е. изобретаете еще один миллис? Смысл?

2 лайка

Если память не позволяет, считать по отдельности не хочется, а на другой МК переходить влом, то

А теперь почему нельзя на миллис делать?
Просто “таймер один на всех” - это как раз и есть миллис. Нафига изобретать велосипед?

2 лайка

Если точность не нужна особая, заводишь сколько надо таймеров и отсчитываешь каждый в loop-е через delay(1). И никакой привязки к миллис-у и Ардуино.)

1 лайк

Не учи плохому ))

Зато просто и всё как на ладони.) Для кнопок, светодиодов, реле… вполне.

сижу и плАчу…

4 лайка

жуть!
А ведь это наверняка, лишь малая часть того, что ТС наворотил… и, наверно, одна из самых приличных… раз остальное даже ему показывать стыдно…

красата!))