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:
Mon Jul 21 06:48:12 2014 +0000
Revision:
7:b576848f8800
Parent:
6:58ac5eb16aec
fixed i2c bus speed from 400 to 400000

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 7:b576848f8800 25 ADT7410 healthThemometer(p22, p20, 0x90, 400000);
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 #define KONASHI 1
micono 5:9591519c2782 42 #if KONASHI
micono 5:9591519c2782 43 /* Health Thermometer Service */
micono 5:9591519c2782 44 uint8_t thermTempPayload[2] = { 0, 0 };
micono 5:9591519c2782 45 static const uint16_t konashi_service_uuid = 0xFF00;
micono 5:9591519c2782 46 static const uint16_t konashi_i2c_read_uuid = 0x300F;
micono 5:9591519c2782 47 GattService thermService (konashi_service_uuid);
micono 5:9591519c2782 48 GattCharacteristic thermTemp (konashi_i2c_read_uuid,2, 2,
micono 5:9591519c2782 49 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
micono 5:9591519c2782 50 #else
donalm 0:701da26ee5cb 51 /* Health Thermometer Service */
donalm 0:701da26ee5cb 52 uint8_t thermTempPayload[5] = { 0, 0, 0, 0, 0 };
donalm 0:701da26ee5cb 53 GattService thermService (GattService::UUID_HEALTH_THERMOMETER_SERVICE);
donalm 0:701da26ee5cb 54 GattCharacteristic thermTemp (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR,
donalm 0:701da26ee5cb 55 5, 5, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
donalm 0:701da26ee5cb 56
micono 6:58ac5eb16aec 57 /* Battery Level Service */
micono 6:58ac5eb16aec 58 uint8_t batt = 100; /* Battery level */
micono 6:58ac5eb16aec 59 uint8_t read_batt = 0; /* Variable to hold battery level reads */
micono 6:58ac5eb16aec 60 GattService battService ( GattService::UUID_BATTERY_SERVICE );
micono 6:58ac5eb16aec 61 GattCharacteristic battLevel ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, 1, 1,
micono 6:58ac5eb16aec 62 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
micono 6:58ac5eb16aec 63 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
micono 6:58ac5eb16aec 64
micono 5:9591519c2782 65 #endif
micono 5:9591519c2782 66
donalm 0:701da26ee5cb 67
donalm 0:701da26ee5cb 68
donalm 0:701da26ee5cb 69 /* Advertising data and parameters */
donalm 0:701da26ee5cb 70 GapAdvertisingData advData;
donalm 0:701da26ee5cb 71 GapAdvertisingData scanResponse;
donalm 0:701da26ee5cb 72 GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED );
donalm 2:f11df1469db2 73
donalm 0:701da26ee5cb 74 uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE,
donalm 0:701da26ee5cb 75 GattService::UUID_BATTERY_SERVICE};
donalm 0:701da26ee5cb 76
donalm 0:701da26ee5cb 77 uint32_t quick_ieee11073_from_float(float temperature);
donalm 0:701da26ee5cb 78 void updateServiceValues(void);
donalm 0:701da26ee5cb 79
donalm 0:701da26ee5cb 80 /**************************************************************************/
donalm 0:701da26ee5cb 81 /*!
donalm 0:701da26ee5cb 82 @brief This custom class can be used to override any GapEvents
donalm 0:701da26ee5cb 83 that you are interested in handling on an application level.
donalm 0:701da26ee5cb 84 */
donalm 0:701da26ee5cb 85 /**************************************************************************/
donalm 0:701da26ee5cb 86 class GapEventHandler : public GapEvents
donalm 0:701da26ee5cb 87 {
donalm 2:f11df1469db2 88 //virtual void onTimeout(void) {}
donalm 2:f11df1469db2 89
donalm 0:701da26ee5cb 90 virtual void onConnected(void)
donalm 0:701da26ee5cb 91 {
micono 5:9591519c2782 92 #if DBG
micono 5:9591519c2782 93 pc.printf("Connected\n\r");
micono 5:9591519c2782 94 #endif
donalm 2:f11df1469db2 95 advertisingStateLed = 0;
donalm 0:701da26ee5cb 96 }
donalm 0:701da26ee5cb 97
donalm 2:f11df1469db2 98 /* When a client device disconnects we need to start advertising again. */
donalm 0:701da26ee5cb 99 virtual void onDisconnected(void)
donalm 0:701da26ee5cb 100 {
donalm 0:701da26ee5cb 101 nrf.getGap().startAdvertising(advParams);
donalm 2:f11df1469db2 102 advertisingStateLed = 1;
donalm 0:701da26ee5cb 103 }
donalm 0:701da26ee5cb 104 };
donalm 0:701da26ee5cb 105
donalm 0:701da26ee5cb 106 /**************************************************************************/
donalm 0:701da26ee5cb 107 /*!
donalm 0:701da26ee5cb 108 @brief Program entry point
donalm 0:701da26ee5cb 109 */
donalm 0:701da26ee5cb 110 /**************************************************************************/
donalm 0:701da26ee5cb 111 int main(void)
donalm 0:701da26ee5cb 112 {
donalm 2:f11df1469db2 113
donalm 2:f11df1469db2 114 /* Setup blinky led */
donalm 2:f11df1469db2 115 oneSecondLed=1;
donalm 0:701da26ee5cb 116
donalm 2:f11df1469db2 117 /* Setup an event handler for GAP events i.e. Client/Server connection events. */
donalm 0:701da26ee5cb 118 nrf.getGap().setEventHandler(new GapEventHandler());
donalm 2:f11df1469db2 119
donalm 0:701da26ee5cb 120 /* Initialise the nRF51822 */
donalm 0:701da26ee5cb 121 nrf.init();
donalm 0:701da26ee5cb 122
donalm 0:701da26ee5cb 123 /* Make sure we get a clean start */
donalm 0:701da26ee5cb 124 nrf.reset();
donalm 0:701da26ee5cb 125
donalm 0:701da26ee5cb 126 /* Add BLE-Only flag and complete service list to the advertising data */
donalm 0:701da26ee5cb 127 advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED);
donalm 0:701da26ee5cb 128 advData.addData(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
donalm 0:701da26ee5cb 129 (uint8_t*)uuid16_list, sizeof(uuid16_list));
donalm 0:701da26ee5cb 130 advData.addAppearance(GapAdvertisingData::GENERIC_THERMOMETER);
donalm 0:701da26ee5cb 131 nrf.getGap().setAdvertisingData(advData, scanResponse);
donalm 0:701da26ee5cb 132
donalm 0:701da26ee5cb 133 /* Health Thermometer Service */
donalm 0:701da26ee5cb 134 thermService.addCharacteristic(thermTemp);
donalm 0:701da26ee5cb 135 nrf.getGattServer().addService(thermService);
donalm 0:701da26ee5cb 136
micono 5:9591519c2782 137 #if KONASHI
micono 5:9591519c2782 138 #else
donalm 0:701da26ee5cb 139 /* Add the Battery Level service */
donalm 0:701da26ee5cb 140 battService.addCharacteristic(battLevel);
donalm 0:701da26ee5cb 141 nrf.getGattServer().addService(battService);
micono 5:9591519c2782 142 #endif
donalm 0:701da26ee5cb 143
donalm 0:701da26ee5cb 144 /* Start advertising (make sure you've added all your data first) */
donalm 0:701da26ee5cb 145 nrf.getGap().startAdvertising(advParams);
donalm 2:f11df1469db2 146 advertisingStateLed = 1;
donalm 0:701da26ee5cb 147
donalm 0:701da26ee5cb 148 for (;;)
donalm 0:701da26ee5cb 149 {
donalm 2:f11df1469db2 150 /* Now that we're live, update the battery level & temperature characteristics */
donalm 2:f11df1469db2 151 updateServiceValues();
donalm 0:701da26ee5cb 152 wait(1);
donalm 0:701da26ee5cb 153 }
donalm 0:701da26ee5cb 154 }
donalm 0:701da26ee5cb 155
donalm 0:701da26ee5cb 156 /**************************************************************************/
donalm 0:701da26ee5cb 157 /*!
donalm 2:f11df1469db2 158 @brief Ticker callback to switch advertisingStateLed state
donalm 0:701da26ee5cb 159 */
donalm 0:701da26ee5cb 160 /**************************************************************************/
donalm 0:701da26ee5cb 161 void updateServiceValues(void)
donalm 0:701da26ee5cb 162 {
donalm 2:f11df1469db2 163 /* Toggle the one second LEDs */
donalm 2:f11df1469db2 164 oneSecondLed = !oneSecondLed;
micono 5:9591519c2782 165
micono 5:9591519c2782 166 #if KONASHI
micono 5:9591519c2782 167 #else
donalm 0:701da26ee5cb 168 /* Update battery level */
donalm 0:701da26ee5cb 169 nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt));
donalm 2:f11df1469db2 170 /* Decrement the battery level. */
donalm 2:f11df1469db2 171 batt <=50 ? batt=100 : batt--;;
micono 5:9591519c2782 172 #endif
donalm 0:701da26ee5cb 173
donalm 2:f11df1469db2 174 /* Update the temperature. Note that we need to convert to an ieee11073 format float. */
micono 5:9591519c2782 175 #if UseADT7410
micono 5:9591519c2782 176 float temperature = healthThemometer.getTemp();
micono 5:9591519c2782 177 #else
donalm 0:701da26ee5cb 178 float temperature = healthThemometer.read();
micono 5:9591519c2782 179 #endif
micono 5:9591519c2782 180 #if KONASHI
micono 5:9591519c2782 181 uint16_t temp_ieee11073 = temperature;
micono 5:9591519c2782 182 //memcpy(thermTempPayload, &temp_ieee11073, 2);
micono 5:9591519c2782 183 thermTempPayload[0]=floor(temperature);
micono 5:9591519c2782 184 thermTempPayload[1]=floor(10*(temperature-(float)thermTempPayload[0]));
micono 5:9591519c2782 185 #else
donalm 0:701da26ee5cb 186 uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature);
donalm 0:701da26ee5cb 187 memcpy(thermTempPayload+1, &temp_ieee11073, 4);
micono 5:9591519c2782 188 #endif
micono 5:9591519c2782 189 #if DBG
micono 5:9591519c2782 190 pc.printf("DATA:%d\n\r",temp_ieee11073);
micono 5:9591519c2782 191 #endif
micono 5:9591519c2782 192 nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload));
donalm 0:701da26ee5cb 193 }
donalm 0:701da26ee5cb 194
donalm 0:701da26ee5cb 195 /**
donalm 0:701da26ee5cb 196 * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type.
donalm 0:701da26ee5cb 197 * @param temperature The temperature as a float.
donalm 0:701da26ee5cb 198 * @return The temperature in 11073-20601 FLOAT-Type format.
donalm 0:701da26ee5cb 199 */
donalm 0:701da26ee5cb 200 uint32_t quick_ieee11073_from_float(float temperature)
donalm 0:701da26ee5cb 201 {
donalm 0:701da26ee5cb 202 uint8_t exponent = 0xFF; //exponent is -1
donalm 0:701da26ee5cb 203 uint32_t mantissa = (uint32_t)(temperature*10);
donalm 0:701da26ee5cb 204
donalm 0:701da26ee5cb 205 return ( ((uint32_t)exponent) << 24) | mantissa;
donalm 2:f11df1469db2 206 }
donalm 2:f11df1469db2 207