Code permettant d'interfacer le capteur MCP9808 et afficher le résultat ainsi qu'une petite application sur l'écran de la carte DISCO

Dependencies:   mbed BSP_DISCO_F746NG

Committer:
samiirr
Date:
Mon Jun 29 20:45:04 2020 +0000
Revision:
0:96f939ccb440
MCP9808

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samiirr 0:96f939ccb440 1 #include "mbed.h"
samiirr 0:96f939ccb440 2 #include "stm32746g_discovery_lcd.h"
samiirr 0:96f939ccb440 3 #include "stm32746g_discovery_ts.h"
samiirr 0:96f939ccb440 4 #include "logo.h"
samiirr 0:96f939ccb440 5 #include <stdlib.h>
samiirr 0:96f939ccb440 6
samiirr 0:96f939ccb440 7
samiirr 0:96f939ccb440 8
samiirr 0:96f939ccb440 9
samiirr 0:96f939ccb440 10 #define MCP9808_REG_TEMP (0x05) // Registre de température
samiirr 0:96f939ccb440 11 #define MCP9808_REG_CONF (0x01) // Registre de configuration
samiirr 0:96f939ccb440 12 #define MCP9808_ADDR (0x30) // adresse de base 0x18<<1
samiirr 0:96f939ccb440 13
samiirr 0:96f939ccb440 14
samiirr 0:96f939ccb440 15
samiirr 0:96f939ccb440 16 //uint16_t TS_StateTypeDef variable ;
samiirr 0:96f939ccb440 17 //uint16_t TS_x = variable.touchX[0];
samiirr 0:96f939ccb440 18 //uint16_t TS_y = variable.touchY[0];
samiirr 0:96f939ccb440 19
samiirr 0:96f939ccb440 20 I2C i2c(D14,D15);
samiirr 0:96f939ccb440 21 // sur la carte DISCO (SDA --> D14 ; SCL --> D15)
samiirr 0:96f939ccb440 22
samiirr 0:96f939ccb440 23 DigitalOut myled(LED1);
samiirr 0:96f939ccb440 24
samiirr 0:96f939ccb440 25 Serial pc(USBTX, USBRX,115200); // parametres de la liaison série pour affciher les résultats sur l'hype-terminal
samiirr 0:96f939ccb440 26
samiirr 0:96f939ccb440 27
samiirr 0:96f939ccb440 28 char TempCelsiusDisplay[] = "+abc.dd C"; // chaine de caracteres de la valeur de température
samiirr 0:96f939ccb440 29 int var = atoi(TempCelsiusDisplay);
samiirr 0:96f939ccb440 30
samiirr 0:96f939ccb440 31
samiirr 0:96f939ccb440 32 // fonction pour afficher le logo de l'iut ajouté sur l'écran LCD
samiirr 0:96f939ccb440 33 void drawImage(int offsetX, int offsetY)
samiirr 0:96f939ccb440 34 {
samiirr 0:96f939ccb440 35 int x = 0;
samiirr 0:96f939ccb440 36 int y = 0;
samiirr 0:96f939ccb440 37 uint32_t* dataPtr = (uint32_t*)logo.data;
samiirr 0:96f939ccb440 38 while(y < logo.height) {
samiirr 0:96f939ccb440 39 while(x < logo.width) {
samiirr 0:96f939ccb440 40 BSP_LCD_DrawPixel(x + offsetX, y + offsetY, *dataPtr);
samiirr 0:96f939ccb440 41 dataPtr++;
samiirr 0:96f939ccb440 42 x++;
samiirr 0:96f939ccb440 43 }
samiirr 0:96f939ccb440 44 x = 0;
samiirr 0:96f939ccb440 45 y++;
samiirr 0:96f939ccb440 46 }
samiirr 0:96f939ccb440 47 }
samiirr 0:96f939ccb440 48
samiirr 0:96f939ccb440 49
samiirr 0:96f939ccb440 50 int main()
samiirr 0:96f939ccb440 51 {
samiirr 0:96f939ccb440 52 // initialisation de l'écran LCD
samiirr 0:96f939ccb440 53
samiirr 0:96f939ccb440 54 uint8_t statu;
samiirr 0:96f939ccb440 55
samiirr 0:96f939ccb440 56 BSP_LCD_Init();
samiirr 0:96f939ccb440 57 BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS);
samiirr 0:96f939ccb440 58 BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
samiirr 0:96f939ccb440 59
samiirr 0:96f939ccb440 60
samiirr 0:96f939ccb440 61 statu = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
samiirr 0:96f939ccb440 62 if (statu != TS_OK) {
samiirr 0:96f939ccb440 63 BSP_LCD_Clear(LCD_COLOR_BLUE);
samiirr 0:96f939ccb440 64 BSP_LCD_SetBackColor(LCD_COLOR_RED);
samiirr 0:96f939ccb440 65 BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
samiirr 0:96f939ccb440 66
samiirr 0:96f939ccb440 67 } else {
samiirr 0:96f939ccb440 68 BSP_LCD_Clear(LCD_COLOR_GREEN);
samiirr 0:96f939ccb440 69 BSP_LCD_SetBackColor(LCD_COLOR_GREEN);
samiirr 0:96f939ccb440 70 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
samiirr 0:96f939ccb440 71
samiirr 0:96f939ccb440 72 }
samiirr 0:96f939ccb440 73
samiirr 0:96f939ccb440 74 /*BSP_LCD_SetTextColor(LCD_COLOR_RED);
samiirr 0:96f939ccb440 75 BSP_LCD_FillRect(50, 200, 100,50);
samiirr 0:96f939ccb440 76 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
samiirr 0:96f939ccb440 77 //BSP_LCD_SetBackColor(LCD_COLOR_RED);
samiirr 0:96f939ccb440 78 BSP_LCD_DisplayStringAt(-50, 140, (uint8_t *)"MIN", CENTER_MODE);*/
samiirr 0:96f939ccb440 79
samiirr 0:96f939ccb440 80 // Création du bouton "Kelvin"
samiirr 0:96f939ccb440 81
samiirr 0:96f939ccb440 82 BSP_LCD_SetTextColor(LCD_COLOR_RED);
samiirr 0:96f939ccb440 83 BSP_LCD_FillRect(150, 200, 120,50);
samiirr 0:96f939ccb440 84 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
samiirr 0:96f939ccb440 85 BSP_LCD_SetBackColor(LCD_COLOR_RED);
samiirr 0:96f939ccb440 86 BSP_LCD_DisplayStringAt(-30, 215, (uint8_t *)"Kelvin", CENTER_MODE);
samiirr 0:96f939ccb440 87
samiirr 0:96f939ccb440 88
samiirr 0:96f939ccb440 89
samiirr 0:96f939ccb440 90
samiirr 0:96f939ccb440 91 char data_write[3];
samiirr 0:96f939ccb440 92 char data_read[2];
samiirr 0:96f939ccb440 93 int tempval;
samiirr 0:96f939ccb440 94 //int tempK ;
samiirr 0:96f939ccb440 95
samiirr 0:96f939ccb440 96 //tempK = var + 273;
samiirr 0:96f939ccb440 97 //char nbr = (char)tempK;
samiirr 0:96f939ccb440 98 //wait(3);
samiirr 0:96f939ccb440 99
samiirr 0:96f939ccb440 100
samiirr 0:96f939ccb440 101 data_write[0] = MCP9808_REG_CONF;
samiirr 0:96f939ccb440 102 data_write[1] = 0x00; // config msb
samiirr 0:96f939ccb440 103 data_write[2] = 0x00; // config lsb
samiirr 0:96f939ccb440 104
samiirr 0:96f939ccb440 105 int status = i2c.write(MCP9808_ADDR, data_write, 3, 0);
samiirr 0:96f939ccb440 106 if (status != 0) { // Error
samiirr 0:96f939ccb440 107
samiirr 0:96f939ccb440 108 while (1) {
samiirr 0:96f939ccb440 109 //drawImage(0,0);
samiirr 0:96f939ccb440 110
samiirr 0:96f939ccb440 111
samiirr 0:96f939ccb440 112 myled = !myled;
samiirr 0:96f939ccb440 113 wait(0.2);
samiirr 0:96f939ccb440 114 }
samiirr 0:96f939ccb440 115 }
samiirr 0:96f939ccb440 116
samiirr 0:96f939ccb440 117 while (1) {
samiirr 0:96f939ccb440 118
samiirr 0:96f939ccb440 119
samiirr 0:96f939ccb440 120
samiirr 0:96f939ccb440 121 drawImage(0,1); // emplacement du logo de l'iut sur l'écran LCD
samiirr 0:96f939ccb440 122
samiirr 0:96f939ccb440 123 // Read temperature register
samiirr 0:96f939ccb440 124 data_write[0] = MCP9808_REG_TEMP;
samiirr 0:96f939ccb440 125 i2c.write(MCP9808_ADDR, data_write, 1, 1); // no stop
samiirr 0:96f939ccb440 126 i2c.read(MCP9808_ADDR, data_read, 2, 0);
samiirr 0:96f939ccb440 127
samiirr 0:96f939ccb440 128
samiirr 0:96f939ccb440 129
samiirr 0:96f939ccb440 130 // check Ta vs Tcrit
samiirr 0:96f939ccb440 131 if((data_read[0] & 0x80) == 0x80) {
samiirr 0:96f939ccb440 132 //pc.printf(" temp >= critique ");
samiirr 0:96f939ccb440 133 }
samiirr 0:96f939ccb440 134 if((data_read[0] & 0x40) == 0x40) {
samiirr 0:96f939ccb440 135 //pc.printf(" temp > limite superieur ");
samiirr 0:96f939ccb440 136 }
samiirr 0:96f939ccb440 137 if((data_read[0] & 0x20) == 0x20) {
samiirr 0:96f939ccb440 138 //pc.printf(" temp < limite inférieure ");
samiirr 0:96f939ccb440 139 }
samiirr 0:96f939ccb440 140 if(data_read[0] & 0xE0) {
samiirr 0:96f939ccb440 141 //pc.printf("\r\n");
samiirr 0:96f939ccb440 142 data_read[0] = data_read[0] & 0x1F; // effacer les bits de drapeau
samiirr 0:96f939ccb440 143 }
samiirr 0:96f939ccb440 144 if((data_read[0] & 0x10) == 0x10) {
samiirr 0:96f939ccb440 145 data_read[0] = data_read[0] & 0x0F;
samiirr 0:96f939ccb440 146 TempCelsiusDisplay[0] = '-';
samiirr 0:96f939ccb440 147 tempval = 256 - (data_read[0] << 4) + (data_read[1] >> 4);
samiirr 0:96f939ccb440 148 } else {
samiirr 0:96f939ccb440 149 TempCelsiusDisplay[0] = '+';
samiirr 0:96f939ccb440 150 tempval = (data_read[0] << 4) + (data_read[1] >> 4);
samiirr 0:96f939ccb440 151 }
samiirr 0:96f939ccb440 152
samiirr 0:96f939ccb440 153 // partie fractionnaire (précision 0.25°C)
samiirr 0:96f939ccb440 154 if (data_read[1] & 0x08) {
samiirr 0:96f939ccb440 155 if(data_read[1] & 0x04) {
samiirr 0:96f939ccb440 156 TempCelsiusDisplay[5] = '7';
samiirr 0:96f939ccb440 157 TempCelsiusDisplay[6] = '5';
samiirr 0:96f939ccb440 158 } else {
samiirr 0:96f939ccb440 159 TempCelsiusDisplay[5] = '5';
samiirr 0:96f939ccb440 160 TempCelsiusDisplay[6] = '0';
samiirr 0:96f939ccb440 161 }
samiirr 0:96f939ccb440 162 } else {
samiirr 0:96f939ccb440 163 if(data_read[1] & 0x04) {
samiirr 0:96f939ccb440 164 TempCelsiusDisplay[5] = '2';
samiirr 0:96f939ccb440 165 TempCelsiusDisplay[6] = '5';
samiirr 0:96f939ccb440 166 } else {
samiirr 0:96f939ccb440 167 TempCelsiusDisplay[5] = '0';
samiirr 0:96f939ccb440 168 TempCelsiusDisplay[6] = '0';
samiirr 0:96f939ccb440 169 }
samiirr 0:96f939ccb440 170 }
samiirr 0:96f939ccb440 171
samiirr 0:96f939ccb440 172 // Partie entière
samiirr 0:96f939ccb440 173 TempCelsiusDisplay[1] = (tempval / 100) + 0x30;
samiirr 0:96f939ccb440 174 TempCelsiusDisplay[2] = ((tempval % 100) / 10) + 0x30;
samiirr 0:96f939ccb440 175 TempCelsiusDisplay[3] = ((tempval % 100) % 10) + 0x30;
samiirr 0:96f939ccb440 176
samiirr 0:96f939ccb440 177 // Affichage du résultat
samiirr 0:96f939ccb440 178 pc.printf("temperature = %s\r\n", TempCelsiusDisplay); // affichage de la température sur l'hyper-terminal
samiirr 0:96f939ccb440 179 //pc.printf("temperature = %s\r\n", nbr);
samiirr 0:96f939ccb440 180
samiirr 0:96f939ccb440 181 HAL_Delay(1000);
samiirr 0:96f939ccb440 182 BSP_LCD_SetFont(&Font12);
samiirr 0:96f939ccb440 183 BSP_LCD_SetFont(&Font20);
samiirr 0:96f939ccb440 184 //sprintf((char*)text, "temperature : %5.3f cm", TempCelsiusDisplay);
samiirr 0:96f939ccb440 185 BSP_LCD_DisplayStringAt(0, 70, (uint8_t *) "MCP9808 : CAPTEUR DE TEMPERATURE", CENTER_MODE); //message de bienvenue
samiirr 0:96f939ccb440 186 BSP_LCD_DisplayStringAt(135, 100, (uint8_t *) TempCelsiusDisplay, CENTER_MODE); //affichage de la valeur de température sur l'écran LCD
samiirr 0:96f939ccb440 187 //BSP_LCD_DisplayStringAt(135, 120, (uint8_t *) nbr, CENTER_MODE);
samiirr 0:96f939ccb440 188
samiirr 0:96f939ccb440 189
samiirr 0:96f939ccb440 190
samiirr 0:96f939ccb440 191 //pc.printf("temperature= %i", tempval);
samiirr 0:96f939ccb440 192 myled = !myled;
samiirr 0:96f939ccb440 193 wait(1.0);
samiirr 0:96f939ccb440 194 }
samiirr 0:96f939ccb440 195
samiirr 0:96f939ccb440 196 }
samiirr 0:96f939ccb440 197
samiirr 0:96f939ccb440 198
samiirr 0:96f939ccb440 199
samiirr 0:96f939ccb440 200