Наигравшись с микропитоном понял что надо переписывать на C. У меня не получилось написать вменяемый код на микропитоне, чтобы весь функционал убрался в прошивку. Основная проблема в том что код не убирается на МК и прошивка не загрушается. Также отсутствие пакета вычислегния сатурации на питоне. Пришлось бы портировать там не очень сложно но всёже. Поэтому переделаем на C.
Начал я с базовых элементов периферии. Экран поможет с отладкой + тест экрана. На с на сколько я помню библиотека даже побогаче чем на микропитоне. Далее датчик кислорода и термистор.
По термистору нашёл интересную информацию что датчик может нагреваться при длительном использовании и это может влиять на показатели, Поэтому автор предлагал подцепить на лапу и перед замером подавать питание а после выключать источник тут. Идея мне понравилась. На сколько это правильно не могу пока сказать, точно надо попробовать. Пусть знающие люди подскажут.
Сердце контроллера
Если точнее - то архитектура программы. Базовая модель задач. Луп это конечно хорошо, но для объёмного функционального приложения надо что-то по-интереснее. Да и код будет выглядеть как г*** лапша. Поэтому я решил заиспользовать планировщик + прерывания. С ними я ещё не работал заодно и пощупаю, изучу.
Замер температуры (термистор) - по таймеру раз в минуту(или реже) будет достаточно. Но в иделе бы взять несколько замеров. То есть замеры температуры серия из 5 замеров с интервалом 0.5с раз в 5 минут. Пример тут. Да и эту задачку я уже решал на питоне. Там кода 20 строк.
Далее получение показателей от датчика кислорода - по прерываниям. В Max30105 есть датчик температуры но я думаю что этот датчик нельзя использовать для измерения температуры тела т.к. может влиять температура модуля. И он используется для корректировки показаний фотоэлементов. Накапливаем в массив и обрабатываем. В идеале считать spO чаще. раз в 5 -15 секунд.
Пульс и SpO считаем с помощью https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library. Отображаем на экран по мере обновления информации. Ну и алерты. Необходимо хранить итоговые показатели и по ним считать алерты. Это будет после. Для начала - простые просто на превышение границ. Но использовать будем несколько замеров. При возникновения алерта - отображаем на экране и подаём звуковой сигнал. Вот библиотека базера без delay. https://github.com/ArduinoGetStarted/buzzer/blob/main/examples/Melody/Melody.ino. Эта реализация хороша тем что там нет задержек.
Всё это сделать без delay...
Начинаем
В целом надо собрать MVP (минимально жизнеспособный прототип) это программа в которой реализован основной функционал без всяких бантиков.
Основные сквозные сценарии:
- Получаем измерения с датчика температуры отображаем на экран. Измерение соответствует действительности.
- При превышении температуры выше границы (37.5 гр Ц.) отображаем на экране информацию об предупреждении, подаём звуковой сигнал.
- Получаем измерения с датчика Max30102. Вычисляем пульс. Отображаем на экран. Измерение соответствует действительности.
- При превышении пульса выше границы (125 уд\мин) отображаем на экране информацию об предупреждении, подаём звуковой сигнал.
- Получаем измерения с датчика Max30102. Вычисляем SpO (насыщенность крови кислородом). Отображаем на экран. Измерение соответствует действительности.
- При падении SpO ниже границы (94%) отображаем на экране информацию об предупреждении, подаём звуковой сигнал.
Начнем с 3 и 5. тк там выше неопределённость и прототип позволит их закрыть. Ну и по итогам - получим код который даст пользу.
__Здесь_будет_фото_макетной_платы__
Подключил, дисплей. Подключил Max30105. Разобравшись в проблемах и поправив несколько баг. Получил первые показания на экране. Для старта - отлично.
По проблемам. Были сложности с подключением 2х устройств к шине I2C. Пришлось поковырять но в целом всё нормально.
Следующая проблема уже существенная - показания Spo и пульса - не стабильные.
Что я сделал:
Взял за основу код отсюда __ссылка__ . Прочитал 100 значений и посчитал на них Spo и пульс. И у меня ничего не завелось. Результаты либо отсутствуют либо вовсе неправильные. либо постоянно меняются. Я замерял свой пульс и сатурацию пульоксиметром напалечным и знаю что у меня spo 98-99 пульс 70 и оно не меняется в течении нескольких замеров. А тут же постоянно плавает. и показывает то 60 то 20 то 99. Отсутствует стабильность.
Пошёл разбираться с этим...
Ссылки
- Основная статья