| #include <stdio.h> |
| #include "pico/stdlib.h" |
| #include "hardware/adc.h" |
| #include "hardware/pio.h" |
| #include "aht10.h" |
| #include "pico_lvgl.h" |
| |
| #define GP2Y10_ILED_PIN 18 |
| #define GP2Y10_VOUT_PIN 26 |
| #define AHT10_I2C_PORT i2c0 |
| #define AHT10_SDA_PIN 16 |
| #define AHT10_SCL_PIN 17 |
| |
| PIO TFT_PIO = pio1; |
| #define TFT_SM 1 |
| #define TFT_SDI_GPIO 9 |
| #define TFT_CSX_DCX_SCK_GPIO 6 |
| |
| |
| const float conversion_factor = 3.3f / (1 << 12); |
| |
| lv_obj_t *humi_label, *temp_label, *ug_label, *dusk_meter, *avg_1h_label, |
| *avg_6h_label, *max_last_hour_label; |
| lv_obj_t *humi_bar, *temp_bar; |
| lv_meter_indicator_t * indic; |
| |
| |
| void lgvl_ui() { |
| |
| dusk_meter = lv_meter_create(lv_scr_act()); |
| lv_obj_align(dusk_meter, LV_ALIGN_TOP_MID, 0, 10); |
| lv_obj_set_size(dusk_meter, 200, 200); |
| |
| |
| lv_meter_scale_t * scale = lv_meter_add_scale(dusk_meter); |
| lv_meter_set_scale_ticks(dusk_meter, scale, 70, 2, 5, lv_palette_main(LV_PALETTE_GREY)); |
| lv_meter_set_scale_major_ticks(dusk_meter, scale, 10, 4, 15, lv_color_black(), 10); |
| |
| |
| |
| |
| indic = lv_meter_add_arc(dusk_meter, scale, 3, lv_palette_main(LV_PALETTE_GREEN), 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 0); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 50); |
| |
| |
| indic = lv_meter_add_scale_lines(dusk_meter, scale, lv_palette_main(LV_PALETTE_GREEN), lv_palette_main(LV_PALETTE_GREEN), |
| false, 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 0); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 50); |
| |
| |
| indic = lv_meter_add_arc(dusk_meter, scale, 3, lv_palette_main(LV_PALETTE_YELLOW), 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 51); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 100); |
| |
| |
| indic = lv_meter_add_scale_lines(dusk_meter, scale, lv_palette_main(LV_PALETTE_YELLOW), lv_palette_main(LV_PALETTE_YELLOW), |
| false, 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 51); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 100); |
| |
| |
| |
| indic = lv_meter_add_arc(dusk_meter, scale, 3, lv_palette_main(LV_PALETTE_ORANGE), 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 101); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 150); |
| |
| |
| indic = lv_meter_add_scale_lines(dusk_meter, scale, lv_palette_main(LV_PALETTE_ORANGE), lv_palette_main(LV_PALETTE_ORANGE), |
| false, 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 101); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 150); |
| |
| |
| |
| |
| indic = lv_meter_add_arc(dusk_meter, scale, 3, lv_palette_main(LV_PALETTE_RED), 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 151); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 200); |
| |
| |
| indic = lv_meter_add_scale_lines(dusk_meter, scale, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false, |
| 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 151); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 200); |
| |
| |
| |
| indic = lv_meter_add_arc(dusk_meter, scale, 3, lv_palette_main(LV_PALETTE_PURPLE), 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 201); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 350); |
| |
| |
| indic = lv_meter_add_scale_lines(dusk_meter, scale, lv_palette_main(LV_PALETTE_PURPLE), lv_palette_main(LV_PALETTE_PURPLE), |
| false, 0); |
| lv_meter_set_indicator_start_value(dusk_meter, indic, 201); |
| lv_meter_set_indicator_end_value(dusk_meter, indic, 350); |
| |
| |
| indic = lv_meter_add_needle_line(dusk_meter, scale, 4, lv_palette_main(LV_PALETTE_GREY), -10); |
| lv_meter_set_scale_range(dusk_meter, scale, 0, 350, 270, 135); |
| |
| |
| avg_1h_label = lv_label_create(lv_scr_act()); |
| avg_6h_label = lv_label_create(lv_scr_act()); |
| max_last_hour_label = lv_label_create(lv_scr_act()); |
| lv_obj_align(avg_1h_label, LV_ALIGN_TOP_LEFT, 5,190); |
| lv_obj_align(avg_6h_label, LV_ALIGN_TOP_RIGHT, -5,190); |
| lv_obj_align(max_last_hour_label, LV_ALIGN_TOP_LEFT, 5,5); |
| lv_obj_set_style_text_color(avg_1h_label, lv_palette_main(LV_PALETTE_BLUE), 0); |
| lv_obj_set_style_text_color(avg_6h_label, lv_palette_main(LV_PALETTE_BLUE), 0); |
| lv_obj_set_style_text_color(max_last_hour_label, lv_palette_main(LV_PALETTE_RED), 0); |
| lv_label_set_text(avg_1h_label, "Avg(1 Hour)\n-.- ug/m3"); |
| lv_label_set_text(avg_6h_label, "Avg(6 Hours)\n-.- ug/m3"); |
| lv_label_set_text(max_last_hour_label, "Max(Last Hour)\n-.- ug/m3"); |
| |
| humi_bar = lv_bar_create(lv_scr_act()); |
| lv_obj_set_size(humi_bar, 20, 150); |
| lv_obj_align(humi_bar, LV_ALIGN_BOTTOM_LEFT, 80, -40); |
| lv_bar_set_value(humi_bar, 0, LV_ANIM_ON); |
| lv_bar_set_range(humi_bar, 0, 100); |
| |
| temp_bar = lv_bar_create(lv_scr_act()); |
| lv_obj_set_size(temp_bar, 20, 150); |
| lv_obj_align(temp_bar, LV_ALIGN_BOTTOM_RIGHT, -80, -40); |
| lv_bar_set_value(temp_bar, 0, LV_ANIM_ON); |
| lv_bar_set_range(temp_bar, -10, 70); |
| lv_obj_t *tl = lv_label_create(lv_scr_act()); |
| lv_label_set_text(tl, "Humidity"); |
| lv_obj_align_to(tl, humi_bar, LV_ALIGN_OUT_TOP_MID, 0, -10); |
| tl = lv_label_create(lv_scr_act()); |
| lv_label_set_text(tl, "Temperature"); |
| lv_obj_align_to(tl, temp_bar, LV_ALIGN_OUT_TOP_MID, 0, -10); |
| |
| humi_label = lv_label_create(lv_scr_act()); |
| temp_label = lv_label_create(lv_scr_act()); |
| ug_label = lv_label_create(lv_scr_act()); |
| |
| |
| |
| |
| lv_obj_align(ug_label, LV_ALIGN_TOP_MID, 0, 170); |
| lv_obj_align_to(humi_label, humi_bar, LV_ALIGN_OUT_BOTTOM_MID, 0, 5); |
| lv_obj_align_to(temp_label, temp_bar, LV_ALIGN_OUT_BOTTOM_MID, 0, 5); |
| |
| |
| } |
| |
| int main() |
| { |
| stdio_init_all(); |
| |
| pico_lvgl_tft_init(TFT_PIO, TFT_SM, TFT_SDI_GPIO, TFT_CSX_DCX_SCK_GPIO); |
| |
| |
| pico_lvgl_display_init(5); |
| |
| |
| lgvl_ui(); |
| |
| |
| |
| gpio_init(GP2Y10_ILED_PIN); |
| gpio_set_dir(GP2Y10_ILED_PIN, true); |
| |
| adc_init(); |
| adc_gpio_init(GP2Y10_VOUT_PIN); |
| adc_select_input(0); |
| |
| aht10_init(AHT10_I2C_PORT, AHT10_SDA_PIN, AHT10_SCL_PIN); |
| |
| uint16_t value, index_1h=0, index_6h=0; |
| float ug, humidity, temperature, ug_avg_six_hours=0, ug_avg_one_hour=0; |
| uint8_t buff[200]; |
| static float one_hour_ug[3600]; |
| static float six_hours_ug[6]; |
| static float max_last_hour = 0; |
| while (true) { |
| |
| gpio_put(GP2Y10_ILED_PIN, false); |
| sleep_us(280); |
| value = adc_read(); |
| sleep_us(40); |
| gpio_put(GP2Y10_ILED_PIN, true); |
| sleep_us(9680); |
| ug = (((0.172 * value*conversion_factor) - 0.1) * 1000); |
| |
| |
| printf("adcvalue:%d, \tv:%.2f\t ug:.%.2f\n", value, value*conversion_factor,ug); |
| |
| aht10_trigger_measurement(&humidity, &temperature); |
| printf("humidity:%.2f %%, \ttemperature:%.2fC\n\n", humidity, temperature); |
| sprintf(buff, "\t%3.0f ug/m3", ug<0?0:ug); |
| lv_label_set_text(ug_label, buff); |
| sprintf(buff, "%2.1f \xC2\xB0" "C", temperature); |
| lv_label_set_text(temp_label, buff); |
| |
| sprintf(buff, "%2.1f%%", humidity); |
| lv_label_set_text(humi_label, buff); |
| |
| lv_meter_set_indicator_value(dusk_meter, indic, (int)(ug)); |
| lv_bar_set_value(humi_bar, humidity, LV_ANIM_ON); |
| lv_bar_set_value(temp_bar, temperature, LV_ANIM_ON); |
| one_hour_ug[index_1h] = ug; |
| if (++index_1h == 3600) { |
| index_1h = 0; |
| } |
| if ((index_1h) % 60 == 0) { |
| for (int i = 0; i < 3600; i++) { |
| ug_avg_one_hour += one_hour_ug[i]; |
| } |
| ug_avg_one_hour /= 3600; |
| |
| sprintf(buff, "Avg(1 Hour)\n%3.1f ug/m3", ug_avg_one_hour); |
| lv_label_set_text(avg_1h_label, buff); |
| } |
| if(index_1h == 0) { |
| six_hours_ug[index_6h++] = ug_avg_one_hour; |
| if (index_6h == 6) { |
| index_6h = 0; |
| } |
| for (int i =0; i < 6; i++) { |
| ug_avg_six_hours += six_hours_ug[i]; |
| } |
| ug_avg_six_hours = ug_avg_six_hours / 6; |
| |
| sprintf(buff, "Avg(6 Hours)\n%3.1f ug/m3", ug_avg_six_hours); |
| lv_label_set_text(avg_6h_label, buff); |
| } |
| max_last_hour = 0; |
| for (int i = 0; i < 3600; i++) { |
| if (one_hour_ug[i] > max_last_hour) max_last_hour = one_hour_ug[i]; |
| } |
| sprintf(buff, "Max(Last Hour)\n%3.1f ug/m3", max_last_hour); |
| lv_label_set_text(max_last_hour_label, buff); |
| |
| lv_timer_handler(); |
| sleep_ms(1000); |
| |
| } |
| } |