Проблема с преобразованием данных в ESPHome

Доброго времени уважаемые форумчане!

Имеется следующие детали:

  1. ESP32-C3 super mini (https://www.ozon.ru/product/plata-razrabotki-esp32-c3-supermini-wi-fi-bluetooth-dlya-arduino-1421896577/)
  2. Анализатор углекислого газа eSENSE II Display (eSENSE II Display | Air quality & Gas sensing technology from Senseair)
  3. Резистор 150 Ом.

У анализатора углекислого газа eSENSE II Display есть выход 4-20 мА, через резистор 150 Ом подключен к GPIO0 для считывания напряжения. Подвязал ESP32 в Home Assistant через ESPHome.
Замерил показания на пине GPIO0 и показания в PPM. Вышла следующая зависимость:
|V|ppm|
|0|0,6|
|200|0,8|
|300|0,91|
|400|1,02|
|500|1,15|
|630|1,32|
|660|1,35|
|702|1,4|
|743|1,45|
|787|1,5|
|780|1,5|
|852|1,58|
|864|1,59|
|871|1,6|
|875|1,61|
|916|1,65|
|960|1,7|
|999|1,75|
|1040|1,8|
|1070|1,85|
|1146|1,94|
|1243|2,03|
|1242|2,04|
|1314|2,12|
|1349|2,16|
|1449|2,27|
|1505|2,34|
|1520|2,36|
|1562|2,41|
|1617|2,47|
|1720|2,6|
|1950|2,94|
Подскажите как теперь это воткнуть в скетч, чтобы получать показания ppm в Home Assistant?

Самый прямой и банальный путь: оформить в виде массива с табличными значениями, либо ещё тупее, кучу if-else использовать.
Сложный, небанальный путь: найти формулу, по которой пересчитывать. Зависимость явно нелинейная, но в даташите должна быть информация.

Чуть “менее тупее (ТМ)” - свитч-кейс :slight_smile:

1 лайк

в виде графика)) А дальше задача со звездочкой

Нифига не нашёл. В официальных бумагах выход 4-20мА, диапазон 0-2000 ppm и всё. Кстати там Modbus есть.
@restiv нарисуй где-нить график, хоть в Екселе. Тогда будет наглядно видно кривизну. Оттуда уже плясать.

Самый простой вариант как с точки зрения программиста, так и с точки зрения расхода ресурсов МК - табличная функция.
Если есть такая возможность - сделать аргумент с постоянным шагом. Если нет, обращаем внимание, что массив упорядочен, и используем бинарный поиск.
Ну а дальше - либо кусочно-линейная функция, либо - сплайн.


Вот такой получился график и уравнение кривой. Я забивал его в скетч, но вы ходят странные значения:

Такому значению напряжения не может соответствовать такое значение ppm.

# Включение аналогового входа
sensor:
  - platform: adc
    pin: GPIO0  # Пин A0 на ESP32-C3
    name: "CO2 Sensor Voltage"
    id: co2_voltage
    unit_of_measurement: "V"
    update_interval: 5s
    attenuation: 6db
    accuracy_decimals: 3
    filters:
      - lambda: return 0.0012 * x + 0.5733;   // Применение уравнения y = 0.0012x + 0.5733

  - platform: template
    name: "CO2 Concentration"
    unit_of_measurement: "ppm"
    accuracy_decimals: 0
    id: co2_concentration
    filters:
      - multiply: 3.0  # Убедитесь, что это необходимо для вашей схемы
    lambda: return id(co2_voltage).state;

Скетч применяю такой.

Я так понял, что аналоговый пин не считывает напряжение с анализатора и выдает нулевое значение при 4 мА около 0,6 в. Почему не считывает - не могу понять. Уже пробовал менять GPIO с 0 на 1. Результат такой же.

Неужели погрешность в несколько процентов критична? Для концентрации газа. Углекислого.
Это что за язык такой? Не сочтите невеждой)

Это язык программирования YAML, применяется в Home Assistant.
Что касается точности, нет прям высокая точность по любому не получится. Меня устроит и +/-10%.

А как вы снимали табличку из первого поста? Там написано, что она регистрировалась на пине А0 ЕСП. Почему тогда пин считывал, а теперь нет? Может подключили по другому?

Я снимал показания мультиметром.

А зачем было врать? Зачем писали что это данные с ЕСП, зачем градуировать табличку в единицах АЦП ?

Думаю Вам надо начать с любого примера использования функции analogRead() в Ардуино. На той плате, с которой собираетесь использовать сенсор - подключите пин А0 сначала к GND, а потом к 3в3 - и напишите что показывает.

В мои 55 я не устаю удивляться окружающему миру!

Пока есть источники позитивных эмоций - жизнь прекрасна! :wink:

К последнему только присоединиться :+1:
А первому - Напиши на этом языке блиньк и я поверю что это язык программирования :rofl:

Посторонние не поймут над чем мы ржем!
YAML == Yet Another Markup Language (Еще Один Язык Разметки). Это очередной способ разметки, чтобы описывать настройки чего-либо.
Как XML. В какой-то степени JSON. И собственно HTML.
Никому не придет в голову называть html языком программирования.

И тем не менее его так называют :rofl:

«Я запрограммировал интернет страницу» - звучит же круче )))

ЗЫ: Еще css можно отнести - это вообще «таблица стилей» ))

Там даже классы есть )))

Кста. Просто вдруг по ассоциации вспомнил, У тебя нет ссылки на хорошую CSS анимацию сдачи карт, шоп летали красиво? Не могу от чатЖПТ добиться красивости. Он тупой, как Буратино! :wink: А сам я совершенно лево-полушарный человек. Понятие “красиво” от меня да другом полюсе.

Я давно не занимаюсь этим (веб-версткой, PHP и тп), поэтому не смогу помочь. Сейчас стили (что немного замечаю) стали ленивыми. Раньше для придания скругления элементу нужно было десятки строк написать описывая стиль, а сейчас это делается парой строк. Просто выдели время и почитай. Думаю есть (и не мало) подобного.