Станция мониторинга микроклимата спальни из этой статьи — часть дипломной работы. Собрана она на плате NapiSci, учебном конструкторе для процессорного модуля NAPI-C (Rockchip RK3308). В статье — что входит в базовую комплектацию платы, что студент добавил сверх нее под конкретную задачу, как данные со станции и с носимого модуля сходятся на сервере и превращаются в гипнограмму, и какие реальные баги пришлось ловить при отладке на живом железе. В конце — что из этого получилось у станции конкретно, и приглашение талантливым студентам обращаться за бесплатными учебными платами для дипломных работ.

Прикроватный станция для мониторинга сна снимает параметры микроклимата спальни и передает их на сервер синхронно с физиологическими данными от носимого браслета. Сразу надо сказать важную оговорку, в комплексе снятия гипнограммы действуют два параллельных, независимых расчета на сервере — один превращает пульс и движение в гипнограмму, другой оценивает параметры микроклимата (только за это отвечает прикроватная станция на базе NapiSci) в рекомендации по проветриванию, уровню шума, затемнению, и температуре в помещении, и эти два процесса не ссылаются друг на друга.

Связка параметров окружающей среды с фазами сна (шум будит чаще, чем тишина, теплый воздух сокращает глубокий сон и т.д.) — это анализ, который можно построить поверх данных с физио-браслета вручную, поскольку у записей общая временная шкала. В самом коде проекта такой корреляции нет, есть только независимые пороговые правила по среде и независимый эвристический алгоритм по гипнограмме.

Объяснение всего проекта в коротком видео

Проект выполнен студентом М.Шеховцовым в рамках выпускной квалификационной работы (ВКР) на степень магистра в Юго-Западном госуниверситете (г.Курск). Плата была предоставлена на дипломную работу бесплатно и эта программа поддержки студентов действует и сейчас.

У данной статьи нет задачи показа уникальности дипломной работы, т.к. с точки зрения промышленной инженерии задача не представляла собой каких-либо особых трудностей. Здесь более важно показать, что все схемотехника выполнена без единой пайки, методом установки различных компонентов и модулей на учебную плату.

Далее — короткое видео на Rutube, на котором дипломник рассказывает о самом проекте с демонстрацией всех частей оборудования проекта.

Модуль NAPI-C и его несущие платы

NAPI-C — процессорный модуль на Rockchip RK3308, четыре ядра ARM Cortex-A35, частота до 1,3 ГГц, 512 МБ DDR3, 4 ГБ eMMC. Сам по себе модуль не самостоятельное изделие, под него сделано несколько несущих плат под разные сценарии.

Плата

Назначение

Особенности

FCC3308

Компактный Linux – компьютер как готовое изделие

RS485, изолированный источник 9–36 В, RTC

FCU3308

Универсальный Linux – компьютер как изделие с расширением

RTC, доп. Ethernet 10 Мбит/с, слоты для модулей связи LTE/LoRa/Zigbee, слот RS485, слот питания, слот индикации

плата с PoE (802.3at/af)

Компактный Linux – компьютер как изделие без отдельного БП

питание по Ethernet-кабелю, консоль

NapiSci

Плата для целей обучения и прототипирования

собирается как конструктор из модулей

Первые три — готовые производственные форм-факторы под конкретный класс задач. NapiSci выполнена иначе — это набор модулей, из которого под задачу собирается нужная конфигурация. Собственно, для дипломной работы это и есть основное преимущество — не нужно проектировать плату с нуля, чтобы дойти до работающего прототипа.

Что входит в конструктор

Базовая комплектация NapiSci включает часы реального времени, SPI-дисплей, блок питания 9–36 В, встроенный датчик опционально, консольный модуль, модуль RS485, два разъема под I2C-датчики, светодиоды и два типа реле на GPIO — магнитное и сухое, плюс модуль расширения GPIO. Список и фото — на странице платы.

В проекте станции из стандартной комплектации использованы часы реального времени DS3231, OLED-дисплей 1,3 дюйма на контроллере SH1106 по SPI, блок питания 9–36 В, консольный модуль для отладки по UART и одно из двух штатных реле — для демонстрационного управления нагрузкой. Модуль RS485 в проекте распаян, но не задействован — он часть стандартного конструктора независимо от того, нужен он в конкретной сборке или нет.

Плата NapiSci, собранная для проекта станции мониторинга сна
Плата NapiSci, собранная для проекта станции мониторинга сна
Разводка платы NapiSci и расположение основных разъемов
Разводка платы NapiSci и расположение основных разъемов

Что добавлено поверх конструктора

Из двух штатных разъемов под I2C-датчики один занят датчиком температуры и влажности SHT31, второй — датчиком освещенности BH1750. Третий датчик, барометр BMP280, в базовую комплектацию не входит и подключен студентом на свободную шину I2C-3.

Аналоговый тракт для микрофонного модуля MAX4466 и датчика качества воздуха MQ-135 тоже сделан сверх конструктора — оба висят на встроенном АЦП модуля NAPI-C через подсистему IIO, доступ к которой в базовой комплектации не задействован ни одним модулем набора. И третье добавление — модуль Wi-Fi ESP-01 по UART, поскольку беспроводной связи в конструкторе нет по умолчанию, только консоль и опциональный Ethernet на других несущих платах.

Три компонента сверх стандартного набора — третий I2C-датчик, аналоговый тракт с двумя каналами и радиомодуль — и есть тот объем самостоятельной работы, который в дипломе приходится на аппаратную часть станции. Остальное — использование модулей конструктора по назначению.

Место станции в архитектуре комплекса

Комплекс состоит из четырех подсистем — носимый биосенсорный модуль, станция на NapiSci, сервер и мобильное приложение.

·   Носимый модуль на ESP32-C3 передает пульс, сатурацию и данные акселерометра по BLE в приложение, которое агрегирует их и пересылает на сервер по HTTP.

·   Станция измеряет параметры среды и отправляет их на сервер самостоятельно через Wi-Fi модуль ESP-01, независимо от цепочки носимый модуль — приложение.

На сервере из этих двух потоков рассчитываются две независимые функции. Пульс и движение превращаются в гипнограмму. Агрегаты по среде — температура, влажность, свет, доля времени с шумом и качеством воздуха за цикл — сравниваются с пороговыми значениями и превращаются в рекомендации вида «проветрить помещение» или «использовать увлажнитель», с уровнем критичности info, warning или critical.

В учебном проекте эти два расчета не ссылаются друг на друга — рекомендации по микроклимату не учитывают, в какой фазе сна был человек в момент замера, а гипнограмма не учитывает параметры среды.

Структурная схема комплекса, два независимых потока данных сходятся на сервере
Структурная схема комплекса, два независимых потока данных сходятся на сервере

Как из пульса и движения получается гипнограмма

Гипнограмма — график фаз сна за ночь, где каждому короткому интервалу присвоена одна метка — бодрствование, легкий сон, глубокий сон или REM-сон. В клинике разметку по интервалам в 30 секунд ставит врач по энцефалограмме, движению глаз и тонусу мышц подбородка. Ни один из этих сигналов носимый модуль на ESP32-C3 не снимает — электродов на голову в конструкции нет, есть только пульсоксиметрический датчик и акселерометр на запястье.

В основе реконструкции лежит закономерность вегетативной нервной системы. В глубоком сне преобладает парасимпатическая активность, и пульс снижается относительно среднего значения за ночь. В REM-сне происходит обратное — симпатическая активация поднимает пульс, при этом крупных движений почти нет из-за мышечной атонии. Двигательная активность по акселерометру отдельно выделяет эпизоды, когда человек ворочается или встает — это бодрствование.

Сервер размечает каждую пятиминутную эпоху по трем правилам, проверяемым по порядку — движение выше порога дает бодрствование, пульс заметно ниже среднего за ночь дает глубокий сон, заметно выше — REM, все остальное — легкий сон. Входные данные для этого расчета — пульс и мера движения, агрегированные мобильным приложением из потока BLE и переданные на сервер по HTTP. Ни один из этих параметров через станцию NapiSci не проходит.

За десять ночей записи гипнограмма комплекса сравнивалась поэпохно с гипнограммой того же человека за ту же ночь от потребительского фитнес-трекера, разбитой на те же четыре класса. Совпадение — 71 процент, то есть из каждых десяти пятиминутных интервалов ночи в семи оба алгоритма присвоили одинаковую метку. Для ориентира — согласованность между двумя врачами-сомнологами, независимо размечающими одну и ту же полисомнограмму вручную по полному набору клинических сигналов, обычно держится в районе 82–83 процентов. Разметка сна не бывает согласована на сто процентов даже на золотом стандарте, граница между стадиями размыта по своей природе.

71 процент между двумя алгоритмами, ни один из которых не видит энцефалограмму, — результат в разумных пределах для дипломного проекта. Он показывает согласие с другой такой же оценкой, а не точность относительно истинной структуры сна.

Измерительные каналы и подключение к шинам

Шина I2C-1 занята тремя цифровыми устройствами и часами реального времени — SHT31 по адресу 0x44, BMP280 по адресу 0x76, BH1750 по адресу 0x23, DS3231 по адресу 0x68. Совмещение на одной шине возможно благодаря неперекрывающимся адресам и подтягивающим резисторам на плате.

SPI занят под OLED-дисплей — линии CLK, MOSI, MISO, CS0, отдельные GPIO для сигналов DC (GPIO2_A7) и RST (GPIO2_B1). UART1 — системная консоль, UART3 отдан под Wi-Fi модуль ESP-01 на скорости 115200 бод. Аналоговые каналы — канал 0 для микрофонного модуля MAX4466, канал 1 для датчика качества воздуха MQ-135, доступ через подсистему IIO ядра Linux. Линия GPIO2-14 управляет реле.

Датчик температуры и влажности SHT31 на шине I2C станции
Датчик температуры и влажности SHT31 на шине I2C станции
Wi-Fi модуль ESP-01, добавленный сверх конструктора для беспроводной сети
Wi-Fi модуль ESP-01, добавленный сверх конструктора для беспроводной сети

Программная среда — NapiLinux

Контроллер работает под NapiLinux — легковесным дистрибутивом на ядре Linux, собранным под процессоры Rockchip. Корневая файловая система построена с наложением (overlay), что защищает от повреждения при внезапном отключении питания в процессе записи — рабочий сценарий для устройства без источника бесперебойного питания в спальне на бытовой розетке.

Конфигурация интерфейсов выполняется через файл /boot/uEnv.txt подключением оверлеев Device Tree, без пересборки ядра. В системе доступен интерпретатор Python 3.12 с библиотеками для GPIO и периферии, утилиты gpioset, i2cdetect, stty, и systemd с автозапуском пользовательских служб.

Встроенное ПО станции разбито на пакеты. hardware/sensors — драйверы BMP280, BH1750, SHT31 и доступ к АЦП через IIO. hardware — управление OLED-дисплеем по SPI, управление реле через gpioset, драйвер ESP01 с инкапсуляцией AT-команд. services — циклический опрос датчиков, локальное сохранение в SQLite, отправка JSON на сервер. Точка входа night_monitor.py реализует главный цикл — опрос активного цикла сна на сервере, сбор и агрегацию измерений, отправку по сетке времени.

Отладка на живом железе

Изначальная реализация планировщика формировала паузу фиксированной длительности после завершения цикла обработки, из-за чего момент отправки смещался на 10–30 секунд за каждые 5 минут работы, накапливая заметный дрейф за восьмичасовую ночь. Планировщик переработан на привязку к сетке астрономического времени.

def next_grid_time(now, step=SEND_INTERVAL):
"""Ближайший узел сетки времени с шагом step секунд."""
return math.ceil(now / step) * step

Проверка по меткам времени записей в базе данных за восьмичасовую ночь показала отклонение от узлов сетки не более 0,5 секунды после переработки против накопленных 30 секунд в исходной версии.

Отклонение момента отправки от сетки времени, версия с фиксированной паузой и версия с привязкой к сетке
Отклонение момента отправки от сетки времени, версия с фиксированной паузой и версия с привязкой к сетке

Отдельная находка — в канале давления. Первичная проверка показала занижение результата, станция возвращала 627 мм рт. ст. при ожидаемых по данным метеостанции 742. Драйвер BMP280 читал калибровочные коэффициенты как беззнаковые целые, тогда как по спецификации датчика они знаковые.

def signed(value):
return value - 65536 if value > 32767 else value

self.dig
T2 = signed(calib[2] | (calib[3] << 8))
self.dig
P2 = _signed(calib[8] | (calib[9] << 8))

После исправления показание составило 740,4 мм рт. ст., остаточное смещение снято аддитивной поправкой PRESSURE_OFFSET_MMHG = 1.6, итоговое показание 742,1 мм рт. ст. совпало с эталоном метеостанции в пределах 0,1 мм рт. ст.

Показание канала давления до исправления знаковости коэффициентов, после исправления и после аддитивной поправки
Показание канала давления до исправления знаковости коэффициентов, после исправления и после аддитивной поправки

Канал температуры SHT31 показал систематическое завышение на 5°C из-за самонагрева датчика рядом с процессором, компенсация — константой TEMP_OFFSET_C = -5.0. Оба дефекта — систематические, а не случайные, оба найдены сопоставлением с независимым эталоном и устранены константами в config.py, а не перерасчетом на сервере.

Буферизация в SQLite на стороне станции подтвердила пользу за десять ночей тестовой эксплуатации — два кратковременных отключения роутера были компенсированы локальным хранением без потери данных.

Что показал пилот

Станция как измерительный инструмент для гипнограммы роли не играет — физиологический сигнал через нее не проходит, гипнограмму строит сервер из данных носимого модуля. Роль станции — параллельный канал оценки окружающей среды и источник команды на опрос активного цикла сна, по которому она понимает, идет сейчас ночь мониторинга или нет.

По совокупности интерфейсов дипломник закрыл задачу станции без дополнительных плат расширения — RTC, дисплей, блок питания и реле в базовой комплектации, добавить пришлось только сенсорную часть. Для непрерывной работы без обслуживания диапазон питания 9–36 В и отказоустойчивая файловая система — преимущество, подтвержденное на практике двумя отключениями роутера без потери данных.

Слабое место — сетевая часть, но это следствие добавленного модуля, а не конструктора учебной платы. Ethernet на модуле NAPI-C есть, но развертывание в спальне или палате подразумевает Wi-Fi, а радиомодуля в конструкторе нет по умолчанию. Поэтому в пилоте используется внешний ESP-01 по UART с AT-командами и самодельным построением HTTP-запроса. Драйвер работает поверх текстового протокола без контроля целостности пакета, с ожиданием подстрок в ответе по таймауту. Это самая «хлипкая часть» станции, и такая ситуация возникла за пределами штатных модулей.

Аналоговый тракт через встроенный АЦП пригоден для бинарного детектирования событий шума и загрязнения воздуха по превышению порога или базовой линии. Для более тонкой обработки, например распознавания храпа по спектру микрофонного канала, потребуется канал с существенно более высокой частотой дискретизации, чем общего назначения АЦП, рассчитанный на редкие измерения вроде опроса кнопок. Здесь нужен либо цифровой I2S-микрофон, либо отдельный аудиокодек, и это уже выходит за рамки обычной дипломной работы.

Смысл проекта в итоге не в самой станции — задача у нее скромная, три канала среды и отправка агрегата раз в пять минут. Итог в том, что дипломную работу удалось довести до работающего прототипа с реальными данными за счет готового набора модулей, а не разработки платы с нуля. Отладка планировщика и канала давления — рутина, обычная работа конструктора РЭА с реальным железом.

Учебные платы для вузов — по бесплатной заявке

NapiLab передает учебные платы NapiSci вузам бесплатно под интересные дипломные и в ряде случаев, курсовые проекты. Если есть в планах студенческая работа, где не хватает именно легковесной линуксовой аппаратной части — пишите на почту, рассмотрим ваш проект.

Комментарии (3)


  1. GoblinHero
    11.09.2026 08:06

    Для измерения углекислого газа (а для сна это важно) нужен NDIR датчик. Остальное показывает уровень co2 на марсе.


    1. NutsUnderline
      11.09.2026 08:06

      ага, с ним вся установка сразу выглядит как китайский дешеманский показометр. в дипломе по логике должно быть обоснование выбора тех или иных компонентов. для данного проекта можно было даже взять готовое устройство с нормальным датчиком co2 и тем же ble.

      более того - тут целый смартфон выступает как адаптер ble -> http. я бы понял если бы на NapiSci крутился еще и сервер. так нет же, она выступает адаптером i2c - wifi, да еще с дополнительном модулем.

      для всех этих целей достаточно одной единственной esp32 (можно и с ethernet). она бы так же прекрасно смогла и на карту памяти все данные записать, и анализ произвести. и все это можно было бы написать в среде arduino, имея тысячи готовых примеров.


      1. sergbe
        11.09.2026 08:06

        Дипломник сделал как умеет, со временем вырастет в зрелого инженера. -- важно что не в торговлю и юрист-экономист- психолог и тп.