Programme affichant la température et le taux de CO2 sur graphique. Bibliothèque LVGL + I2C Capteur Telaire T30-22 / Capteur temp/Hum Si7021 by Simon M
Dependencies: BSP_DISCO_F746NG
Revision 6:61d9f0dbdc21, committed 2022-06-16
- Comitter:
- simon11111
- Date:
- Thu Jun 16 09:50:45 2022 +0000
- Parent:
- 5:071136c3eefa
- Commit message:
Changed in this revision
lv_conf.h | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 071136c3eefa -r 61d9f0dbdc21 lv_conf.h --- a/lv_conf.h Tue Jun 15 19:35:57 2021 +0000 +++ b/lv_conf.h Thu Jun 16 09:50:45 2022 +0000 @@ -202,7 +202,7 @@ # define lv_snprintf snprintf # define lv_vsnprintf vsnprintf #else /*LV_SPRINTF_CUSTOM*/ -# define LV_SPRINTF_USE_FLOAT 0 +# define LV_SPRINTF_USE_FLOAT 1 #endif /*LV_SPRINTF_CUSTOM*/ #define LV_USE_USER_DATA 1 @@ -266,13 +266,13 @@ #define LV_FONT_MONTSERRAT_10 0 #define LV_FONT_MONTSERRAT_12 0 #define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 0 -#define LV_FONT_MONTSERRAT_18 0 -#define LV_FONT_MONTSERRAT_20 0 -#define LV_FONT_MONTSERRAT_22 0 -#define LV_FONT_MONTSERRAT_24 0 -#define LV_FONT_MONTSERRAT_26 0 -#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_FONT_MONTSERRAT_18 1 +#define LV_FONT_MONTSERRAT_20 1 +#define LV_FONT_MONTSERRAT_22 1 +#define LV_FONT_MONTSERRAT_24 1 +#define LV_FONT_MONTSERRAT_26 1 +#define LV_FONT_MONTSERRAT_28 1 #define LV_FONT_MONTSERRAT_30 0 #define LV_FONT_MONTSERRAT_32 0 #define LV_FONT_MONTSERRAT_34 0
diff -r 071136c3eefa -r 61d9f0dbdc21 main.cpp --- a/main.cpp Tue Jun 15 19:35:57 2021 +0000 +++ b/main.cpp Thu Jun 16 09:50:45 2022 +0000 @@ -1,84 +1,287 @@ -/** - * Notebook page https://os.mbed.com/users/JohnnyK/notebook/how-start-with-the-littlevgl/ - */ - #include "mbed.h" #include "lvgl/lvgl.h" +#include "lvgl/src/misc/lv_color.h" +#include "lvgl/src/misc/lv_style.h" +#include "lvgl/src/misc/lv_style_gen.h" +#include "lvgl/examples/lv_examples.h" #include "hal_stm_lvgl/tft/tft.h" -#include "hal_stm_lvgl/touchpad/touchpad.h" -#include "lv_demo.h" /*Comment/uncomment will switch between LVGL demo and Hello word example*/ +#include "hal_stm_lvgl/touchpad/touchpad.h" #define LVGL_TICK 10 //Time tick value for lvgl in ms (1-10msa) #define TICKER_TIME 10ms //modified to miliseconds -Ticker ticker; //Ticker for lvgl - +//Variable globale liaison I2C capteur Temp/HUM. +#define READ_TEMP 0xE0 +#define READ_RH 0xE5 +#define READ_ID1_1 0xFA +#define READ_ID1_2 0x0F +#define READ_ID2_1 0xFC +#define READ_ID2_2 0xC9 +#define READ_FWREV_1 0x84 +#define READ_FWREV_2 0xB8 +#define ADDR 0x80 +#define FREQ 100000 +#define DEVICE_ID 0x15 + + +char x_event; +Ticker ticker; //Ticker for lvgl + +//création des objets des deux écrans +lv_obj_t * scr1; +lv_obj_t * scr2; + + +I2C i2c(PB_9,PB_8); // initialisation des broches I2C + + /* * Callback function for lvgl timing. - * Call lv_tick_inc(x) every x milliseconds in a Timer or Task (x should be between 1 and 10). + * Call lv_tick_inc(x) every x milliseconds in a Timer or Task (x should be between 1 and 10). * It is required for the internal timing of LittlevGL. */ -void lv_ticker_func(){ - lv_tick_inc(LVGL_TICK); +void lv_ticker_func() +{ + lv_tick_inc(LVGL_TICK); +} +// +// Bouton ON/OFF +// +static void eventActivAlarme(lv_event_t * e)//event du bouton ON/OFF non utilisé actuellement +{ + LV_LOG_USER("btnActivAlarme was Clicked"); + + lv_obj_t * btnActivAlarme = lv_event_get_target(e); + lv_obj_t * label = lv_obj_get_child(btnActivAlarme, 0); + + if (x_event==1) { + lv_label_set_text(label, "ON"); + + x_event=0; + } else { + lv_label_set_text(label, "OFF"); + x_event=1; + } } -#ifndef LV_DEMO_H -static void event_handler(lv_event_t* event) + +// +// Bouton Graph +// +static void eventGraph(lv_event_t * event) //event du bouton Graph pour charger scr2 { - lv_event_code_t code = lv_event_get_code(event); - if(code == LV_EVENT_CLICKED) { - printf("Clicked\n"); - } - else if(code == LV_EVENT_VALUE_CHANGED) { - printf("Toggled\n"); - } + + lv_scr_load(scr2); + + lv_obj_t * btnGraph = lv_event_get_target(event); + lv_obj_t * label = lv_obj_get_child(btnGraph, 0); + } -#endif +// +// Bouton MENU +// +static void event_MENU(lv_event_t * e) //event du bouton Menu pour charger scr1 +{ + + lv_scr_load(scr1); + + lv_obj_t * btn_ALR = lv_event_get_target(e); + lv_obj_t * label = lv_obj_get_child(btn_ALR, 0); + +} + // main() runs in its own thread in the OS int main() { - printf("LVGL-"); - lv_init(); //Initialize the LVGL - tft_init(); //Initialize diplay - touchpad_init(); //Initialize touchpad - ticker.attach(callback(&lv_ticker_func),TICKER_TIME); //Attach callback to ticker + + //init variable I2C capteur CO2 + char readdata[6] = {}; + char writedata[6] = {}; + uint8_t adresse = 42; // adresse du capteur CO2 + char bufvalue[12] = {}; + int MSB = 0; // most significant bit + int LSB = 0; // less signifiicant bit + int ppm = 0; + // variable I2C capteur Temp/Hum + uint8_t rx_buff[8]; + uint8_t tx_buff[2]; + uint32_t rhData; //valeur Hum + int32_t tData; //valeur Temp + + i2c.frequency(FREQ); // FREQ de communication imposee par le maître 100 000 -#ifdef LV_DEMO_H - printf("Demo\n"); - lv_demo_widgets(); -#else - printf("Hello world\n"); - lv_obj_t * label1 = lv_label_create(lv_scr_act()); + //Initialisation des différents objets à l'écran + lv_init(); //Initialize the LVGL + tft_init(); //Initialize diplay + touchpad_init(); + //Initialize touchpad + ticker.attach(callback(&lv_ticker_func),TICKER_TIME); + lv_obj_t * label; //Attach callback to ticker + lv_obj_t * labe2; //Attach callback to ticker + lv_obj_t * labe3; //Attach callback to ticker + lv_obj_t * labe4; //Attach callback to ticker + lv_obj_t * labe5; //Attach callback to ticker + + scr1 = lv_obj_create(NULL); //création scr1 + scr2 = lv_obj_create(NULL); //création scr2 + + lv_scr_load(scr1); //Utilisation scr1 par défault + + //Texte appartenant au scr1 + //******************************************************************************// + lv_obj_t * label1 = lv_label_create(scr1); lv_label_set_long_mode(label1, LV_LABEL_LONG_WRAP); /*Break the long lines*/ lv_label_set_recolor(label1, true); /*Enable re-coloring by commands in the text*/ - lv_label_set_text(label1, "#0000ff Hello# #ff00ff world# #ff0000 - the LVGL and MbedOS#"); + lv_label_set_text(label1, "#ff0000 Boitier domotique Temp Hum & CO2#"); lv_obj_set_width(label1, 150); - lv_obj_align(label1, LV_ALIGN_TOP_MID, 0, 20); + lv_obj_align(label1, LV_ALIGN_TOP_LEFT, 0, 0); + + lv_obj_t * label2 = lv_label_create(scr1); + lv_obj_set_width(label2, 300); + lv_label_set_text(label2, "Project by Simon Marchiano"); + lv_obj_align(label2, LV_ALIGN_BOTTOM_LEFT, 0, 0); + + lv_obj_t * label31 = lv_label_create(scr1); + lv_obj_set_width(label31, 300); + lv_label_set_recolor(label31, true); /*Enable re-coloring by commands in the text*/ + lv_obj_align(label31, LV_ALIGN_CENTER, 50, -50); + + lv_obj_t * label32 = lv_label_create(scr1); + lv_obj_set_width(label32, 300); + lv_label_set_recolor(label32, true); /*Enable re-coloring by commands in the text*/ + lv_obj_align(label32, LV_ALIGN_CENTER, 50, 0); + + lv_obj_t * label33 = lv_label_create(scr1); + lv_obj_set_width(label33, 300); + lv_label_set_recolor(label33, true); /*Enable re-coloring by commands in the text*/ + lv_obj_align(label33, LV_ALIGN_CENTER, 50, 50); + //******************************************************************************// + + //Texte appartenant au scr2 + //******************************************************************************// + lv_obj_t * label3 = lv_label_create(scr2); + lv_obj_set_width(label3, 300); + lv_label_set_recolor(label3, true); /*Enable re-coloring by commands in the text*/ + //lv_label_set_text_fmt(label3, "Temperature : %d", tData); + lv_obj_align(label3, LV_ALIGN_TOP_MID, 50, 30); + + lv_obj_t * label4 = lv_label_create(scr2); + lv_obj_set_width(label4, 300); + lv_label_set_recolor(label4, true); /*Enable re-coloring by commands in the text*/ + //lv_label_set_text_fmt(label4, "Humidite : %d", rhData); + lv_obj_align(label4, LV_ALIGN_TOP_MID, 50, 45); + + lv_obj_t * label5 = lv_label_create(scr2); + lv_obj_set_width(label5, 300); + lv_label_set_recolor(label5, true); /*Enable re-coloring by commands in the text*/ + //lv_label_set_text_fmt(label5, "CO2 : %d", ppm); + lv_obj_align(label5, LV_ALIGN_TOP_MID, 50, 15); + + lv_obj_t * label20 = lv_label_create(scr2); + lv_obj_set_width(label20, 300); + lv_label_set_text_fmt(label20, "Graphique ppm "); + lv_obj_align(label20, LV_ALIGN_BOTTOM_MID, 90, -35); +//******************************************************************************// + + //Bouton appartenant au scr1 + //******************************************************************************// + // Bouton Graph + lv_obj_t * btnGraph = lv_btn_create(scr1); + lv_obj_add_event_cb(btnGraph, eventGraph, LV_EVENT_CLICKED, NULL); + lv_obj_align(btnGraph, LV_ALIGN_LEFT_MID, 10, 0); + label = lv_label_create(btnGraph); + lv_label_set_text(label, "Graph"); + + // Style Bouton ON/OFF + static lv_style_t style_btn_green; + lv_style_init(&style_btn_green); + lv_style_set_bg_color(&style_btn_green, lv_color_make(0,225,0)); + lv_style_set_bg_grad_color(&style_btn_green, lv_color_make(0,200,0)); + lv_style_set_border_color(&style_btn_green, lv_color_make(0,255,0)); + lv_style_set_text_color(&style_btn_green, lv_color_make(255,255,255)); + + // Bouton ON/OFF + lv_obj_t * btnActivAlarme = lv_btn_create(scr1); + lv_obj_add_style(btnActivAlarme, &style_btn_green,0); - lv_obj_t * label2 = lv_label_create(lv_scr_act()); - lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/ - lv_obj_set_width(label2, 150); - lv_label_set_text(label2, "It is a circularly scrolling text. "); - lv_obj_align(label2, LV_ALIGN_BOTTOM_MID, 0, 0); - - lv_obj_t * label; - lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); - lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL); - lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -25); - label = lv_label_create(btn1); - lv_label_set_text(label, "Button"); - lv_obj_t * btn2 = lv_btn_create(lv_scr_act()); - lv_obj_add_event_cb(btn2, event_handler,LV_EVENT_ALL, NULL); - lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 25); - lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE); - label = lv_label_create(btn2); - lv_label_set_text(label, "Toggled"); -#endif + lv_obj_add_event_cb(btnActivAlarme, eventActivAlarme, LV_EVENT_CLICKED, NULL); + lv_obj_align(btnActivAlarme, LV_ALIGN_LEFT_MID, 10, 50); + lv_obj_add_flag(btnActivAlarme, LV_OBJ_FLAG_CHECKABLE); + label = lv_label_create(btnActivAlarme); + lv_label_set_text(label, "ON"); + //******************************************************************************// + //Bouton et graphique appartenant au scr2 + //******************************************************************************// + // Bouton ALARMES + lv_obj_t * btn_ALR = lv_btn_create(scr2); + lv_obj_add_event_cb(btn_ALR, event_MENU, LV_EVENT_CLICKED, NULL); + lv_obj_align(btn_ALR, LV_ALIGN_LEFT_MID, 10, -50); + //lv_disp_get_scr_act(scr1); + label = lv_label_create(btn_ALR); + lv_label_set_text(label, "Menu"); + + /*Create a chart*/ + lv_obj_t * chart; + chart = lv_chart_create(scr2); + lv_obj_set_size(chart, 250, 155); + lv_obj_align(chart, LV_ALIGN_CENTER, 0, 0); + lv_chart_set_type(chart, LV_CHART_TYPE_LINE); /*Show lines and points too*/ + lv_chart_set_update_mode(chart, LV_CHART_UPDATE_MODE_SHIFT); + lv_chart_set_point_count(chart, 100); + lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 1400); + + /*Add 3 data series*/ + lv_chart_series_t * ser1 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_X); + lv_chart_series_t * ser2 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_X); + lv_chart_series_t * ser3 = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_BLUE), LV_CHART_AXIS_PRIMARY_X); + + while (true) { + + //Init capteur CO2 + writedata[0] = 0x04; + writedata[1] = 0x13; + writedata[2] = 0x8B; + writedata[3] = 0x00; + writedata[4] = 0x01; - while (true){ - lv_task_handler(); - //Call lv_task_handler() periodically every few milliseconds. + i2c.write(adresse, writedata, 6); // requête pour obtenir les mesures du capteur + HAL_Delay(7); + i2c.read(adresse, readdata, 5); // stock les mesures dans le tableau readdata + HAL_Delay(10); + + 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,"CO2 : %d ppm",ppm); // conversion d'un nombre en caractère + + tx_buff[0] = READ_RH; + i2c.write(ADDR, (char*)tx_buff, 1); + i2c.read(ADDR, (char*)rx_buff, 2); + + rhData = ((((uint32_t)rx_buff[0] << 8 | rx_buff[1]) * 125 ) / 65536)-6; + + tx_buff[0] = READ_TEMP; + i2c.write(ADDR, (char*)tx_buff, 1); + i2c.read(ADDR, (char*)rx_buff, 2); + + tData = ((((uint32_t)rx_buff[0] << 8 | rx_buff[1]) * 175.72) / 65536) - 46.85; + + //Affichage valeurs scr1 + lv_label_set_text_fmt(label5,"#ff0000 %s#",bufvalue); + lv_label_set_text_fmt(label3, "#0000ff Temperature : %d C°#", tData); + lv_label_set_text_fmt(label4, "#008000 Humidite : %d %%#", rhData); + //Affichage valeurs scr2 + lv_label_set_text_fmt(label31,"#ff0000 %s#",bufvalue); + lv_label_set_text_fmt(label32, "#0000ff Temperature : %d C°#", tData); + lv_label_set_text_fmt(label33, "#008000 Humidite : %d %%#", rhData); + //Mise à jour valeur graphique + lv_chart_set_next_value(chart, ser1, ppm); + lv_chart_set_next_value(chart, ser2, rhData); + lv_chart_set_next_value(chart, ser3, tData); + + lv_task_handler(); + //Call lv_task_handler() periodically every few milliseconds. //It will redraw the screen if required, handle input devices etc. - thread_sleep_for(LVGL_TICK); + thread_sleep_for(LVGL_TICK); } -} \ No newline at end of file +}