BLE_HTS_Demo

This BLE_HTS_Demo program enables you to collect Temperature and Humidity data reading from sensor and transmit to collector device such as smartphone.

Below documents teach you how to install app that can connect and read data from our DELTA-DFCM-NNN40 development board. There are two versions, Android and iPhone.

/media/uploads/Marcomissyou/ios_app_for_environment_sensor_0518.pdf

/media/uploads/Marcomissyou/android_app_for_environment_sensor.pdf

Committer:
Marcomissyou
Date:
Wed Jun 03 05:40:14 2015 +0000
Revision:
1:a7ecbb0ccc61
Parent:
0:ef0f188a6fdd
Child:
2:13ffe50056f9
modify led pin number

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marcomissyou 0:ef0f188a6fdd 1 /* mbed Microcontroller Library
Marcomissyou 0:ef0f188a6fdd 2 * Copyright (c) 2006-2013 ARM Limited
Marcomissyou 0:ef0f188a6fdd 3 *
Marcomissyou 0:ef0f188a6fdd 4 * Licensed under the Apache License, Version 2.0 (the "License");
Marcomissyou 0:ef0f188a6fdd 5 * you may not use this file except in compliance with the License.
Marcomissyou 0:ef0f188a6fdd 6 * You may obtain a copy of the License at
Marcomissyou 0:ef0f188a6fdd 7 *
Marcomissyou 0:ef0f188a6fdd 8 * http://www.apache.org/licenses/LICENSE-2.0
Marcomissyou 0:ef0f188a6fdd 9 *
Marcomissyou 0:ef0f188a6fdd 10 * Unless required by applicable law or agreed to in writing, software
Marcomissyou 0:ef0f188a6fdd 11 * distributed under the License is distributed on an "AS IS" BASIS,
Marcomissyou 0:ef0f188a6fdd 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Marcomissyou 0:ef0f188a6fdd 13 * See the License for the specific language governing permissions and
Marcomissyou 0:ef0f188a6fdd 14 * limitations under the License.
Marcomissyou 0:ef0f188a6fdd 15 */
Marcomissyou 0:ef0f188a6fdd 16
Marcomissyou 0:ef0f188a6fdd 17 #include "mbed.h"
Marcomissyou 0:ef0f188a6fdd 18 #include "BatteryService.h"
Marcomissyou 0:ef0f188a6fdd 19 #include "DeviceInformationService.h"
Marcomissyou 0:ef0f188a6fdd 20 #include "BLEDevice.h"
Marcomissyou 0:ef0f188a6fdd 21
Marcomissyou 0:ef0f188a6fdd 22 #include "hts221.h"
Marcomissyou 0:ef0f188a6fdd 23 #include "uvis25.h"
Marcomissyou 0:ef0f188a6fdd 24 #include "nrf_gpio.h"
Marcomissyou 0:ef0f188a6fdd 25
Marcomissyou 0:ef0f188a6fdd 26 #include "nrf51_bitfields.h"
Marcomissyou 0:ef0f188a6fdd 27
Marcomissyou 0:ef0f188a6fdd 28 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
Marcomissyou 0:ef0f188a6fdd 29 * it will have an impact on code-size and power consumption. */
Marcomissyou 0:ef0f188a6fdd 30 BLEDevice ble;
Marcomissyou 1:a7ecbb0ccc61 31
Marcomissyou 1:a7ecbb0ccc61 32 DigitalOut led0(p7);
Marcomissyou 0:ef0f188a6fdd 33
Marcomissyou 0:ef0f188a6fdd 34 static const uint8_t UUID_HUMI_AND_UVI[] = {0xf5, 0x59, 0xa2, 0x49, 0xbe, 0xb1, 0x4c, 0x54, 0xa1, 0x0a, 0xc7, 0x95, 0x7e, 0x17, 0xf8, 0x67};
Marcomissyou 0:ef0f188a6fdd 35 uint8_t wrs_HumiUVI_payload[11] = {0, };
Marcomissyou 0:ef0f188a6fdd 36 uint8_t htsTempPayload[7] = {0,};
Marcomissyou 0:ef0f188a6fdd 37 /* Health Thermometer Service */
Marcomissyou 0:ef0f188a6fdd 38 /* Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml */
Marcomissyou 0:ef0f188a6fdd 39 /* Temperature Measurement: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml */
Marcomissyou 0:ef0f188a6fdd 40 GattCharacteristic htsTemp ( GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, htsTempPayload, 6, 13, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
Marcomissyou 0:ef0f188a6fdd 41 GattCharacteristic wrs_HumiUVI ( UUID_HUMI_AND_UVI, wrs_HumiUVI_payload, 1, 7, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
Marcomissyou 0:ef0f188a6fdd 42 GattCharacteristic *htsChars[] = {&htsTemp, &wrs_HumiUVI};
Marcomissyou 0:ef0f188a6fdd 43 GattService htsService ( GattService::UUID_HEALTH_THERMOMETER_SERVICE, htsChars, sizeof(htsChars) / sizeof(GattCharacteristic *));
Marcomissyou 0:ef0f188a6fdd 44
Marcomissyou 0:ef0f188a6fdd 45 float tempCelsius = 25.50;
Marcomissyou 0:ef0f188a6fdd 46 int32_t tempCelsius_ix100;
Marcomissyou 0:ef0f188a6fdd 47 int8_t exponent = -2;
Marcomissyou 0:ef0f188a6fdd 48 uint8_t UTC[7] = { 222, 7, 9, 11, 13, 42, 59 };
Marcomissyou 0:ef0f188a6fdd 49 float humi = 55;
Marcomissyou 0:ef0f188a6fdd 50 int32_t humi_ix100;
Marcomissyou 0:ef0f188a6fdd 51 uint8_t uvi = 8;
Marcomissyou 0:ef0f188a6fdd 52 uint32_t counter = 0;
Marcomissyou 0:ef0f188a6fdd 53
Marcomissyou 0:ef0f188a6fdd 54 const static char DEVICE_NAME[] = "WRS_d7";
Marcomissyou 0:ef0f188a6fdd 55 static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE,
Marcomissyou 0:ef0f188a6fdd 56 GattService::UUID_DEVICE_INFORMATION_SERVICE};
Marcomissyou 0:ef0f188a6fdd 57 static volatile bool triggerSensorPolling = false;
Marcomissyou 0:ef0f188a6fdd 58
Marcomissyou 0:ef0f188a6fdd 59 /**************************************************************************/
Marcomissyou 0:ef0f188a6fdd 60 /*!
Marcomissyou 0:ef0f188a6fdd 61 @brief This custom class can be used to override any GattServerEvents
Marcomissyou 0:ef0f188a6fdd 62 that you are interested in handling on an application level.
Marcomissyou 0:ef0f188a6fdd 63 */
Marcomissyou 0:ef0f188a6fdd 64 /**************************************************************************/
Marcomissyou 0:ef0f188a6fdd 65 //
Marcomissyou 0:ef0f188a6fdd 66 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
Marcomissyou 0:ef0f188a6fdd 67 {
Marcomissyou 0:ef0f188a6fdd 68 ble.startAdvertising();
Marcomissyou 0:ef0f188a6fdd 69 }
Marcomissyou 0:ef0f188a6fdd 70
Marcomissyou 0:ef0f188a6fdd 71 void periodicCallback(void)
Marcomissyou 0:ef0f188a6fdd 72 {
Marcomissyou 0:ef0f188a6fdd 73 led0 = !led0; /* Do blinky on LED1 while we're waiting for BLE events */
Marcomissyou 0:ef0f188a6fdd 74
Marcomissyou 0:ef0f188a6fdd 75 /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
Marcomissyou 0:ef0f188a6fdd 76 * heavy-weight sensor polling from the main thread. */
Marcomissyou 0:ef0f188a6fdd 77 triggerSensorPolling = true;
Marcomissyou 0:ef0f188a6fdd 78 }
Marcomissyou 0:ef0f188a6fdd 79 /**************************************************************************/
Marcomissyou 0:ef0f188a6fdd 80 /*!
Marcomissyou 0:ef0f188a6fdd 81 @brief Program entry point
Marcomissyou 0:ef0f188a6fdd 82 */
Marcomissyou 0:ef0f188a6fdd 83 /**************************************************************************/
Marcomissyou 0:ef0f188a6fdd 84
Marcomissyou 0:ef0f188a6fdd 85 int main(void)
Marcomissyou 0:ef0f188a6fdd 86 {
Marcomissyou 0:ef0f188a6fdd 87 nrf_gpio_cfg_output(19); // SWIO
Marcomissyou 0:ef0f188a6fdd 88 nrf_gpio_pin_clear(19);
Marcomissyou 0:ef0f188a6fdd 89
Marcomissyou 0:ef0f188a6fdd 90 if (hts221_init() ) //led2=1;
Marcomissyou 0:ef0f188a6fdd 91 // else led2=0;
Marcomissyou 0:ef0f188a6fdd 92 HTS221_Calib();
Marcomissyou 0:ef0f188a6fdd 93
Marcomissyou 0:ef0f188a6fdd 94 Ticker ticker;
Marcomissyou 0:ef0f188a6fdd 95 ticker.attach(periodicCallback, 2);
Marcomissyou 0:ef0f188a6fdd 96
Marcomissyou 0:ef0f188a6fdd 97 ble.init();
Marcomissyou 0:ef0f188a6fdd 98 ble.onDisconnection(disconnectionCallback);
Marcomissyou 0:ef0f188a6fdd 99
Marcomissyou 0:ef0f188a6fdd 100 /* Setup auxiliary services. */
Marcomissyou 0:ef0f188a6fdd 101 BatteryService battery(ble);
Marcomissyou 0:ef0f188a6fdd 102 DeviceInformationService deviceInfo(ble, "Delta", "NNN40_1.0", "SN", "EVB_1.0", "B230-n80-m92", "T_0128b");
Marcomissyou 0:ef0f188a6fdd 103
Marcomissyou 0:ef0f188a6fdd 104 /* Setup advertising. */
Marcomissyou 0:ef0f188a6fdd 105 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
Marcomissyou 0:ef0f188a6fdd 106 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
Marcomissyou 0:ef0f188a6fdd 107 ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
Marcomissyou 0:ef0f188a6fdd 108 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Marcomissyou 0:ef0f188a6fdd 109 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Marcomissyou 0:ef0f188a6fdd 110 ble.setAdvertisingInterval(1600);
Marcomissyou 0:ef0f188a6fdd 111 ble.startAdvertising();
Marcomissyou 0:ef0f188a6fdd 112
Marcomissyou 0:ef0f188a6fdd 113 ble.addService(htsService);
Marcomissyou 0:ef0f188a6fdd 114
Marcomissyou 0:ef0f188a6fdd 115 while (true) {
Marcomissyou 0:ef0f188a6fdd 116
Marcomissyou 0:ef0f188a6fdd 117 HTS221_ReadTempHumi(&tempCelsius, &humi);
Marcomissyou 0:ef0f188a6fdd 118 uvi = UVIS25_ReadUVI();
Marcomissyou 0:ef0f188a6fdd 119 /* Update the Temperature measurement */
Marcomissyou 0:ef0f188a6fdd 120 /* See --> https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml */
Marcomissyou 0:ef0f188a6fdd 121 tempCelsius_ix100 = tempCelsius * 100;
Marcomissyou 0:ef0f188a6fdd 122 htsTempPayload[0] = 0x02; // flag
Marcomissyou 0:ef0f188a6fdd 123 htsTempPayload[1] = tempCelsius_ix100%0xff;
Marcomissyou 0:ef0f188a6fdd 124 htsTempPayload[2] = tempCelsius_ix100/0xff;
Marcomissyou 0:ef0f188a6fdd 125 htsTempPayload[3] = tempCelsius_ix100/0xffff;
Marcomissyou 0:ef0f188a6fdd 126 htsTempPayload[4] = exponent;
Marcomissyou 0:ef0f188a6fdd 127 for (int i = 0; i < 7; i++) htsTempPayload[i+5] = UTC[i];
Marcomissyou 0:ef0f188a6fdd 128 ble.updateCharacteristicValue(htsTemp.getValueAttribute().getHandle(), htsTempPayload, 12);
Marcomissyou 0:ef0f188a6fdd 129
Marcomissyou 0:ef0f188a6fdd 130 ble.waitForEvent();
Marcomissyou 1:a7ecbb0ccc61 131 wait(1);
Marcomissyou 0:ef0f188a6fdd 132 wrs_HumiUVI_payload[0] = 0x03; // flag
Marcomissyou 0:ef0f188a6fdd 133 memcpy(&wrs_HumiUVI_payload[1],&humi,4);
Marcomissyou 0:ef0f188a6fdd 134 wrs_HumiUVI_payload[5] = uvi;
Marcomissyou 0:ef0f188a6fdd 135
Marcomissyou 0:ef0f188a6fdd 136 ble.updateCharacteristicValue(wrs_HumiUVI.getValueAttribute().getHandle(), wrs_HumiUVI_payload, 6);
Marcomissyou 0:ef0f188a6fdd 137 ble.waitForEvent();
Marcomissyou 0:ef0f188a6fdd 138 wait(1);
Marcomissyou 0:ef0f188a6fdd 139
Marcomissyou 0:ef0f188a6fdd 140 }
Marcomissyou 0:ef0f188a6fdd 141
Marcomissyou 1:a7ecbb0ccc61 142 }