【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);           // 让这段时间过去吧
 - }
 
  复制代码
  
 
 |