我把该项目开源到了github:https://github.com/whyovo/ESP32_course_project
以下是readme文档:
ESP32 课设
项目概述
这是一个基于ESP32的课设,实现了多种功能模式的集成,包括信息显示、图片展示、MQTT通信、摩尔斯电码处理以及MPU6050姿态传感。该项目作为电子系统设计课程的实践项目,展示了ESP32在物联网应用中的多种功能实现。
课程设计要求
必做功能(满分80分)
- ✅ 1个按键输入(GPIO9)
- ✅ 1个LED输出(GPIO8)
- ✅ 液晶屏显示自己的照片(预存在开发板)
- ✅ WLAN连接到MQTT服务器,注册账户并可以收发消息
- ✅ 液晶屏显示英文字符串(由MQTT服务器下发)
- ✅ 单一程序运行时具备上述功能,不需要切换程序
选做功能(20分)
- ✅ 3个人一组,可以通过MQTT互相收发消息(使用统一主题,可通过消息前缀识别发送者)
- ✅ 支持更多传感器输入和数据上传(集成MPU6050加速度计与陀螺仪)
- ✅ 按键输入支持摩尔斯电码(短按输入"点",长按输入"划")
硬件要求
- ESP32开发板
- ST7789/ST7735 LCD显示屏 (128x160分辨率)
- MPU6050传感器 (加速度计和陀螺仪)
硬件连接
LCD屏幕连接
- SCL: GPIO5
- SDA: GPIO4
- RES: GPIO0
- DC: GPIO3
- CS: GPIO1
- BL: GPIO2
MPU6050连接
- SCL: GPIO8
- SDA: GPIO10
软件要求
- ESP-IDF v5.x 或更高版本
- 下列必要的ESP-IDF组件:
- WiFi
- MQTT
- I2C
- SPI
- LCD
- FreeRTOS
功能模式
该项目包含以下功能模式,可通过双击按钮切换:
- 欢迎界面模式:显示个人和课程信息
- 照片模式:显示预加载的图片,可通过短按控制LED开关
- MQTT模式:连接MQTT服务器,发送和接收消息
- 摩尔斯电码模式:通过按钮输入摩尔斯电码,实时解码并显示
- MPU6050模式:显示并发送加速度计和陀螺仪数据到MQTT服务器
操作指南
基本操作
- 短按按钮:根据当前模式执行不同操作
- 长按按钮:根据当前模式执行辅助操作
- 双击按钮:切换到下一个功能模式
各模式操作详情
欢迎界面模式
- 短按:刷新个人信息
- 长按:显示设备详情
照片模式
- 短按:切换LED状态
- 长按:显示LED状态信息
MQTT模式
- 短按:发送预设消息
- 长按:显示MQTT连接详情
摩尔斯电码模式
- 短按:输入"点"(.)
- 长按:输入"划"(-)
- 系统会自动解码输入的摩尔斯电码
- 输入6个连续点(…) 将通过MQTT发送当前解码结果
MPU6050模式
- 短按:刷新传感器数据
- 长按:通过MQTT发送传感器数据
- 自动每0.5秒发送一次数据到MQTT服务器
详细配置指南
WiFi和MQTT配置
在mqtt.h
文件中需要配置以下参数:
// WiFi配置
#define WIFI_SSID "您的WiFi名称"
#define WIFI_PASSWORD "您的WiFi密码"
// MQTT配置
#define MQTT_BROKER_URL "mqtt://您的MQTT服务器地址:端口"
#define MQTT_USERNAME "您的用户名"
#define MQTT_PASSWORD "您的密码"
#define MQTT_CLIENT_ID "ESP32_客户端ID"
#define MQTT_TOPIC "您的订阅主题"
#define MQTT_PUBLISH_TOPIC "您的发布主题"
屏幕显示修改
修改欢迎界面和个人信息
在main.c
文件中可以修改欢迎界面显示的个人信息。找到以下代码段并修改为您的信息:
// 显示初始欢迎界面
clear_text_area(lcd_buffer, LCD_H_RES, LCD_V_RES);
draw_string(lcd_buffer, 0, 0, "姓名", 0xFFFF, LCD_H_RES); // 修改为您的姓名
draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT + 2, "班级", 0xFFFF, LCD_H_RES); // 修改为您的班级
draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 2 + 4, "学号", 0xFFFF, LCD_H_RES); // 修改为您的学号
draw_string(lcd_buffer, 0, CHINESE_FONT_HEIGHT * 3 + 6, "电子系统设计2", 0xFFFF, LCD_H_RES);
esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, LCD_H_RES, LCD_V_RES, lcd_buffer);
修改MQTT发送的消息内容
在MQTT模式下默认发送的消息可在以下位置修改:
// MQTT模式下短按发送消息
char message[50];
strcpy(message, "wyh_esp32"); // 修改为您的标识信息
添加汉字库
汉字库在font_chinese.h
和font_chinese.c
文件中定义。要添加新的汉字,请按照以下步骤操作:
- 在
font_chinese.h
文件中添加新汉字的点阵数据:
static const uint8_t char_新汉字名[] = {
// 这里是16x16点阵数据,每行2个字节,共16行(总共32字节)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
- 在
chinese_chars
数组中添加新汉字的Unicode编码和点阵数据映射:
static const chinese_char_t chinese_chars[] = {
// ...现有汉字定义...
{0x新汉字Unicode, char_新汉字名}, // 新汉字的Unicode和数据
};
替换图片
要替换显示的照片,需要修改wyh_pic.c
文件中的图片数据:
- 准备一张适合LCD分辨率的图片
- 使用图片转换工具(如LCD Image Converter)将图片转换为适合的RGB565格式
- 将生成的数据替换到
wyh_pic.c
文件中的gImage_wyh_pic
数组 - 修改分辨率的宏定义,现在是128x128
// 图片数据示例格式
const unsigned char gImage_wyh_pic[32768] = {
0xFF, 0xFF, 0xFF, 0xFF, ... // 这里是图片的16位RGB565格式数据
};
MPU6050传感器配置
如果需要修改MPU6050的连接引脚,可在mpu6050.c
文件中修改以下定义:
#define I2C_MASTER_SCL_IO 8 // SCL引脚,默认GPIO8
#define I2C_MASTER_SDA_IO 10 // SDA引脚,默认GPIO10
摩尔斯电码配置
摩尔斯电码模块的超时时间和缓冲区大小可在morse.c
文件中调整:
#define MORSE_CHAR_TIMEOUT 2000 // 字符超时时间(毫秒)
#define MORSE_MAX_BUFFER 32 // 最大缓冲区大小
按钮配置
如需调整按钮的长按时间、双击检测时间等参数,可在button.c
文件中修改:
#define BUTTON_LONG_PRESS_TIME 750 // 长按阈值(毫秒)
#define BUTTON_DOUBLE_CLICK_TIME 300 // 双击的有效时间窗口(毫秒)
#define BUTTON_DEBOUNCE_TIME 20 // 消抖时间(毫秒)
添加支持的传感器
如需添加新的传感器支持,建议参考MPU6050的实现方式,主要步骤:
- 创建传感器相关的
.h
和.c
文件 - 在
general.h
中包含新传感器的头文件 - 在
main.c
中添加传感器初始化与数据读取代码 - 添加新的显示模式用于展示传感器数据
注意:添加新模式需要修改app_mode_t
枚举类型并增加相应的处理逻辑。
项目结构
ESP32_course_project/
├── main/
│ ├── main.c # 主程序入口
│ ├── general.h # 通用头文件
│ ├── button.c/h # 按钮处理
│ ├── led.c/h # LED控制
│ ├── lcd.c/h # LCD显示屏控制
│ ├── mqtt.c/h # MQTT通信
│ ├── morse.c/h # 摩尔斯电码处理
│ ├── mpu6050.c/h # MPU6050传感器控制
│ ├── font_chinese.c/h # 中文字体支持
│ └── wyh_pic.c/h # 图片数据
├── CMakeLists.txt # CMake构建配置
└── README.md # 项目说明文档
编译与烧录
- 安装ESP-IDF环境
- 配置项目:
idf.py menuconfig
- 编译项目:
idf.py build
- 连接ESP32,并烧录:
idf.py -p [端口] flash
- 监视输出:
idf.py -p [端口] monitor
故障排除
- 屏幕无显示:检查LCD连接,特别是SPI引脚连接
- WiFi无法连接:确认WiFi凭据正确,ESP32在WiFi覆盖范围内
- MQTT连接失败:检查MQTT配置和服务器状态
- MPU6050没有数据:检查I2C连接,确认地址设置正确
注意事项
- 首次使用前,请确保正确配置WiFi和MQTT参数
- 确保MPU6050连接正确,否则可能导致I2C通信错误
- 修改图片数据需要重新编译整个项目