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

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

Запись от Eddy_Em размещена 14.10.2025 в 16:21. Обновил(-а) Eddy_Em 14.10.2025 в 16:26
Показов 3783 Комментарии 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
Просмотров: 1581
Размер:	190.8 Кб
ID:	11286  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru