Прототип собрал, подобрао настройки. Теперь тестируем. Необходимо убедиться что всё верно раотает.
В этой статье рассмотрим сырые данные которые отдаёт датчик. основные параметры, будем менятьдинамически вот круть!
Вступление
При разаработке кода для прототипа я столкнулся с проблемой - показания spo и пульса были неверные или вообще не считались.
И я начал разбираться
Вот список ошибок с которыми я столкнулся. Первые 2 совсем неприятные ошибки (яб из назвал ошибки новенького).
- После загрузки прошивкии МК уходил в ребут с непонятными логами в консоле. Решение - 7бед один ресет, отключить питание и включить, обратно, что-то не так с датчиком тк не верно был сброшен в начальное состояние.
- После загрузки прошивкии МК уходил в ребут с непонятными логами в консоле. Проблема с памятью. Штука классическая в языке C. Следите за
рукамиуказателями. чинится правильной работой с указателями. - maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate); отказывается работать при bufferLength != 100. Тут до конца не разобрался. пока отложил может я чтотто с массивами наzvbкосячил. Но когда gолез в исходники изучать код - нашёл подсказку скриншот ниже.
- Настройки параметров сенсора. На тех что демонстрируются во всех примерах у меня не завелось
Стенд
Докрутил парсер параметров, настройку вывода (для ардуино графиков), и автоапдейт сенсора. Ну и начал динамически менять. Допчикм посчитал частоту получения сэмплов.
Начал играть, а точнее крутить ручки. Как меня учил один умный человек, спасибо ему за это!
Основное правило радиофизика - не крути больше одной ручки за раз!
Стенд пришлось запилить для более быстрой обратной связи, иначе каждое изменение - этто перепрошика. А меня однообразные дествия расстраивают...
Итак значения парметров которые я подобрал:
- ledBrightness яркость подсветки = 60 - 100
- sampleAverage усреднение аппаратное = 8; //Options: 1, 2, 4, 8, 16, 32
- ledMode режим работы (без измененийб зеленого нет) = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
- sampleRate вот тут подсказка пригодилась = 1600 ; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
- pulseWidth ширина пульсации led = 411; //Options: 69, 118, 215, 411
- adcRange мкасимальное значение переменной для значений с фотосенсора = 16384; //Options: 2048, 4096, 8192, 16384. Другими словами сколько бит данных считывать для значения. У меня при маленьких значениях (4096) и большом значении ledBrightness значения getRed() были пустые.
Подробнее параметры здесь или в даташит.
А ещё интересную штуку нашёл, что sampleRate > 800 возможен если поменять pulseWidth.
У меня оставалсся вопрос: как связаны параметры sampleAverage и sampleRate. Я имею ввиду sampleRate это выходная частота или базовая частота max30105. Нужно ли увеличивать частоту при увеличении значения усреденения?
Реализация обработки события
Код из этой библиотеки у меня в обработке эвентов не заработал. Были ошибки получения данных модуля. программа падала при попытки прочитать данные из модуля. Далеко в отладку решил не нырять, попробовал другую реализацию. И чтение данных в обрпботчике завелось, Использовал эту реализацияю работы с MAX30105 https://github.com/devxplained/MAX3010x-Sensor-Library
Далее проблема возникла с тем что лууп вообще не выполняется, а работает только прерывание непрерывно. Видимо код работы с прерыванием оказалсч слишком долгим, и контекст не успевает переключиться на основной луп. Это проблема...