Détection du niveau de Co2 présent dans l'air, avec une alerte

Dependencies:   BSP_DISCO_F746NG

Files at this revision

API Documentation at this revision

Comitter:
maximebe
Date:
Thu Jun 16 09:23:52 2022 +0000
Parent:
3:9f66aabe7b3b
Commit message:
Benabed_Maxime_detection_Co2

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Nov 20 11:49:15 2019 +0100
+++ b/main.cpp	Thu Jun 16 09:23:52 2022 +0000
@@ -2,21 +2,43 @@
 #include "stm32746g_discovery_lcd.h"
 #include "stm32746g_discovery_ts.h"
 
+I2C i2c(PB_9, PB_8);
+DigitalOut buzzer(D11);
+
 int main()
 {
+    uint8_t ADDR_6700 = 42;//Adresse du capteur
+    char cmd[6] = {};
+    char data[6] = {};//Variable de stockage des valeurs de Co2 du capteur
+    char valeur[30];
+    int readOk = 0;
+    int msb = 0; //bit de poid fort
+    int lsb = 0; //bit de poid faible
+    int co2 = 0;
+    int frequence = 100000;//frequence de l'horloge
+    
     TS_StateTypeDef TS_State;
-    uint16_t x, y;
+    uint16_t xRect = 215;
+    uint16_t X, Y;
     uint8_t text[30];
+    uint8_t textCo2[30];
     uint8_t status;
-    uint8_t idx;
     uint8_t cleared = 0;
     uint8_t prev_nb_touches = 0;
-
+    
+    int alarme = 0;
+    int etatBp = 0;
+    
+    int sueil = 0;
+    buzzer = 0;
+    
+    //Initialisation
+    i2c.frequency(frequence);
+    BSP_EEPROM_Init();
     BSP_LCD_Init();
     BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
     BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
 
-    BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE);
     HAL_Delay(1000);
 
     status = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
@@ -24,51 +46,131 @@
         BSP_LCD_Clear(LCD_COLOR_RED);
         BSP_LCD_SetBackColor(LCD_COLOR_RED);
         BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
-        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"INITIALISATION FAIL", CENTER_MODE);
     } else {
         BSP_LCD_Clear(LCD_COLOR_GREEN);
         BSP_LCD_SetBackColor(LCD_COLOR_GREEN);
         BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
-        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
+        BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"INITIALISATION OK", CENTER_MODE);
     }
+    
+    
+   
 
     HAL_Delay(1000);
     BSP_LCD_SetFont(&Font12);
-    BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
+    BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
     BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
-
+            
     while(1) {
 
         BSP_TS_GetState(&TS_State);
         if (TS_State.touchDetected) {
-            // Clear lines corresponding to old touches coordinates
-            if (TS_State.touchDetected < prev_nb_touches) {
-                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
-                    BSP_LCD_ClearStringLine(idx);
-                }
-            }
             prev_nb_touches = TS_State.touchDetected;
-
             cleared = 0;
-
-            sprintf((char*)text, "Touches: %d", TS_State.touchDetected);
-            BSP_LCD_DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
-
-            for (idx = 0; idx < TS_State.touchDetected; idx++) {
-                x = TS_State.touchX[idx];
-                y = TS_State.touchY[idx];
-                sprintf((char*)text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
-                BSP_LCD_DisplayStringAt(0, LINE(idx+1), (uint8_t *)&text, LEFT_MODE);
             }
-
-            BSP_LCD_DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
-        } else {
+        else {
             if (!cleared) {
-                BSP_LCD_Clear(LCD_COLOR_BLUE);
-                sprintf((char*)text, "Touches: 0");
-                BSP_LCD_DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE);
+                BSP_LCD_Clear(LCD_COLOR_BLACK);
                 cleared = 1;
             }
         }
+        //Recuperation de la position X et Y du doigt sur l'écran
+        X = TS_State.touchX[0];
+        Y = TS_State.touchY[0];
+        
+        //Creation du bouton STOP du signal sonor 
+        BSP_LCD_DrawRect(10,210,100,50);
+        BSP_LCD_DisplayStringAt(30,230,(uint8_t *)"STOP",LEFT_MODE);
+        if (TS_State.touchDetected) {
+            if(X > 10 && X < 110){
+                if(Y > 210 && Y < 260){
+                    alarme = 0;
+                    etatBp = 1;
+                    }
+                }
+            }
+        
+        //creation du slide
+        sprintf((char*)text, "%d", sueil);
+        BSP_LCD_DisplayStringAt(305,215,(uint8_t *)&text,LEFT_MODE);
+        BSP_LCD_FillRect(210,235,200,10);
+        BSP_LCD_SetTextColor(LCD_COLOR_RED);
+        BSP_LCD_FillRect(xRect,230,10,20);
+        BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
+        if(TS_State.touchDetected){
+            if(X > 215 && X < 395){
+                if(Y > 230 && Y < 250){
+                 xRect = X;
+                 sueil = (400 + X) - 215;
+                 }
+            }
+        }
+        
+        //I2C
+        cmd[0] = 0x04;
+        cmd[1] = 0x13;
+        cmd[3] = 0x8B;
+        cmd[4] = 0x00;
+        cmd[5] = 0x01;
+        //configuration du registre
+        i2c.write(ADDR_6700, cmd, 6);
+        HAL_Delay(7);
+        //requete et recuperation de la valeur du CO2
+        readOk = i2c.read(ADDR_6700, data, 5);
+        HAL_Delay(10);
+        //Calcul
+        msb = (int)data[2];
+        lsb = (int)data[3];
+        co2 = msb * 256 + lsb;
+        //Affichage de la valeur de Co2 et de la trame
+        sprintf((char*)text, "%02X %02X %02X %02X %d", data[0], data[1], data[2], data[3], readOk);
+        BSP_LCD_DisplayStringAt(305,170,(uint8_t *)&text,LEFT_MODE);
+        sprintf(valeur, "%d ppm", co2);
+        BSP_LCD_DisplayStringAt(305,190,(uint8_t *)&valeur,LEFT_MODE);
+
+        //Gestoin de l'alarme  
+        //premier niveau d'alerte      
+        if(co2 >= sueil && co2 < 1500){
+            alarme = 1;
+            //Indication du niveau de danger à l'utilisateur
+            BSP_LCD_DisplayStringAt(200,100,(uint8_t *)"Attention, il faut ouvrir les fenetre",LEFT_MODE);
+            if(etatBp != 0){
+                alarme = 0;
+            }
+        }
+        //deuxième niveau d'alerte
+        else if(co2 >= 1500){
+            alarme = 2;
+            //Indication du niveau de danger à l'utilisateur
+            BSP_LCD_DisplayStringAt(308,100,(uint8_t *)"Evacuer la salle",LEFT_MODE);
+            if(etatBp != 0){
+                alarme = 0;
+            }               
+        }  
+        else if(co2 < sueil){
+            alarme = 0;
+            etatBp = 0;
+            //Indication du niveau de danger à l'utilisateur                 
+            BSP_LCD_DisplayStringAt(308,100,(uint8_t *)"Aucun danger",LEFT_MODE);
+        }
+        
+        switch(alarme){
+            // signal sonor éteinte
+            case 0:
+                buzzer = 0;
+            break;
+            // signal sonor discontinu
+            case 1:
+                buzzer = 1;
+                HAL_Delay(500);
+                buzzer = 0;
+            break;
+            // signal sonor continu
+            case 2:
+                buzzer = 1;
+            break;
+        }
     }
 }
+
--- a/mbed-os.lib	Wed Nov 20 11:49:15 2019 +0100
+++ b/mbed-os.lib	Thu Jun 16 09:23:52 2022 +0000
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/mbed-os/#699372421a3b388fe568e9be85b1a985749a438f
+https://github.com/ARMmbed/mbed-os/#b1796dedeb8accde1cbaecf136fab96895e23d81