ADT7410 or TMP102 with mbed HRM1017 sample program konashi.js http://jsdo.it/micutil/7GnE
Dependencies: ADT7410 BLE_API_Native_IRC TMP102 mbed
Fork of BLE_Health_Thermometer_IRC by
konashi.jsを使う場合 http://jsdo.it/micutil/7GnE
techBASICを使う場合 https://www.dropbox.com/s/q5vuqmdr7o8r9v0/ADT7410.txt
I2C温度計:ADT7410またはTMP102を使って mbed HRM1017で温度を表示させるサンプルプログラムです
ADT7410:秋月 http://akizukidenshi.com/catalog/g/gM-06675/ で購入できます。
TMP102:スイッチサイエンス http://www.switch-science.com/catalog/1474/ で購入できます。
mbed HRM1017 http://www.switch-science.com/catalog/1755/
mbedのコード http://mbed.org/users/micono/code/BLE_ADT7410_TMP102_Sample/
ADT7410を使う場合:UseADT7410 1
TMP102を使う場合:UseADT7410 0
konashi.jsを使う場合:KONASHI 1
nRF Toolboxを使う場合:KONASHI 0
ADT7410配線図 /media/uploads/micono/adt7410mbedhrm1017.jpg
main.cpp@6:58ac5eb16aec, 2014-07-20 (annotated)
- Committer:
- micono
- Date:
- Sun Jul 20 04:04:22 2014 +0000
- Revision:
- 6:58ac5eb16aec
- Parent:
- 5:9591519c2782
- Child:
- 7:b576848f8800
update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
donalm | 0:701da26ee5cb | 1 | /* mbed Microcontroller Library |
donalm | 0:701da26ee5cb | 2 | * Copyright (c) 2006-2014 ARM Limited |
donalm | 0:701da26ee5cb | 3 | * |
donalm | 0:701da26ee5cb | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
donalm | 0:701da26ee5cb | 5 | * you may not use this file except in compliance with the License. |
donalm | 0:701da26ee5cb | 6 | * You may obtain a copy of the License at |
donalm | 0:701da26ee5cb | 7 | * |
donalm | 0:701da26ee5cb | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
donalm | 0:701da26ee5cb | 9 | * |
donalm | 0:701da26ee5cb | 10 | * Unless required by applicable law or agreed to in writing, software |
donalm | 0:701da26ee5cb | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
donalm | 0:701da26ee5cb | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
donalm | 0:701da26ee5cb | 13 | * See the License for the specific language governing permissions and |
donalm | 0:701da26ee5cb | 14 | * limitations under the License. |
donalm | 0:701da26ee5cb | 15 | */ |
donalm | 0:701da26ee5cb | 16 | |
donalm | 0:701da26ee5cb | 17 | #include "mbed.h" |
donalm | 0:701da26ee5cb | 18 | #include "nRF51822n.h" |
donalm | 0:701da26ee5cb | 19 | |
donalm | 0:701da26ee5cb | 20 | nRF51822n nrf; /* BLE radio driver */ |
micono | 5:9591519c2782 | 21 | |
micono | 5:9591519c2782 | 22 | #define UseADT7410 1 |
micono | 5:9591519c2782 | 23 | #if UseADT7410 |
micono | 5:9591519c2782 | 24 | #include "ADT7410.h" |
micono | 5:9591519c2782 | 25 | ADT7410 healthThemometer(p22, p20, 0x90, 400); |
micono | 5:9591519c2782 | 26 | #else |
micono | 5:9591519c2782 | 27 | #include "TMP102.h" |
micono | 5:9591519c2782 | 28 | TMP102 healthThemometer(p22, p20, 0x90); /* The TMP102 connected to our board */ |
micono | 5:9591519c2782 | 29 | #endif |
micono | 5:9591519c2782 | 30 | |
micono | 5:9591519c2782 | 31 | #define DBG 0 |
micono | 5:9591519c2782 | 32 | #if DBG |
micono | 5:9591519c2782 | 33 | Serial pc(USBTX, USBRX); |
micono | 5:9591519c2782 | 34 | #endif |
donalm | 0:701da26ee5cb | 35 | |
donalm | 2:f11df1469db2 | 36 | /* LEDs for indication: */ |
donalm | 2:f11df1469db2 | 37 | DigitalOut oneSecondLed(LED1); /* LED1 is toggled every second. */ |
donalm | 2:f11df1469db2 | 38 | DigitalOut advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */ |
donalm | 0:701da26ee5cb | 39 | |
donalm | 0:701da26ee5cb | 40 | |
micono | 5:9591519c2782 | 41 | |
micono | 5:9591519c2782 | 42 | |
micono | 5:9591519c2782 | 43 | |
micono | 5:9591519c2782 | 44 | #define KONASHI 1 |
micono | 5:9591519c2782 | 45 | #if KONASHI |
micono | 5:9591519c2782 | 46 | /* Health Thermometer Service */ |
micono | 5:9591519c2782 | 47 | uint8_t thermTempPayload[2] = { 0, 0 }; |
micono | 5:9591519c2782 | 48 | static const uint16_t konashi_service_uuid = 0xFF00; |
micono | 5:9591519c2782 | 49 | static const uint16_t konashi_i2c_read_uuid = 0x300F; |
micono | 5:9591519c2782 | 50 | GattService thermService (konashi_service_uuid); |
micono | 5:9591519c2782 | 51 | GattCharacteristic thermTemp (konashi_i2c_read_uuid,2, 2, |
micono | 5:9591519c2782 | 52 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE); |
micono | 5:9591519c2782 | 53 | #else |
donalm | 0:701da26ee5cb | 54 | /* Health Thermometer Service */ |
donalm | 0:701da26ee5cb | 55 | uint8_t thermTempPayload[5] = { 0, 0, 0, 0, 0 }; |
donalm | 0:701da26ee5cb | 56 | GattService thermService (GattService::UUID_HEALTH_THERMOMETER_SERVICE); |
donalm | 0:701da26ee5cb | 57 | GattCharacteristic thermTemp (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, |
donalm | 0:701da26ee5cb | 58 | 5, 5, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE); |
donalm | 0:701da26ee5cb | 59 | |
micono | 6:58ac5eb16aec | 60 | /* Battery Level Service */ |
micono | 6:58ac5eb16aec | 61 | uint8_t batt = 100; /* Battery level */ |
micono | 6:58ac5eb16aec | 62 | uint8_t read_batt = 0; /* Variable to hold battery level reads */ |
micono | 6:58ac5eb16aec | 63 | GattService battService ( GattService::UUID_BATTERY_SERVICE ); |
micono | 6:58ac5eb16aec | 64 | GattCharacteristic battLevel ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, 1, 1, |
micono | 6:58ac5eb16aec | 65 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | |
micono | 6:58ac5eb16aec | 66 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
micono | 6:58ac5eb16aec | 67 | |
micono | 5:9591519c2782 | 68 | #endif |
micono | 5:9591519c2782 | 69 | |
donalm | 0:701da26ee5cb | 70 | |
donalm | 0:701da26ee5cb | 71 | |
donalm | 0:701da26ee5cb | 72 | /* Advertising data and parameters */ |
donalm | 0:701da26ee5cb | 73 | GapAdvertisingData advData; |
donalm | 0:701da26ee5cb | 74 | GapAdvertisingData scanResponse; |
donalm | 0:701da26ee5cb | 75 | GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED ); |
donalm | 2:f11df1469db2 | 76 | |
donalm | 0:701da26ee5cb | 77 | uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE, |
donalm | 0:701da26ee5cb | 78 | GattService::UUID_BATTERY_SERVICE}; |
donalm | 0:701da26ee5cb | 79 | |
donalm | 0:701da26ee5cb | 80 | uint32_t quick_ieee11073_from_float(float temperature); |
donalm | 0:701da26ee5cb | 81 | void updateServiceValues(void); |
donalm | 0:701da26ee5cb | 82 | |
donalm | 0:701da26ee5cb | 83 | /**************************************************************************/ |
donalm | 0:701da26ee5cb | 84 | /*! |
donalm | 0:701da26ee5cb | 85 | @brief This custom class can be used to override any GapEvents |
donalm | 0:701da26ee5cb | 86 | that you are interested in handling on an application level. |
donalm | 0:701da26ee5cb | 87 | */ |
donalm | 0:701da26ee5cb | 88 | /**************************************************************************/ |
donalm | 0:701da26ee5cb | 89 | class GapEventHandler : public GapEvents |
donalm | 0:701da26ee5cb | 90 | { |
donalm | 2:f11df1469db2 | 91 | //virtual void onTimeout(void) {} |
donalm | 2:f11df1469db2 | 92 | |
donalm | 0:701da26ee5cb | 93 | virtual void onConnected(void) |
donalm | 0:701da26ee5cb | 94 | { |
micono | 5:9591519c2782 | 95 | #if DBG |
micono | 5:9591519c2782 | 96 | pc.printf("Connected\n\r"); |
micono | 5:9591519c2782 | 97 | #endif |
donalm | 2:f11df1469db2 | 98 | advertisingStateLed = 0; |
donalm | 0:701da26ee5cb | 99 | } |
donalm | 0:701da26ee5cb | 100 | |
donalm | 2:f11df1469db2 | 101 | /* When a client device disconnects we need to start advertising again. */ |
donalm | 0:701da26ee5cb | 102 | virtual void onDisconnected(void) |
donalm | 0:701da26ee5cb | 103 | { |
donalm | 0:701da26ee5cb | 104 | nrf.getGap().startAdvertising(advParams); |
donalm | 2:f11df1469db2 | 105 | advertisingStateLed = 1; |
donalm | 0:701da26ee5cb | 106 | } |
donalm | 0:701da26ee5cb | 107 | }; |
donalm | 0:701da26ee5cb | 108 | |
donalm | 0:701da26ee5cb | 109 | /**************************************************************************/ |
donalm | 0:701da26ee5cb | 110 | /*! |
donalm | 0:701da26ee5cb | 111 | @brief Program entry point |
donalm | 0:701da26ee5cb | 112 | */ |
donalm | 0:701da26ee5cb | 113 | /**************************************************************************/ |
donalm | 0:701da26ee5cb | 114 | int main(void) |
donalm | 0:701da26ee5cb | 115 | { |
donalm | 2:f11df1469db2 | 116 | |
donalm | 2:f11df1469db2 | 117 | /* Setup blinky led */ |
donalm | 2:f11df1469db2 | 118 | oneSecondLed=1; |
donalm | 0:701da26ee5cb | 119 | |
donalm | 2:f11df1469db2 | 120 | /* Setup an event handler for GAP events i.e. Client/Server connection events. */ |
donalm | 0:701da26ee5cb | 121 | nrf.getGap().setEventHandler(new GapEventHandler()); |
donalm | 2:f11df1469db2 | 122 | |
donalm | 0:701da26ee5cb | 123 | /* Initialise the nRF51822 */ |
donalm | 0:701da26ee5cb | 124 | nrf.init(); |
donalm | 0:701da26ee5cb | 125 | |
donalm | 0:701da26ee5cb | 126 | /* Make sure we get a clean start */ |
donalm | 0:701da26ee5cb | 127 | nrf.reset(); |
donalm | 0:701da26ee5cb | 128 | |
donalm | 0:701da26ee5cb | 129 | /* Add BLE-Only flag and complete service list to the advertising data */ |
donalm | 0:701da26ee5cb | 130 | advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
donalm | 0:701da26ee5cb | 131 | advData.addData(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, |
donalm | 0:701da26ee5cb | 132 | (uint8_t*)uuid16_list, sizeof(uuid16_list)); |
donalm | 0:701da26ee5cb | 133 | advData.addAppearance(GapAdvertisingData::GENERIC_THERMOMETER); |
donalm | 0:701da26ee5cb | 134 | nrf.getGap().setAdvertisingData(advData, scanResponse); |
donalm | 0:701da26ee5cb | 135 | |
donalm | 0:701da26ee5cb | 136 | /* Health Thermometer Service */ |
donalm | 0:701da26ee5cb | 137 | thermService.addCharacteristic(thermTemp); |
donalm | 0:701da26ee5cb | 138 | nrf.getGattServer().addService(thermService); |
donalm | 0:701da26ee5cb | 139 | |
micono | 5:9591519c2782 | 140 | #if KONASHI |
micono | 5:9591519c2782 | 141 | #else |
donalm | 0:701da26ee5cb | 142 | /* Add the Battery Level service */ |
donalm | 0:701da26ee5cb | 143 | battService.addCharacteristic(battLevel); |
donalm | 0:701da26ee5cb | 144 | nrf.getGattServer().addService(battService); |
micono | 5:9591519c2782 | 145 | #endif |
donalm | 0:701da26ee5cb | 146 | |
donalm | 0:701da26ee5cb | 147 | /* Start advertising (make sure you've added all your data first) */ |
donalm | 0:701da26ee5cb | 148 | nrf.getGap().startAdvertising(advParams); |
donalm | 2:f11df1469db2 | 149 | advertisingStateLed = 1; |
donalm | 0:701da26ee5cb | 150 | |
donalm | 0:701da26ee5cb | 151 | for (;;) |
donalm | 0:701da26ee5cb | 152 | { |
donalm | 2:f11df1469db2 | 153 | /* Now that we're live, update the battery level & temperature characteristics */ |
donalm | 2:f11df1469db2 | 154 | updateServiceValues(); |
donalm | 0:701da26ee5cb | 155 | wait(1); |
donalm | 0:701da26ee5cb | 156 | } |
donalm | 0:701da26ee5cb | 157 | } |
donalm | 0:701da26ee5cb | 158 | |
donalm | 0:701da26ee5cb | 159 | /**************************************************************************/ |
donalm | 0:701da26ee5cb | 160 | /*! |
donalm | 2:f11df1469db2 | 161 | @brief Ticker callback to switch advertisingStateLed state |
donalm | 0:701da26ee5cb | 162 | */ |
donalm | 0:701da26ee5cb | 163 | /**************************************************************************/ |
donalm | 0:701da26ee5cb | 164 | void updateServiceValues(void) |
donalm | 0:701da26ee5cb | 165 | { |
donalm | 2:f11df1469db2 | 166 | /* Toggle the one second LEDs */ |
donalm | 2:f11df1469db2 | 167 | oneSecondLed = !oneSecondLed; |
micono | 5:9591519c2782 | 168 | |
micono | 5:9591519c2782 | 169 | #if KONASHI |
micono | 5:9591519c2782 | 170 | #else |
donalm | 0:701da26ee5cb | 171 | /* Update battery level */ |
donalm | 0:701da26ee5cb | 172 | nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt)); |
donalm | 2:f11df1469db2 | 173 | /* Decrement the battery level. */ |
donalm | 2:f11df1469db2 | 174 | batt <=50 ? batt=100 : batt--;; |
micono | 5:9591519c2782 | 175 | #endif |
donalm | 0:701da26ee5cb | 176 | |
donalm | 2:f11df1469db2 | 177 | /* Update the temperature. Note that we need to convert to an ieee11073 format float. */ |
micono | 5:9591519c2782 | 178 | #if UseADT7410 |
micono | 5:9591519c2782 | 179 | float temperature = healthThemometer.getTemp(); |
micono | 5:9591519c2782 | 180 | #else |
donalm | 0:701da26ee5cb | 181 | float temperature = healthThemometer.read(); |
micono | 5:9591519c2782 | 182 | #endif |
micono | 5:9591519c2782 | 183 | #if KONASHI |
micono | 5:9591519c2782 | 184 | uint16_t temp_ieee11073 = temperature; |
micono | 5:9591519c2782 | 185 | //memcpy(thermTempPayload, &temp_ieee11073, 2); |
micono | 5:9591519c2782 | 186 | thermTempPayload[0]=floor(temperature); |
micono | 5:9591519c2782 | 187 | thermTempPayload[1]=floor(10*(temperature-(float)thermTempPayload[0])); |
micono | 5:9591519c2782 | 188 | #else |
donalm | 0:701da26ee5cb | 189 | uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature); |
donalm | 0:701da26ee5cb | 190 | memcpy(thermTempPayload+1, &temp_ieee11073, 4); |
micono | 5:9591519c2782 | 191 | #endif |
micono | 5:9591519c2782 | 192 | #if DBG |
micono | 5:9591519c2782 | 193 | pc.printf("DATA:%d\n\r",temp_ieee11073); |
micono | 5:9591519c2782 | 194 | #endif |
micono | 5:9591519c2782 | 195 | nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload)); |
donalm | 0:701da26ee5cb | 196 | } |
donalm | 0:701da26ee5cb | 197 | |
donalm | 0:701da26ee5cb | 198 | /** |
donalm | 0:701da26ee5cb | 199 | * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type. |
donalm | 0:701da26ee5cb | 200 | * @param temperature The temperature as a float. |
donalm | 0:701da26ee5cb | 201 | * @return The temperature in 11073-20601 FLOAT-Type format. |
donalm | 0:701da26ee5cb | 202 | */ |
donalm | 0:701da26ee5cb | 203 | uint32_t quick_ieee11073_from_float(float temperature) |
donalm | 0:701da26ee5cb | 204 | { |
donalm | 0:701da26ee5cb | 205 | uint8_t exponent = 0xFF; //exponent is -1 |
donalm | 0:701da26ee5cb | 206 | uint32_t mantissa = (uint32_t)(temperature*10); |
donalm | 0:701da26ee5cb | 207 | |
donalm | 0:701da26ee5cb | 208 | return ( ((uint32_t)exponent) << 24) | mantissa; |
donalm | 2:f11df1469db2 | 209 | } |
donalm | 2:f11df1469db2 | 210 |