ARDUINO Множественный таймер (мультитаймер) с привязкой к RTC

Dorfman

✩✩✩✩✩✩✩
29 Мар 2020
17
1
Ukraine
johnnsoft.space
Имеем ардуинку (пусть будет Уно), группу кнопок (или энкодер), часы реального времени и дисплей. Нужно завести несколько таймеров, которые будут подавать сигнал через определённое время (к примеру, каждые 5 минут, каждые 8 минут, каждые 14 минут и т.д...), причём запускать каждый таймер каждый день нужно вручную. У всех маршрутов интевалы разные, но у одного конкретно взятого маршрута интервалы одинаковые. Например, у 8-го маршрута интервал 13 минут, у 20-го - 6 минут, и т.д...

Применение - конечная остановка автобусов, отъезжающих по разным маршрутам с разными интервалами движения. Девайс должен подавать звуковой сигнал и выводить на экран номер маршрута, которому необходимо отправляться.
Настраивать планирую гибко: добавляю номер маршрута, интервал движения, записываю в ЕЕПРОМ. Выхожу из настроек, выбираю номер маршрута и запускаю конкретный таймер (то есть автобус отъезжает).

Как я это вижу:
Это двумерный массив, в котором 3 столбца и плавающее количество строк.
Столбец 0 - id, которое связывает номер маршрута с его интервалом, столбец 1 - собственно номер (строковое имя) маршрута, и столбец 2 - интервал (в минутах).

ID
Номер маршрута
Интервал (в мин)
1​
10​
11​
2​
21​
5​
3​
13​
16​
4​
15​
26​
5​
28​
13​
6​
163​
55​
...
...
...
id(N)​
track(N)​
interval(N)​
Вот дальше начинаются грабли, которые я не могу понять. Как создать в EEPROM массив, да ещё и плавающий? Как связать адресацию массива и адресацию EEPROM? То есть я хочу добавлять маршруты через настройки, а не вручную в коде скетча.

Или кто-то предложит более простое решение?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,415
978
58
Марий-Эл
Одна запись в массиве - структура из трёх переменных.
Записывать структуру в EEPROM как цепочку байт. Длина цепочки strlen("ИмяСтруктуры")
Место нахождение каждой следующей записи = ID*strlen("ИмяСтруктуры")

Мне кажется самым простым и оптимальным. Не нужно заморачиваться типами переменных и их длиной.
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru
Одна ячейка хранит кол-во строк. Строка состоит из трёх байт:
  • 2 байта - номер маршрута;
  • 1 байт - интервал.
Вычисление адреса конкретной ячейки относительно начального адреса (begin):
begin+(id-1)*3
begin+(id-1)*3+1
begin+(id-1)*3+2
 
  • Лойс +1
Реакции: Dorfman