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 Yoshihiro TSUBOI

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

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?

UserRevisionLine numberNew 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