Mesure le taux de CO2 avec le capteur Telaire T3320

Dependencies:   BSP_DISCO_F746NG

main.cpp

Committer:
dragomir
Date:
2021-06-22
Revision:
0:c59276d46a12

File content as of revision 0:c59276d46a12:

#include "mbed.h"
#include "ft5336.h"
#include "stm32746g_discovery.h"
#include "stm32746g_discovery_lcd.h"
#include "stm32746g_discovery_ts.h"
#include "logo.h"

void drawImage_logo(int offsetX, int offsetY)
{
    int x = 0;
    int y = 0;
    uint32_t* dataPtr = (uint32_t*)logo.data;
    while(y < logo.height) {
        while(x < logo.width) {
            BSP_LCD_DrawPixel(x + offsetX, y + offsetY, *dataPtr);
            dataPtr++;
            x++;
        }
        x = 0;
        y++;
    }
}

TS_StateTypeDef State;
TS_TouchEventTypeDef event;
DigitalOut buzer(PG_6);
I2C i2c(PB_9,PB_8); // initialisation des broches I2C



int main()
{

    char readdata[6] = {};
    char writedata[6] = {};
    int frequence = 100000;
    int x = 0;
    int y = 0;
    int read = 0;
    uint8_t adresse = 42; // adresse du capteur
    uint8_t coorX = 100;
    uint8_t coorY = 100;
    char buf[20] = {0};
    char buf2[20] = {0};
    char buffer[10] = {};
    char bufvalue[10] = {};
    int MSB = 0; // most significant bit
    int LSB = 0; // less signifiicant bit
    int ppm = 0;
    int etat = 1;

    BSP_LCD_Init(); // initialisation du LCD
    BSP_TS_Init(BSP_LCD_GetXSize(),BSP_LCD_GetYSize()); // initialisation du touch screen
    BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
    BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
    i2c.frequency(frequence); // frequence de communication imposee par le maître


    int i = 0;


    BSP_LCD_Clear(LCD_COLOR_WHITE);

    while (1) {



        switch(etat)

        {

            case 0 :

                writedata[0] = 0x04;
                writedata[1] = 0x13;
                writedata[2] = 0x8B;
                writedata[3] = 0x00;
                writedata[4] = 0x01;

                i2c.write(adresse, writedata, 6);  // requête pour obtenir les mesures du capteur
                HAL_Delay(7);
                read = i2c.read(adresse, readdata, 5); // stock les mesures dans le tableau readdata
                HAL_Delay(10);

                switch(read) {

                    case 0:
                        drawImage_logo(0,0);
                        MSB = (int)readdata[2];                     // affecte la valeur du MSB
                        LSB = (int)readdata[3];                     // affecte la valeur du LSB
                        ppm = MSB*256+LSB;                          // calcul pour obtenir la valeur en ppm
                        sprintf(bufvalue,"%d",ppm);                 // conversion d'un nombre en caractère
                        BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                        BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
                        BSP_LCD_DisplayStringAt(40, 100, (uint8_t *)bufvalue, CENTER_MODE);
                        BSP_LCD_DisplayStringAt(120, 100, (uint8_t *)"ppm", CENTER_MODE);

                        if(ppm > 1500) {

                            BSP_LCD_Clear(LCD_COLOR_WHITE);
                            BSP_LCD_DisplayStringAt(0, 130, (uint8_t *)"Evacuer la salle", CENTER_MODE);
                            BSP_LCD_DisplayStringAt(0, 100, (uint8_t *)bufvalue, CENTER_MODE);
                            BSP_LCD_DisplayStringAt(90, 100, (uint8_t *)"ppm", CENTER_MODE);
                            BSP_LCD_SetTextColor(LCD_COLOR_RED);
                            BSP_LCD_DisplayStringAt(0, 160, (uint8_t *)"seuil de CO2 mauvais", CENTER_MODE);
                            BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE);
                            drawImage_logo(0,0);
                            buzer.write(1);
                        }

                        else if(ppm > 600 && ppm < 1000) {

                            BSP_LCD_Clear(LCD_COLOR_WHITE);
                            BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                            BSP_LCD_SetTextColor(LCD_COLOR_LIGHTBLUE );
                            BSP_LCD_DisplayStringAt(0, 150, (uint8_t *)"qualite air moderee", CENTER_MODE);
                            BSP_LCD_DisplayStringAt(40, 100, (uint8_t *)bufvalue, CENTER_MODE);
                            BSP_LCD_DisplayStringAt(120, 100, (uint8_t *)"ppm", CENTER_MODE);
                            BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
                            BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE);
                            drawImage_logo(0,0);
                        }

                        else if(ppm > 400 && ppm < 600) {

                            BSP_LCD_Clear(LCD_COLOR_WHITE);
                            BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                            BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
                            BSP_LCD_DisplayStringAt(0, 100, (uint8_t *)bufvalue, CENTER_MODE);
                            BSP_LCD_DisplayStringAt(80, 100, (uint8_t *)"ppm", CENTER_MODE);
                            BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
                            BSP_LCD_DisplayStringAt(0, 150, (uint8_t *)"qualite air moyen", CENTER_MODE);
                            BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE);
                            drawImage_logo(0,0);

                        }

                        else if(ppm <= 400) {

                            BSP_LCD_Clear(LCD_COLOR_WHITE);
                            BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                            BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
                            BSP_LCD_DisplayStringAt(0, 100, (uint8_t *)bufvalue, CENTER_MODE);
                            BSP_LCD_DisplayStringAt(80, 100, (uint8_t *)"ppm", CENTER_MODE);
                            BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
                            BSP_LCD_DisplayStringAt(0, 150, (uint8_t *)"qualite air excellente", CENTER_MODE);
                            BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                            BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
                            BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE);
                            drawImage_logo(0,0);
                        }


                        BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                        BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
                        BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"QUALITE AIR", CENTER_MODE);

                        HAL_Delay(1000);
                        BSP_TS_GetState(&State);        // initialise touch screen
                        coorX = State.touchX[0];        // récupére les coordonnées en x
                        coorY = State.touchY[0];        // récupére les coordonnées en y
                        BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
                        BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                        BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE);

                        if(coorY >= 190 && coorY <= 250 && coorX >= 25 && coorX <= 70) {
                            BSP_LCD_DisplayStringAt(100, 50, (uint8_t *)"affichage des mesures", CENTER_MODE);
                            BSP_LCD_Clear(LCD_COLOR_WHITE);
                            buzer.write(0);  // eteind le buzer
                            etat = 1;
                        }

                        break;

                    case 1:

                        BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                        BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
                        BSP_LCD_DisplayStringAt(50, 180, (uint8_t *)"I2C read nothing: ", CENTER_MODE);

                        break;

                }


                ppm = 0; // met la valeur mesuré
                break;

            case 1:


                BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
                BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
                BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);
                BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"QUALITE AIR", CENTER_MODE);
                drawImage_logo(0,0);            // logo iut
                HAL_Delay(1000);
                BSP_TS_GetState(&State);        // initialise touch screen
                coorX = State.touchX[0];
                coorY = State.touchY[0];
                BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
                BSP_LCD_DrawRect(180, 190, 120,40);
                BSP_LCD_DisplayStringAt(0, 200, (uint8_t *)"mesure", CENTER_MODE);

                if(coorY >= 180 && coorY <= 220 && coorX >= 220 && coorX <= 240) {
                    BSP_LCD_DisplayStringAt(100, 50, (uint8_t *)"mesures CO2 en ppm ", CENTER_MODE);
                    etat = 0;
                    BSP_LCD_Clear(LCD_COLOR_WHITE);
                }

                else {
                    etat = 1;
                }

                HAL_Delay(1000);
                BSP_TS_ITClear();
                BSP_TS_ResetTouchData(&State);


                break;
        }






    }
}