for testing

Dependencies:   C12832 FXOS8700Q LM75B eCompass_FPU_Lib mbed-rtos mbed

Committer:
co838_ad543
Date:
Wed Feb 24 21:04:12 2016 +0000
Revision:
0:091b62984a92
for testing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
co838_ad543 0:091b62984a92 1 /*
co838_ad543 0:091b62984a92 2 * Author - Aruna Duraisingam - ad543
co838_ad543 0:091b62984a92 3 * Date - 20 Feb 2016
co838_ad543 0:091b62984a92 4 * The below program is developed beased on IOT assessment 3 requirements.
co838_ad543 0:091b62984a92 5 * The below program reads temperature for ever 5 sesonds
co838_ad543 0:091b62984a92 6 * and when the temperature goes higher than 26 degree celcius the progam shuts down the
co838_ad543 0:091b62984a92 7 * processor for 5 seconds and comes back again. The processor can also be make active when a
co838_ad543 0:091b62984a92 8 * switch is pressed.
co838_ad543 0:091b62984a92 9 */
co838_ad543 0:091b62984a92 10
co838_ad543 0:091b62984a92 11 #include "mbed.h" /* stock MBED API */
co838_ad543 0:091b62984a92 12 #include "LM75B.h" /* Lib for the temperature sensor */
co838_ad543 0:091b62984a92 13 #include "C12832.h" /* Lib for LCD Display */
co838_ad543 0:091b62984a92 14 #include "FXOS8700Q.h" /* Lib for on-board Accelerometer/Magnetometer */
co838_ad543 0:091b62984a92 15 #include "eCompass_Lib.h"
co838_ad543 0:091b62984a92 16 #include "rtos.h"
co838_ad543 0:091b62984a92 17 #include "math.h"
co838_ad543 0:091b62984a92 18
co838_ad543 0:091b62984a92 19 /**************** Declaration *********************/
co838_ad543 0:091b62984a92 20
co838_ad543 0:091b62984a92 21 Serial host (USBTX, USBRX); /* to-host UART via OpenSDAv2 */
co838_ad543 0:091b62984a92 22
co838_ad543 0:091b62984a92 23
co838_ad543 0:091b62984a92 24 LM75B sens_temp (D14, D15); /* temperature sensor */
co838_ad543 0:091b62984a92 25 PwmOut speaker(D6); /* speaker */
co838_ad543 0:091b62984a92 26
co838_ad543 0:091b62984a92 27 DigitalOut led_red(LED_RED);
co838_ad543 0:091b62984a92 28 DigitalOut led_green(LED_GREEN);
co838_ad543 0:091b62984a92 29 C12832 lcd_display (D11, D13, D12, D7, D10); /* LCD on the shield (128x32) */
co838_ad543 0:091b62984a92 30 Ticker blinker;
co838_ad543 0:091b62984a92 31 AnalogIn pot1 (A0); // Potentiometer
co838_ad543 0:091b62984a92 32
co838_ad543 0:091b62984a92 33 eCompass compass;
co838_ad543 0:091b62984a92 34
co838_ad543 0:091b62984a92 35
co838_ad543 0:091b62984a92 36 // JoyStick
co838_ad543 0:091b62984a92 37 DigitalIn up(A2);
co838_ad543 0:091b62984a92 38 DigitalIn down(A3);
co838_ad543 0:091b62984a92 39 DigitalIn left(A4);
co838_ad543 0:091b62984a92 40 DigitalIn right(A5);
co838_ad543 0:091b62984a92 41
co838_ad543 0:091b62984a92 42 //Accelerometer/magnetometer
co838_ad543 0:091b62984a92 43
co838_ad543 0:091b62984a92 44 I2C i2c(PTE25, PTE24);
co838_ad543 0:091b62984a92 45 //FXOS8700Q fxos(i2c, FXOS8700CQ_SLAVE_ADDR1);
co838_ad543 0:091b62984a92 46 FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1); // Configured for the FRDM-K64F with onboard sensors
co838_ad543 0:091b62984a92 47 FXOS8700QMagnetometer mag(i2c, FXOS8700CQ_SLAVE_ADDR1);
co838_ad543 0:091b62984a92 48
co838_ad543 0:091b62984a92 49 extern axis6_t axis6;
co838_ad543 0:091b62984a92 50
co838_ad543 0:091b62984a92 51 MotionSensorDataCounts mag_raw;
co838_ad543 0:091b62984a92 52 MotionSensorDataCounts acc_raw;
co838_ad543 0:091b62984a92 53
co838_ad543 0:091b62984a92 54 InterruptIn wakeup_switch (PTC6); /* interrupts for the two on-board switches */
co838_ad543 0:091b62984a92 55 InterruptIn temp_conversion_switch (PTA4);
co838_ad543 0:091b62984a92 56
co838_ad543 0:091b62984a92 57 /* option trigger/flag (integer value) . possible values 1,2,3 - what to display in LCD
co838_ad543 0:091b62984a92 58 option 1 - read temperature and display in LCD in celcius/fareinheit
co838_ad543 0:091b62984a92 59 option 2 - Simple ball game using accelerometer reading
co838_ad543 0:091b62984a92 60 option 3 - Magentometer showing direction.
co838_ad543 0:091b62984a92 61 */
co838_ad543 0:091b62984a92 62 static volatile int joystick_option_flag;
co838_ad543 0:091b62984a92 63
co838_ad543 0:091b62984a92 64
co838_ad543 0:091b62984a92 65 static volatile int temp_conversion_switch_trig; /* 0- gives reading in celcius and 1 in farenheit.*/
co838_ad543 0:091b62984a92 66
co838_ad543 0:091b62984a92 67 static volatile float threshold_temperature = 29.0; /* given in degree celcius*/
co838_ad543 0:091b62984a92 68 static volatile bool isActive = true;
co838_ad543 0:091b62984a92 69 static volatile bool activate_blink = false;
co838_ad543 0:091b62984a92 70
co838_ad543 0:091b62984a92 71 // login
co838_ad543 0:091b62984a92 72 static char username[10] ;
co838_ad543 0:091b62984a92 73 static char password[10] ;
co838_ad543 0:091b62984a92 74 static char * tempstring ;
co838_ad543 0:091b62984a92 75 static bool validateUser = false;
co838_ad543 0:091b62984a92 76
co838_ad543 0:091b62984a92 77 /*****************************Methods***************************/
co838_ad543 0:091b62984a92 78
co838_ad543 0:091b62984a92 79 void hal_map( MotionSensorDataCounts * acc_raw, MotionSensorDataCounts * mag_raw)
co838_ad543 0:091b62984a92 80 {
co838_ad543 0:091b62984a92 81 int16_t t;
co838_ad543 0:091b62984a92 82 // swap and negate X & Y axis
co838_ad543 0:091b62984a92 83 t = acc_raw->x;
co838_ad543 0:091b62984a92 84 acc_raw->x = acc_raw->y * -1;
co838_ad543 0:091b62984a92 85 acc_raw->y = t * -1;
co838_ad543 0:091b62984a92 86 // swap mag X & Y axis
co838_ad543 0:091b62984a92 87 t = mag_raw->x;
co838_ad543 0:091b62984a92 88 mag_raw->x = mag_raw->y;
co838_ad543 0:091b62984a92 89 mag_raw->y = t;
co838_ad543 0:091b62984a92 90 // negate mag Z axis
co838_ad543 0:091b62984a92 91 mag_raw->z *= -1;
co838_ad543 0:091b62984a92 92 }
co838_ad543 0:091b62984a92 93
co838_ad543 0:091b62984a92 94 //Toggles the temperature conversion switch trigger
co838_ad543 0:091b62984a92 95 void conversion_switch_interrupt (void)
co838_ad543 0:091b62984a92 96 {
co838_ad543 0:091b62984a92 97 temp_conversion_switch_trig = !temp_conversion_switch_trig;
co838_ad543 0:091b62984a92 98 }
co838_ad543 0:091b62984a92 99
co838_ad543 0:091b62984a92 100 // reactivate the processor and starts execution
co838_ad543 0:091b62984a92 101 void wakeup_switch_interrupt (void)
co838_ad543 0:091b62984a92 102 {
co838_ad543 0:091b62984a92 103 led_green=1;
co838_ad543 0:091b62984a92 104 activate_blink = false;
co838_ad543 0:091b62984a92 105 isActive = true;
co838_ad543 0:091b62984a92 106 lcd_display.cls();
co838_ad543 0:091b62984a92 107 }
co838_ad543 0:091b62984a92 108
co838_ad543 0:091b62984a92 109 // When the temperature is above threshold limit, it sets an alaram for 3 seconds and sleep
co838_ad543 0:091b62984a92 110 void setAlarm (void)
co838_ad543 0:091b62984a92 111 {
co838_ad543 0:091b62984a92 112 led_red = 0;
co838_ad543 0:091b62984a92 113 speaker.period(1.0/500.0); // 500hz period
co838_ad543 0:091b62984a92 114 speaker =0.5; //50% duty cycle - max volume
co838_ad543 0:091b62984a92 115 wait(1.5f);
co838_ad543 0:091b62984a92 116 speaker=0.0; // turn off audio
co838_ad543 0:091b62984a92 117 led_red = !led_red; // toggle a led
co838_ad543 0:091b62984a92 118 }
co838_ad543 0:091b62984a92 119
co838_ad543 0:091b62984a92 120 void makeProcessorSleep(void){
co838_ad543 0:091b62984a92 121 isActive = false;
co838_ad543 0:091b62984a92 122 activate_blink = true;
co838_ad543 0:091b62984a92 123 sleep();
co838_ad543 0:091b62984a92 124 }
co838_ad543 0:091b62984a92 125
co838_ad543 0:091b62984a92 126 void blink() {
co838_ad543 0:091b62984a92 127 if(activate_blink)
co838_ad543 0:091b62984a92 128 led_green=!led_green;
co838_ad543 0:091b62984a92 129 }
co838_ad543 0:091b62984a92 130
co838_ad543 0:091b62984a92 131 void initialize() {
co838_ad543 0:091b62984a92 132
co838_ad543 0:091b62984a92 133 temp_conversion_switch_trig =1;
co838_ad543 0:091b62984a92 134 joystick_option_flag = 1; // intially
co838_ad543 0:091b62984a92 135 led_red = 1;
co838_ad543 0:091b62984a92 136 led_green = 1;
co838_ad543 0:091b62984a92 137 }
co838_ad543 0:091b62984a92 138
co838_ad543 0:091b62984a92 139 void displayTemperature(float temp)
co838_ad543 0:091b62984a92 140 {
co838_ad543 0:091b62984a92 141 if (temp_conversion_switch_trig) {
co838_ad543 0:091b62984a92 142 lcd_display.printf ("Temperature %.2f C", temp);
co838_ad543 0:091b62984a92 143 }
co838_ad543 0:091b62984a92 144 else{
co838_ad543 0:091b62984a92 145 float f = (temp*9/5)+32;
co838_ad543 0:091b62984a92 146 lcd_display.printf ("Temperature %.2f F", f);
co838_ad543 0:091b62984a92 147 }
co838_ad543 0:091b62984a92 148 }
co838_ad543 0:091b62984a92 149
co838_ad543 0:091b62984a92 150 void displayGame(void)
co838_ad543 0:091b62984a92 151 {
co838_ad543 0:091b62984a92 152
co838_ad543 0:091b62984a92 153 }
co838_ad543 0:091b62984a92 154
co838_ad543 0:091b62984a92 155 void displayDirection(void)
co838_ad543 0:091b62984a92 156 {
co838_ad543 0:091b62984a92 157 lcd_display.cls();
co838_ad543 0:091b62984a92 158 acc.getAxis( acc_raw);
co838_ad543 0:091b62984a92 159 mag.getAxis( mag_raw);
co838_ad543 0:091b62984a92 160 compass.run( acc_raw, mag_raw); // calculate the eCompass
co838_ad543 0:091b62984a92 161 int yaw =axis6.yaw;
co838_ad543 0:091b62984a92 162
co838_ad543 0:091b62984a92 163 if((yaw >=338 && yaw <360) || (yaw>=0 && yaw < 23)) lcd_display.printf("%d degree North\r\n", yaw);
co838_ad543 0:091b62984a92 164 else if((yaw >=24 && yaw <67)) lcd_display.printf("%d degree Nort East", yaw);
co838_ad543 0:091b62984a92 165 else if((yaw >=68 && yaw <112)) lcd_display.printf("%d degree East", yaw);
co838_ad543 0:091b62984a92 166 else if(yaw >=113 && yaw <158) lcd_display.printf("%d degree South East", yaw);
co838_ad543 0:091b62984a92 167 else if(yaw >=159 && yaw <203) lcd_display.printf("%d degree South", yaw);
co838_ad543 0:091b62984a92 168 else if(yaw >=204 && yaw <247) lcd_display.printf("%d degree South West", yaw);
co838_ad543 0:091b62984a92 169 else if(yaw >=248 && yaw <292) lcd_display.printf("%d degree West", yaw);
co838_ad543 0:091b62984a92 170 else lcd_display.printf("%d degree North West\r\n", yaw);
co838_ad543 0:091b62984a92 171 }
co838_ad543 0:091b62984a92 172
co838_ad543 0:091b62984a92 173
co838_ad543 0:091b62984a92 174 char* readString(void){
co838_ad543 0:091b62984a92 175 tempstring = (char*) malloc(10 * sizeof(char));
co838_ad543 0:091b62984a92 176 int i =0;
co838_ad543 0:091b62984a92 177 bool status = true;
co838_ad543 0:091b62984a92 178 while(status) {
co838_ad543 0:091b62984a92 179 char ch = host.getc();
co838_ad543 0:091b62984a92 180 if(ch != '\r')
co838_ad543 0:091b62984a92 181 {
co838_ad543 0:091b62984a92 182 lcd_display.printf("%c", ch);
co838_ad543 0:091b62984a92 183 tempstring[i]= ch;
co838_ad543 0:091b62984a92 184 i++;
co838_ad543 0:091b62984a92 185 }
co838_ad543 0:091b62984a92 186 else
co838_ad543 0:091b62984a92 187 {
co838_ad543 0:091b62984a92 188 //lcd_display.printf("Entered enter!");
co838_ad543 0:091b62984a92 189 printf("\n");
co838_ad543 0:091b62984a92 190 status =false;
co838_ad543 0:091b62984a92 191 }
co838_ad543 0:091b62984a92 192
co838_ad543 0:091b62984a92 193
co838_ad543 0:091b62984a92 194 }
co838_ad543 0:091b62984a92 195
co838_ad543 0:091b62984a92 196 tempstring[i] = '\0';
co838_ad543 0:091b62984a92 197 return tempstring;
co838_ad543 0:091b62984a92 198 }
co838_ad543 0:091b62984a92 199
co838_ad543 0:091b62984a92 200 void getUserNameText(void){
co838_ad543 0:091b62984a92 201 host.printf("Please enter username (Max 10 characters): \r\n");
co838_ad543 0:091b62984a92 202 strcpy(username , readString());
co838_ad543 0:091b62984a92 203 }
co838_ad543 0:091b62984a92 204
co838_ad543 0:091b62984a92 205 void login(void){
co838_ad543 0:091b62984a92 206
co838_ad543 0:091b62984a92 207 host.printf("Please enter username (Max 10 characters): \r\n");
co838_ad543 0:091b62984a92 208 strcpy(username , readString());
co838_ad543 0:091b62984a92 209
co838_ad543 0:091b62984a92 210
co838_ad543 0:091b62984a92 211 host.printf("Please enter password (Max 10 Characters):\r\n");
co838_ad543 0:091b62984a92 212 strcpy(password , readString());
co838_ad543 0:091b62984a92 213
co838_ad543 0:091b62984a92 214 host.printf("Username :%s , Password : %s \r\n", username, password);
co838_ad543 0:091b62984a92 215 }
co838_ad543 0:091b62984a92 216
co838_ad543 0:091b62984a92 217 /************** Start - Main Method **************************/
co838_ad543 0:091b62984a92 218 int main (void)
co838_ad543 0:091b62984a92 219 {
co838_ad543 0:091b62984a92 220 host.baud (38400);
co838_ad543 0:091b62984a92 221 login();
co838_ad543 0:091b62984a92 222
co838_ad543 0:091b62984a92 223 if(strcmp (username,"default") == 0 && strcmp (password,"default") == 0)
co838_ad543 0:091b62984a92 224 {
co838_ad543 0:091b62984a92 225 validateUser = true;
co838_ad543 0:091b62984a92 226 free(username);
co838_ad543 0:091b62984a92 227 free(password);
co838_ad543 0:091b62984a92 228 }
co838_ad543 0:091b62984a92 229 else{
co838_ad543 0:091b62984a92 230 host.printf("Invalid login\r\n");
co838_ad543 0:091b62984a92 231 login();
co838_ad543 0:091b62984a92 232 }
co838_ad543 0:091b62984a92 233
co838_ad543 0:091b62984a92 234 initialize();
co838_ad543 0:091b62984a92 235
co838_ad543 0:091b62984a92 236 wakeup_switch.mode (PullUp);
co838_ad543 0:091b62984a92 237 wakeup_switch.fall (&wakeup_switch_interrupt);
co838_ad543 0:091b62984a92 238
co838_ad543 0:091b62984a92 239 temp_conversion_switch.mode (PullUp);
co838_ad543 0:091b62984a92 240 temp_conversion_switch.fall (&conversion_switch_interrupt);
co838_ad543 0:091b62984a92 241
co838_ad543 0:091b62984a92 242 up.mode(PullUp);
co838_ad543 0:091b62984a92 243 left.mode(PullUp);
co838_ad543 0:091b62984a92 244 right.mode(PullUp);
co838_ad543 0:091b62984a92 245 down.mode(PullUp);
co838_ad543 0:091b62984a92 246
co838_ad543 0:091b62984a92 247 blinker.attach(&blink, 1);
co838_ad543 0:091b62984a92 248
co838_ad543 0:091b62984a92 249 acc.enable();
co838_ad543 0:091b62984a92 250 mag.enable();
co838_ad543 0:091b62984a92 251
co838_ad543 0:091b62984a92 252 acc.getAxis( acc_raw);
co838_ad543 0:091b62984a92 253 mag.getAxis( mag_raw);
co838_ad543 0:091b62984a92 254
co838_ad543 0:091b62984a92 255 while(isActive){
co838_ad543 0:091b62984a92 256 host.printf ("validateUser %d", validateUser);
co838_ad543 0:091b62984a92 257 if(!validateUser) sleep();
co838_ad543 0:091b62984a92 258 else{
co838_ad543 0:091b62984a92 259 lcd_display.locate (1, 10);
co838_ad543 0:091b62984a92 260 lcd_display.cls();
co838_ad543 0:091b62984a92 261
co838_ad543 0:091b62984a92 262 float curr_temp = sens_temp.read ();
co838_ad543 0:091b62984a92 263
co838_ad543 0:091b62984a92 264 if(up) joystick_option_flag = 1;
co838_ad543 0:091b62984a92 265 else if(left)joystick_option_flag = 2;
co838_ad543 0:091b62984a92 266 else if(right)joystick_option_flag = 3;
co838_ad543 0:091b62984a92 267
co838_ad543 0:091b62984a92 268 host.printf ("option joystick: %d \r\n", joystick_option_flag);
co838_ad543 0:091b62984a92 269
co838_ad543 0:091b62984a92 270 switch (joystick_option_flag) {
co838_ad543 0:091b62984a92 271 case 1:
co838_ad543 0:091b62984a92 272 displayTemperature(curr_temp);
co838_ad543 0:091b62984a92 273 break;
co838_ad543 0:091b62984a92 274 case 2:
co838_ad543 0:091b62984a92 275 displayGame();
co838_ad543 0:091b62984a92 276 break;
co838_ad543 0:091b62984a92 277 case 3:
co838_ad543 0:091b62984a92 278 displayDirection();
co838_ad543 0:091b62984a92 279 break;
co838_ad543 0:091b62984a92 280 default:
co838_ad543 0:091b62984a92 281 displayTemperature(curr_temp);
co838_ad543 0:091b62984a92 282 }
co838_ad543 0:091b62984a92 283
co838_ad543 0:091b62984a92 284 if(curr_temp > threshold_temperature)
co838_ad543 0:091b62984a92 285 {
co838_ad543 0:091b62984a92 286 setAlarm();
co838_ad543 0:091b62984a92 287 lcd_display.printf ("In Sleep Mode. Temperature: %.2f C\r\n", curr_temp);
co838_ad543 0:091b62984a92 288 makeProcessorSleep();
co838_ad543 0:091b62984a92 289 }
co838_ad543 0:091b62984a92 290
co838_ad543 0:091b62984a92 291 wait (1.0f);
co838_ad543 0:091b62984a92 292 }
co838_ad543 0:091b62984a92 293 }
co838_ad543 0:091b62984a92 294 }