Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Hexi_KW40Z Hexi_OLED_SSD1351
main.cpp@3:97bc87323258, 2016-11-04 (annotated)
- Committer:
- GregC
- Date:
- Fri Nov 04 23:11:29 2016 +0000
- Revision:
- 3:97bc87323258
- Parent:
- 2:8e7d89c2cbde
Very advanced Click Air Quality example for Hexiwear featuring OLED Display, Bluetooth, Cloud and Touch
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| daveyclk | 2:8e7d89c2cbde | 1 | |
| daveyclk | 2:8e7d89c2cbde | 2 | |
| GregC | 0:4cf89612afab | 3 | /****************************************************************************** |
| GregC | 0:4cf89612afab | 4 | * Includes |
| GregC | 0:4cf89612afab | 5 | *******************************************************************************/ |
| GregC | 0:4cf89612afab | 6 | |
| GregC | 0:4cf89612afab | 7 | #include "mbed.h" |
| GregC | 0:4cf89612afab | 8 | #include "Hexi_OLED_SSD1351.h" |
| GregC | 3:97bc87323258 | 9 | #include "Hexi_KW40Z.h" |
| GregC | 0:4cf89612afab | 10 | #include "images.h" |
| daveyclk | 2:8e7d89c2cbde | 11 | #include "new_images.h" |
| GregC | 0:4cf89612afab | 12 | #include "string.h" |
| daveyclk | 2:8e7d89c2cbde | 13 | #include "stdbool.h" |
| GregC | 0:4cf89612afab | 14 | |
| GregC | 0:4cf89612afab | 15 | /****************************************************************************** |
| GregC | 0:4cf89612afab | 16 | * Input and Output Pinout |
| GregC | 0:4cf89612afab | 17 | *******************************************************************************/ |
| GregC | 0:4cf89612afab | 18 | |
| GregC | 0:4cf89612afab | 19 | AnalogIn ain(PTB2); |
| GregC | 0:4cf89612afab | 20 | SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); // SSD1351 OLED Driver (MOSI,SCLK,POWER,CS,RST,DC) |
| GregC | 3:97bc87323258 | 21 | KW40Z kw40z_device(PTE24, PTE25); // Instantiate the Hexi KW40Z Driver (UART TX, UART RX) |
| GregC | 3:97bc87323258 | 22 | DigitalOut blueLed(LED3,1); |
| GregC | 0:4cf89612afab | 23 | Serial pc(USBTX, USBRX); |
| GregC | 0:4cf89612afab | 24 | |
| GregC | 3:97bc87323258 | 25 | Thread txThread; |
| GregC | 3:97bc87323258 | 26 | |
| GregC | 3:97bc87323258 | 27 | /****************************************************************************** |
| GregC | 3:97bc87323258 | 28 | * prototypes |
| GregC | 3:97bc87323258 | 29 | *******************************************************************************/ |
| GregC | 3:97bc87323258 | 30 | void InitModules(); |
| GregC | 3:97bc87323258 | 31 | void ReadSensor(); |
| GregC | 3:97bc87323258 | 32 | void CalculatePPM(); |
| GregC | 3:97bc87323258 | 33 | void DisplayAirQValue(uint16_t value); |
| GregC | 3:97bc87323258 | 34 | |
| GregC | 3:97bc87323258 | 35 | |
| GregC | 0:4cf89612afab | 36 | /****************************************************************************** |
| GregC | 0:4cf89612afab | 37 | * Module Variable Definitions |
| GregC | 0:4cf89612afab | 38 | *******************************************************************************/ |
| GregC | 0:4cf89612afab | 39 | |
| GregC | 3:97bc87323258 | 40 | uint16_t ppm; |
| GregC | 0:4cf89612afab | 41 | |
| GregC | 3:97bc87323258 | 42 | uint16_t value = 0; |
| GregC | 3:97bc87323258 | 43 | uint16_t value_old = 0; |
| GregC | 0:4cf89612afab | 44 | uint16_t adc_rd; |
| GregC | 0:4cf89612afab | 45 | |
| daveyclk | 2:8e7d89c2cbde | 46 | //const uint8_t *image1; // old cover image |
| daveyclk | 2:8e7d89c2cbde | 47 | const uint8_t *green_arrow; // Pointer for the image to be displayed |
| daveyclk | 2:8e7d89c2cbde | 48 | const uint8_t *yellow_arrow; // Pointer for the image to be displayed |
| daveyclk | 2:8e7d89c2cbde | 49 | const uint8_t *orange_arrow; // Pointer for the image to be displayed |
| daveyclk | 2:8e7d89c2cbde | 50 | const uint8_t *red_arrow; // Pointer for the image to be displayed |
| daveyclk | 2:8e7d89c2cbde | 51 | const uint8_t *purple_arrow; // Pointer for the image to be displayed |
| daveyclk | 2:8e7d89c2cbde | 52 | |
| daveyclk | 2:8e7d89c2cbde | 53 | char text[20]; // Text Buffer for dynamic value displayed |
| daveyclk | 2:8e7d89c2cbde | 54 | |
| daveyclk | 2:8e7d89c2cbde | 55 | bool test = false; // used to put the program in text mode to check images |
| GregC | 0:4cf89612afab | 56 | |
| GregC | 3:97bc87323258 | 57 | /************************************************************************************************** |
| GregC | 3:97bc87323258 | 58 | * Call Back Functions |
| GregC | 3:97bc87323258 | 59 | **************************************************************************************************/ |
| GregC | 3:97bc87323258 | 60 | |
| GregC | 3:97bc87323258 | 61 | void ButtonRight(void) |
| GregC | 3:97bc87323258 | 62 | { |
| GregC | 3:97bc87323258 | 63 | kw40z_device.ToggleAdvertisementMode(); |
| GregC | 3:97bc87323258 | 64 | } |
| GregC | 3:97bc87323258 | 65 | |
| GregC | 3:97bc87323258 | 66 | void ButtonLeft(void) |
| GregC | 3:97bc87323258 | 67 | { |
| GregC | 3:97bc87323258 | 68 | kw40z_device.ToggleAdvertisementMode(); |
| GregC | 3:97bc87323258 | 69 | } |
| GregC | 3:97bc87323258 | 70 | |
| GregC | 3:97bc87323258 | 71 | void PassKey(void) |
| GregC | 3:97bc87323258 | 72 | { |
| GregC | 3:97bc87323258 | 73 | /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */ |
| GregC | 3:97bc87323258 | 74 | sprintf(text,"%d", kw40z_device.GetPassKey()); |
| GregC | 3:97bc87323258 | 75 | oled.TextBox((uint8_t *)text,0,72,95,18); |
| GregC | 3:97bc87323258 | 76 | } |
| GregC | 3:97bc87323258 | 77 | |
| GregC | 3:97bc87323258 | 78 | |
| GregC | 3:97bc87323258 | 79 | |
| GregC | 3:97bc87323258 | 80 | /************************************************************************************************** |
| GregC | 3:97bc87323258 | 81 | * Function Main() |
| GregC | 3:97bc87323258 | 82 | * ------------------------------------------------------------------------------------------------- |
| GregC | 3:97bc87323258 | 83 | * Overview: |
| GregC | 3:97bc87323258 | 84 | * Input: None |
| GregC | 3:97bc87323258 | 85 | * Output: None |
| GregC | 3:97bc87323258 | 86 | **************************************************************************************************/ |
| GregC | 3:97bc87323258 | 87 | |
| GregC | 3:97bc87323258 | 88 | int main() |
| GregC | 3:97bc87323258 | 89 | { |
| GregC | 3:97bc87323258 | 90 | |
| GregC | 3:97bc87323258 | 91 | InitModules(); |
| GregC | 3:97bc87323258 | 92 | |
| GregC | 3:97bc87323258 | 93 | while (true) |
| GregC | 3:97bc87323258 | 94 | { |
| GregC | 3:97bc87323258 | 95 | |
| GregC | 3:97bc87323258 | 96 | ReadSensor(); |
| GregC | 3:97bc87323258 | 97 | pc.printf("Sensor Value 0x%04X\n\r",ain.read_u16()); |
| GregC | 3:97bc87323258 | 98 | |
| GregC | 3:97bc87323258 | 99 | blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/ |
| GregC | 3:97bc87323258 | 100 | |
| GregC | 3:97bc87323258 | 101 | |
| GregC | 3:97bc87323258 | 102 | CalculatePPM(); |
| GregC | 3:97bc87323258 | 103 | DisplayAirQValue(ppm); |
| GregC | 3:97bc87323258 | 104 | |
| GregC | 3:97bc87323258 | 105 | Thread::wait(500); |
| GregC | 3:97bc87323258 | 106 | |
| GregC | 3:97bc87323258 | 107 | } |
| GregC | 3:97bc87323258 | 108 | } |
| GregC | 3:97bc87323258 | 109 | |
| GregC | 3:97bc87323258 | 110 | /************************************************************************************************** |
| GregC | 3:97bc87323258 | 111 | * Function TxTask() |
| GregC | 3:97bc87323258 | 112 | **************************************************************************************************/ |
| GregC | 3:97bc87323258 | 113 | |
| GregC | 3:97bc87323258 | 114 | void txTask(void){ |
| GregC | 3:97bc87323258 | 115 | |
| GregC | 3:97bc87323258 | 116 | while (true) |
| GregC | 3:97bc87323258 | 117 | { |
| GregC | 3:97bc87323258 | 118 | |
| GregC | 3:97bc87323258 | 119 | /*Notify Hexiwear App that it is running Sensor Tag mode*/ |
| GregC | 3:97bc87323258 | 120 | kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG); |
| GregC | 3:97bc87323258 | 121 | |
| GregC | 3:97bc87323258 | 122 | kw40z_device.SendPressure(10*ppm); //send ppm Air Quality Click value |
| GregC | 3:97bc87323258 | 123 | |
| GregC | 3:97bc87323258 | 124 | Thread::wait(1000); |
| GregC | 3:97bc87323258 | 125 | } |
| GregC | 3:97bc87323258 | 126 | } |
| GregC | 0:4cf89612afab | 127 | |
| GregC | 0:4cf89612afab | 128 | /************************************************************************************************** |
| GregC | 0:4cf89612afab | 129 | * Function InitModules() |
| GregC | 0:4cf89612afab | 130 | * ------------------------------------------------------------------------------------------------- |
| GregC | 0:4cf89612afab | 131 | * Overview: |
| GregC | 0:4cf89612afab | 132 | * Input: None |
| GregC | 0:4cf89612afab | 133 | * Output: None |
| GregC | 0:4cf89612afab | 134 | **************************************************************************************************/ |
| GregC | 0:4cf89612afab | 135 | |
| GregC | 0:4cf89612afab | 136 | void InitModules() |
| GregC | 0:4cf89612afab | 137 | { |
| daveyclk | 2:8e7d89c2cbde | 138 | //image1 = AirQuality; // Setting pointer location of the 96 by 96 pixel bitmap |
| daveyclk | 2:8e7d89c2cbde | 139 | //oled.DrawImage(image1,0,0); // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0 |
| daveyclk | 2:8e7d89c2cbde | 140 | |
| daveyclk | 2:8e7d89c2cbde | 141 | green_arrow = Green_arrow_bmp; // Setting pointer location of the 96 by 96 pixel bitmap Arrow Point to Green To begin |
| daveyclk | 2:8e7d89c2cbde | 142 | yellow_arrow = Yellow_arrow_bmp; // Setting pointer location of the 96 by 96 pixel bitmap |
| daveyclk | 2:8e7d89c2cbde | 143 | orange_arrow = Orange_arrow_bmp; // Setting pointer location of the 96 by 96 pixel bitmap |
| daveyclk | 2:8e7d89c2cbde | 144 | red_arrow = Red_arrow_bmp; // Setting pointer location of the 96 by 96 pixel bitmap |
| daveyclk | 2:8e7d89c2cbde | 145 | purple_arrow = Purple_arrow_bmp; // Setting pointer location of the 96 by 96 pixel bitmap |
| daveyclk | 2:8e7d89c2cbde | 146 | |
| daveyclk | 2:8e7d89c2cbde | 147 | oled.DrawImage(green_arrow,0,0); // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0 |
| GregC | 0:4cf89612afab | 148 | |
| GregC | 0:4cf89612afab | 149 | oled_text_properties_t textProperties = {0}; // Get OLED Class Default Text Properties |
| GregC | 0:4cf89612afab | 150 | oled.GetTextProperties(&textProperties); |
| GregC | 3:97bc87323258 | 151 | |
| GregC | 3:97bc87323258 | 152 | /* Register callbacks to application functions */ |
| GregC | 3:97bc87323258 | 153 | kw40z_device.attach_buttonLeft(&ButtonLeft); |
| GregC | 3:97bc87323258 | 154 | kw40z_device.attach_buttonRight(&ButtonRight); |
| GregC | 3:97bc87323258 | 155 | kw40z_device.attach_passkey(&PassKey); |
| GregC | 0:4cf89612afab | 156 | |
| daveyclk | 2:8e7d89c2cbde | 157 | //PPM text now in the Bitmap |
| daveyclk | 2:8e7d89c2cbde | 158 | |
| daveyclk | 2:8e7d89c2cbde | 159 | //textProperties.fontColor = COLOR_BLUE; // Set text properties to white and right aligned for the dynamic text |
| daveyclk | 2:8e7d89c2cbde | 160 | //textProperties.alignParam = OLED_TEXT_ALIGN_LEFT; |
| daveyclk | 2:8e7d89c2cbde | 161 | //oled.SetTextProperties(&textProperties); |
| GregC | 0:4cf89612afab | 162 | |
| daveyclk | 2:8e7d89c2cbde | 163 | //strcpy((char *) text,"ppm:"); // Display Legends |
| daveyclk | 2:8e7d89c2cbde | 164 | // oled.Label((uint8_t *)text,15,75); |
| GregC | 0:4cf89612afab | 165 | |
| daveyclk | 2:8e7d89c2cbde | 166 | textProperties.fontColor = COLOR_WHITE; // Set text properties to white and right aligned for the dynamic text |
| GregC | 0:4cf89612afab | 167 | textProperties.alignParam = OLED_TEXT_ALIGN_RIGHT; |
| GregC | 0:4cf89612afab | 168 | oled.SetTextProperties(&textProperties); |
| GregC | 0:4cf89612afab | 169 | |
| GregC | 0:4cf89612afab | 170 | sprintf(text,"%i",value); // Format the value |
| daveyclk | 2:8e7d89c2cbde | 171 | oled.TextBox((uint8_t *)text,55,76,20,15); //Increase textbox for more digits |
| GregC | 3:97bc87323258 | 172 | |
| GregC | 3:97bc87323258 | 173 | txThread.start(txTask); /*Start transmitting Sensor Tag Data */ |
| GregC | 0:4cf89612afab | 174 | |
| GregC | 0:4cf89612afab | 175 | } |
| GregC | 0:4cf89612afab | 176 | |
| GregC | 0:4cf89612afab | 177 | |
| GregC | 0:4cf89612afab | 178 | /************************************************************************************************** |
| GregC | 0:4cf89612afab | 179 | * Function ReadSensor() |
| GregC | 0:4cf89612afab | 180 | * ------------------------------------------------------------------------------------------------- |
| GregC | 0:4cf89612afab | 181 | * Overview: Read sensor. |
| GregC | 0:4cf89612afab | 182 | * Input: None |
| GregC | 0:4cf89612afab | 183 | * Output: None |
| GregC | 0:4cf89612afab | 184 | **************************************************************************************************/ |
| GregC | 0:4cf89612afab | 185 | |
| GregC | 0:4cf89612afab | 186 | void ReadSensor() |
| GregC | 0:4cf89612afab | 187 | { |
| GregC | 0:4cf89612afab | 188 | adc_rd = ain.read_u16(); |
| GregC | 0:4cf89612afab | 189 | wait_ms(10); |
| GregC | 0:4cf89612afab | 190 | } |
| GregC | 0:4cf89612afab | 191 | |
| GregC | 0:4cf89612afab | 192 | |
| GregC | 0:4cf89612afab | 193 | /************************************************************************************************** |
| GregC | 0:4cf89612afab | 194 | * Function CalculatePPM() |
| GregC | 0:4cf89612afab | 195 | * ------------------------------------------------------------------------------------------------- |
| GregC | 0:4cf89612afab | 196 | * Overview: Calculation of PPM. |
| GregC | 0:4cf89612afab | 197 | * Input: None |
| GregC | 0:4cf89612afab | 198 | * Output: None |
| GregC | 0:4cf89612afab | 199 | **************************************************************************************************/ |
| GregC | 0:4cf89612afab | 200 | |
| GregC | 0:4cf89612afab | 201 | void CalculatePPM() |
| GregC | 0:4cf89612afab | 202 | { |
| GregC | 0:4cf89612afab | 203 | const double Rl = 5000.0; // Rl (Ohm) - Load resistance |
| daveyclk | 1:7b9c19276087 | 204 | const double Vadc_33 = 0.0000503548; // ADC step 3,3V/65535 0.00503mV (16bit ADC) |
| GregC | 0:4cf89612afab | 205 | double Vrl; // Output voltage |
| GregC | 0:4cf89612afab | 206 | double Rs; // Rs (Ohm) - Sensor resistance |
| GregC | 0:4cf89612afab | 207 | double ratio; // Rs/Rl ratio |
| GregC | 0:4cf89612afab | 208 | double lgPPM; |
| GregC | 0:4cf89612afab | 209 | |
| GregC | 0:4cf89612afab | 210 | Vrl = (double)adc_rd * Vadc_33; // For 3.3V Vcc use Vadc_33 |
| daveyclk | 1:7b9c19276087 | 211 | Rs = Rl * (3.3 - Vrl)/Vrl; // Calculate sensor resistance |
| GregC | 0:4cf89612afab | 212 | ratio = Rs/Rl; // Calculate ratio |
| GregC | 0:4cf89612afab | 213 | lgPPM = (log10(ratio) * -0.8) + 0.9; // Calculate ppm |
| GregC | 3:97bc87323258 | 214 | ppm = 6* pow(10,lgPPM); // Calculate ppm |
| GregC | 0:4cf89612afab | 215 | } |
| GregC | 0:4cf89612afab | 216 | |
| GregC | 0:4cf89612afab | 217 | |
| GregC | 0:4cf89612afab | 218 | |
| GregC | 0:4cf89612afab | 219 | /************************************************************************************************** |
| GregC | 0:4cf89612afab | 220 | * Function DisplayAirQValue() |
| GregC | 0:4cf89612afab | 221 | * ------------------------------------------------------------------------------------------------- |
| GregC | 0:4cf89612afab | 222 | * Overview: |
| GregC | 0:4cf89612afab | 223 | * Input: None |
| GregC | 0:4cf89612afab | 224 | * Output: None |
| GregC | 0:4cf89612afab | 225 | **************************************************************************************************/ |
| GregC | 0:4cf89612afab | 226 | |
| GregC | 3:97bc87323258 | 227 | void DisplayAirQValue(uint16_t value ) |
| GregC | 0:4cf89612afab | 228 | { |
| GregC | 0:4cf89612afab | 229 | if (value_old != value) |
| GregC | 0:4cf89612afab | 230 | { |
| GregC | 0:4cf89612afab | 231 | |
| daveyclk | 2:8e7d89c2cbde | 232 | if( value > 200) |
| daveyclk | 2:8e7d89c2cbde | 233 | oled.DrawImage(purple_arrow,0,0); // Fill 96px by 96px Screen with 96px by 96px NXP Image starting at x=0,y=0 |
| daveyclk | 2:8e7d89c2cbde | 234 | else if (value < 200 && value > 150) |
| daveyclk | 2:8e7d89c2cbde | 235 | oled.DrawImage(red_arrow,0,0); |
| daveyclk | 2:8e7d89c2cbde | 236 | else if (value < 150 && value > 100) |
| daveyclk | 2:8e7d89c2cbde | 237 | oled.DrawImage(orange_arrow,0,0); |
| daveyclk | 2:8e7d89c2cbde | 238 | else if (value < 100 && value > 50) |
| daveyclk | 2:8e7d89c2cbde | 239 | oled.DrawImage(yellow_arrow,0,0); |
| daveyclk | 2:8e7d89c2cbde | 240 | else |
| daveyclk | 2:8e7d89c2cbde | 241 | oled.DrawImage(green_arrow,0,0); |
| daveyclk | 2:8e7d89c2cbde | 242 | |
| GregC | 0:4cf89612afab | 243 | oled_text_properties_t textProperties = {0}; // Get OLED Class Default Text Properties |
| GregC | 0:4cf89612afab | 244 | oled.GetTextProperties(&textProperties); |
| GregC | 0:4cf89612afab | 245 | |
| GregC | 0:4cf89612afab | 246 | // clear the previous value |
| GregC | 0:4cf89612afab | 247 | textProperties.fontColor = COLOR_WHITE; // Set text properties to white and right aligned for the dynamic text |
| GregC | 0:4cf89612afab | 248 | textProperties.alignParam = OLED_TEXT_ALIGN_RIGHT; |
| GregC | 0:4cf89612afab | 249 | oled.SetTextProperties(&textProperties); |
| GregC | 0:4cf89612afab | 250 | |
| GregC | 0:4cf89612afab | 251 | sprintf(text,"%i",value_old); // Format the value |
| daveyclk | 2:8e7d89c2cbde | 252 | oled.TextBox((uint8_t *)text,55,76,20,15); //Increase textbox for more digits |
| GregC | 0:4cf89612afab | 253 | |
| GregC | 0:4cf89612afab | 254 | // display the new value |
| GregC | 0:4cf89612afab | 255 | textProperties.fontColor = COLOR_WHITE; // Set text properties to white and right aligned for the dynamic text |
| GregC | 0:4cf89612afab | 256 | textProperties.alignParam = OLED_TEXT_ALIGN_RIGHT; |
| GregC | 0:4cf89612afab | 257 | oled.SetTextProperties(&textProperties); |
| GregC | 0:4cf89612afab | 258 | |
| GregC | 0:4cf89612afab | 259 | sprintf(text,"%i",value); // Format the value |
| daveyclk | 2:8e7d89c2cbde | 260 | oled.TextBox((uint8_t *)text,55,76,20,15); //Increase textbox for more digits |
| GregC | 0:4cf89612afab | 261 | } |
| GregC | 0:4cf89612afab | 262 | value_old = value; |
| GregC | 0:4cf89612afab | 263 | } |