@@ -23,7 +23,17 @@ static const char *TAG = "example";
2323static sensor_handle_t imu_sensor_handle = NULL ;
2424static sensor_handle_t humiture_sensor_handle = NULL ;
2525
26- void sensor_event_handler (void * handler_args , esp_event_base_t base , int32_t id , void * event_data )
26+ static lv_obj_t * acc_x_bar , * acc_y_bar , * acc_z_bar ;
27+ static lv_obj_t * gyr_x_bar , * gyr_y_bar , * gyr_z_bar ;
28+ static lv_style_t bar_style ;
29+
30+ static lv_obj_t * chart = NULL ;
31+ static lv_chart_series_t * temp_series = NULL ;
32+ static lv_chart_series_t * humid_series = NULL ;
33+
34+ static void chart_add_value (lv_chart_series_t * series , const int32_t value );
35+
36+ static void sensor_event_handler (void * handler_args , esp_event_base_t base , int32_t id , void * event_data )
2737{
2838 sensor_data_t * sensor_data = (sensor_data_t * )event_data ;
2939
@@ -47,6 +57,7 @@ void sensor_event_handler(void *handler_args, esp_event_base_t base, int32_t id,
4757 sensor_data -> sensor_name ,
4858 sensor_data -> sensor_addr ,
4959 sensor_data -> humidity );
60+ chart_add_value (humid_series , (int32_t )(sensor_data -> humidity * 10.0f ));
5061 break ;
5162 case SENSOR_TEMP_DATA_READY :
5263 ESP_LOGI (TAG , "Timestamp = %llu - %s_0x%x TEMP_DATA_READY - "
@@ -55,6 +66,7 @@ void sensor_event_handler(void *handler_args, esp_event_base_t base, int32_t id,
5566 sensor_data -> sensor_name ,
5667 sensor_data -> sensor_addr ,
5768 sensor_data -> temperature );
69+ chart_add_value (temp_series , (int32_t )(sensor_data -> temperature * 10.0f ));
5870 break ;
5971 case SENSOR_ACCE_DATA_READY :
6072 ESP_LOGI (TAG , "Timestamp = %llu - %s_0x%x ACCE_DATA_READY - "
@@ -63,6 +75,9 @@ void sensor_event_handler(void *handler_args, esp_event_base_t base, int32_t id,
6375 sensor_data -> sensor_name ,
6476 sensor_data -> sensor_addr ,
6577 sensor_data -> acce .x , sensor_data -> acce .y , sensor_data -> acce .z );
78+ lv_bar_set_value (acc_x_bar , (int32_t )(sensor_data -> acce .x * 10.0f ), LV_ANIM_OFF );
79+ lv_bar_set_value (acc_y_bar , (int32_t )(sensor_data -> acce .y * 10.0f ), LV_ANIM_OFF );
80+ lv_bar_set_value (acc_z_bar , (int32_t )(sensor_data -> acce .z * 10.0f ), LV_ANIM_OFF );
6681 break ;
6782 case SENSOR_GYRO_DATA_READY :
6883 ESP_LOGI (TAG , "Timestamp = %llu - %s_0x%x GYRO_DATA_READY - "
@@ -71,15 +86,125 @@ void sensor_event_handler(void *handler_args, esp_event_base_t base, int32_t id,
7186 sensor_data -> sensor_name ,
7287 sensor_data -> sensor_addr ,
7388 sensor_data -> gyro .x , sensor_data -> gyro .y , sensor_data -> gyro .z );
89+ lv_bar_set_value (gyr_x_bar , (int32_t )(sensor_data -> gyro .x * 10.0f ), LV_ANIM_OFF );
90+ lv_bar_set_value (gyr_y_bar , (int32_t )(sensor_data -> gyro .y * 10.0f ), LV_ANIM_OFF );
91+ lv_bar_set_value (gyr_z_bar , (int32_t )(sensor_data -> gyro .z * 10.0f ), LV_ANIM_OFF );
7492 break ;
7593 default :
7694 ESP_LOGI (TAG , "Timestamp = %" PRIi64 " - event id = %" PRIi32 , sensor_data -> timestamp , id );
7795 break ;
7896 }
7997}
8098
99+ static void chart_add_value (lv_chart_series_t * series , const int32_t value )
100+ {
101+ assert (chart != NULL );
102+ assert (series != NULL );
103+ lv_chart_set_next_value (chart , series , value );
104+ uint32_t p = lv_chart_get_point_count (chart );
105+ uint32_t s = lv_chart_get_x_start_point (chart , series );
106+ int32_t * a = lv_chart_get_series_y_array (chart , series );
107+ a [(s + 1 ) % p ] = LV_CHART_POINT_NONE ;
108+ a [(s + 2 ) % p ] = LV_CHART_POINT_NONE ;
109+ lv_chart_refresh (chart );
110+ }
111+
112+ static void chart_init (lv_obj_t * scr )
113+ {
114+ chart = lv_chart_create (scr );
115+ lv_chart_set_update_mode (chart , LV_CHART_UPDATE_MODE_CIRCULAR );
116+ lv_obj_set_style_size (chart , 0 , 0 , LV_PART_INDICATOR );
117+ lv_obj_set_size (chart , BSP_LCD_H_RES , (BSP_LCD_V_RES * 2 ) / 5 );
118+ lv_obj_align (chart , LV_ALIGN_TOP_MID , 0 , BSP_LCD_V_RES / 10 );
119+
120+ lv_chart_set_point_count (chart , 250 );
121+ lv_chart_set_axis_range (chart , LV_CHART_AXIS_PRIMARY_Y , 100 , 400 );
122+ lv_chart_set_axis_range (chart , LV_CHART_AXIS_SECONDARY_Y , 0 , 1000 );
123+ lv_chart_set_div_line_count (chart , 5 , 0 );
124+
125+ temp_series = lv_chart_add_series (chart , lv_palette_main (LV_PALETTE_RED ), LV_CHART_AXIS_PRIMARY_Y );
126+ humid_series = lv_chart_add_series (chart , lv_palette_main (LV_PALETTE_BLUE ), LV_CHART_AXIS_SECONDARY_Y );
127+
128+ lv_obj_t * chart_label = lv_label_create (scr );
129+ lv_label_set_recolor (chart_label , true);
130+ lv_label_set_text_static (chart_label , "#ff0000 Temperature#" );
131+ lv_obj_align (chart_label , LV_ALIGN_TOP_LEFT , BSP_LCD_H_RES / 8 , BSP_LCD_V_RES / 32 );
132+ chart_label = lv_label_create (scr );
133+ lv_label_set_recolor (chart_label , true);
134+ lv_label_set_text_static (chart_label , "#0000ff Humidity#" );
135+ lv_obj_align (chart_label , LV_ALIGN_TOP_RIGHT , - BSP_LCD_H_RES / 8 , BSP_LCD_V_RES / 32 );
136+ }
137+
138+ static lv_obj_t * imu_bars_new (lv_obj_t * scr , const lv_style_t * style , const uint32_t range )
139+ {
140+ lv_obj_t * bar = lv_bar_create (scr );
141+ lv_bar_set_range (bar , - range , range );
142+ lv_bar_set_mode (bar , LV_BAR_MODE_SYMMETRICAL );
143+ lv_obj_add_style (bar , style , 0 );
144+ return bar ;
145+ }
146+
147+ static void imu_create_axis_label (lv_obj_t * bar , const char * text )
148+ {
149+ lv_obj_t * bar_label ;
150+ bar_label = lv_label_create (lv_obj_get_screen (bar ));
151+ lv_label_set_text_static (bar_label , text );
152+ lv_obj_align_to (bar_label , bar , LV_ALIGN_OUT_LEFT_MID , - BSP_LCD_H_RES / 32 , 0 );
153+ }
154+
155+ static void imu_bars_init (lv_obj_t * scr )
156+ {
157+ lv_obj_t * static_label ;
158+
159+ lv_style_init (& bar_style );
160+ lv_style_set_width (& bar_style , BSP_LCD_H_RES / 3 );
161+ lv_style_set_height (& bar_style , BSP_LCD_V_RES / 16 );
162+
163+ acc_x_bar = imu_bars_new (scr , & bar_style , 15 );
164+ acc_y_bar = imu_bars_new (scr , & bar_style , 15 );
165+ acc_z_bar = imu_bars_new (scr , & bar_style , 15 );
166+ lv_obj_align (acc_z_bar , LV_ALIGN_BOTTOM_LEFT , BSP_LCD_H_RES / 8 , - BSP_LCD_V_RES / 16 );
167+ lv_obj_align_to (acc_y_bar , acc_z_bar , LV_ALIGN_OUT_TOP_MID , 0 , - BSP_LCD_V_RES / 16 );
168+ lv_obj_align_to (acc_x_bar , acc_y_bar , LV_ALIGN_OUT_TOP_MID , 0 , - BSP_LCD_V_RES / 16 );
169+
170+ static_label = lv_label_create (scr );
171+ lv_label_set_text_static (static_label , "Accelerometer" );
172+ lv_obj_align_to (static_label , acc_x_bar , LV_ALIGN_OUT_TOP_MID , 0 , - BSP_LCD_V_RES / 32 );
173+ imu_create_axis_label (acc_x_bar , "X" );
174+ imu_create_axis_label (acc_y_bar , "Y" );
175+ imu_create_axis_label (acc_z_bar , "Z" );
176+
177+ gyr_x_bar = imu_bars_new (scr , & bar_style , 5000 );
178+ gyr_y_bar = imu_bars_new (scr , & bar_style , 5000 );
179+ gyr_z_bar = imu_bars_new (scr , & bar_style , 5000 );
180+ lv_obj_align (gyr_z_bar , LV_ALIGN_BOTTOM_RIGHT , - BSP_LCD_H_RES / 16 , - BSP_LCD_V_RES / 16 );
181+ lv_obj_align_to (gyr_y_bar , gyr_z_bar , LV_ALIGN_OUT_TOP_MID , 0 , - BSP_LCD_V_RES / 16 );
182+ lv_obj_align_to (gyr_x_bar , gyr_y_bar , LV_ALIGN_OUT_TOP_MID , 0 , - BSP_LCD_V_RES / 16 );
183+
184+ static_label = lv_label_create (scr );
185+ lv_label_set_text_static (static_label , "Gyroscope" );
186+ lv_obj_align_to (static_label , gyr_x_bar , LV_ALIGN_OUT_TOP_MID , 0 , - BSP_LCD_V_RES / 32 );
187+ imu_create_axis_label (gyr_x_bar , "X" );
188+ imu_create_axis_label (gyr_y_bar , "Y" );
189+ imu_create_axis_label (gyr_z_bar , "Z" );
190+ }
191+
81192void app_main (void )
82193{
194+ #if BSP_CAPS_DISPLAY
195+ bsp_display_start ();
196+ bsp_display_lock (0 );
197+ lv_obj_t * main_scr = lv_screen_active ();
198+ #if BSP_CAPS_HUMITURE
199+ chart_init (main_scr );
200+ #endif
201+ #if BSP_CAPS_IMU
202+ imu_bars_init (main_scr );
203+ #endif
204+ bsp_display_unlock ();
205+ bsp_display_backlight_on ();
206+ #endif
207+
83208#if BSP_CAPS_IMU
84209 bsp_sensor_config_t imu_config = {
85210 .type = IMU_ID ,
0 commit comments