![](/media/cache/group/hexiweare_logo_main_black.jpg.50x50_q85.jpg)
Very advanced Click IR Thermo example for Hexiwear featuring OLED Display, Bluetooth, Cloud and Touch
Dependencies: Hexi_KW40Z Hexi_MLX90614 Hexi_OLED_SSD1351
Fork of Hexi_Click_IRThermo_Example by
This project has been developed by mbed user daveyclk
This project demonstrates the use of the Mikroelektronika Click IRThermo
module with hexiwear featuring the OLED display
, the Bluetooth for Cloud connectivity
and Touch buttons
Plug Hexiwear into the Docking Station and the IRThermo Click to the Click Socket 1
Connect the USB cable to your computer and to the micro-USB port of the Docking Station
Compile the project and copy the binary "Hexi_Click_IRThermo_Example_HEXIWEAR.bin" in the DAP-LINK drive
from your computer file explorer
Press the K64F-RESET button
on the docking station to start the program on your board
The OLED screen will display some graphics
and the temperature measurement below
Approach your end from the IRThermo sensor
and see the temperature changing
Graphic displayed will change from blue, orange or red depending from the temperature measured by the IR Thermo sensor
Download the cell phone App Hexiwear from iOS or Android stores to connect your board to your phone
Type the pin displayed on the screen and give a name to your board to pair it via the App
Congratulation your data are now streamed directly to Wolkabout Cloud...
To visualize the data remotely (over cloud not bluetooth), you can go to Wolksense.com or download the Wolksense iOS/Android App and login with same account
Diff: main.cpp
- Revision:
- 2:14a1a79639db
- Parent:
- 1:2df78187cf01
- Child:
- 5:ae7682e17859
diff -r 2df78187cf01 -r 14a1a79639db main.cpp --- a/main.cpp Thu Oct 20 01:20:45 2016 +0000 +++ b/main.cpp Thu Oct 27 20:07:15 2016 +0000 @@ -1,26 +1,212 @@ + +/****************************************************************************** +* Includes +*******************************************************************************/ + #include "mbed.h" #include "mlx90614.h" +#include "Hexi_KW40Z.h" +#include "Hexi_OLED_SSD1351.h" +#include "OLED_types.h" +#include "OpenSans_Font.h" +#include "string.h" +#include "irimages_c.h" -DigitalOut myled(LED1); //displays I2C wait -I2C i2c(PTD9,PTD8); //sda,scl -Serial pc(USBTX,USBRX); //serial usb config + + +DigitalOut blueLed(LED3,1); +DigitalOut haptic(PTB9); + +I2C i2c(PTD9,PTD8); //sda,scl (start i2c interace) + +Serial pc(USBTX,USBRX); //serial usb config for debug + +MLX90614 IR_thermometer(&i2c); // instantiate IR Thermometer + -MLX90614 IR_thermometer(&i2c); -//setup an MLX90614 using MLX90614 library from -// http://mbed.org/users/aquahika/libraries/MLX90614/lsixz6 +/* prototypes */ +void Sys_Init(void); +void readTemp(void); +void StartHaptic(void); +void StopHaptic(void const *n); +void txTask(void); +void animateDisplay(void); +void displayTemp(void); + +/* Define timer for haptic feedback */ +RtosTimer hapticTimer(StopHaptic, osTimerOnce); -float temp; //temperature in degrees C +/* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */ +KW40Z kw40z_device(PTE24, PTE25); + + +/* Instantiate the SSD1351 OLED Driver */ +SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */ + +/*Create a Thread to handle sending BLE Sensor Data */ +Thread txThread; + +/*Create a Thread to handle reading the sensor and display*/ +Thread dispThread; -int main() { - while (1) { - myled=1; // if led1 on - waiting on I2C - if (IR_thermometer.getTemp(&temp)) { - //gets temperature from sensor via I2C bus - myled=0; - //print temperature on PC - printf("Temperature is %4.2F degrees C\r\n",temp); - } - //wait for device to produce next temperature reading - wait(0.5); + /* Text Buffer */ +char text[20]; + +/* Temperature images */ +const uint8_t *blue1; // Pointer for the image to be displayed +const uint8_t *orange2; // Pointer for the image to be displayed +const uint8_t *red3; // Pointer for the image to be displayed + +float tempC; //temperature in degrees C +float tempF; //temperature in degrees F + + +/****************************Call Back Functions*******************************/ + +void ButtonRight(void) +{ + StartHaptic(); + kw40z_device.ToggleAdvertisementMode(); +} + +void ButtonLeft(void) +{ + StartHaptic(); + kw40z_device.ToggleAdvertisementMode(); +} + +void PassKey(void) +{ + StartHaptic(); + + /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */ + sprintf(text,"%d", kw40z_device.GetPassKey()); + oled.TextBox((uint8_t *)text,0,72,95,18); +} + +/***********************End of Call Back Functions*****************************/ + +/********************************Main******************************************/ + +int main() +{ + Sys_Init(); // system initial values + + while (true) + { + blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/ + Thread::wait(50); + } } + +/******************************End of Main*************************************/ + + +/* txTask() transmits the sensor data */ +void txTask(void){ + + while (true) + { + + /*Notify Hexiwear App that it is running Sensor Tag mode*/ + kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG); + + kw40z_device.SendTemperature(tempC*100); //send IR Click Temperature + + Thread::wait(1000); + } +} + + +void StartHaptic(void) { + hapticTimer.start(50); + haptic = 1; +} + +void StopHaptic(void const *n) { + haptic = 0; + hapticTimer.stop(); +} + +void readTemp(void) { + if (IR_thermometer.getTemp(&tempC)) { + //gets temperature from sensor via I2C bus + + tempF = tempC * 9.0 / 5 + 32; // convert C to F + + //print temperature on PC + printf("Temperature is %4.2F degrees C\r\n",tempC); + printf("Temperature is %4.2F degrees F\r\n",tempF); + } +} + +void Sys_Init(void){ + + blue1 = blue1s_bmp; // Pointer for the image to be displayed + orange2 = orange2s_bmp; // Pointer for the image to be displayed + red3 = red3s_bmp; // Pointer for the image to be displayed + + /* Fills the screen with solid black */ + oled.FillScreen(COLOR_BLACK); + + /* Turn on the backlight of the OLED Display */ + oled.DimScreenON(); + + oled.DrawImage(blue1,0,0); // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0 + wait(0.5); + oled.DrawImage(orange2,0,0); // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0 + wait(0.5); + oled.DrawImage(red3,0,0); // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0 + wait(0.5); + + /* Get OLED Class Default Text Properties */ + oled_text_properties_t textProperties = {0}; + oled.GetTextProperties(&textProperties); + + /* Register callbacks to application functions */ + kw40z_device.attach_buttonLeft(&ButtonLeft); + kw40z_device.attach_buttonRight(&ButtonRight); + kw40z_device.attach_passkey(&PassKey); + + /* Change font color to white */ + textProperties.font = OpenSans_12x18_Regular; + textProperties.fontColor = COLOR_WHITE; + textProperties.alignParam = OLED_TEXT_ALIGN_LEFT; + oled.SetTextProperties(&textProperties); + + strcpy((char *) text,"C"); + /* Display Label at x=60,y=72 */ + oled.Label((uint8_t *)text,60,72); + + txThread.start(txTask); /*Start transmitting Sensor Tag Data */ + dispThread.start(animateDisplay); /* start reading the temperature */ +} + + + +void animateDisplay(void){ + + while(true){ + + readTemp(); + + if (tempC > 30) // for temps over 30 display red + oled.DrawImage(red3,0,0); + else if (tempC < 30 || tempC > 10) // for temps between 10 and 30 display orange + oled.DrawImage(orange2,0,0); + else if (tempC < 10) // for temps under 10 display blue + oled.DrawImage(blue1,0,0); + displayTemp(); // show temp on display + + Thread::wait(500); + } +} + +void displayTemp(void){ + + /* format the text */ + sprintf(text,"%.1f", tempC); + /* Display Label at x=22,y=80 */ + oled.TextBox((uint8_t *)text,22,72,30,18); +} \ No newline at end of file