Thermometer program using TYBLE16

Dependencies:   HDC1000 TYBLE16_BASE TextLCD

Please refer flowing link.
/users/kenjiArai/notebook/tyble16-module-will-become-a-mbed-family--mbedliza/

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?

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