projet Iot

Dependencies:   BMP180 DHT11 SoftPWM SparkFun_APDS9960 mbed-rtos mbed

Committer:
ALounes
Date:
Thu Dec 17 18:37:52 2015 +0000
Revision:
0:826d61f3ff66
Child:
1:0941b8778db6
holla

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