基于ARM Linux和LVGL的智能宠物投喂系统设计与实现(超详细讲解)
一、项目背景与简介
随着智能家居和物联网的发展,宠物智能投喂器成为许多养宠家庭的刚需。本项目基于ARM Linux平台,结合LVGL(Light and Versatile Graphics Library)图形库,设计并实现了一套功能完善、界面友好、可扩展性强的智能宠物投喂系统。
适用人群: 嵌入式开发者、物联网爱好者、学生课程设计、LVGL学习者
二、系统功能与界面交互详解
1. 主界面
- 系统状态显示:实时显示“System Ready”或“Feeding…”等状态。
- 手动投喂:点击“Manual Feed”按钮,立即投喂50克(可扩展为自定义重量)。
- 进入设置:点击“Settings”按钮,跳转到投喂计划管理界面。
主界面布局示意:
| 标题 |
|---|
| 状态显示 |
| [Settings] [Manual Feed] |
2. 设置界面
- 投喂时间表格:显示所有已设置的投喂时间、重量、状态(启用/禁用)、操作。
- 添加投喂时间:点击“Add”弹出对话框,软键盘输入小时、分钟、重量。
- 删除投喂时间:点击表格“Delete”按钮,弹窗确认后删除。
- 返回主界面:点击“Return”按钮返回。
设置界面表格示例:
| No. | Time | Weight(g) | Status | Actions |
|---|---|---|---|---|
| 1 | 08:00 | 30.0 | Enabled | Delete |
| 2 | 18:30 | 50.0 | Enabled | Delete |
3. 软键盘与输入体验
- 点击输入框自动弹出软键盘,支持数字和小数点。
- 输入完成后点击“确认”关闭软键盘。
- 输入校验:小时0-23,分钟0-59,重量>0且支持小数点后一位。
三、核心技术与关键实现
1. LVGL图形界面设计
- 主界面与设置界面分别由
setup_main_ui()和setup_settings_ui()构建。 - 控件使用:LVGL的
lv_label、lv_btn、lv_table、lv_keyboard等。 - 事件绑定:如按钮点击、输入框聚焦、表格点击等,均通过
lv_obj_add_event_cb实现。 - 中文字体支持:通过
init_chinese_font()初始化,保证界面国际化。
关键代码片段:主界面初始化
void setup_main_ui() {
g_main_screen = lv_screen_active();
// 标题
lv_obj_t *title_label = lv_label_create(g_main_screen);
lv_label_set_text(title_label, "Smart Pet Feeder System");
// 状态
g_status_label = lv_label_create(g_main_screen);
lv_label_set_text(g_status_label, "System Ready");
// 设置按钮
lv_obj_t *settings_btn = lv_btn_create(g_main_screen);
lv_obj_add_event_cb(settings_btn, main_to_settings_cb, LV_EVENT_CLICKED, NULL);
// 手动投喂按钮
lv_obj_t *manual_btn = lv_btn_create(g_main_screen);
lv_obj_add_event_cb(manual_btn, manual_feed_cb, LV_EVENT_CLICKED, NULL);
}
2. 投喂计划管理与定时检测
- 数据结构:
typedef struct {
int hour;
int minute;
float weight; // 食物重量(克)
int enabled; // 是否启用
} FeedingTime;
typedef struct {
FeedingTime times[5]; // 最多5个投喂时间
int time_count; // 当前设置的时间数量
int is_feeding; // 是否正在投喂
time_t last_feed_time; // 上次投喂时间
} PetFeederSystem;
- 添加/删除计划:通过
add_feeding_time()和remove_feeding_time()操作结构体数组。 - 定时检测线程:
void *feeding_monitor_thread(void *arg) {
while (1) {
int time_index = check_feeding_time();
if (time_index >= 0) {
float weight = g_feeder_system.times[time_index].weight;
start_feeding(weight);
}
sleep(30); // 每30秒检测一次
}
}
- 手动投喂:
static void manual_feed_cb(lv_event_t *e) {
if (lv_event_get_code(e) == LV_EVENT_CLICKED) {
start_feeding(50.0); // 手动投喂50克
update_main_ui();
}
}
3. 硬件交互与模拟
- 投喂控制:
void start_feeding(float weight) {
if (!g_feeder_system.is_feeding) {
g_feeder_system.is_feeding = 1;
// 这里可扩展为控制电机/舵机
usleep(2000000); // 模拟2秒投喂
g_feeder_system.is_feeding = 0;
}
}
- 可扩展性:可根据实际硬件,替换或补充电机控制代码。
4. 线程与同步
- 主线程负责LVGL事件循环和UI刷新:
while (g_running) {
lv_timer_handler();
usleep(5000); // 5ms
}
- 定时检测线程负责自动投喂。
- 如需多线程安全,可引入
pthread_mutex_t互斥锁保护全局数据。
四、代码结构与模块说明
| 文件/目录 | 作用说明 |
|---|---|
| main.c | 主程序入口,系统初始化、主循环 |
| ui.c / ui.h | 界面构建、事件处理 |
| pet_feeder.c/.h | 投喂计划管理、定时检测、硬件控制 |
| lvgl/ | LVGL图形库源码 |
| CMakeLists.txt | CMake工程配置 |
五、编译环境与运行方法
1. 交叉编译环境配置
- 推荐平台:Ubuntu Linux
- 交叉编译器:
/usr/local/arm-linux/bin/arm-linux-gcc(需提前安装) - LVGL版本:v9.0(已集成在项目中)
2. 编译步骤
cd 4-宠物投喂
cmake .
make
- 编译成功后,主程序位于
bin/main
3. 运行与调试
- 在ARM Linux设备(如开发板)上运行
- 确保
/dev/fb0(帧缓冲)和/dev/input/event0(触摸屏)可用 - 字体文件需放置在项目
bin/目录下,保证中文显示 - 支持Ctrl+C优雅退出,资源自动清理
4. 常见问题与调试建议
- 界面无显示:检查LVGL初始化、帧缓冲设备路径
- 触摸无响应:确认输入设备路径正确,驱动加载正常
- 中文乱码:确认字体文件路径和LVGL字体配置
- 投喂无动作:检查硬件控制代码,或用printf调试
六、项目总结与扩展建议
本项目实现了一个功能完善、界面友好的智能宠物投喂系统,适合嵌入式开发和物联网应用场景。后续可扩展:
- 增加网络远程控制、手机APP联动
- 支持更多传感器(如重量检测、摄像头)
- 优化UI美观度,增加动画和多语言支持
- 增加数据存储与历史记录功能
- 支持投喂日志上传云端
源码结构清晰,欢迎学习、移植和二次开发!
如有问题或建议,欢迎评论区留言交流!

被折叠的 条评论
为什么被折叠?



