Thermometer program using TYBLE16
Dependencies: HDC1000 TYBLE16_BASE TextLCD
Please refer flowing link.
/users/kenjiArai/notebook/tyble16-module-will-become-a-mbed-family--mbedliza/
main.cpp@1:1bb39678a0b2, 2018-02-25 (annotated)
- Committer:
- kenjiArai
- Date:
- Sun Feb 25 03:43:27 2018 +0000
- Revision:
- 1:1bb39678a0b2
- Parent:
- 0:d215cd7076fe
bug fix
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kenjiArai | 0:d215cd7076fe | 1 | /* mbed Microcontroller Library |
| kenjiArai | 0:d215cd7076fe | 2 | * Copyright (c) 2006-2013 ARM Limited |
| kenjiArai | 0:d215cd7076fe | 3 | * |
| kenjiArai | 0:d215cd7076fe | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| kenjiArai | 0:d215cd7076fe | 5 | * you may not use this file except in compliance with the License. |
| kenjiArai | 0:d215cd7076fe | 6 | * You may obtain a copy of the License at |
| kenjiArai | 0:d215cd7076fe | 7 | * |
| kenjiArai | 0:d215cd7076fe | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| kenjiArai | 0:d215cd7076fe | 9 | * |
| kenjiArai | 0:d215cd7076fe | 10 | * Unless required by applicable law or agreed to in writing, software |
| kenjiArai | 0:d215cd7076fe | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| kenjiArai | 0:d215cd7076fe | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| kenjiArai | 0:d215cd7076fe | 13 | * See the License for the specific language governing permissions and |
| kenjiArai | 0:d215cd7076fe | 14 | * limitations under the License. |
| kenjiArai | 0:d215cd7076fe | 15 | */ |
| kenjiArai | 0:d215cd7076fe | 16 | /* |
| kenjiArai | 0:d215cd7076fe | 17 | Modified by Kenji Arai, Feburary 25th, 2018 |
| kenjiArai | 0:d215cd7076fe | 18 | */ |
| kenjiArai | 0:d215cd7076fe | 19 | |
| kenjiArai | 0:d215cd7076fe | 20 | #include "mbed.h" |
| kenjiArai | 0:d215cd7076fe | 21 | #include "TYBLE16_BASE.h" |
| kenjiArai | 0:d215cd7076fe | 22 | #include "ble/BLE.h" |
| kenjiArai | 0:d215cd7076fe | 23 | #include "ble/services/HealthThermometerService.h" |
| kenjiArai | 0:d215cd7076fe | 24 | #include "TextLCD.h" |
| kenjiArai | 0:d215cd7076fe | 25 | #include "HDC1000.h" |
| kenjiArai | 0:d215cd7076fe | 26 | |
| kenjiArai | 0:d215cd7076fe | 27 | #define USE_LCD 0 |
| kenjiArai | 0:d215cd7076fe | 28 | |
| kenjiArai | 0:d215cd7076fe | 29 | DigitalOut led1(P0_5); |
| kenjiArai | 0:d215cd7076fe | 30 | Serial pc(P0_1, P0_3); |
| kenjiArai | 0:d215cd7076fe | 31 | I2C i2c(P0_4, P0_6); |
| kenjiArai | 0:d215cd7076fe | 32 | HDC1000 hmtp(i2c); |
| kenjiArai | 0:d215cd7076fe | 33 | #if USE_LCD |
| kenjiArai | 0:d215cd7076fe | 34 | TextLCD_I2C_N lcd(&i2c, 0x7c, TextLCD::LCD8x2); // LCD(Akizuki AQM0802A) |
| kenjiArai | 0:d215cd7076fe | 35 | #endif |
| kenjiArai | 0:d215cd7076fe | 36 | |
| kenjiArai | 0:d215cd7076fe | 37 | static HealthThermometerService *thermometerServicePtr; |
| kenjiArai | 0:d215cd7076fe | 38 | |
| kenjiArai | 0:d215cd7076fe | 39 | const static char DEVICE_NAME[] = "TYBLE16"; |
| kenjiArai | 0:d215cd7076fe | 40 | static const uint16_t uuid16_list[] |
| kenjiArai | 0:d215cd7076fe | 41 | = {GattService::UUID_HEALTH_THERMOMETER_SERVICE}; |
| kenjiArai | 0:d215cd7076fe | 42 | static volatile bool triggerSensorPolling = false; |
| kenjiArai | 0:d215cd7076fe | 43 | static float currentTemperature = 21.0; |
| kenjiArai | 0:d215cd7076fe | 44 | |
| kenjiArai | 0:d215cd7076fe | 45 | /* Restart Advertising on disconnection*/ |
| kenjiArai | 0:d215cd7076fe | 46 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
| kenjiArai | 0:d215cd7076fe | 47 | { |
| kenjiArai | 0:d215cd7076fe | 48 | BLE::Instance().gap().startAdvertising(); |
| kenjiArai | 0:d215cd7076fe | 49 | } |
| kenjiArai | 0:d215cd7076fe | 50 | |
| kenjiArai | 0:d215cd7076fe | 51 | void periodicCallback(void) |
| kenjiArai | 0:d215cd7076fe | 52 | { |
| kenjiArai | 0:d215cd7076fe | 53 | led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ |
| kenjiArai | 0:d215cd7076fe | 54 | triggerSensorPolling = true; |
| kenjiArai | 0:d215cd7076fe | 55 | } |
| kenjiArai | 0:d215cd7076fe | 56 | |
| kenjiArai | 0:d215cd7076fe | 57 | /** |
| kenjiArai | 0:d215cd7076fe | 58 | * This function is called when the ble initialization process has failed |
| kenjiArai | 0:d215cd7076fe | 59 | */ |
| kenjiArai | 0:d215cd7076fe | 60 | void onBleInitError(BLE &ble, ble_error_t error) |
| kenjiArai | 0:d215cd7076fe | 61 | { |
| kenjiArai | 0:d215cd7076fe | 62 | /* Avoid compiler warnings */ |
| kenjiArai | 0:d215cd7076fe | 63 | (void) ble; |
| kenjiArai | 0:d215cd7076fe | 64 | (void) error; |
| kenjiArai | 0:d215cd7076fe | 65 | /* Initialization error handling should go here */ |
| kenjiArai | 0:d215cd7076fe | 66 | } |
| kenjiArai | 0:d215cd7076fe | 67 | |
| kenjiArai | 0:d215cd7076fe | 68 | /** |
| kenjiArai | 0:d215cd7076fe | 69 | * Callback triggered when the ble initialization process has finished |
| kenjiArai | 0:d215cd7076fe | 70 | */ |
| kenjiArai | 0:d215cd7076fe | 71 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
| kenjiArai | 0:d215cd7076fe | 72 | { |
| kenjiArai | 0:d215cd7076fe | 73 | BLE& ble = params->ble; |
| kenjiArai | 0:d215cd7076fe | 74 | ble_error_t error = params->error; |
| kenjiArai | 0:d215cd7076fe | 75 | |
| kenjiArai | 0:d215cd7076fe | 76 | if (error != BLE_ERROR_NONE) { |
| kenjiArai | 0:d215cd7076fe | 77 | /* In case of error, forward the error handling to onBleInitError */ |
| kenjiArai | 0:d215cd7076fe | 78 | onBleInitError(ble, error); |
| kenjiArai | 0:d215cd7076fe | 79 | return; |
| kenjiArai | 0:d215cd7076fe | 80 | } |
| kenjiArai | 0:d215cd7076fe | 81 | /* Ensure that it is the default instance of BLE */ |
| kenjiArai | 0:d215cd7076fe | 82 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
| kenjiArai | 0:d215cd7076fe | 83 | return; |
| kenjiArai | 0:d215cd7076fe | 84 | } |
| kenjiArai | 0:d215cd7076fe | 85 | |
| kenjiArai | 0:d215cd7076fe | 86 | ble.gap().onDisconnection(disconnectionCallback); |
| kenjiArai | 0:d215cd7076fe | 87 | |
| kenjiArai | 0:d215cd7076fe | 88 | /* Setup primary service. */ |
| kenjiArai | 0:d215cd7076fe | 89 | thermometerServicePtr = new HealthThermometerService( |
| kenjiArai | 0:d215cd7076fe | 90 | ble, |
| kenjiArai | 0:d215cd7076fe | 91 | currentTemperature, |
| kenjiArai | 0:d215cd7076fe | 92 | HealthThermometerService::LOCATION_EAR |
| kenjiArai | 0:d215cd7076fe | 93 | ); |
| kenjiArai | 0:d215cd7076fe | 94 | /* setup advertising */ |
| kenjiArai | 0:d215cd7076fe | 95 | ble.gap().accumulateAdvertisingPayload( |
| kenjiArai | 0:d215cd7076fe | 96 | GapAdvertisingData::BREDR_NOT_SUPPORTED | |
| kenjiArai | 0:d215cd7076fe | 97 | GapAdvertisingData::LE_GENERAL_DISCOVERABLE |
| kenjiArai | 0:d215cd7076fe | 98 | ); |
| kenjiArai | 0:d215cd7076fe | 99 | ble.gap().accumulateAdvertisingPayload( |
| kenjiArai | 0:d215cd7076fe | 100 | GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, |
| kenjiArai | 0:d215cd7076fe | 101 | (uint8_t *)uuid16_list, |
| kenjiArai | 0:d215cd7076fe | 102 | sizeof(uuid16_list) |
| kenjiArai | 0:d215cd7076fe | 103 | ); |
| kenjiArai | 0:d215cd7076fe | 104 | ble.gap().accumulateAdvertisingPayload( |
| kenjiArai | 0:d215cd7076fe | 105 | GapAdvertisingData::THERMOMETER_EAR |
| kenjiArai | 0:d215cd7076fe | 106 | ); |
| kenjiArai | 0:d215cd7076fe | 107 | ble.gap().accumulateAdvertisingPayload( |
| kenjiArai | 0:d215cd7076fe | 108 | GapAdvertisingData::COMPLETE_LOCAL_NAME, |
| kenjiArai | 0:d215cd7076fe | 109 | (uint8_t *)DEVICE_NAME, |
| kenjiArai | 0:d215cd7076fe | 110 | sizeof(DEVICE_NAME) |
| kenjiArai | 0:d215cd7076fe | 111 | ); |
| kenjiArai | 0:d215cd7076fe | 112 | ble.gap().setAdvertisingType( |
| kenjiArai | 0:d215cd7076fe | 113 | GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED |
| kenjiArai | 0:d215cd7076fe | 114 | ); |
| kenjiArai | 0:d215cd7076fe | 115 | ble.gap().setAdvertisingInterval(1000); /* 1000ms */ |
| kenjiArai | 0:d215cd7076fe | 116 | ble.gap().startAdvertising(); |
| kenjiArai | 0:d215cd7076fe | 117 | } |
| kenjiArai | 0:d215cd7076fe | 118 | |
| kenjiArai | 0:d215cd7076fe | 119 | int main(void) |
| kenjiArai | 0:d215cd7076fe | 120 | { |
| kenjiArai | 0:d215cd7076fe | 121 | led1 = 1; |
| kenjiArai | 0:d215cd7076fe | 122 | Ticker ticker; |
| kenjiArai | 0:d215cd7076fe | 123 | ticker.attach(periodicCallback, 1); |
| kenjiArai | 0:d215cd7076fe | 124 | #if USE_LCD |
| kenjiArai | 0:d215cd7076fe | 125 | lcd.locate(0, 0); |
| kenjiArai | 0:d215cd7076fe | 126 | // 12345678 |
| kenjiArai | 0:d215cd7076fe | 127 | lcd.puts("12345678"); |
| kenjiArai | 0:d215cd7076fe | 128 | lcd.locate(0, 1); |
| kenjiArai | 0:d215cd7076fe | 129 | // 12345678 |
| kenjiArai | 0:d215cd7076fe | 130 | lcd.puts(" JH1PJL "); |
| kenjiArai | 0:d215cd7076fe | 131 | lcd.setCursor(TextLCD_Base::CurOff_BlkOff); |
| kenjiArai | 0:d215cd7076fe | 132 | lcd.setContrast(0x19); |
| kenjiArai | 0:d215cd7076fe | 133 | wait(2.0f); |
| kenjiArai | 0:d215cd7076fe | 134 | #endif |
| kenjiArai | 0:d215cd7076fe | 135 | BLE &ble = BLE::Instance(); |
| kenjiArai | 0:d215cd7076fe | 136 | ble.init(bleInitComplete); |
| kenjiArai | 0:d215cd7076fe | 137 | while (ble.hasInitialized() == false) { /* spin loop */ } |
| kenjiArai | 0:d215cd7076fe | 138 | // Check TYBLE-16 configuration |
| kenjiArai | 0:d215cd7076fe | 139 | cpu_sys(); |
| kenjiArai | 1:1bb39678a0b2 | 140 | if (compile_condition() == false) { |
| kenjiArai | 0:d215cd7076fe | 141 | pc.printf("This is wrong configuration!!\r\n"); |
| kenjiArai | 0:d215cd7076fe | 142 | while(true) { |
| kenjiArai | 0:d215cd7076fe | 143 | led1 = !led1; |
| kenjiArai | 0:d215cd7076fe | 144 | wait(0.2); |
| kenjiArai | 0:d215cd7076fe | 145 | } |
| kenjiArai | 0:d215cd7076fe | 146 | } |
| kenjiArai | 0:d215cd7076fe | 147 | // |
| kenjiArai | 0:d215cd7076fe | 148 | while (true) { |
| kenjiArai | 0:d215cd7076fe | 149 | if (triggerSensorPolling && ble.gap().getState().connected) { |
| kenjiArai | 0:d215cd7076fe | 150 | triggerSensorPolling = false; |
| kenjiArai | 0:d215cd7076fe | 151 | currentTemperature = hmtp.temperature(); |
| kenjiArai | 0:d215cd7076fe | 152 | thermometerServicePtr->updateTemperature(currentTemperature); |
| kenjiArai | 0:d215cd7076fe | 153 | pc.printf("Temperature= %+5.2f [degC]\r\n", currentTemperature); |
| kenjiArai | 0:d215cd7076fe | 154 | #if USE_LCD |
| kenjiArai | 0:d215cd7076fe | 155 | lcd.locate(0, 0); |
| kenjiArai | 0:d215cd7076fe | 156 | // 123456 78 |
| kenjiArai | 0:d215cd7076fe | 157 | lcd.printf("Temp: %cC", 0xdf); |
| kenjiArai | 0:d215cd7076fe | 158 | lcd.locate(0, 1); |
| kenjiArai | 0:d215cd7076fe | 159 | lcd.printf(" %+5.2f ", currentTemperature); |
| kenjiArai | 0:d215cd7076fe | 160 | #endif |
| kenjiArai | 0:d215cd7076fe | 161 | } else { |
| kenjiArai | 0:d215cd7076fe | 162 | ble.waitForEvent(); |
| kenjiArai | 0:d215cd7076fe | 163 | } |
| kenjiArai | 0:d215cd7076fe | 164 | hmtp.get(); // Triger conversion |
| kenjiArai | 0:d215cd7076fe | 165 | } |
| kenjiArai | 0:d215cd7076fe | 166 | } |