BLEによる温度センサー計測

PSoC4BLEとTMP006/温度センサー(説明はコチラ)を使用して、BLEにより計測データを送信します。

PSoC 4 BLEの設定:

全体回路:

CySmartアプリケーション表示:

I2C:

PSoC Creator 回路図エディタにI2Cコンポーネントを登録します。

I2Cモジュールをダブルクリックしてコンフィグレーションします。

I2C_1_SCL, I2C_1_SDAのピンを設定します。

RGB LED:

PSoC 4 BLE Pioneer KitにはRGBのLEDが存在しますのでインディケータとして使用します。

OutputとPWMコンポーネントを追加します。

PWM_BLUE:

ControlLED:

ひとつはHeart Beat用にPWMを接続しておきます。

BLE:

BLEコンポーネントを登録します。

PROFILES:

GAP:

コード:

BLE Code

#include "project.h"

#include <stdbool.h>

#include <math.h>

#define bool _Bool

#define true 1

#define false 0

#define min(a, b) ((a) < (b) ? (a) : (b))

volatile uint32_t gTick = 0;

CY_ISR(SysTick_Handler)

{

gTick++;

}

void Delay(uint32_t tick_delay)

{

uint32_t tick_entry = gTick;

while(gTick - tick_entry < tick_delay);

}

void I2CDev_initialize(void);

void I2CDev_cleanup(void);

bool I2CDev_readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data);

bool I2CDev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length);

int8_t I2CDev_readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data);

int8_t I2CDev_readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout);

int8_t I2CDev_readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout);

int8_t I2CDev_readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout);

int8_t I2CDev_readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout);

int8_t I2CDev_readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout);

bool I2CDev_writeCommand(uint8_t devAddr, uint8_t command);

bool I2CDev_writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data);

bool I2CDev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length);

bool I2CDev_writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data);

bool I2CDev_writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data);

bool I2CDev_writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data);

bool I2CDev_writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data);

bool I2CDev_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data);

bool I2CDev_writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data);

static uint8_t I2CDev_devAddr;

#define I2C_1_WRITE_XFER_MODE I2C_1_I2C_WRITE_XFER_MODE

#define I2C_1_READ_XFER_MODE I2C_1_I2C_READ_XFER_MODE

#define I2C_1_ACK_DATA I2C_1_I2C_ACK_DATA

#define I2C_1_NAK_DATA I2C_1_I2C_NAK_DATA

void I2CDev_initialize(void)

{

I2C_1_Start();

}

void I2CDev_cleanup(void)

{

I2C_1_Stop();

}

bool I2CDev_readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data)

{

I2C_1_I2CMasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_I2CMasterWriteByte(regAddr);

I2C_1_I2CMasterSendRestart(devAddr, I2C_1_READ_XFER_MODE);

*data = I2C_1_I2CMasterReadByte(I2C_1_ACK_DATA);

I2C_1_I2CMasterSendStop();

return true;

}

bool I2CDev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length)

{

uint8_t i=0;

I2C_1_I2CMasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_I2CMasterWriteByte(regAddr);

I2C_1_I2CMasterSendRestart(devAddr, I2C_1_READ_XFER_MODE);

while (i++ < (length-1)) {

*data++ = I2C_1_I2CMasterReadByte(I2C_1_ACK_DATA);

}

*data = I2C_1_I2CMasterReadByte(I2C_1_NAK_DATA);

I2C_1_I2CMasterSendStop();

return true;

}

int8_t I2CDev_readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data)

{

int8_t count;

for (uint8_t k = 0; k < length * 2; k += length * 2) {

I2C_1_I2CMasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_I2CMasterWriteByte(regAddr);

I2C_1_I2CMasterSendRestart(devAddr, I2C_1_READ_XFER_MODE);

bool msb = true; // starts with MSB, then LSB

for (count = 0; count < length;) {

if (msb == true) {

// first byte is bits 15-8 (MSb=15)

data[count] = I2C_1_I2CMasterReadByte(I2C_1_ACK_DATA) << 8;

msb = false;

} else {

// second byte is bits 7-0 (LSb=0)

data[count] |= I2C_1_I2CMasterReadByte(I2C_1_NAK_DATA);

count++;

msb = true;

}

}

}

I2C_1_I2CMasterSendStop();

return count;

}

int8_t I2CDev_readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout)

{

return I2CDev_readWords(devAddr, regAddr, 1, data);

}

int8_t I2CDev_readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout)

{

uint8_t b;

uint8_t count = I2CDev_readByte(devAddr, regAddr, &b);

*data = b & (1 << bitNum);

return count;

}

int8_t I2CDev_readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout)

{

uint16_t b;

uint8_t count = I2CDev_readWord(devAddr, regAddr, &b, timeout);

*data = b & (1 << bitNum);

return count;

}

int8_t I2CDev_readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout)

{

// 01101001 read byte

// 76543210 bit numbers

// xxx args: bitStart=4, length=3

// 010 masked

// -> 010 shifted

uint8_t count, b;

if ((count = I2CDev_readByte(devAddr, regAddr, &b)) != 0) {

uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);

b &= mask;

b >>= (bitStart - length + 1);

*data = b;

}

return count;

}

int8_t I2CDev_readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout)

{

// 1101011001101001 read byte

// fedcba9876543210 bit numbers

// xxx args: bitStart=12, length=3

// 010 masked

// -> 010 shifted

uint8_t count;

uint16_t w;

if ((count = I2CDev_readWord(devAddr, regAddr, &w, timeout)) != 0) {

uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1);

w &= mask;

w >>= (bitStart - length + 1);

*data = w;

}

return count;

}

bool I2CDev_writeCommand(uint8_t devAddr, uint8_t command)

{

I2C_1_I2CMasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_I2CMasterWriteByte(command);

I2C_1_I2CMasterSendStop();

return true;

}

bool I2CDev_writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data)

{

I2C_1_I2CMasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_I2CMasterWriteByte(regAddr);

I2C_1_I2CMasterWriteByte(data);

I2C_1_I2CMasterSendStop();

return true;

}

bool I2CDev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint8_t length)

{

uint8_t i;

I2C_1_I2CMasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_I2CMasterWriteByte(regAddr);

for (i = 0; i < length; i++)

{

I2C_1_I2CMasterWriteByte(*(data+i));

}

I2C_1_I2CMasterSendStop();

return true;

}

bool I2CDev_writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data)

{

I2C_1_I2CMasterSendStart(devAddr, I2C_1_WRITE_XFER_MODE);

I2C_1_I2CMasterWriteByte(regAddr);

for (uint8_t i = 0; i < length * 2; i++) {

I2C_1_I2CMasterWriteByte((uint8_t)((data[i] >> 8) & 0xFF));

I2C_1_I2CMasterWriteByte( (uint8_t)(data[i++] & 0xFF));

}

I2C_1_I2CMasterSendStop();

return true;

}

bool I2CDev_writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data)

{

return I2CDev_writeWords(devAddr, regAddr, 1, &data);

}

bool I2CDev_writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data)

{

uint8_t b;

I2CDev_readByte(devAddr, regAddr, &b);

b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));

return I2CDev_writeByte(devAddr, regAddr, b);

}

bool I2CDev_writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data)

{

uint16_t w;

I2CDev_readWord(devAddr, regAddr, &w, 0);

w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum));

return I2CDev_writeWord(devAddr, regAddr, w);

}

bool I2CDev_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data)

{

// 010 value to write

// 76543210 bit numbers

// xxx args: bitStart=4, length=3

// 00011100 mask byte

// 10101111 original value (sample)

// 10100011 original & ~mask

// 10101011 masked | value

uint8_t b;

if (I2CDev_readByte(devAddr, regAddr, &b) != 0) {

uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1);

data <<= (bitStart - length + 1); // shift data into correct position

data &= mask; // zero all non-important bits in data

b &= ~(mask); // zero all important bits in existing byte

b |= data; // combine data with existing byte

return I2CDev_writeByte(devAddr, regAddr, b);

} else {

return false;

}

}

bool I2CDev_writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data)

{

// 010 value to write

// fedcba9876543210 bit numbers

// xxx args: bitStart=12, length=3

// 0001110000000000 mask word

// 1010111110010110 original value (sample)

// 1010001110010110 original & ~mask

// 1010101110010110 masked | value

uint16_t w;

if (I2CDev_readWord(devAddr, regAddr, &w, 0) != 0) {

uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1);

data <<= (bitStart - length + 1); // shift data into correct position

data &= mask; // zero all non-important bits in data

w &= ~(mask); // zero all important bits in existing word

w |= data; // combine data with existing word

return I2CDev_writeWord(devAddr, regAddr, w);

} else {

return false;

}

}

uint16_t w_temperature;

float f_temperature;

float prev_f_temperature;

#define TMP006_ADDRESS 0x40 // 100 0000

#define TMP006_EXISTS

#define LED_ON (0u)

#define LED_OFF (1u)

#define NO_ALERT (0u)

#define MILD_ALERT (1u)

#define HIGH_ALERT (2u)

#define LED_TOGGLE_TIMEOUT (100u)

uint8_t alertLevel;

#define WAKEUP_SOURCE_WDT (1u << 0)

#define MEASUREMENT_INTERVAL (1u << 1)

#define SLEEP_DISABLED (1u << 2)

#define ENABLE_HIBERNATE (1u << 3)

#define IMO_FREQUENCY_3MHZ (3u)

#define IMO_FREQUENCY_12MHZ (12u)

#define DEFAULT_MEASUREMENT_INTERVAL (1u)

#define REFRESH_INTERVAL (1000u)

#define HTSS_TEMPERATURE_MEASURE_SIZE (6u)

/* htssInterval holds the Health Thermometer Service measurement interval */

uint32 htssInterval = DEFAULT_MEASUREMENT_INTERVAL;

/* Indicates the status of Indication */

static bool htssIndication = false;

/* Connection handle used for transmitting information over BLE */

CYBLE_CONN_HANDLE_T connectionHandle;

#define DRIVE_HIGH (1u)

#define DRIVE_LOW (0u)

/* System Flag used to indicate system status */

uint32 SystemFlag = 0;

#define WDT_INTERRUPT_NUM (8)

#define WATCHDOG_DEFAULT_PERIOD_MS (20)

#define WATCHDOG_TICKS_PER_MS (32)

#define CLK_ILO_CONFIG_ILO_ENABLE (1u << 31)

#define WDT_CONFIG_WDT_MODE0_INT (1u << 0)

#define WDT_CONTROL_WDT_ENABLE0 (1u << 0)

#define WDT_CONTROL_WDT_ENABLED0 (1u << 1)

#define WDT_CONTROL_WDT_INT0 (1u << 2)

#define CLK_SELECT_WDT_LOCK_SET01 ((1u << 14) | (1u << 15))

#define CLK_SELECT_WDT_LOCK_CLR0 (1u << 14)

#define CLK_SELECT_WDT_LOCK_CLR1 (1u << 15)

#define UPDATE_WDT_MATCH(value) CY_SET_REG32(CYREG_WDT_MATCH, \

(CY_GET_REG32(CYREG_WDT_MATCH) & 0xFFFF0000) + (uint16)value)

volatile static uint32 watchdogPeriodMs = WATCHDOG_DEFAULT_PERIOD_MS;

volatile static uint32 nextTicks = WATCHDOG_DEFAULT_PERIOD_MS * WATCHDOG_TICKS_PER_MS;

static void WatchdogTimer_Lock(void)

{

uint32 ClkSelectValue;

/* Update CLK_SELECT register to lock watchdog timer */

ClkSelectValue = CY_GET_REG32(CYREG_CLK_SELECT) | CLK_SELECT_WDT_LOCK_SET01;

CY_SET_REG32(CYREG_CLK_SELECT, ClkSelectValue);

}

static void WatchdogTimer_Unlock(void)

{

uint32 ClkSelectValue;

/* Update CLK_SELECT register to unlock watchdog timer */

ClkSelectValue = CY_GET_REG32(CYREG_CLK_SELECT) & ~CLK_SELECT_WDT_LOCK_SET01;

CY_SET_REG32(CYREG_CLK_SELECT, ClkSelectValue | CLK_SELECT_WDT_LOCK_CLR0);

CY_SET_REG32(CYREG_CLK_SELECT, ClkSelectValue | CLK_SELECT_WDT_LOCK_CLR1);

}

CY_ISR(WatchdogTimer_Isr)

{

/* Initializes the interval timer with default measurement interval */

static uint32 intervalTimer = DEFAULT_MEASUREMENT_INTERVAL;

/* Unlock watchdog timer to enable configuration changes*/

WatchdogTimer_Unlock();

/* Update WDT match register for next interrupt */

UPDATE_WDT_MATCH((uint16)(CY_GET_REG32(CYREG_WDT_MATCH) + nextTicks));

/* Clear WDT pending interrupt */

CY_SET_REG32(CYREG_WDT_CONTROL, CY_GET_REG32(CYREG_WDT_CONTROL) | WDT_CONTROL_WDT_INT0);

/* Lock watchdog timer to prevent configuration changes */

WatchdogTimer_Lock();

/* Decrement interval timer */

intervalTimer--;

/* If interval timer has elapsed then enable MEASUREMENT_INTERVAL flag */

if(intervalTimer == 0)

{

/* Initialize interval timer and set MEASUREMENT_INTERVAL flag */

intervalTimer = htssInterval;

SystemFlag |= MEASUREMENT_INTERVAL;

}

/* Set WDT flag for application processing */

SystemFlag |= WAKEUP_SOURCE_WDT;

}

void WatchdogTimer_Start(uint32 wdtPeriodMs)

{

CyIntSetVector(WDT_INTERRUPT_NUM, &WatchdogTimer_Isr);

WatchdogTimer_Unlock();

/* Set the WDT period */

watchdogPeriodMs = wdtPeriodMs;

nextTicks = watchdogPeriodMs * WATCHDOG_TICKS_PER_MS;

UPDATE_WDT_MATCH(nextTicks);

/* Set WDT_CONFIG register */

CY_SET_REG32(CYREG_WDT_CONFIG, CY_GET_REG32(CYREG_WDT_CONFIG) | WDT_CONFIG_WDT_MODE0_INT);

/* Enable WDT interrupt for the NVIC */

CyIntEnable(WDT_INTERRUPT_NUM);

/* Set WDT_CONTROL register */

CY_SET_REG32(CYREG_WDT_CONTROL, CY_GET_REG32(CYREG_WDT_CONTROL) | WDT_CONTROL_WDT_ENABLE0);

/* Wait for the WDT enable to complete */

while((CY_GET_REG32(CYREG_WDT_CONTROL) & WDT_CONTROL_WDT_ENABLED0) == 0);

WatchdogTimer_Lock();

}

void WatchdogTimer_Stop (void)

{

WatchdogTimer_Unlock();

/* Clear WDT_CONFIG register */

CY_SET_REG32(CYREG_WDT_CONFIG, CY_GET_REG32(CYREG_WDT_CONFIG) & ~WDT_CONFIG_WDT_MODE0_INT);

/* Clear WDT pending interrupt */

CY_SET_REG32(CYREG_WDT_CONTROL, CY_GET_REG32(CYREG_WDT_CONTROL) | WDT_CONTROL_WDT_INT0);

WatchdogTimer_Lock();

}

uint8_t led_enable_control = 0; // all off, bit0:blue, bit1:green, bit0:red

void EnLEDBlue(bool enable)

{

if (enable) {

led_enable_control |= 0x01;

} else {

led_enable_control &= 0xFE;

}

Control_LED_Write( led_enable_control);

}

void EnLEDGreen(bool enable)

{

if (enable) {

led_enable_control |= 0x02;

} else {

led_enable_control &= 0xFD;

}

Control_LED_Write( led_enable_control);

}

void EnLEDRed(bool enable)

{

if (enable) {

led_enable_control |= 0x04;

} else {

led_enable_control &= 0xFB;

}

Control_LED_Write( led_enable_control);

}

uint8_t status_led = 0;

void Status_Init(void)

{

//return;

if (status_led != 1)

{

PWM_BLUE_WriteCompare(10);

PWM_BLUE_WritePeriod(999);

//PWM_BLUE_Start();

status_led = 1;

EnLEDBlue(true);

EnLEDGreen(false);

EnLEDRed(false);

}

}

void Status_Advertise(void)

{

//return;

if (status_led != 2)

{

PWM_BLUE_WriteCompare(5);

PWM_BLUE_WritePeriod(799);

//PWM_BLUE_Start();

status_led = 2;

EnLEDBlue(true);

EnLEDGreen(false);

EnLEDRed(false);

}

}

void Status_Disconn(void)

{

//return;

if (status_led != 3)

{

PWM_BLUE_WriteCompare(499);

PWM_BLUE_WritePeriod(999);

//PWM_BLUE_Start();

status_led = 3;

EnLEDBlue(true);

EnLEDGreen(false);

EnLEDRed(false);

}

}

void Status_Conn(void)

{

//return;

if (status_led != 4)

{

PWM_BLUE_WriteCompare(99);

PWM_BLUE_WritePeriod(199);

//PWM_BLUE_Start();

status_led = 4;

EnLEDBlue(true);

EnLEDGreen(true);

EnLEDRed(false);

}

}

void GenericEventHandler(uint32 event, void *eventParam)

{

switch(event)

{

/* This event is received when component is Started */

case CYBLE_EVT_STACK_ON:

/* Stop watchdog to reduce power consumption during advertising */

//WatchdogTimer_Stop();

/* Start Advertisement and enter Discoverable mode*/

CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);

Status_Advertise();

break;

/* This event is received when device is disconnected or advetising times out*/

case CYBLE_EVT_GAP_DEVICE_DISCONNECTED:

case CYBLE_EVT_TIMEOUT:

/* Sets the ENABLE_HIBERNATE flag to put system in Hibernate mode */

SystemFlag |= ENABLE_HIBERNATE;

CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);

Status_Advertise();

break;

/* This event is received when connection is established */

case CYBLE_EVT_GATT_CONNECT_IND:

/* Start watchdog timer with 1s refresh interval */

/* Note: For this application, wakeup should be 1s because htssInterval

* resolution is configured as 1s */

//WatchdogTimer_Start(REFRESH_INTERVAL);

/* Retrieve BLE connection handle */

connectionHandle = *(CYBLE_CONN_HANDLE_T *) eventParam;

Status_Conn();

break;

default:

/* Error handling */

break;

}

}

void HtssEventHandler(uint32 event, void* eventParam)

{

CYBLE_HTS_CHAR_VALUE_T *interval;

switch(event)

{

/* This event is received when indication are enabled by the central */

case CYBLE_EVT_HTSS_INDICATION_ENABLED:

/* Set the htssIndication flag */

htssIndication = true;

break;

/* This event is received when indication are enabled by the central */

case CYBLE_EVT_HTSS_INDICATION_DISABLED:

/* Reset the htssIndiciation flag */

htssIndication = false;

break;

/* This event is received when measurement interval is updated by

* the central */

case CYBLE_EVT_HTSS_CHAR_WRITE:

/* Retrive interval value */

interval = ((CYBLE_HTS_CHAR_VALUE_T *)eventParam);

htssInterval = interval->value->val[1];

/* Update htssInterval with the updated value */

htssInterval = (htssInterval << 8) | interval->value->val[0];

break;

default:

/* Error handling */

break;

}

}

void EnableBLE (void)

{

/* Enable BLE block and register the callback function for common events */

CyBle_Start(GenericEventHandler);

/* Regsiters the callback function for heart rate service specific events */

CyBle_HtsRegisterAttrCallback(HtssEventHandler);

}

void InitializeSystem (void)

{

/* Clear wakeup pin interrupt */

//SW_ClearInterrupt();

/* Enable BLE and related resouces */

EnableBLE();

}

void PrepareForDeepSleep (void)

{

}

void WakeupFromDeepSleep (void)

{

}

void ProcessBLE (uint32 temperature)

{

/* Temporary array to hold Health Thermometer characteristic information */

uint8 valueArray[HTSS_TEMPERATURE_MEASURE_SIZE];

/* Check if indications are enabled and measurement interval has elapsed */

// if((true == htssIndication) && (SystemFlag & MEASUREMENT_INTERVAL))

if((true == htssIndication) && (MEASUREMENT_INTERVAL))

{

/* Clear measurement interval flag */

SystemFlag &= ~MEASUREMENT_INTERVAL;

/* Read Health Thermometer Characteristic from GATT DB */

if(CYBLE_ERROR_OK == CyBle_HtssGetCharacteristicValue(CYBLE_HTS_TEMP_MEASURE, HTSS_TEMPERATURE_MEASURE_SIZE, valueArray))

{

/* Update temperature in the characteristic */

valueArray[1] = LO8(LO16(temperature));

valueArray[2] = HI8(LO16(temperature));

valueArray[3] = LO8(HI16(temperature));

valueArray[4] = HI8(HI16(temperature));

/* Send indication to the central */

CyBle_HtssSendIndication(connectionHandle, CYBLE_HTS_TEMP_MEASURE, HTSS_TEMPERATURE_MEASURE_SIZE, valueArray);

}

}

}

uint32_t l_temp = 0;

/* clock and interrupt rates, in Hz */

#define SYS_CLOCK_FREQ 12000000u // clock frequency

#define ENABLE_BLE

int main(void)

{

CYBLE_API_RESULT_T apiResult;

/* Powerstate indicators of BLESS */

CYBLE_LP_MODE_T lpMode = CYBLE_BLESS_DEEPSLEEP;

CYBLE_BLESS_STATE_T blessState = CYBLE_BLESS_STATE_DEEPSLEEP;

CyIntSetSysVector(15,(cyisraddress)SysTick_Handler);

SysTick_Config(SYS_CLOCK_FREQ/1000);

//PWM_BLUE_Start();

CyGlobalIntEnable; /* Enable global interrupts. */

I2CDev_initialize();

//Clock_1_Start();

PWM_BLUE_Start();

EnLEDBlue(true);

// Delay(5000);

#ifdef ENABLE_BLE

// Start BLE

apiResult = CyBle_Start(GenericEventHandler);

if (apiResult != CYBLE_ERROR_OK)

{

CYASSERT(0);

} else {

Status_Init();

}

InitializeSystem();

#endif

#ifdef TMP006_EXISTS

// set configuration register

// I2CDev_writeWord(TMP006_ADDRESS, 0x02, 0x7980);

#endif

for(;;)

{

#ifdef ENABLE_BLE

CyBle_ProcessEvents();

if(CyBle_GetState() == CYBLE_STATE_CONNECTED)

{

// Process all pending BLE events in the stack

CyBle_ProcessEvents();

ProcessBLE(l_temp);

}

#endif

#ifdef TMP006_EXISTS

// I2CDev_readWord(TMP006_ADDRESS, 0x02, &w_temperature, 0);

// if (w_temperature & 0x0080)

{

I2CDev_readWord(TMP006_ADDRESS, 0x01, &w_temperature, 0);

int temperature_flag;

temperature_flag = 0;

if (w_temperature & 0x8000)

{

temperature_flag = 1; // minus

}

f_temperature = (float)(w_temperature >> 2);

if (temperature_flag) {

f_temperature *= -1.0;

}

f_temperature *= 0.0315;

if (f_temperature > (prev_f_temperature + 30))

{

f_temperature = prev_f_temperature + 1;

}

else if(f_temperature < (prev_f_temperature - 30))

{

f_temperature = prev_f_temperature -1;

}

prev_f_temperature = f_temperature;

l_temp = (int)(f_temperature);

}

#endif

}

}

/* [] END OF FILE */