【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十八:ESP32开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
项目实验之二十二:带 LVGL 的 ESP32 CYD:使用 DS18B20 传感器显示温度(曲面仪表)
实验开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验二百三十八:ESP32开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
- 项目实验之二十二:带 LVGL 的 ESP32 CYD:使用 DS18B20 传感器显示温度(曲面仪表)
- */
-
- // 包含LVGL库
- #include <lvgl.h>
-
- // 安装“TFT_eSPI”库来与TFT显示屏接口 - https://github.com/Bodmer/TFT_eSPI - 重要:网上的User_Setup.h可能无法与Random Nerd Tutorials的示例配合使用
- #include <TFT_eSPI.h>
-
- // 安装OneWire和DallasTemperature库
- #include <OneWire.h>
- #include <DallasTemperature.h>
-
- // DS18B20传感器连接到的GPIO
- const int oneWireBus = 27;
-
- // 设置一个OneWire实例与任何OneWire设备通信
- OneWire oneWire(oneWireBus);
-
- // 将OneWire引用传递给Dallas Temperature传感器
- DallasTemperature sensors(&oneWire);
-
- // 设置变量为0表示华氏温度
- #define TEMP_CELSIUS 1
-
- #if TEMP_CELSIUS
- #define TEMP_ARC_MIN -20
- #define TEMP_ARC_MAX 40
- #else
- #define TEMP_ARC_MIN -4
- #define TEMP_ARC_MAX 104
- #endif
-
- #define SCREEN_WIDTH 240
- #define SCREEN_HEIGHT 320
-
- #define DRAW_BUF_SIZE (SCREEN_WIDTH * SCREEN_HEIGHT / 10 * (LV_COLOR_DEPTH / 8))
- uint32_t draw_buf[DRAW_BUF_SIZE / 4];
-
- // 如果启用日志,它将通知用户库中发生了什么
- void log_print(lv_log_level_t level, const char* buf) {
- LV_UNUSED(level);
- Serial.println(buf);
- Serial.flush();
- }
-
- lv_obj_t* arc;
-
- // 在弧形图和文本标签中设置温度值
- static void set_temp(void* text_label_temp_value, int32_t v) {
- sensors.requestTemperatures();
- // 获取最新的温度读数(摄氏度或华氏度)
- #if TEMP_CELSIUS
- float ds18b20_temp = sensors.getTempCByIndex(0);
- if (ds18b20_temp <= 10.0) {
- lv_obj_set_style_text_color((lv_obj_t*)text_label_temp_value, lv_palette_main(LV_PALETTE_BLUE), 0);
- } else if (ds18b20_temp > 10.0 && ds18b20_temp <= 29.0) {
- lv_obj_set_style_text_color((lv_obj_t*)text_label_temp_value, lv_palette_main(LV_PALETTE_GREEN), 0);
- } else {
- lv_obj_set_style_text_color((lv_obj_t*)text_label_temp_value, lv_palette_main(LV_PALETTE_RED), 0);
- }
- const char degree_symbol[] = "\u00B0C";
- #else
- float ds18b20_temp = sensors.getTempFByIndex(0);
- if (ds18b20_temp <= 50.0) {
- lv_obj_set_style_text_color((lv_obj_t*)text_label_temp_value, lv_palette_main(LV_PALETTE_BLUE), 0);
- } else if (ds18b20_temp > 50.0 && ds18b20_temp <= 84.2) {
- lv_obj_set_style_text_color((lv_obj_t*)text_label_temp_value, lv_palette_main(LV_PALETTE_GREEN), 0);
- } else {
- lv_obj_set_style_text_color((lv_obj_t*)text_label_temp_value, lv_palette_main(LV_PALETTE_RED), 0);
- }
- const char degree_symbol[] = "\u00B0F";
- #endif
-
- lv_arc_set_value(arc, map(int(ds18b20_temp), TEMP_ARC_MIN, TEMP_ARC_MAX, 0, 100));
-
- String ds18b20_temp_text = String(ds18b20_temp) + degree_symbol;
- lv_label_set_text((lv_obj_t*)text_label_temp_value, ds18b20_temp_text.c_str());
- Serial.print("Temperature: ");
- Serial.println(ds18b20_temp_text);
- }
-
- void lv_create_main_gui(void) {
- // 创建一个弧形图
- arc = lv_arc_create(lv_screen_active());
- lv_obj_set_size(arc, 210, 210);
- lv_arc_set_rotation(arc, 135);
- lv_arc_set_bg_angles(arc, 0, 270);
- lv_obj_set_style_arc_color(arc, lv_color_hex(0x666666), LV_PART_INDICATOR);
- lv_obj_set_style_bg_color(arc, lv_color_hex(0x333333), LV_PART_KNOB);
- lv_obj_align(arc, LV_ALIGN_CENTER, 0, 10);
-
- // 创建一个字体大小为32的文本标签来显示最新的温度读数
- lv_obj_t* text_label_temp_value = lv_label_create(lv_screen_active());
- lv_label_set_text(text_label_temp_value, "--.--");
- lv_obj_align(text_label_temp_value, LV_ALIGN_CENTER, 0, 10);
- static lv_style_t style_temp;
- lv_style_init(&style_temp);
- lv_style_set_text_font(&style_temp, &lv_font_montserrat_32);
- lv_obj_add_style(text_label_temp_value, &style_temp, 0);
-
- // 创建一个动画,每10秒更新一次最新的温度值
- lv_anim_t a_temp;
- lv_anim_init(&a_temp);
- lv_anim_set_exec_cb(&a_temp, set_temp);
- lv_anim_set_duration(&a_temp, 1000000);
- lv_anim_set_playback_duration(&a_temp, 1000000);
- lv_anim_set_var(&a_temp, text_label_temp_value);
- lv_anim_set_values(&a_temp, 0, 100);
- lv_anim_set_repeat_count(&a_temp, LV_ANIM_REPEAT_INFINITE);
- lv_anim_start(&a_temp);
- }
-
- void setup() {
- String LVGL_Arduino = String("LVGL Library Version: ") + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
- Serial.begin(115200);
- Serial.println(LVGL_Arduino);
-
- // 启动DS18B20传感器
- sensors.begin();
-
- // 启动LVGL
- lv_init();
- // 注册打印函数用于调试
- lv_log_register_print_cb(log_print);
-
- // 创建显示对象
- lv_display_t* disp;
- // 使用TFT_eSPI库初始化TFT显示屏
- disp = lv_tft_espi_create(SCREEN_WIDTH, SCREEN_HEIGHT, draw_buf, sizeof(draw_buf));
- lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_270);
-
- // 绘制GUI
- lv_create_main_gui();
- }
-
- void loop() {
- lv_task_handler(); // 让GUI完成它的工作
- lv_tick_inc(5); // 告诉LVGL已经过去了多长时间
- delay(5); // 让这段时间过去吧
- }
复制代码
|