Bathroom scale
Dependencies: Hexi_KW40Z Hexi_OLED_SSD1351 MPL3115A2
main.cpp@1:93fbe55738f4, 2016-10-09 (annotated)
- Committer:
- eddienuel
- Date:
- Sun Oct 09 18:46:24 2016 +0000
- Revision:
- 1:93fbe55738f4
- Parent:
- 0:bd3942174be3
release live
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eddienuel | 0:bd3942174be3 | 1 | #include "mbed.h" |
eddienuel | 0:bd3942174be3 | 2 | #include "Hexi_KW40Z.h" |
eddienuel | 0:bd3942174be3 | 3 | #include "Hexi_OLED_SSD1351.h" |
eddienuel | 0:bd3942174be3 | 4 | #include "OLED_types.h" |
eddienuel | 0:bd3942174be3 | 5 | #include "OpenSans_Font.h" |
eddienuel | 0:bd3942174be3 | 6 | #include "string.h" |
eddienuel | 0:bd3942174be3 | 7 | |
eddienuel | 0:bd3942174be3 | 8 | #define LED_ON 0 |
eddienuel | 0:bd3942174be3 | 9 | #define LED_OFF 1 |
eddienuel | 0:bd3942174be3 | 10 | |
eddienuel | 0:bd3942174be3 | 11 | |
eddienuel | 0:bd3942174be3 | 12 | void StartHaptic(void); |
eddienuel | 0:bd3942174be3 | 13 | void StopHaptic(void const *n); |
eddienuel | 0:bd3942174be3 | 14 | void txTask(void); |
eddienuel | 0:bd3942174be3 | 15 | long ReadWeight(void); |
eddienuel | 0:bd3942174be3 | 16 | uint16_t getGram(); |
eddienuel | 0:bd3942174be3 | 17 | long offset = 0; |
eddienuel | 0:bd3942174be3 | 18 | long getAverageValue(int times); |
eddienuel | 0:bd3942174be3 | 19 | |
eddienuel | 0:bd3942174be3 | 20 | // Pin connections for Hexiwear |
eddienuel | 0:bd3942174be3 | 21 | //MPL3115A2 MPL3115A2( PTC11, PTC10, MPL3115A2_I2C_ADDRESS); |
eddienuel | 0:bd3942174be3 | 22 | /* pos [0] = altimeter or pressure value */ |
eddienuel | 0:bd3942174be3 | 23 | /* pos [1] = temperature value */ |
eddienuel | 0:bd3942174be3 | 24 | float sensor_data[2]; |
eddienuel | 0:bd3942174be3 | 25 | |
eddienuel | 0:bd3942174be3 | 26 | DigitalOut redLed(LED1,1); |
eddienuel | 0:bd3942174be3 | 27 | DigitalOut greenLed(LED2,1); |
eddienuel | 0:bd3942174be3 | 28 | DigitalOut blueLed(LED3,1); |
eddienuel | 0:bd3942174be3 | 29 | DigitalOut haptic(PTB9); |
eddienuel | 0:bd3942174be3 | 30 | |
eddienuel | 0:bd3942174be3 | 31 | DigitalIn HX_DOUT(PTC3); |
eddienuel | 0:bd3942174be3 | 32 | DigitalOut HX_PD_SCK(PTC5); |
eddienuel | 0:bd3942174be3 | 33 | |
eddienuel | 0:bd3942174be3 | 34 | /* Define timer for haptic feedback */ |
eddienuel | 0:bd3942174be3 | 35 | RtosTimer hapticTimer(StopHaptic, osTimerOnce); |
eddienuel | 0:bd3942174be3 | 36 | |
eddienuel | 0:bd3942174be3 | 37 | /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */ |
eddienuel | 0:bd3942174be3 | 38 | KW40Z kw40z_device(PTE24, PTE25); |
eddienuel | 0:bd3942174be3 | 39 | |
eddienuel | 0:bd3942174be3 | 40 | /* Instantiate the SSD1351 OLED Driver */ |
eddienuel | 0:bd3942174be3 | 41 | SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */ |
eddienuel | 0:bd3942174be3 | 42 | |
eddienuel | 0:bd3942174be3 | 43 | /*Create a Thread to handle sending BLE Sensor Data */ |
eddienuel | 0:bd3942174be3 | 44 | Thread txThread; |
eddienuel | 0:bd3942174be3 | 45 | |
eddienuel | 0:bd3942174be3 | 46 | /* Text Buffer */ |
eddienuel | 0:bd3942174be3 | 47 | char text[20]; |
eddienuel | 0:bd3942174be3 | 48 | |
eddienuel | 0:bd3942174be3 | 49 | /****************************Call Back Functions*******************************/ |
eddienuel | 0:bd3942174be3 | 50 | void ButtonRight(void) |
eddienuel | 0:bd3942174be3 | 51 | { |
eddienuel | 0:bd3942174be3 | 52 | StartHaptic(); |
eddienuel | 0:bd3942174be3 | 53 | kw40z_device.ToggleAdvertisementMode(); |
eddienuel | 0:bd3942174be3 | 54 | } |
eddienuel | 0:bd3942174be3 | 55 | |
eddienuel | 0:bd3942174be3 | 56 | void ButtonLeft(void) |
eddienuel | 0:bd3942174be3 | 57 | { |
eddienuel | 0:bd3942174be3 | 58 | StartHaptic(); |
eddienuel | 0:bd3942174be3 | 59 | kw40z_device.ToggleAdvertisementMode(); |
eddienuel | 0:bd3942174be3 | 60 | } |
eddienuel | 0:bd3942174be3 | 61 | |
eddienuel | 0:bd3942174be3 | 62 | void PassKey(void) |
eddienuel | 0:bd3942174be3 | 63 | { |
eddienuel | 0:bd3942174be3 | 64 | StartHaptic(); |
eddienuel | 0:bd3942174be3 | 65 | strcpy((char *) text,"PAIR CODE"); |
eddienuel | 0:bd3942174be3 | 66 | oled.TextBox((uint8_t *)text,0,25,95,18); |
eddienuel | 0:bd3942174be3 | 67 | |
eddienuel | 0:bd3942174be3 | 68 | /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */ |
eddienuel | 0:bd3942174be3 | 69 | sprintf(text,"%d", kw40z_device.GetPassKey()); |
eddienuel | 0:bd3942174be3 | 70 | oled.TextBox((uint8_t *)text,0,40,95,18); |
eddienuel | 0:bd3942174be3 | 71 | } |
eddienuel | 0:bd3942174be3 | 72 | |
eddienuel | 0:bd3942174be3 | 73 | /***********************End of Call Back Functions*****************************/ |
eddienuel | 0:bd3942174be3 | 74 | |
eddienuel | 0:bd3942174be3 | 75 | /********************************Main******************************************/ |
eddienuel | 0:bd3942174be3 | 76 | |
eddienuel | 0:bd3942174be3 | 77 | int main() |
eddienuel | 0:bd3942174be3 | 78 | { |
eddienuel | 1:93fbe55738f4 | 79 | Thread::wait(10000); |
eddienuel | 0:bd3942174be3 | 80 | offset = getAverageValue(20); |
eddienuel | 0:bd3942174be3 | 81 | /* Get OLED Class Default Text Properties */ |
eddienuel | 0:bd3942174be3 | 82 | oled_text_properties_t textProperties = {0}; |
eddienuel | 0:bd3942174be3 | 83 | oled.GetTextProperties(&textProperties); |
eddienuel | 0:bd3942174be3 | 84 | |
eddienuel | 0:bd3942174be3 | 85 | /* Turn on the backlight of the OLED Display */ |
eddienuel | 0:bd3942174be3 | 86 | oled.DimScreenON(); |
eddienuel | 0:bd3942174be3 | 87 | |
eddienuel | 0:bd3942174be3 | 88 | /* Fills the screen with solid black */ |
eddienuel | 0:bd3942174be3 | 89 | oled.FillScreen(COLOR_BLACK); |
eddienuel | 0:bd3942174be3 | 90 | |
eddienuel | 0:bd3942174be3 | 91 | /* Register callbacks to application functions */ |
eddienuel | 0:bd3942174be3 | 92 | kw40z_device.attach_buttonLeft(&ButtonLeft); |
eddienuel | 0:bd3942174be3 | 93 | kw40z_device.attach_buttonRight(&ButtonRight); |
eddienuel | 0:bd3942174be3 | 94 | kw40z_device.attach_passkey(&PassKey); |
eddienuel | 0:bd3942174be3 | 95 | |
eddienuel | 0:bd3942174be3 | 96 | /* Change font color to white */ |
eddienuel | 0:bd3942174be3 | 97 | textProperties.fontColor = COLOR_WHITE; |
eddienuel | 0:bd3942174be3 | 98 | oled.SetTextProperties(&textProperties); |
eddienuel | 0:bd3942174be3 | 99 | |
eddienuel | 0:bd3942174be3 | 100 | /* Display Bluetooth Label at x=17,y=30 */ |
eddienuel | 0:bd3942174be3 | 101 | strcpy((char *) text,"89.9kg"); |
eddienuel | 0:bd3942174be3 | 102 | oled.Label((uint8_t *)text,17,30); |
eddienuel | 0:bd3942174be3 | 103 | |
eddienuel | 0:bd3942174be3 | 104 | |
eddienuel | 0:bd3942174be3 | 105 | /* Change font color to Blue */ |
eddienuel | 0:bd3942174be3 | 106 | textProperties.fontColor = COLOR_BLUE; |
eddienuel | 0:bd3942174be3 | 107 | oled.SetTextProperties(&textProperties); |
eddienuel | 0:bd3942174be3 | 108 | |
eddienuel | 0:bd3942174be3 | 109 | /* Display Bluetooth Label at x=17,y=65 */ |
eddienuel | 0:bd3942174be3 | 110 | strcpy((char *) text,"BLUETOOTH"); |
eddienuel | 0:bd3942174be3 | 111 | oled.Label((uint8_t *)text,17,65); |
eddienuel | 0:bd3942174be3 | 112 | |
eddienuel | 0:bd3942174be3 | 113 | /* Change font color to white */ |
eddienuel | 0:bd3942174be3 | 114 | textProperties.fontColor = COLOR_WHITE; |
eddienuel | 0:bd3942174be3 | 115 | textProperties.alignParam = OLED_TEXT_ALIGN_CENTER; |
eddienuel | 0:bd3942174be3 | 116 | oled.SetTextProperties(&textProperties); |
eddienuel | 0:bd3942174be3 | 117 | |
eddienuel | 0:bd3942174be3 | 118 | /* Display Label at x=22,y=80 */ |
eddienuel | 0:bd3942174be3 | 119 | strcpy((char *) text,"Tap Below"); |
eddienuel | 0:bd3942174be3 | 120 | oled.Label((uint8_t *)text,22,80); |
eddienuel | 0:bd3942174be3 | 121 | |
eddienuel | 0:bd3942174be3 | 122 | uint8_t prevLinkState = 0; |
eddienuel | 0:bd3942174be3 | 123 | uint8_t currLinkState = 0; |
eddienuel | 0:bd3942174be3 | 124 | txThread.start(txTask); /*Start transmitting Sensor Tag Data */ |
eddienuel | 0:bd3942174be3 | 125 | |
eddienuel | 0:bd3942174be3 | 126 | while (true) |
eddienuel | 0:bd3942174be3 | 127 | { |
eddienuel | 0:bd3942174be3 | 128 | blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/ |
eddienuel | 0:bd3942174be3 | 129 | Thread::wait(50); |
eddienuel | 0:bd3942174be3 | 130 | } |
eddienuel | 0:bd3942174be3 | 131 | } |
eddienuel | 0:bd3942174be3 | 132 | |
eddienuel | 0:bd3942174be3 | 133 | /******************************End of Main*************************************/ |
eddienuel | 0:bd3942174be3 | 134 | |
eddienuel | 0:bd3942174be3 | 135 | |
eddienuel | 0:bd3942174be3 | 136 | /* txTask() transmits the sensor data */ |
eddienuel | 0:bd3942174be3 | 137 | void txTask(void){ |
eddienuel | 0:bd3942174be3 | 138 | |
eddienuel | 0:bd3942174be3 | 139 | while (true) |
eddienuel | 0:bd3942174be3 | 140 | { |
eddienuel | 1:93fbe55738f4 | 141 | /* sets the gain of hx711 to 128*/ |
eddienuel | 0:bd3942174be3 | 142 | ReadWeight(); |
eddienuel | 0:bd3942174be3 | 143 | |
eddienuel | 0:bd3942174be3 | 144 | /*Notify Hexiwear App that it is running Sensor Tag mode*/ |
eddienuel | 0:bd3942174be3 | 145 | kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG); |
eddienuel | 0:bd3942174be3 | 146 | |
eddienuel | 0:bd3942174be3 | 147 | /*Send weight using pressure service*/ |
eddienuel | 0:bd3942174be3 | 148 | kw40z_device.SendPressure(getGram()); |
eddienuel | 0:bd3942174be3 | 149 | Thread::wait(1000); |
eddienuel | 0:bd3942174be3 | 150 | } |
eddienuel | 0:bd3942174be3 | 151 | } |
eddienuel | 0:bd3942174be3 | 152 | |
eddienuel | 0:bd3942174be3 | 153 | void StartHaptic(void) { |
eddienuel | 0:bd3942174be3 | 154 | hapticTimer.start(50); |
eddienuel | 0:bd3942174be3 | 155 | haptic = 1; |
eddienuel | 0:bd3942174be3 | 156 | } |
eddienuel | 0:bd3942174be3 | 157 | |
eddienuel | 0:bd3942174be3 | 158 | void StopHaptic(void const *n) { |
eddienuel | 0:bd3942174be3 | 159 | haptic = 0; |
eddienuel | 0:bd3942174be3 | 160 | hapticTimer.stop(); |
eddienuel | 0:bd3942174be3 | 161 | } |
eddienuel | 0:bd3942174be3 | 162 | |
eddienuel | 0:bd3942174be3 | 163 | long ReadWeight(void) |
eddienuel | 0:bd3942174be3 | 164 | { |
eddienuel | 0:bd3942174be3 | 165 | long Count; |
eddienuel | 0:bd3942174be3 | 166 | unsigned char i; |
eddienuel | 0:bd3942174be3 | 167 | HX_PD_SCK.write(0); |
eddienuel | 0:bd3942174be3 | 168 | Count = 0; |
eddienuel | 0:bd3942174be3 | 169 | while(HX_DOUT.read() == 1); |
eddienuel | 0:bd3942174be3 | 170 | for (i=0;i<24;i++) |
eddienuel | 0:bd3942174be3 | 171 | { |
eddienuel | 0:bd3942174be3 | 172 | HX_PD_SCK.write(1); |
eddienuel | 0:bd3942174be3 | 173 | Count=Count<<1; |
eddienuel | 0:bd3942174be3 | 174 | HX_PD_SCK.write(0); |
eddienuel | 0:bd3942174be3 | 175 | if(HX_DOUT.read() == 1) Count++; |
eddienuel | 0:bd3942174be3 | 176 | } |
eddienuel | 0:bd3942174be3 | 177 | HX_PD_SCK.write(1); |
eddienuel | 0:bd3942174be3 | 178 | Count=Count^0x800000; |
eddienuel | 0:bd3942174be3 | 179 | HX_PD_SCK.write(0); |
eddienuel | 0:bd3942174be3 | 180 | return(Count); |
eddienuel | 0:bd3942174be3 | 181 | } |
eddienuel | 0:bd3942174be3 | 182 | |
eddienuel | 0:bd3942174be3 | 183 | uint16_t getGram(){ |
eddienuel | 0:bd3942174be3 | 184 | return ((getAverageValue(20) - offset))/1000; |
eddienuel | 0:bd3942174be3 | 185 | } |
eddienuel | 0:bd3942174be3 | 186 | |
eddienuel | 0:bd3942174be3 | 187 | long getAverageValue(int times){ |
eddienuel | 0:bd3942174be3 | 188 | long sum = 0; |
eddienuel | 0:bd3942174be3 | 189 | for (int i = 1; i <= times; i++) |
eddienuel | 0:bd3942174be3 | 190 | { |
eddienuel | 0:bd3942174be3 | 191 | sum += ReadWeight(); |
eddienuel | 0:bd3942174be3 | 192 | } |
eddienuel | 0:bd3942174be3 | 193 | return sum / times; |
eddienuel | 0:bd3942174be3 | 194 | } |
eddienuel | 0:bd3942174be3 | 195 | |
eddienuel | 0:bd3942174be3 | 196 | |
eddienuel | 0:bd3942174be3 | 197 | |
eddienuel | 0:bd3942174be3 | 198 | |
eddienuel | 0:bd3942174be3 | 199 |