【ElfBoard】基于 Linux 的智能家居小项目——开源

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【ElfBoard】基于 Linux 的智能家居小项目——开源

大家好,我是 Hello 阿尔法,这段时间参与了保定飞凌嵌入式技术有限公司举办的 ElfBoard 共创社招募活动,并有幸成为了一名共创官,官方寄来了一块 ELF 1 开发板,开箱看这里 ELF 1 开箱初体验。


作为共创官,我使用 ELF 1 完成了一个智能家居的小项目。除了 ELF 1 开发板之外,还使用了一块其他厂商的 Linux 开发板 IMX6U,主要原因是在多次抽奖活动中都没有抽中 Elfboard 的官方显示屏,只有我的 IMX6U 有屏幕。


其实这样也正好符合智能家居的项目背景,带有屏幕的 IMX6U 作为智能家居的主控面板,ELF 1 作为被控终端设备,它可以是电灯、电扇、空调器,也可以是冰箱、彩电、洗衣机……实现效果如下图所示:

项目简介

IMX6U 开发板模拟智能家居中的主控面板,GUI 设计采用开源的 LVGL,实时刷新显示时间、天气、室内空气质量、温湿度等信息,实现对家居设备电灯、窗帘、通风扇的控制,天气数据来自于心知天气,使用 cJSON 对天气数据进行解析。


ELF 1 开发板模拟终端设备,三个 LED 分别代表电灯、窗帘、通风扇,电位器(ADC)模拟室内空气质量检测器,温湿度传感器则用来检测环境中的温湿度。


IMX6U 和 ELF 1 两者通过以太网实现数据交互,均基于 Linux 系统开发,两个开发板的资源使用情况总体如下所示:


IMX6U 开发板:5inch RGB 800×480 显示屏、以太网口

ELF 1 开发板:3 个 LED、电位器(ADC)、温湿度传感器、以太网口

仓库简介

本仓库开源了 IMX6U 的工程源码,它以 LVGL 的 Linux 移植工程 lvgl_demo 为基础。

工程源码结构如下所示:

lvgl_demo
├── app                # 应用源码
|    ├── cJSON         # cJSON 解析器
|    ├── protocol      # 自定义通信协议
|    ├── socket        # socket 源码
|    ├── application.c # 主要应用
|    ├── button.c      # 按键应用
|    ├── def.h         # 一些定义
|    └── weather.c     # 天气应用
├── lv_drivers         # LVGL 驱动源码
├── lvgl               # LVGL 源码
├── ui                 # UI 设计源码
├── lv_conf.h          # LVGL 库配置文件
├── lv_drv_conf.h      # LVGL 驱动配置文件
├── main.c             # main.c 文件
├── Makefile           # Makefile 文件
└── README.md          # README 文件


关于 LVGL 的 Linux 移植可以参考阅读 嵌入式 Linux 下的 LVGL 移植。


关于 UI 设计可以参考阅读 基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面。


数据交互

IMX6U 和 ELF 1 数据交互通过 socket 接口实现,基于 TCP 协议。

IMX6U 创建服务端及接受 ELF 1 客户端连接实现如下所示:

// 创建服务端
server_fd = server_init_socket();
// 接受客户端连接
client_fd = server_accept_client(server_fd);


相关源码实现在 socket 文件夹中,可以参考阅读:

  • Linux 下 socket 编程介绍
  • Linux 下使用 socket 实现 TCP 服务端
  • Linux 下使用 socket 实现 TCP 客户端


通信协议

通信协议采用了一个简洁实用的基于字节的自定义兼容性通信协议 Protocol。

开源仓库地址:https://github.com/alphazcc/protocol

以按键控制 LED 为例,实现数据打包、发送功能如下所示:

static void led_ryg_turn(int cmd, int code)
{
    msg_frame_t led_msg_frame;
    led_msg_frame.type = LED_RYG;
    led_msg_frame.cmd = cmd;
    led_msg_frame.code = code;
    led_msg_frame.datalen = 0;
    msg_buf_t *_msg_buf = pkg_frame(&led_msg_frame);
    server_send_data(client_fd, (char *)_msg_buf->buf_ptr, _msg_buf->buf_size);
}


以接收室内空气质量数据(ADC 数据)为例,关于数据接收、解析功能如下所示:

static int ctrl_dev_adc(msg_frame_t *_msg_pack)
{
    // 获取 ADC 原始数据
    uint16_t adc_raw = (uint16_t)(_msg_pack->data[0] << 8) + _msg_pack->data[1];
    // 更新显示等...
    return 0;
}

static int ctrl_cmd_func(const msg_pkg_t *_msg_pkg)
{
    switch(_msg_pkg->pkg->type)
    {
        case ADC: ctrl_dev_adc(_msg_pkg->pkg); break;
        // 其他设备等...
    }
    return 0; 
}

static void *recv_thread(void *arg)
{
    while(1)
    {
        if(server_receive_data(client_fd, (char *)recv_msg_buf->buf_ptr,
                                (ssize_t *)&recv_msg_buf->buf_size) == 0)
        {
            msg_pkg_t *_msg_pkg = 
                    unpkg_frame(recv_msg_buf->buf_ptr, recv_msg_buf->buf_size);
            ctrl_cmd_func(_msg_pkg);
        } 
    }
    return NULL;
}

/* 数据接收线程创建 */
pthread_create(&recv_thread_id, NULL, recv_thread, NULL);

天气获取

天气数据由心知天气提供,心知天气通过标准的 Restful API 接口,提供标准化的数据访问,无论是 APP、智能硬件还是企业级系统都可以轻松接入心知的精细化天气数据。


在心知天气注册、登录,申请免费版即可满足使用要求,获取 API KEY。

心知天气官网:https://www.seniverse.com

通过创建本地客户端,向心知天气服务端发送请求包,即可获取天气数据。

实现天气数据获取、解析、UI 更新等功能流程如下所示:

int weather_init(void)
{
    /* 创建客户端 */
    client_fd = client_init_socket();
    /* 组合请求包 */
    sprintf(buffer, REQUEST_PKG, DAILY, API_KEY, WUHAN);
    /* 向心知天气服务端发送请求 */
    client_send_data(client_fd, buffer, strlen(buffer));
    /* 清空缓存准备接收天气数据 */
    memset(buffer, 0, sizeof(buffer));
    /* 接收天气数据 JSON 格式 */
    client_receive_data(client_fd, buffer, &json_size);
    /* 解析天气数据到 weather_daily 中 */
    cJSON_Parse_Weather_Daily(buffer, &weather_daily);
    /* 打印天气信息 */
    weather_show_data(&weather_daily);
    /* 更新天气显示 */
    weather_update_ui(&weather_daily);
    /* 关闭客户端 */
    client_close_socket(client_fd);
    return 0;
}


关于对 JSON 格式的天气数据解析,使用了一个开源的、C 语言编写的超轻量级 JSON 解析器 cJSON。

开源仓库地址:https://github.com/DaveGamble/cJSON

写在后面

文中源码为便于阅读进行了格式修改及源码简化,旨在说明功能实现逻辑及方式,建议下载仓库完整源码分析阅读。


ELF 1 开发板数据采集采用文件操作方式实现,关于客户端创建、数据打包、发送、接收、解析等功能实现与 IMX6U 相关功能实现类似,便不开源了,小伙伴们可以自行设计。

本项目并不难,项目内容更多倾向于 Linux 应用开发,欢迎小伙伴们复现!


开源仓库链接:https://github.com/alphazcc/mini-project

项目演示

  • 抖音视频链接
  • 哔哩哔哩视频链接

更多内容

  • CSDN博客:@Hello阿尔法
  • 哔哩哔哩:@Hello阿尔法
  • 知乎:@Hello阿尔法


相关文章
|
12天前
|
人工智能 分布式计算 大数据
Linux操作系统:开源力量的崛起与影响###
一场技术革命的火种,如何燎原? 本文将带您深入探索Linux操作系统的诞生背景、核心特性及其对现代科技世界的深远影响。从1991年芬兰学生Linus Torvalds的一个小众项目,到如今成为支撑全球无数服务器、超级计算机及物联网设备的基石,Linux的发展既是一部技术创新史,也是开源文化胜利的见证。通过剖析其设计哲学、安全性、灵活性等关键优势,结合实例展示Linux在云计算、大数据处理等领域的广泛应用,本文旨在揭示Linux为何能在众多操作系统中脱颖而出,以及它如何塑造了我们今天的数字生活。 ###
|
3天前
|
边缘计算 人工智能 运维
Linux操作系统:开源力量的崛起与影响###
一场技术革命的回顾 回溯至1991年,当Linus Torvalds宣布Linux操作系统的诞生时,世界或许并未意识到这一举措将如何深刻地改变技术领域的面貌。本文旨在探讨Linux操作系统的发展历程、核心特性、以及它如何引领了一场开源运动,重塑了软件行业的生态。从最初的个人爱好项目成长为全球最广泛采用的服务器操作系统之一,Linux的故事是技术创新与社区精神共同推动下的辉煌篇章。 ###
|
28天前
|
存储 关系型数据库 Linux
2024 年 16 个适用于 Linux 的开源云存储软件 (上)
2024 年 16 个适用于 Linux 的开源云存储软件 (上)
43 2
2024 年 16 个适用于 Linux 的开源云存储软件 (上)
|
30天前
|
存储 数据可视化 Java
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!
如何在Linux系统下部署和运行Java项目jar包,包括传输文件到Linux、使用nohup命令运行jar包、查看端口状态、杀死进程和查看项目运行状态,以及如何解决“没有主清单属性”的错误。
253 1
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!
|
10天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
104 2
|
21天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
191 3
|
22天前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
36 1
|
23天前
|
存储 安全 Unix
2024 年 16 个适用于 Linux 的开源云存储软件 (下)
2024 年 16 个适用于 Linux 的开源云存储软件 (下)
34 0
2024 年 16 个适用于 Linux 的开源云存储软件 (下)
|
30天前
|
前端开发 JavaScript 应用服务中间件
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
本文是一篇详细的教程,介绍了如何在Linux系统上安装和配置nginx,以及如何将打包好的前端项目(如Vue或React)上传和部署到服务器上,包括了常见的错误处理方法。
111 0
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
|
21天前
|
Web App开发 运维 安全
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
1Panel:一个现代化、开源的 Linux 服务器运维管理面板