IOT / Esp32 / FreeRTOS / Arduino / stm32
800 subscribers
747 photos
133 videos
29 files
199 links
Копилка материалов по работе с микроконтроллером esp32 / stm32
Download Telegram
Бывают EC-щупы со встроенным термистором (вверху).

Бывают EC-щупы без встроенных термисторов (в середине).
В таком случае термистор нужен отдельный. Они бывают двух типов на 10kΩ или 100kΩ

С помощью жёлтой изоленты совмещаем ЕС и термистор и купорим в баночку вместе с калибровочным раствором 1EC.

Вокруг щупа нужно обязательно очертить пространство где может распространяться электрический ток с помощью напечатанной на 3Д принтере юбочки. Если это не сделать - то прибор будет очень хорошо определять расстояние от электродов до стенки.
Держать температуру 25°С поможет термореле =)

Возьмём 15 сантиметров греющего китайского кабеля, и сделаем нагреватель который будем питать от USB-зарядки. Можность конечно маленькая, но надеюсь достаточная для сохранения тепла внутри пенопластовой коробочки.
Готово!
Пакуем и радуемся постоянной температуре.
This media is not supported in your browser
VIEW IN TELEGRAM
Длительное тестирование началось 26 окт.

Запомним эти цифры:
1616mV - напряжение на делителе
2517mV - опорное напряжение.

Китайский мультиметр при этом считает что 2507mV, так что есть вероятность что АЦП у esp32 плохо калиброван и привирает.
Отправим сырые данные тестирования в облака на хранение, и на сегодня закончим 🤗
Прошли сутки. Надеюсь изменение графика - это очищение электродов =)
Последние 6 часов выглядят очень стабильно.
За сутки график сполз на ~5mV
Кроме этого что-то произошло ночью. Возможно это помеха по питанию - в этот же USB-зарядник воткнута лампа которая для него слишком мощная.
Есть пара моментов которые смущают во всей этой затее.

На всех графиках выше видно что есть некие u+,u-,u.
Это как раз положительное измерение, отрицальеное и среднее.

Расшифровка:
Положительное = Uацп
Отрицательное = Вычитаем Uацп из опорного напряжения 2500mV
Среднее = среднеарифметическое между верхними двумя
Дельта (Δ) = разница менду положительным и отрицательным.

Первое что может пойти не так - это положительное != отрицательному всегда.
Чтобы всё это выглядело сильно красивее на тестовой платке одно из начений смещено на -35 mV.
В таком случае значения пляшут около нуля.

Но на графиках выше мы получаем расхождение окло 15mV и пока не могу определиться с тем какой решение правильнее: смещать или не смещать =)

Скорее всего часть неопределённости сюда вносит неоткалиброванный АЦП. У нас источник опорного 2500 mV и китайский мультиметр считает что там 2497mV). Поэтому показания АЦП 2516mV кажутся немного странными.

Хотя я тут торгуюсь вокруг пары десятков милливольт, которые скорее сильно нише возмо
Но есть вещь которая смущает гораздо больше чем пара десятков милливольт выше. Иногда эта дельта улетает в космос и эти "улёты" вполне стабильны и статичны и точно зависят от каких-то вещей в прошивке. Одно радует что средние значения при этом не меняются.

Дельта (Δ) = 180
Дельта (Δ) = 650

А иногда получается воттак 😱😱😱
А ещё у ESP-IDF какие-то проблемы либо с документацией либо с фриртосом. https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html

Решил я архитектуру немного попеределать, и оказалось так что мне нужно посылать Notify в таску из двух разны задач. После недолгого гугленья понял что это делается с помощью xTaskNotifyIndexed(). В доке ESP-IDF даже про это написано, но вот в коде её нет и VsCode её не видит.

В итоге пришлось нашлёпать костылей с велосипедами. Во время Notify мы должны передать uint32_t, а это 4 раза по 8 бит. Поэтому в первом бите будем передавать тип, а в остальных 3х значение (до 16 миллионов).

Для того чтобы передать -23.88°C сделаем следующую логику, которая будет всем понятна, но за которую люди в свитерах и с красными глазами готовы убивать:

1) умножим на 1000 чтобы получить 23880 мллицельсий.
2) добавим 100*1000 чтобы значение точно было больше 0
3) добавим биты с инфой: 0b00000001 << 24
4) передаём получившееся uint32_t x
5) получаем биты с инфой x >> 24
6) поучаем значение наложив маску
7) вычитаем 100 и делим на 1000 если бит гооврит о том что к нам прилетела температура

на графике сверху как раз таска жёлтым цветом отчитывается о том что получила нотифаи о температуре из ntcTask и о померяном напряжении из ecTask.
This media is not supported in your browser
VIEW IN TELEGRAM
переткнул питание на отдельный 5V источник. В результате последние 2 суток выглядят очень стабильно
Пока делал перестановку - забыл подключить питание для нагревателя.
Морс! Клюква!

Весь вечер делаю дооолгие замеры, чтобы процесс устоялся и при повторном измерении получалась та-же цифра что и первоначально.

Стабильность показаний и их повторяемость при перемещении между баночками в случайном порядке радуют - (2-3mV).

Если присмотреться - то видно что рядом с синим штекером EC щупа появился синий (СТИЛЬ!!!) джампер который воткнут в дальнюю от нас позицию. Это говорит о том что теперь на делителе напряжения сопротивление 500Ω вместо неправильных 4700Ω
График тоже получается красивый.

Когда я делал похожие измерения раньше - у меня всегда начинали уплывать показатели на значениях 5-6 EC. А тут даже в этих цифрах всё сходится.

Калибровочные коэффициенты, правда подобрал вручную: решение калибровочных уравнений осталось только в коде на C++, а на компе это запускать лень.
А вот так получается если коэффициенты подобрать решением математических уравнений.

Оказывается можно ничего не устанавливать, а пользоваться программой в которой я всё считал онлайн:
https://sagecell.sagemath.org/

Система уравнений на первый взгляд кажется очень простой:
a/(R1-b)-c==EC1
a/(R2-b)-c==EC2
a/(R3-b)-c==EC3
Зная сопротивления (R) и электропроводимость (EC) нужно посчитать систему из 3х уравнений =)

Почему уравнения такие? ну хз так показалось 😂
Вот как можно эти уравнения порешать онлайн, используя эту прекрасную софтину.

Но её можно и поставить к себе на компьютер, чтобы решать без ожидания всё что вам нужно и строить всякие разные графики.