projet Iot
Dependencies: BMP180 DHT11 SoftPWM SparkFun_APDS9960 mbed-rtos mbed
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 /*************************************************************************************/
Generated on Fri Jul 15 2022 13:18:11 by 1.7.2