Пытаюсь организовать таймер так сказать один на всех тк раньше особо не надо было один мах нужен был через 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 лайк
нет, у тебя загвоздка везде, из-за недостаточных знаний
BABOS
4
#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])
BABOS
8
#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 лайка
как мне показалось так лучше будет чем кажный по отдельности считать)
Вы как всегда за современный подход , изучу этот вариант .
v258
12
Т.е. изобретаете еще один миллис? Смысл?
2 лайка
v258
13
Если память не позволяет, считать по отдельности не хочется, а на другой МК переходить влом, то
MMM
14
А теперь почему нельзя на миллис делать?
Просто “таймер один на всех” - это как раз и есть миллис. Нафига изобретать велосипед?
2 лайка
Green1
15
Если точность не нужна особая, заводишь сколько надо таймеров и отсчитываешь каждый в loop-е через delay(1). И никакой привязки к миллис-у и Ардуино.)
1 лайк
Green1
17
Зато просто и всё как на ладони.) Для кнопок, светодиодов, реле… вполне.
MMM
19
жуть!
А ведь это наверняка, лишь малая часть того, что ТС наворотил… и, наверно, одна из самых приличных… раз остальное даже ему показывать стыдно…