Сделать датчик температуры BLE с помощью nRF51
Как создать датчик температуры BLE с помощью nRF51.
обзор
Это часть серии статей о nRF51. NRF51 - это система на кристалле с Cortex M0 и радиочипом BLE, все в одном. В этой статье показано, как использовать встроенный датчик температуры матрицы на nRF51. Температура матрицы не совпадает с температурой окружающей среды, но может быть откалибрована до температуры окружающей среды с использованием поправочного коэффициента.
Предыдущие статьи
BLE с использованием nRF51: среда сборки ARM-GCC
BLE с использованием nRF51: создание периферийного устройства BLE
Требования
- Устройство, которое имеет nRF51
Используется в статье: nRF-Dongle
- Устройство, поддерживающее Android и BLE
Используется в статье: Android v5.1.1
- Настройка инструментальной цепочки в предыдущей статье.
Изменение программного обеспечения nRF51
Программное обеспечение от создания периферийного устройства BLE необходимо изменить, чтобы прочитать температуру и преобразовать ее в нечто, которое может быть отправлено через BLE. Следующая функция использует встроенный вызов softdevice для чтения регистра TEMP внутри nRF51. Значение делится на 4, так как температура регистрируется с шагом 0, 25 C.
Скачать код
int32_t temperature_data_get(void) { int32_t temp; uint32_t err_code; err_code = sd_temp_get(&temp); APP_ERROR_CHECK(err_code); return temp/4; }
Температура считывается в основном приложении один раз в секунду. Данные преобразуются в 8 бит и отправляются в пользовательскую характеристику BLE. В этом примере в настоящее время не используется схема малой мощности. Если вам нужна низкая мощность, вы можете запустить считывание температуры в таймере и спящий остаток времени. Переменная TEMP_CAL_OFFSET может быть определена путем считывания температуры с консоли в помещении, где известна температура. TEMP_CAL_OFFSET - это просто разница между измеренной температурой и фактической температурой помещения.
// Enter main loop. while(1) { nrf_delay_ms(1000); temp_c = (int8_t)temperature_data_get() + TEMP_CAL_OFFSET; temp_f = (int8_t)((float)temp_c*9/5+32); char2_data(0) = temp_c; char2_data(1) = temp_f; err_code = custom_service_update_data(m_conn_handle, char2_data); APP_ERROR_CHECK(err_code); DEBUG_PRINTF("Actual temperature: %d C -- %d F", temp_c, temp_f); }
Отображение на Android
Приложение Android состоит из двух текстовых полей для отображения темпа в единицах Цельсия или Фаренгейта. Значения обновляются при нажатии текстовых полей.

Исходный код
Скачать код
APK
Скачать код
тестирование
Чтобы проверить, я измерил температуру в помещении, а затем наблюдал снижение температуры, когда я поместил ключ в морозильник.
Вывод
Этот проект можно улучшить, используя уведомления BLE. Уведомления идеальны для значений, которые не меняются очень часто. Характеристика обновляется только после изменения значения. Устройство Android может регистрироваться для этих уведомлений, поэтому темп автоматически отображается, а не запрашивается нажатием. Во-вторых, если датчик будет запущен на батареях, код может быть изменен для использования функции sd_evt_wait для сна до тех пор, пока событие таймера не проснется, чтобы прочитать температуру.
Попробуйте этот проект сами! Получить спецификацию.