projet Iot

Dependencies:   BMP180 DHT11 SoftPWM SparkFun_APDS9960 mbed-rtos mbed

Committer:
ALounes
Date:
Thu Dec 17 21:30:29 2015 +0000
Revision:
1:0941b8778db6
Parent:
0:826d61f3ff66
!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ALounes 0:826d61f3ff66 1 /*************************************************************************************/
ALounes 0:826d61f3ff66 2 /*************************************************************************************/
ALounes 0:826d61f3ff66 3 /* PROJET IOT / GROUPE AGIR / EISE5 2015-2016 */
ALounes 0:826d61f3ff66 4 /*************************************************************************************/
ALounes 0:826d61f3ff66 5 /*************************************************************************************/
ALounes 0:826d61f3ff66 6
ALounes 0:826d61f3ff66 7 /*************************************************************************************/
ALounes 0:826d61f3ff66 8 /*************************************************************************************/
ALounes 0:826d61f3ff66 9 /* BIBLIOTHEQUES ET HEADER */
ALounes 0:826d61f3ff66 10 /*************************************************************************************/
ALounes 0:826d61f3ff66 11 /*************************************************************************************/
ALounes 0:826d61f3ff66 12
ALounes 0:826d61f3ff66 13 #include "mbed.h"
ALounes 0:826d61f3ff66 14 #include "rtos.h"
ALounes 0:826d61f3ff66 15 #include "DHT11.h"
ALounes 0:826d61f3ff66 16 #include "BMP180.h"
ALounes 0:826d61f3ff66 17 #include "SoftPWM.h"
ALounes 0:826d61f3ff66 18 #include "apds9960.h"
ALounes 0:826d61f3ff66 19 #include "configuration.h"
ALounes 0:826d61f3ff66 20
ALounes 0:826d61f3ff66 21 /*************************************************************************************/
ALounes 0:826d61f3ff66 22 /*************************************************************************************/
ALounes 0:826d61f3ff66 23 /* VARIABLES GLOBALES */
ALounes 0:826d61f3ff66 24 /*************************************************************************************/
ALounes 0:826d61f3ff66 25 /*************************************************************************************/
ALounes 0:826d61f3ff66 26
ALounes 0:826d61f3ff66 27 apds9960 sensor(PIN_MOUVEMENT_SENSOR_SDA,PIN_MOUVEMENT_SENSOR_SCL);
ALounes 0:826d61f3ff66 28 InterruptIn interrupt(PIN_MOUVEMENT_SENSOR_INTERRUPTION);
ALounes 0:826d61f3ff66 29 Serial bluetooth(PIN_BLE_TX, PIN_BLE_RX);
ALounes 0:826d61f3ff66 30 Serial pc(USBTX, USBRX);
ALounes 0:826d61f3ff66 31 Semaphore two_slots(1);
ALounes 0:826d61f3ff66 32 Ticker timer;
ALounes 0:826d61f3ff66 33
ALounes 0:826d61f3ff66 34 Informations inf = {0,0,0,0,0,0};
ALounes 0:826d61f3ff66 35 bool intFlag = false;
ALounes 0:826d61f3ff66 36
ALounes 0:826d61f3ff66 37 /*************************************************************************************/
ALounes 0:826d61f3ff66 38 /*************************************************************************************/
ALounes 0:826d61f3ff66 39 /* FONCTION MAIN */
ALounes 0:826d61f3ff66 40 /*************************************************************************************/
ALounes 0:826d61f3ff66 41 /*************************************************************************************/
ALounes 0:826d61f3ff66 42
ALounes 0:826d61f3ff66 43 int main (void) {
ALounes 0:826d61f3ff66 44
ALounes 0:826d61f3ff66 45 Thread t1(thread_temperature, (void *)"Thread temperature");
ALounes 0:826d61f3ff66 46 Thread t2(thread_pression , (void *)"Thread pression");
ALounes 0:826d61f3ff66 47 Thread t3(thread_presence , (void *)"Thread presence");
ALounes 0:826d61f3ff66 48 Thread t4(thread_led , (void *)"Thread Led");
ALounes 0:826d61f3ff66 49
ALounes 0:826d61f3ff66 50 RtosTimer BleSend(bleCallBack, osTimerPeriodic, (void *)"Ble emission");
ALounes 0:826d61f3ff66 51 BleSend.start(TIME_MS_PERIODE_BLE);
ALounes 0:826d61f3ff66 52
ALounes 0:826d61f3ff66 53 potAndPwm();
ALounes 0:826d61f3ff66 54 }
ALounes 0:826d61f3ff66 55
ALounes 0:826d61f3ff66 56 /*************************************************************************************/
ALounes 0:826d61f3ff66 57 /*************************************************************************************/
ALounes 0:826d61f3ff66 58 /* THREAD TEMPERATURE */
ALounes 0:826d61f3ff66 59 /*************************************************************************************/
ALounes 0:826d61f3ff66 60 /*************************************************************************************/
ALounes 0:826d61f3ff66 61
ALounes 0:826d61f3ff66 62 void thread_temperature(void const *name) {
ALounes 0:826d61f3ff66 63
ALounes 0:826d61f3ff66 64 DHT11 capteur(PIN_TEMPERATURE_HUMIDITY_SENSOR);
ALounes 0:826d61f3ff66 65 int tmp;
ALounes 0:826d61f3ff66 66
ALounes 0:826d61f3ff66 67 while (true) {
ALounes 0:826d61f3ff66 68 printf("%s\n\r", (const char*)name);
ALounes 0:826d61f3ff66 69 tmp = capteur.readData();
ALounes 0:826d61f3ff66 70
ALounes 0:826d61f3ff66 71 if (tmp != DHT11::OK) {
ALounes 0:826d61f3ff66 72 printf("Error! %d\r\n",tmp);
ALounes 0:826d61f3ff66 73 }
ALounes 0:826d61f3ff66 74 else {
ALounes 0:826d61f3ff66 75 inf.temperature_01 = capteur.readTemperature();
ALounes 0:826d61f3ff66 76 inf.humidite = capteur.readHumidity();
ALounes 0:826d61f3ff66 77 printf("Temperature: %d, Humidity: %d\r\n", capteur.readTemperature(), capteur.readHumidity());
ALounes 0:826d61f3ff66 78 }
ALounes 0:826d61f3ff66 79
ALounes 0:826d61f3ff66 80 Thread::wait(TIME_WAIT_MS_TEMPERATURE_HUMIDITY_SENSOR);
ALounes 0:826d61f3ff66 81 }
ALounes 0:826d61f3ff66 82 }
ALounes 0:826d61f3ff66 83
ALounes 0:826d61f3ff66 84 /*************************************************************************************/
ALounes 0:826d61f3ff66 85 /*************************************************************************************/
ALounes 0:826d61f3ff66 86 /* THREAD LED */
ALounes 0:826d61f3ff66 87 /*************************************************************************************/
ALounes 0:826d61f3ff66 88 /*************************************************************************************/
ALounes 0:826d61f3ff66 89
ALounes 0:826d61f3ff66 90 void thread_led(void const *name) {
ALounes 0:826d61f3ff66 91 DigitalOut tab[] = {PIN_MUX_P0, PIN_MUX_P1, PIN_MUX_P2};
ALounes 0:826d61f3ff66 92
ALounes 0:826d61f3ff66 93 while (true) {
ALounes 0:826d61f3ff66 94 printf("%s\n\r", (const char*)name);
ALounes 0:826d61f3ff66 95
ALounes 0:826d61f3ff66 96 //printf("000 \n\r");
ALounes 0:826d61f3ff66 97 tab[0] = LED_OFF; tab[1] = LED_OFF; tab[2] = LED_OFF;
ALounes 0:826d61f3ff66 98 Thread::wait( TIME_WAIT_BLINK_LED );
ALounes 0:826d61f3ff66 99
ALounes 0:826d61f3ff66 100 //printf("100 \n\r");
ALounes 0:826d61f3ff66 101 tab[0] = LED_ON; tab[1] = LED_OFF; tab[2] = LED_OFF;
ALounes 0:826d61f3ff66 102 Thread::wait( TIME_WAIT_BLINK_LED );
ALounes 0:826d61f3ff66 103
ALounes 0:826d61f3ff66 104 //printf("010 \n\r");
ALounes 0:826d61f3ff66 105 tab[0] = LED_OFF; tab[1] = LED_ON; tab[2] = LED_OFF;
ALounes 0:826d61f3ff66 106 Thread::wait( TIME_WAIT_BLINK_LED );
ALounes 0:826d61f3ff66 107
ALounes 0:826d61f3ff66 108 //printf("110 \n\r");
ALounes 0:826d61f3ff66 109 tab[0] = LED_ON; tab[1] = LED_ON; tab[2] = LED_OFF;
ALounes 0:826d61f3ff66 110 Thread::wait( TIME_WAIT_BLINK_LED );
ALounes 0:826d61f3ff66 111
ALounes 0:826d61f3ff66 112 //printf("001 \n\r");
ALounes 0:826d61f3ff66 113 tab[0] = LED_OFF; tab[1] = LED_OFF; tab[2] = LED_ON;
ALounes 0:826d61f3ff66 114 Thread::wait( TIME_WAIT_BLINK_LED );
ALounes 0:826d61f3ff66 115
ALounes 0:826d61f3ff66 116 //printf("101 \n\r");
ALounes 0:826d61f3ff66 117 tab[0] = LED_ON; tab[1] = LED_OFF; tab[2] = LED_ON;
ALounes 0:826d61f3ff66 118 Thread::wait( TIME_WAIT_BLINK_LED );
ALounes 0:826d61f3ff66 119
ALounes 0:826d61f3ff66 120 //printf("011 \n\r");
ALounes 0:826d61f3ff66 121 tab[0] = LED_OFF; tab[1] = LED_ON; tab[2] = LED_ON;
ALounes 0:826d61f3ff66 122 Thread::wait( TIME_WAIT_BLINK_LED );
ALounes 0:826d61f3ff66 123 }
ALounes 0:826d61f3ff66 124 }
ALounes 0:826d61f3ff66 125
ALounes 0:826d61f3ff66 126 /*************************************************************************************/
ALounes 0:826d61f3ff66 127 /*************************************************************************************/
ALounes 0:826d61f3ff66 128 /* THREAD PRESSION */
ALounes 0:826d61f3ff66 129 /*************************************************************************************/
ALounes 0:826d61f3ff66 130 /*************************************************************************************/
ALounes 0:826d61f3ff66 131
ALounes 0:826d61f3ff66 132 void thread_pression(void const *name) {
ALounes 0:826d61f3ff66 133 long temp = 0;
ALounes 0:826d61f3ff66 134 long pressure = 0;
ALounes 0:826d61f3ff66 135 int error = 0;
ALounes 0:826d61f3ff66 136 BMP180 bmp180(PIN_PRESURE_SENSOR_SDA, PIN_PRESURE_SENSOR_SCL);
ALounes 0:826d61f3ff66 137
ALounes 0:826d61f3ff66 138 while (true) {
ALounes 0:826d61f3ff66 139 two_slots.wait();
ALounes 0:826d61f3ff66 140
ALounes 0:826d61f3ff66 141 printf("%s\n\r", (const char*)name);
ALounes 0:826d61f3ff66 142 error = bmp180.readTP(&temp,&pressure,OVERSAMPLING_ULTRA_HIGH_RESOLUTION);
ALounes 0:826d61f3ff66 143
ALounes 0:826d61f3ff66 144 two_slots.release();
ALounes 0:826d61f3ff66 145
ALounes 0:826d61f3ff66 146 if (error){
ALounes 0:826d61f3ff66 147 printf("Error is %d\r\n\r\n",error);
ALounes 0:826d61f3ff66 148 }
ALounes 0:826d61f3ff66 149 else {
ALounes 0:826d61f3ff66 150 inf.temperature_02 = temp;
ALounes 0:826d61f3ff66 151 inf.pression = pressure;
ALounes 0:826d61f3ff66 152 printf("Temp is %d \r\n",(temp));
ALounes 0:826d61f3ff66 153 printf("Pressure is %ld\r\n",pressure);
ALounes 0:826d61f3ff66 154 }
ALounes 0:826d61f3ff66 155
ALounes 0:826d61f3ff66 156 Thread::wait(TIME_WAIT_MS_PRESURE_SENSOR);
ALounes 0:826d61f3ff66 157 }
ALounes 0:826d61f3ff66 158 }
ALounes 0:826d61f3ff66 159
ALounes 0:826d61f3ff66 160 /*************************************************************************************/
ALounes 0:826d61f3ff66 161 /*************************************************************************************/
ALounes 0:826d61f3ff66 162 /* THREAD PRESENCE */
ALounes 0:826d61f3ff66 163 /*************************************************************************************/
ALounes 0:826d61f3ff66 164 /*************************************************************************************/
ALounes 0:826d61f3ff66 165
ALounes 0:826d61f3ff66 166 void trigger() {
ALounes 0:826d61f3ff66 167 // pc.printf("triggered\n\r");
ALounes 0:826d61f3ff66 168 intFlag = true;
ALounes 0:826d61f3ff66 169 }
ALounes 0:826d61f3ff66 170
ALounes 0:826d61f3ff66 171 void printGesture(int gesture) {
ALounes 0:826d61f3ff66 172 switch ( gesture ) {
ALounes 0:826d61f3ff66 173 case DIR_UP:
ALounes 0:826d61f3ff66 174 pc.printf("UP\n\r");
ALounes 0:826d61f3ff66 175 break;
ALounes 0:826d61f3ff66 176 case DIR_DOWN:
ALounes 0:826d61f3ff66 177 pc.printf("DOWN\n\r");
ALounes 0:826d61f3ff66 178 break;
ALounes 0:826d61f3ff66 179 case DIR_LEFT:
ALounes 0:826d61f3ff66 180 pc.printf("LEFT\n\r");
ALounes 0:826d61f3ff66 181 break;
ALounes 0:826d61f3ff66 182 case DIR_RIGHT:
ALounes 0:826d61f3ff66 183 pc.printf("RIGHT\n\r");
ALounes 0:826d61f3ff66 184 break;
ALounes 0:826d61f3ff66 185 case DIR_NEAR:
ALounes 0:826d61f3ff66 186 pc.printf("NEAR\n\r");
ALounes 0:826d61f3ff66 187 break;
ALounes 0:826d61f3ff66 188 case DIR_FAR:
ALounes 0:826d61f3ff66 189 pc.printf("FAR\n\r");
ALounes 0:826d61f3ff66 190 break;
ALounes 0:826d61f3ff66 191 default:
ALounes 0:826d61f3ff66 192 pc.printf("NONE\n\r");
ALounes 0:826d61f3ff66 193 }
ALounes 0:826d61f3ff66 194 }
ALounes 0:826d61f3ff66 195
ALounes 0:826d61f3ff66 196 int getGesture() {
ALounes 0:826d61f3ff66 197
ALounes 0:826d61f3ff66 198 if(sensor.isGestureAvailable()) {
ALounes 0:826d61f3ff66 199 pc.printf("Gesture Available!\n\r");
ALounes 0:826d61f3ff66 200 // Process it.
ALounes 0:826d61f3ff66 201
ALounes 0:826d61f3ff66 202 switch ( sensor.readGesture() ) {
ALounes 0:826d61f3ff66 203
ALounes 0:826d61f3ff66 204 case DIR_RIGHT:
ALounes 0:826d61f3ff66 205 inf.mouvement = 2;
ALounes 0:826d61f3ff66 206 return 2;
ALounes 0:826d61f3ff66 207 case DIR_LEFT :
ALounes 0:826d61f3ff66 208 inf.mouvement = 3;
ALounes 0:826d61f3ff66 209 return 3;
ALounes 0:826d61f3ff66 210 case DIR_DOWN :
ALounes 0:826d61f3ff66 211 inf.mouvement = 4;
ALounes 0:826d61f3ff66 212 return 4;
ALounes 0:826d61f3ff66 213 case DIR_UP :
ALounes 0:826d61f3ff66 214 inf.mouvement = 5;
ALounes 0:826d61f3ff66 215 return 5;
ALounes 0:826d61f3ff66 216 case DIR_NEAR :
ALounes 0:826d61f3ff66 217 inf.mouvement = 6;
ALounes 0:826d61f3ff66 218 return 6;
ALounes 0:826d61f3ff66 219 case DIR_FAR :
ALounes 0:826d61f3ff66 220 inf.mouvement = 7;
ALounes 0:826d61f3ff66 221 return 7;
ALounes 0:826d61f3ff66 222 default:
ALounes 0:826d61f3ff66 223 inf.mouvement = 1;
ALounes 0:826d61f3ff66 224 return 1;
ALounes 0:826d61f3ff66 225 }
ALounes 0:826d61f3ff66 226 }
ALounes 0:826d61f3ff66 227 return DIR_NONE;
ALounes 0:826d61f3ff66 228 //return 0;
ALounes 0:826d61f3ff66 229 }
ALounes 0:826d61f3ff66 230
ALounes 0:826d61f3ff66 231
ALounes 0:826d61f3ff66 232 void thread_presence(void const *name) {
ALounes 0:826d61f3ff66 233
ALounes 0:826d61f3ff66 234 printf("%s\n\r", (const char*)name);
ALounes 0:826d61f3ff66 235
ALounes 0:826d61f3ff66 236 two_slots.wait();
ALounes 0:826d61f3ff66 237 while(!sensor.ginit(pc)){
ALounes 0:826d61f3ff66 238 printf("Something went wrong during APDS-9960 init\n\r");
ALounes 0:826d61f3ff66 239 Thread::wait(TIME_WAIT_MS_INITIALISATION_FAILURE);
ALounes 0:826d61f3ff66 240 }
ALounes 0:826d61f3ff66 241 printf("APDS-9960 initialization complete\n\r");
ALounes 0:826d61f3ff66 242
ALounes 0:826d61f3ff66 243 // Start running the APDS-9960 gesture sensor engine
ALounes 0:826d61f3ff66 244 while(!sensor.enableGestureSensor(true)){
ALounes 0:826d61f3ff66 245 printf("Something went wrong during gesture sensor init!\n\r");
ALounes 0:826d61f3ff66 246 Thread::wait(TIME_WAIT_MS_INITIALISATION_FAILURE);
ALounes 0:826d61f3ff66 247 }
ALounes 0:826d61f3ff66 248 printf("Gesture sensor is now running\n\r");
ALounes 0:826d61f3ff66 249 two_slots.release();
ALounes 0:826d61f3ff66 250
ALounes 0:826d61f3ff66 251 interrupt.fall(&trigger);
ALounes 0:826d61f3ff66 252
ALounes 0:826d61f3ff66 253 while(1) {
ALounes 0:826d61f3ff66 254 // when interrupt trigerred, flag is set.
ALounes 0:826d61f3ff66 255 if(intFlag) {
ALounes 0:826d61f3ff66 256
ALounes 0:826d61f3ff66 257 two_slots.wait();
ALounes 0:826d61f3ff66 258 printGesture(getGesture());
ALounes 0:826d61f3ff66 259 two_slots.release();
ALounes 0:826d61f3ff66 260
ALounes 0:826d61f3ff66 261 // Clean interrupt handler flag.
ALounes 0:826d61f3ff66 262 intFlag = false;
ALounes 0:826d61f3ff66 263 }
ALounes 0:826d61f3ff66 264
ALounes 0:826d61f3ff66 265 // Do somethings else
ALounes 0:826d61f3ff66 266 wait_ms(TIME_WAIT_MS_MOUVEMENT_SENSOR);
ALounes 0:826d61f3ff66 267 }
ALounes 0:826d61f3ff66 268 }
ALounes 0:826d61f3ff66 269
ALounes 0:826d61f3ff66 270 /*************************************************************************************/
ALounes 0:826d61f3ff66 271 /*************************************************************************************/
ALounes 0:826d61f3ff66 272 /* BLE */
ALounes 0:826d61f3ff66 273 /*************************************************************************************/
ALounes 0:826d61f3ff66 274 /*************************************************************************************/
ALounes 0:826d61f3ff66 275
ALounes 0:826d61f3ff66 276 void bleCallBack(void const *name) {
ALounes 0:826d61f3ff66 277 printf("%s\n\r", (const char*)name);
ALounes 0:826d61f3ff66 278
ALounes 0:826d61f3ff66 279 printf(" tmp 01 : %3d \n",inf.temperature_01);
ALounes 0:826d61f3ff66 280 printf(" tmp 02 : %3d \n",inf.temperature_02);
ALounes 0:826d61f3ff66 281 printf(" humidite : %3d \n",inf.humidite);
ALounes 0:826d61f3ff66 282 printf(" pression : %6ld \n",inf.pression);
ALounes 0:826d61f3ff66 283 printf(" luminosite : %3d \n",inf.luminosite);
ALounes 0:826d61f3ff66 284 printf(" Mouvement : %1d \n",inf.mouvement);
ALounes 0:826d61f3ff66 285
ALounes 0:826d61f3ff66 286 bluetooth.printf("%3d%3d%3d%6ld%3d%1d" ,inf.temperature_01
ALounes 0:826d61f3ff66 287 ,inf.humidite
ALounes 0:826d61f3ff66 288 ,inf.temperature_02
ALounes 0:826d61f3ff66 289 ,inf.pression
ALounes 0:826d61f3ff66 290 ,inf.luminosite
ALounes 0:826d61f3ff66 291 ,inf.mouvement);
ALounes 0:826d61f3ff66 292
ALounes 0:826d61f3ff66 293 inf.mouvement = 0;
ALounes 0:826d61f3ff66 294 }
ALounes 0:826d61f3ff66 295
ALounes 0:826d61f3ff66 296 /*************************************************************************************/
ALounes 0:826d61f3ff66 297 /*************************************************************************************/
ALounes 0:826d61f3ff66 298 /* POT & PWM */
ALounes 0:826d61f3ff66 299 /*************************************************************************************/
ALounes 0:826d61f3ff66 300 /*************************************************************************************/
ALounes 0:826d61f3ff66 301
ALounes 0:826d61f3ff66 302 void potAndPwm()
ALounes 0:826d61f3ff66 303 {
ALounes 0:826d61f3ff66 304 AnalogIn pot(PIN_POTENTIOMETRE);
ALounes 0:826d61f3ff66 305 SoftPWM led = PIN_PWM_LED;
ALounes 0:826d61f3ff66 306
ALounes 0:826d61f3ff66 307 led.period_ms(PWM_PERIODE_MS);
ALounes 0:826d61f3ff66 308
ALounes 0:826d61f3ff66 309 while (true) {
ALounes 0:826d61f3ff66 310 if(pot.read() < PWM_VALUE_MIN){
ALounes 0:826d61f3ff66 311 led = PWM_LED_OFF;
ALounes 0:826d61f3ff66 312 inf.luminosite = 0;
ALounes 0:826d61f3ff66 313 }
ALounes 0:826d61f3ff66 314 else if (pot.read()> PWM_VALUE_MAX){
ALounes 0:826d61f3ff66 315 led = PWM_LED_ON;
ALounes 0:826d61f3ff66 316 inf.luminosite = 100;
ALounes 0:826d61f3ff66 317 }
ALounes 0:826d61f3ff66 318 else {
ALounes 0:826d61f3ff66 319 led = pot.read();
ALounes 0:826d61f3ff66 320 inf.luminosite = pot.read()*100;
ALounes 0:826d61f3ff66 321 }
ALounes 0:826d61f3ff66 322 }
ALounes 0:826d61f3ff66 323 }
ALounes 0:826d61f3ff66 324
ALounes 0:826d61f3ff66 325 /*************************************************************************************/
ALounes 0:826d61f3ff66 326 /*************************************************************************************/
ALounes 0:826d61f3ff66 327 /* FIN PROGRAMME */
ALounes 0:826d61f3ff66 328 /*************************************************************************************/
ALounes 0:826d61f3ff66 329 /*************************************************************************************/