ESP32. Библиотека сжатия массива данных в памяти

Всем привет
С датчика получаю массив данных 768 байт и отправляю его по UART
Хотелось бы сжать массив перед отправкой для уменьшения времени передачи
Подскажите библиотечку для ESP32, пожалуйста
Попробовал miniz_esp32 - compress/compress2 ругается на выделение памяти (пример что с ней идет без PSRAM не работает)
ESP32-targz вообще только с файлами работает

Не знал что существуют архиваторы для МК)

Это решается просто: выкидывай лишний мусор и отправляй действительно полезную информацию, ну и размеры переменных оптимизировать.
Просто скорости всех интерфейсов таковы, что как-то и не возникает ни у кого проблем с передачей. Или УАРТ там на скорости 10 бод?

Там нет лишнего мусора.
Там матрица температуры 32x24 с датчика MLX90640
Отправка идет по ModbusRTU со скоростью 9600. И не с одного датчика, а с нескольких.
Поэтому хотелось бы время минимизировать для уменьшения цикла опроса.

p.s. Ценными советами, как поднять скорость, перейти на Ethernet и вообще чем заниматься можете пренебречь.

Если это картинка, то стоит порыть в области алгоритмов сжатия изображений. Как в формате PCX, например.

Тогда это из разряда “помогите сжать видео FullHD, для передачи Морзянкой. А то долго отправляет.”
Значит задача в корне не верна, либо проблема в чём-то ещё.
Вот, например, чем не устраивает текущий вариант? Медленно? А зачем быстрей? Чтобы что?

Тут могу тогда порекомендовать забить гвоздь углом микроскопа. Меньше шансов его сломать.
Кстати, тут на форуме есть знаток сжатия до 1 бита.:rofl:

4 лайка

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

1 лайк

У меня где-то валялся работающий пример zip для avr. На esp не запускал, но никакая специфика avr там не используется, так что могу поискать вечером. Надо?

1 лайк

А смысл в затее, если оно сжиматься будет дольше, чем передаваться?

Попробовать передавать только однобайтные изменения, и изредка полную инфу.

Ааа, там и так однобайтная инфа, видимо. Тогда не пойдет.

Да. Если не сложно

Порылся. Нашлись две вещи.

  1. Пара ссылок на чей-то чужой гихаб, который Вам может пригодиться:

    1. GitHub - siara-cc/Shox96_Arduino_lib: Compressing and decompressing Strings for Arduino
    2. GitHub - siara-cc/Unishox_Arduino_Progmem_lib: Retrieve compressed UTF-8 strings from Arduino Flash memory (Progmem)
  2. Какая-то собственная попытка реализовать метод Хафмана, но она, вряд ли Вам подойдет. Там я написал кодирование (сжатие) для ПК, а для ардуино только распаковку из прогмем. Это нужно было для хранения больших текстов – сжал заранее на ПК, в ардуиновскую программу вставил как готовый массив, а потом распаковываешь во время работы. Т.е. сжатия на ардуино не было. Но, если надо, я всё зипну и выложу. Там программа под MS Visual Studio для сжатия и пример на ардуино UNO для распаковки на лету.

1 лайк

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

Не забыв оценить также скорость сжатия и требуемый объем памяти.

Отчего же не пойдет?
Можно упаковывать, скажем в 5-битные фрагменты. Или передавать только изменения. Для эффективного сжатия крайне желательно знать все особенности данных.

1 лайк

Да. Тоже продумываю. Я итак массив 4-хбайтных значений, которые сенсор выдает, сжал до однобайтного. Дальше можно только с потерей точности.

Просто думал, есть готовые библиотечки.

А та на гитхабе, что давал не подошла?

Еще раз:

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

И потом, попытайтесь рассматривать не абсолютные величины, а, скажем отклонения. Либо в пространстве (от датчика к датчику), либо во времени (для одного датчика от одного момента времени к следующему).
Еще можно для каждого (момента времени или датчика) вычислить диапазон, и передавать эти величины отдельно. А кроме них - отдельно показания датчиков, нормированные на этот диапазон, но с меньшей разрядностью.
Например, 10 января в разных местах курятника разброс температуры составляет от -6 до +1, а 13 июня - от +16 до +19. Тогда при погрешности 0.5 градуса для отсчета нужно 3 бита зимой и 2 бита летом. Разрядность вычисляется, исходя из полученного диапазона.
Т.е. передаем не 768 байт, а 2+768/8*3=290 или 2+768/8*2=194.

Не совсем. Эти библиотека заточены под строки Unicode8. Работают по словарю. Мои данные в этот словарь не вписываются и жмутся очень плохо

Жаль :frowning:

Там немного другая задача. Датчик мониторит оборудование. Посылает матрицу состояния. Далее человек помечает каждое состояние по балловой системе и все данные скармливаются нейросетке. После обучения нейросетка должна по матрице выдавать состояния оборудования.
Поэтому данные должны жаться без потерь.
Или, прихожу к такому мнению, не жаться совсем. Просто жить на той скорости, которую обеспечит канал связи без сбоев.
Тем более, температура это довольно инертный параметр