基于ARM Linux和LVGL的智能宠物投喂系统设计与实现

基于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.TimeWeight(g)StatusActions
108:0030.0EnabledDelete
218:3050.0EnabledDelete

3. 软键盘与输入体验

  • 点击输入框自动弹出软键盘,支持数字和小数点。
  • 输入完成后点击“确认”关闭软键盘。
  • 输入校验:小时0-23,分钟0-59,重量>0且支持小数点后一位。

三、核心技术与关键实现

1. LVGL图形界面设计

  • 主界面与设置界面分别由setup_main_ui()setup_settings_ui()构建。
  • 控件使用:LVGL的lv_labellv_btnlv_tablelv_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.txtCMake工程配置

五、编译环境与运行方法

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美观度,增加动画和多语言支持
  • 增加数据存储与历史记录功能
  • 支持投喂日志上传云端

源码结构清晰,欢迎学习、移植和二次开发!


如有问题或建议,欢迎评论区留言交流!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值