projet Iot

Dependencies:   BMP180 DHT11 SoftPWM SparkFun_APDS9960 mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001  /*************************************************************************************/
00002 /*************************************************************************************/
00003 /*                   PROJET IOT / GROUPE AGIR / EISE5 2015-2016                      */
00004 /*************************************************************************************/
00005 /*************************************************************************************/
00006 
00007 /*************************************************************************************/
00008 /*************************************************************************************/
00009 /*                            BIBLIOTHEQUES ET HEADER                                */
00010 /*************************************************************************************/
00011 /*************************************************************************************/ 
00012 
00013 #include "mbed.h"
00014 #include "rtos.h"
00015 #include "DHT11.h"
00016 #include "BMP180.h"
00017 #include "SoftPWM.h"
00018 #include "apds9960.h"
00019 #include "configuration.h"
00020  
00021 /*************************************************************************************/
00022 /*************************************************************************************/
00023 /*                             VARIABLES GLOBALES                                    */
00024 /*************************************************************************************/
00025 /*************************************************************************************/ 
00026 
00027 apds9960        sensor(PIN_MOUVEMENT_SENSOR_SDA,PIN_MOUVEMENT_SENSOR_SCL);
00028 InterruptIn     interrupt(PIN_MOUVEMENT_SENSOR_INTERRUPTION);
00029 Serial          bluetooth(PIN_BLE_TX, PIN_BLE_RX);
00030 Serial          pc(USBTX, USBRX);
00031 Semaphore       two_slots(1);
00032 Ticker          timer;
00033 
00034 Informations    inf = {0,0,0,0,0,0};
00035 bool intFlag = false;
00036 
00037 /*************************************************************************************/
00038 /*************************************************************************************/
00039 /*                                FONCTION MAIN                                      */
00040 /*************************************************************************************/
00041 /*************************************************************************************/
00042 
00043 int main (void) {
00044 
00045     Thread t1(thread_temperature, (void *)"Thread temperature");
00046     Thread t2(thread_pression   , (void *)"Thread pression");
00047     Thread t3(thread_presence   , (void *)"Thread presence");
00048     Thread t4(thread_led        , (void *)"Thread Led");
00049     
00050     RtosTimer BleSend(bleCallBack, osTimerPeriodic, (void *)"Ble emission");
00051     BleSend.start(TIME_MS_PERIODE_BLE);
00052     
00053     potAndPwm();
00054 }
00055 
00056 /*************************************************************************************/
00057 /*************************************************************************************/
00058 /*                              THREAD TEMPERATURE                                   */
00059 /*************************************************************************************/
00060 /*************************************************************************************/
00061 
00062 void thread_temperature(void const *name) {
00063 
00064     DHT11 capteur(PIN_TEMPERATURE_HUMIDITY_SENSOR);
00065     int tmp;
00066 
00067     while (true) {
00068         printf("%s\n\r", (const char*)name);
00069         tmp = capteur.readData();
00070 
00071         if (tmp != DHT11::OK) {
00072             printf("Error! %d\r\n",tmp);
00073         }
00074         else {
00075             inf.temperature_01 = capteur.readTemperature();
00076             inf.humidite = capteur.readHumidity();
00077             printf("Temperature: %d, Humidity: %d\r\n", capteur.readTemperature(), capteur.readHumidity());
00078         }
00079 
00080         Thread::wait(TIME_WAIT_MS_TEMPERATURE_HUMIDITY_SENSOR);
00081     } 
00082 }
00083 
00084 /*************************************************************************************/
00085 /*************************************************************************************/
00086 /*                                   THREAD LED                                      */
00087 /*************************************************************************************/
00088 /*************************************************************************************/
00089 
00090 void thread_led(void const *name) {
00091     DigitalOut tab[] = {PIN_MUX_P0, PIN_MUX_P1, PIN_MUX_P2};
00092     
00093     while (true) {
00094         printf("%s\n\r", (const char*)name);
00095         
00096         //printf("000 \n\r");
00097         tab[0] = LED_OFF; tab[1] = LED_OFF; tab[2] = LED_OFF;
00098         Thread::wait( TIME_WAIT_BLINK_LED );
00099           
00100         //printf("100 \n\r");       
00101         tab[0] = LED_ON; tab[1] = LED_OFF; tab[2] = LED_OFF;
00102         Thread::wait( TIME_WAIT_BLINK_LED );
00103 
00104         //printf("010 \n\r"); 
00105         tab[0] = LED_OFF; tab[1] = LED_ON; tab[2] = LED_OFF;
00106         Thread::wait( TIME_WAIT_BLINK_LED );
00107  
00108         //printf("110 \n\r"); 
00109         tab[0] = LED_ON; tab[1] = LED_ON; tab[2] = LED_OFF;
00110         Thread::wait( TIME_WAIT_BLINK_LED );
00111      
00112         //printf("001 \n\r"); 
00113         tab[0] = LED_OFF; tab[1] = LED_OFF; tab[2] = LED_ON;
00114         Thread::wait( TIME_WAIT_BLINK_LED );
00115    
00116         //printf("101 \n\r"); 
00117         tab[0] = LED_ON; tab[1] = LED_OFF; tab[2] = LED_ON;
00118         Thread::wait( TIME_WAIT_BLINK_LED );
00119           
00120         //printf("011 \n\r"); 
00121         tab[0] = LED_OFF; tab[1] = LED_ON; tab[2] = LED_ON;
00122         Thread::wait( TIME_WAIT_BLINK_LED );
00123     }
00124 }
00125 
00126 /*************************************************************************************/
00127 /*************************************************************************************/
00128 /*                               THREAD PRESSION                                     */
00129 /*************************************************************************************/
00130 /*************************************************************************************/
00131 
00132 void thread_pression(void const *name) {
00133     long temp       = 0;
00134     long pressure   = 0;
00135     int  error      = 0;
00136     BMP180 bmp180(PIN_PRESURE_SENSOR_SDA, PIN_PRESURE_SENSOR_SCL);
00137     
00138     while (true) {
00139         two_slots.wait();
00140         
00141         printf("%s\n\r", (const char*)name);
00142         error = bmp180.readTP(&temp,&pressure,OVERSAMPLING_ULTRA_HIGH_RESOLUTION);
00143         
00144         two_slots.release();
00145                 
00146         if (error){
00147             printf("Error is %d\r\n\r\n",error); 
00148         }
00149         else {
00150             inf.temperature_02 = temp;
00151             inf.pression = pressure;
00152             printf("Temp is %d \r\n",(temp));
00153             printf("Pressure is %ld\r\n",pressure);
00154         }
00155 
00156         Thread::wait(TIME_WAIT_MS_PRESURE_SENSOR);
00157     } 
00158 }
00159 
00160 /*************************************************************************************/
00161 /*************************************************************************************/
00162 /*                                THREAD PRESENCE                                    */
00163 /*************************************************************************************/
00164 /*************************************************************************************/
00165   
00166 void trigger() {    
00167 //    pc.printf("triggered\n\r");
00168     intFlag = true;
00169 }
00170 
00171 void printGesture(int gesture) {
00172     switch ( gesture ) {
00173         case DIR_UP:
00174             pc.printf("UP\n\r");
00175             break;
00176         case DIR_DOWN:
00177             pc.printf("DOWN\n\r");
00178             break;
00179         case DIR_LEFT:
00180             pc.printf("LEFT\n\r");
00181             break;
00182         case DIR_RIGHT:
00183             pc.printf("RIGHT\n\r");
00184             break;
00185         case DIR_NEAR:
00186             pc.printf("NEAR\n\r");
00187             break;
00188         case DIR_FAR:
00189             pc.printf("FAR\n\r");
00190             break;
00191         default:
00192             pc.printf("NONE\n\r");
00193     }
00194 }
00195 
00196 int getGesture() {
00197 
00198     if(sensor.isGestureAvailable()) {
00199             pc.printf("Gesture Available!\n\r");
00200         // Process it.
00201         
00202             switch ( sensor.readGesture() ) {
00203 
00204             case DIR_RIGHT: 
00205                     inf.mouvement = 2; 
00206                     return 2;
00207             case DIR_LEFT : 
00208                     inf.mouvement = 3; 
00209                     return 3;
00210             case DIR_DOWN : 
00211                     inf.mouvement = 4; 
00212                     return 4;
00213             case DIR_UP   :
00214                     inf.mouvement = 5; 
00215                     return 5;
00216             case DIR_NEAR : 
00217                     inf.mouvement = 6; 
00218                     return 6;
00219             case DIR_FAR  : 
00220                     inf.mouvement = 7; 
00221                     return 7;
00222             default: 
00223                     inf.mouvement = 1; 
00224                     return 1;
00225         }
00226     }
00227     return DIR_NONE;
00228     //return 0;
00229 }
00230   
00231 
00232 void thread_presence(void const *name) {
00233     
00234     printf("%s\n\r", (const char*)name);
00235     
00236     two_slots.wait();
00237     while(!sensor.ginit(pc)){
00238         printf("Something went wrong during APDS-9960 init\n\r");
00239         Thread::wait(TIME_WAIT_MS_INITIALISATION_FAILURE);
00240     }
00241     printf("APDS-9960 initialization complete\n\r");
00242         
00243     // Start running the APDS-9960 gesture sensor engine    
00244     while(!sensor.enableGestureSensor(true)){
00245         printf("Something went wrong during gesture sensor init!\n\r");
00246         Thread::wait(TIME_WAIT_MS_INITIALISATION_FAILURE);
00247     }
00248     printf("Gesture sensor is now running\n\r");
00249     two_slots.release();
00250  
00251     interrupt.fall(&trigger);
00252            
00253     while(1) {
00254         // when interrupt trigerred, flag is set.
00255         if(intFlag) {
00256             
00257             two_slots.wait();
00258             printGesture(getGesture());
00259             two_slots.release();
00260             
00261             // Clean interrupt handler flag.
00262             intFlag = false;
00263         }
00264             
00265         // Do somethings else
00266         wait_ms(TIME_WAIT_MS_MOUVEMENT_SENSOR);
00267     }
00268 }
00269 
00270 /*************************************************************************************/
00271 /*************************************************************************************/
00272 /*                                     BLE                                           */
00273 /*************************************************************************************/
00274 /*************************************************************************************/
00275 
00276 void bleCallBack(void const *name) {
00277     printf("%s\n\r", (const char*)name);
00278     
00279     printf(" tmp 01      : %3d \n",inf.temperature_01);
00280     printf(" tmp 02      : %3d \n",inf.temperature_02);
00281     printf(" humidite    : %3d \n",inf.humidite);
00282     printf(" pression    : %6ld \n",inf.pression);
00283     printf(" luminosite  : %3d \n",inf.luminosite);
00284     printf(" Mouvement   : %1d \n",inf.mouvement);
00285         
00286     bluetooth.printf("%3d%3d%3d%6ld%3d%1d"  ,inf.temperature_01
00287                                             ,inf.humidite
00288                                             ,inf.temperature_02
00289                                             ,inf.pression
00290                                             ,inf.luminosite
00291                                             ,inf.mouvement);
00292                                             
00293     inf.mouvement = 0;
00294 }
00295 
00296 /*************************************************************************************/
00297 /*************************************************************************************/
00298 /*                                   POT & PWM                                       */
00299 /*************************************************************************************/
00300 /*************************************************************************************/
00301 
00302 void potAndPwm()
00303 {
00304     AnalogIn pot(PIN_POTENTIOMETRE);
00305     SoftPWM led = PIN_PWM_LED;
00306     
00307     led.period_ms(PWM_PERIODE_MS);
00308     
00309     while (true)   {
00310         if(pot.read() < PWM_VALUE_MIN){
00311             led = PWM_LED_OFF;
00312             inf.luminosite = 0;
00313         }
00314         else if (pot.read()> PWM_VALUE_MAX){
00315             led = PWM_LED_ON;
00316             inf.luminosite = 100;
00317         }
00318         else {
00319             led = pot.read(); 
00320             inf.luminosite = pot.read()*100;
00321         }       
00322     }
00323 }
00324 
00325 /*************************************************************************************/
00326 /*************************************************************************************/
00327 /*                                  FIN PROGRAMME                                    */
00328 /*************************************************************************************/
00329 /*************************************************************************************/