Форум программистов, компьютерный форум, киберфорум
Eddy_Em
Войти
Регистрация
Восстановить пароль

Сравнение датчиков влажности-температуры-давления на шине I2C

Запись от Eddy_Em размещена 14.10.2025 в 16:21. Обновил(-а) Eddy_Em 14.10.2025 в 16:26
Показов 4700 Комментарии 0

Накопилось у меня уже прилично всяких датчиков, вот и решил собрать "стенд", чтобы проверить их. Пока датчики не все: еще с десяток едет с алиэкспресса, но пока опишу в общих чертах суть эксперимента.
Т.к. городить на МК монстра мне совершенно не хочется, я подключил датчики непосредственно к компьютеру через преобразователь на основе CP2112. При этом появляется HID-устройство:
Code
1
2
[  426.027327] cp2112 0003:10C4:EA90.0006: hidraw5: USB HID v1.01 Device [Silicon Laboratories CP2112 HID USB-to-SMBus Bridge] on usb-0000:00:14.0-11/input0
[  426.079303] cp2112 0003:10C4:EA90.0006: Part Number: 0x0C Device Version: 0x02
Чтобы оно заработало, нужно иметь поддержку CP2112 в ядре или в виде отдельного модуля hid_cp2112 (руками его грузить не нужно, т.к. все связанное с plug-and-play уже давным-давно обслуживается udev'ом).
Но у датчиков есть неудобная особенность: очень многие имеют один и тот же адрес, причем зачастую не имеют никаких средств его смены (только у некоторых можно поменять 1-3 младших бита адреса). Поэтому нам понадобится еще и мультиплексор на основе PCA9548a. Ну и небольшая "беспаечная макетка" + источник питания.
Вот так это сейчас выглядит:

Для часть имеющихся у меня датчиков я уже писал код или под STM32, или под Orange Pi Zero 2 (второй удобней, т.к. его можно вообще почти без изменений использовать).
Набросал тестовую утилитку для работы с датчиками по-одиночке, которая в итоге превратилась в библиотеку. Файл для работы по-одиночке я превратил в один из примеров использования библиотеки. Вторым примером как раз написал работу с этими датчиками на макетке (напомню, это еще не все: как через 2-3 недели подъедут оставшиеся датчики, проведу более расширенный тест).
Для простоты перечисления имеющихся датчиков и их адресов в портах мультиплексора, сделал так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef struct{
    const char *name;   // name - for header in log
    const char *type;   // sensor's name for `sensor_new`
    uint8_t nch;        // channel number
    uint8_t address;    // address (0 for default)
    sensor_t *sensor;   // pointer to sensor itself
} sd_t;
 
// amount of all sensors connected
#define SENSORS_AMOUNT  8
    
// list of sensors - must be sorted by channel number
static sd_t all_sensors[SENSORS_AMOUNT] = {
    {.name = "AHT15", .type = "AHT15", .nch = 0},
    {.name = "SI7005", .type = "SI7005", .nch = 0},
    {.name = "AHT10", .type = "AHT10", .nch = 1},
    {.name = "BMP180", .type = "BMP180", .nch = 1},
    {.name = "BME280a", .type = "BME280", .nch = 1},
    {.name = "BME280b", .type = "BME280", .nch = 2},
    {.name = "AHT21b", .type = "AHT21", .nch = 2},
    {.name = "SHT30", .type = "SHT3x", .nch = 2},
};
Поле name — условное название датчика, которое будет фигурировать в шапке лога, type — тип (по которому датчик ищется в библиотеке), nch - номер канала мультиплексора (номер бита), address - адрес I2C устройства (если изменен с "умолчательного"), sensor - указатель на сам датчик после обнаружения его библиотекой.
Параметры командной строки минимальные:
Code
1
2
3
4
5
6
7
8
  -H, --hlog=arg       humidity logging file
  -P, --plog=arg       pressure logging file
  -T, --tlog=arg       temperature logging file
  -a, --muladdr=arg    multiplexer I2C address
  -d, --device=arg     I2C device path
  -h, --help           show this help
  -i, --interval=arg   logging interval, seconds (default: 10)
  -m, --presmm         pressure in mmHg instead of hPa
Первые результаты достаточно странные. Приведу выжимку из лог-файлов (запустил у себя на столе, поэтому пока от них немного смысла; как будут все датчики, положу эту плату в подкупольное одного из наших малых телескопов: там все параметры достаточно хорошо меняются, разве что влажность выше 85% при закрытом куполе не должна доходить — осушитель не даст).
Code
1
2
3
4
5
6
7
# Temperature, degC
AHT15   SI7005  AHT10   BMP180  BME280a BME280b AHT21b  SHT30
23.37   22.94   23.36   22.84   23.25   24.14   23.40   23.77
23.33   22.94   23.39   22.86   23.26   24.06   23.36   23.71
23.35   46.12   23.38   22.87   23.26   24.06   23.37   23.73
23.33   23.00   23.44   22.95   23.31   24.03   23.41   23.73
23.31   198.12  23.45   22.93   23.31   24.02   23.37   23.73
Code
1
2
3
4
5
6
7
# Pressure, hPa
BMP180  BME280a BME280b
878.60  877.52  878.20
878.58  877.52  878.19
878.56  877.52  878.19
878.53  877.52  878.19
878.52  877.50  878.18
Code
1
2
3
4
5
6
7
# Humidity, percent
AHT15   SI7005  AHT10   BME280a BME280b AHT21b  SHT30
70.11   82.93   71.85   64.97   67.84   74.71   69.72
67.79   83.08   69.87   64.05   66.84   72.89   68.17
67.95   12.84   69.95   64.10   66.85   73.05   68.28
67.17   83.00   69.50   63.70   66.71   72.51   68.04
67.28   9.83    69.56   63.72   66.78   72.46   67.99
(я забыл добавить последним столбцом время; сделаю это позже).

Видно, что SI7005 периодически "выкаблучивается", выдавая неправильные данные (в среднем один раз на 20-25 измерений), да еще и по влажности сильно выбивается от остальных.
По температуры "каждый в своей поре". И даже BME280, которые я считал точными, выдают примерно на 0.7% различающиеся показания.
По давлению тоже как-то вразнобой, но хотя бы в ±0.5гПа укладываются.

Для калибровки нужны нормальные тарированные психрометр и барометр. Платиновые термодатчики у меня есть, при измерении сразу по трем-пяти точность вполне приличная получается (порядка ±0.1℃). Надеюсь, на БТА можно будет найти советские приборы и попробовать сравнить датчики на точность показаний. Жаль только, для дистанционной записи показаний придется на эти приборы навести видеокамеру и вручную записывать (лень заниматься изготовлением калибровочных приборов самому, да и ртуть для барометра, боюсь, я вряд ли где достану сейчас, а ее хотя бы с поллитра надо).

P.S. более-менее подробные сравнения датчиков в интернете уже делали, например это или это.
А я решил повторить, заодно написать код для поддержки всех этих датчиков (все равно пригодится).
Миниатюры
Нажмите на изображение для увеличения
Название: IMG_20251014_160036.jpg
Просмотров: 1816
Размер:	190.8 Кб
ID:	11286  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru