projet Iot

Dependencies:   BMP180 DHT11 SoftPWM SparkFun_APDS9960 mbed-rtos mbed

Revision:
0:826d61f3ff66
Child:
1:0941b8778db6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 17 18:37:52 2015 +0000
@@ -0,0 +1,330 @@
+ /*************************************************************************************/
+/*************************************************************************************/
+/*                   PROJET IOT / GROUPE AGIR / EISE5 2015-2016                      */
+/*                             achab.lounes@gmail.com                                */
+/*************************************************************************************/
+/*************************************************************************************/
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                            BIBLIOTHEQUES ET HEADER                                */
+/*************************************************************************************/
+/*************************************************************************************/ 
+
+#include "mbed.h"
+#include "rtos.h"
+#include "DHT11.h"
+#include "BMP180.h"
+#include "SoftPWM.h"
+#include "apds9960.h"
+#include "configuration.h"
+ 
+/*************************************************************************************/
+/*************************************************************************************/
+/*                             VARIABLES GLOBALES                                    */
+/*************************************************************************************/
+/*************************************************************************************/ 
+
+apds9960        sensor(PIN_MOUVEMENT_SENSOR_SDA,PIN_MOUVEMENT_SENSOR_SCL);
+InterruptIn     interrupt(PIN_MOUVEMENT_SENSOR_INTERRUPTION);
+Serial          bluetooth(PIN_BLE_TX, PIN_BLE_RX);
+Serial          pc(USBTX, USBRX);
+Semaphore       two_slots(1);
+Ticker          timer;
+
+Informations    inf = {0,0,0,0,0,0};
+bool intFlag = false;
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                                FONCTION MAIN                                      */
+/*************************************************************************************/
+/*************************************************************************************/
+
+int main (void) {
+
+    Thread t1(thread_temperature, (void *)"Thread temperature");
+    Thread t2(thread_pression   , (void *)"Thread pression");
+    Thread t3(thread_presence   , (void *)"Thread presence");
+    Thread t4(thread_led        , (void *)"Thread Led");
+    
+    RtosTimer BleSend(bleCallBack, osTimerPeriodic, (void *)"Ble emission");
+    BleSend.start(TIME_MS_PERIODE_BLE);
+    
+    potAndPwm();
+}
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                              THREAD TEMPERATURE                                   */
+/*************************************************************************************/
+/*************************************************************************************/
+
+void thread_temperature(void const *name) {
+
+    DHT11 capteur(PIN_TEMPERATURE_HUMIDITY_SENSOR);
+    int tmp;
+
+    while (true) {
+        printf("%s\n\r", (const char*)name);
+        tmp = capteur.readData();
+
+        if (tmp != DHT11::OK) {
+            printf("Error! %d\r\n",tmp);
+        }
+        else {
+            inf.temperature_01 = capteur.readTemperature();
+            inf.humidite = capteur.readHumidity();
+            printf("Temperature: %d, Humidity: %d\r\n", capteur.readTemperature(), capteur.readHumidity());
+        }
+
+        Thread::wait(TIME_WAIT_MS_TEMPERATURE_HUMIDITY_SENSOR);
+    } 
+}
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                                   THREAD LED                                      */
+/*************************************************************************************/
+/*************************************************************************************/
+
+void thread_led(void const *name) {
+    DigitalOut tab[] = {PIN_MUX_P0, PIN_MUX_P1, PIN_MUX_P2};
+    
+    while (true) {
+        printf("%s\n\r", (const char*)name);
+        
+        //printf("000 \n\r");
+        tab[0] = LED_OFF; tab[1] = LED_OFF; tab[2] = LED_OFF;
+        Thread::wait( TIME_WAIT_BLINK_LED );
+          
+        //printf("100 \n\r");       
+        tab[0] = LED_ON; tab[1] = LED_OFF; tab[2] = LED_OFF;
+        Thread::wait( TIME_WAIT_BLINK_LED );
+
+        //printf("010 \n\r"); 
+        tab[0] = LED_OFF; tab[1] = LED_ON; tab[2] = LED_OFF;
+        Thread::wait( TIME_WAIT_BLINK_LED );
+ 
+        //printf("110 \n\r"); 
+        tab[0] = LED_ON; tab[1] = LED_ON; tab[2] = LED_OFF;
+        Thread::wait( TIME_WAIT_BLINK_LED );
+     
+        //printf("001 \n\r"); 
+        tab[0] = LED_OFF; tab[1] = LED_OFF; tab[2] = LED_ON;
+        Thread::wait( TIME_WAIT_BLINK_LED );
+   
+        //printf("101 \n\r"); 
+        tab[0] = LED_ON; tab[1] = LED_OFF; tab[2] = LED_ON;
+        Thread::wait( TIME_WAIT_BLINK_LED );
+          
+        //printf("011 \n\r"); 
+        tab[0] = LED_OFF; tab[1] = LED_ON; tab[2] = LED_ON;
+        Thread::wait( TIME_WAIT_BLINK_LED );
+    }
+}
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                               THREAD PRESSION                                     */
+/*************************************************************************************/
+/*************************************************************************************/
+
+void thread_pression(void const *name) {
+    long temp       = 0;
+    long pressure   = 0;
+    int  error      = 0;
+    BMP180 bmp180(PIN_PRESURE_SENSOR_SDA, PIN_PRESURE_SENSOR_SCL);
+    
+    while (true) {
+        two_slots.wait();
+        
+        printf("%s\n\r", (const char*)name);
+        error = bmp180.readTP(&temp,&pressure,OVERSAMPLING_ULTRA_HIGH_RESOLUTION);
+        
+        two_slots.release();
+                
+        if (error){
+            printf("Error is %d\r\n\r\n",error); 
+        }
+        else {
+            inf.temperature_02 = temp;
+            inf.pression = pressure;
+            printf("Temp is %d \r\n",(temp));
+            printf("Pressure is %ld\r\n",pressure);
+        }
+
+        Thread::wait(TIME_WAIT_MS_PRESURE_SENSOR);
+    } 
+}
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                                THREAD PRESENCE                                    */
+/*************************************************************************************/
+/*************************************************************************************/
+  
+void trigger() {    
+//    pc.printf("triggered\n\r");
+    intFlag = true;
+}
+
+void printGesture(int gesture) {
+    switch ( gesture ) {
+        case DIR_UP:
+            pc.printf("UP\n\r");
+            break;
+        case DIR_DOWN:
+            pc.printf("DOWN\n\r");
+            break;
+        case DIR_LEFT:
+            pc.printf("LEFT\n\r");
+            break;
+        case DIR_RIGHT:
+            pc.printf("RIGHT\n\r");
+            break;
+        case DIR_NEAR:
+            pc.printf("NEAR\n\r");
+            break;
+        case DIR_FAR:
+            pc.printf("FAR\n\r");
+            break;
+        default:
+            pc.printf("NONE\n\r");
+    }
+}
+
+int getGesture() {
+
+    if(sensor.isGestureAvailable()) {
+            pc.printf("Gesture Available!\n\r");
+        // Process it.
+        
+            switch ( sensor.readGesture() ) {
+
+            case DIR_RIGHT: 
+                    inf.mouvement = 2; 
+                    return 2;
+            case DIR_LEFT : 
+                    inf.mouvement = 3; 
+                    return 3;
+            case DIR_DOWN : 
+                    inf.mouvement = 4; 
+                    return 4;
+            case DIR_UP   :
+                    inf.mouvement = 5; 
+                    return 5;
+            case DIR_NEAR : 
+                    inf.mouvement = 6; 
+                    return 6;
+            case DIR_FAR  : 
+                    inf.mouvement = 7; 
+                    return 7;
+            default: 
+                    inf.mouvement = 1; 
+                    return 1;
+        }
+    }
+    return DIR_NONE;
+    //return 0;
+}
+  
+
+void thread_presence(void const *name) {
+    
+    printf("%s\n\r", (const char*)name);
+    
+    two_slots.wait();
+    while(!sensor.ginit(pc)){
+        printf("Something went wrong during APDS-9960 init\n\r");
+        Thread::wait(TIME_WAIT_MS_INITIALISATION_FAILURE);
+    }
+    printf("APDS-9960 initialization complete\n\r");
+        
+    // Start running the APDS-9960 gesture sensor engine    
+    while(!sensor.enableGestureSensor(true)){
+        printf("Something went wrong during gesture sensor init!\n\r");
+        Thread::wait(TIME_WAIT_MS_INITIALISATION_FAILURE);
+    }
+    printf("Gesture sensor is now running\n\r");
+    two_slots.release();
+ 
+    interrupt.fall(&trigger);
+           
+    while(1) {
+        // when interrupt trigerred, flag is set.
+        if(intFlag) {
+            
+            two_slots.wait();
+            printGesture(getGesture());
+            two_slots.release();
+            
+            // Clean interrupt handler flag.
+            intFlag = false;
+        }
+            
+        // Do somethings else
+        wait_ms(TIME_WAIT_MS_MOUVEMENT_SENSOR);
+    }
+}
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                                     BLE                                           */
+/*************************************************************************************/
+/*************************************************************************************/
+
+void bleCallBack(void const *name) {
+    printf("%s\n\r", (const char*)name);
+    
+    printf(" tmp 01      : %3d \n",inf.temperature_01);
+    printf(" tmp 02      : %3d \n",inf.temperature_02);
+    printf(" humidite    : %3d \n",inf.humidite);
+    printf(" pression    : %6ld \n",inf.pression);
+    printf(" luminosite  : %3d \n",inf.luminosite);
+    printf(" Mouvement   : %1d \n",inf.mouvement);
+        
+    bluetooth.printf("%3d%3d%3d%6ld%3d%1d"  ,inf.temperature_01
+                                            ,inf.humidite
+                                            ,inf.temperature_02
+                                            ,inf.pression
+                                            ,inf.luminosite
+                                            ,inf.mouvement);
+                                            
+    inf.mouvement = 0;
+}
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                                   POT & PWM                                       */
+/*************************************************************************************/
+/*************************************************************************************/
+
+void potAndPwm()
+{
+    AnalogIn pot(PIN_POTENTIOMETRE);
+    SoftPWM led = PIN_PWM_LED;
+    
+    led.period_ms(PWM_PERIODE_MS);
+    
+    while (true)   {
+        if(pot.read() < PWM_VALUE_MIN){
+            led = PWM_LED_OFF;
+            inf.luminosite = 0;
+        }
+        else if (pot.read()> PWM_VALUE_MAX){
+            led = PWM_LED_ON;
+            inf.luminosite = 100;
+        }
+        else {
+            led = pot.read(); 
+            inf.luminosite = pot.read()*100;
+        }       
+    }
+}
+
+/*************************************************************************************/
+/*************************************************************************************/
+/*                                  FIN PROGRAMME                                    */
+/*************************************************************************************/
+/*************************************************************************************/
\ No newline at end of file