当前位置: 首页 > news >正文

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

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

作为共创官,我使用 ELF 1 完成了一个智能家居的小项目。除了 ELF 1 开发板之外,还使用了一块其他厂商的 Linux 开发板 IMX6U,主要原因是在多次抽奖中都没有抽中显示屏,只有我的 IMX6U 有屏幕,其实这样也正好符合项目背景,带有屏幕的 IMX6U 作为智能家居的控制面板,ELF 1 作为被控终端设备,它可以是电灯、电扇、空调器,也可以是冰箱、彩电、洗衣机……实现效果如下图所示:

项目简介

IMX6U 模拟智能家居中的主控面板,实时刷新显示时间、天气、空气质量、温湿度等信息,实现对家居设备电灯、窗帘、通风扇的控制,天气数据来自于心知天气;ELF 1 模拟终端设备,三个 LED 分别代表电灯、窗帘、通风扇,ADC 模拟空气质量检测器,温湿度则用来检测环境中的温湿度。IMX6U 和 ELF 1 两者通过以太网实现交互,ELF 1 和 IMX6U 均基于 Linux 系统开发,资源使用情况如下所示:

  • ELF 1 开发板:3 个 LED、ADC、温湿度传感器、以太网口
  • IMX6U 开发板:5inch RGB 显示屏、以太网口

IMX6U 工程

  • IMX6U 源码工程结构如图所示:

  • IMX6U 源码工程以 LVGL 的 Linux 移植工程为基础,具体实现请阅读 嵌入式 Linux 下的 LVGL 移植;
  • app 文件夹存放应用源码;
  • build 文件夹为编译输出目录;
  • ui 文件夹存放 UI 界面源码,具体实现请阅读 基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面。

app

  • app 文件夹包括有 cJSON 解析器、通信协议 Protocol、网络编程接口 Socket、天气获取、按键以及时间、温湿度数据更新等;
  • cJSON 是使用了一个开源的、C 语言编写的超轻量级 JSON 解析器;
  • 关于 Protocol 请阅读 一个简洁实用的自定义通信协议;
  • socket 文件夹主要内容为 TCP 服务端和客户端的创建,请阅读 Linux 下 socket 编程介绍及 TCP 客户端与服务端创建示例
  • 天气数据通过心知天气 API 获取,相关实现代码如下:
// weather.c
int weather_init(void)
{weather_client_fd = client_init_socket();/* 组合 GET 请求 */sprintf(weather_buffer, GET_REQUEST_PACKAGE, DAILY_JSON, API_KEY, WUHAN);/* 发送请求 */client_send_data(weather_client_fd, weather_buffer, strlen(weather_buffer));/* 接收天气数据 JSON 格式*/client_receive_data(weather_client_fd, weather_json, &weather_json_size);/* 解析天气数据 */cJSON_Daily_WeatherParse(weather_json, &Weather_now);/* 更新天气显示 */memset(weather_buffer, 0, BUFFER_SIZE);sprintf(weather_buffer, "%s / %s", Weather_now.text_day[0], Weather_now.text_night[0]);lv_label_set_text(ui_TextDay, weather_buffer);lv_label_set_text(ui_MinTemp, Weather_now.low[0]);lv_label_set_text(ui_MaxTemp, Weather_now.high[0]);lv_label_set_text(ui_outHum, Weather_now.humidity[0]);/* 更新天气图片 */int code = *Weather_now.code_day[0] - 48;switch (code){case 0: lv_img_set_src(ui_weatherImg, &ui_img_icons_00_png); break;......case 99: lv_img_set_src(ui_weatherImg, &ui_img_icons_99_png); break;default: break;}client_close_socket(weather_client_fd);return 0;
}
  • 以按键为例,实现数据打包、发送相关代码:
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);
}static void btn1_click_cb(lv_event_t *event) 
{printf("Button1 clicked\n");static char flag = 0;if(flag == 0){flag = 1;led_ryg_turn(LED_R, LED_ON);}else{flag = 0;led_ryg_turn(LED_R, LED_OFF);}
}static void btn2_click_cb(lv_event_t *event) 
{// ...
}static void btn3_click_cb(lv_event_t *event) 
{// ...
}int button_init(void)
{lv_obj_add_event_cb(ui_Button1, btn1_click_cb, LV_EVENT_CLICKED, NULL);lv_obj_add_event_cb(ui_Button2, btn2_click_cb, LV_EVENT_CLICKED, NULL);lv_obj_add_event_cb(ui_Button3, btn3_click_cb, LV_EVENT_CLICKED, NULL);return 0;
}
  • 数据接收、解析、命令执行相关代码:
static int ctrl_dev_aht20(msg_frame_t *_msg_pack)
{// ...return 0;
}static int ctrl_dev_adc(msg_frame_t *_msg_pack)
{printf("--- ctrl_dev_adc ---\r\n");uint16_t adc_raw = (uint16_t)(_msg_pack->data[0] << 8) + _msg_pack->data[1];uint8_t pm2_5 = adc_raw / 16;char pm2_5_src[4];printf("adc raw value: %d, pm2_5 value: %d \r\n", adc_raw, pm2_5);lv_arc_set_value(ui_Air, pm2_5);snprintf(pm2_5_src, sizeof(pm2_5_src), "%d", pm2_5);lv_label_set_text(ui_AirValue, pm2_5_src);return 0;
}static int ctrl_cmd_func(const msg_pkg_t *_msg_pkg)
{printf("--- ctrl_cmd_func ---\r\n");switch(_msg_pkg->pkg->type){case AHT20: ctrl_dev_aht20(_msg_pkg->pkg); break;case ADC: ctrl_dev_adc(_msg_pkg->pkg); break;default: return -1;}return 0; 
}static void *recv_thread(void *arg)
{recv_msg_buf->buf_ptr=recv_msg_buf->buf;while(1){if(server_receive_data(client_fd, (char *)recv_msg_buf->buf_ptr, (ssize_t *)&recv_msg_buf->buf_size) == 0){printf("thread recv \r\n");msg_buf_print(recv_msg_buf);/* 解析数据包命令 */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);

ELF 1 工程

  • ELF 1 源码工程结构如图所示:

  • src 文件夹存放源文件,inc 文件夹存放头文件,obj 为编译输出目录;
  • 客户端创建、数据打包、发送、接收、命令执行与 IMX6U 工程实现类似,不再介绍,数据采集、LED 控制采用文件操作实现。

功能演示

  • 抖音视频链接

更多内容

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

相关文章:

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

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

自动化测试介绍、selenium用法(自动化测试框架+爬虫可用)

文章目录 一、自动化测试1、什么是自动化测试&#xff1f;2、手工测试 vs 自动化测试3、自动化测试常见误区4、自动化测试的优劣5、自动化测试分层6、什么项目适合自动化测试 二、Selenuim1、小例子2、用法3、页面操作获取输入内容模拟点击清空文本元素拖拽frame切换窗口切换/标…...

深度学习的一个完整过程通常包括以下几个步骤

深度学习的一个完整过程通常包括以下几个步骤&#xff1a; 问题定义和数据收集&#xff1a; 定义清晰的问题&#xff0c;明确任务的类型&#xff08;分类、回归、聚类等&#xff09;以及预期的输出。收集和整理用于训练和评估模型的数据集。确保数据集的质量&#xff0c;进行预…...

WPS如何共享文件和文件夹

1 WPS共享单个文件 用WPS打开要分享的文件&#xff0c;点击右上角的“分享”键&#xff0c;选择上传到云端。 之后点击“创建并分享”&#xff0c;即可分享该文档。 2 WPS创建共享文件夹 2.1 如何共享文件夹 首先打开WPS&#xff0c;点击左上角的首页。在首页栏中&#…...

PowerData 2024“数字经济-城市开源行”活动预告

2023&#xff0c;社区经过一年的发展&#xff0c;凝聚起了一批热爱社区、热爱开源的小伙伴。 2024&#xff0c;社区计划在全国十个城市举办"数字经济-城市开源行"活动&#xff0c;连接社区成员、传播数字技术、推广开源文化&#xff0c;吸引更多伙伴加入社区&#xf…...

QT多语言切换功能

一.目的 在做项目时&#xff0c;有时希望我们的程序可以在不同的国家使用&#xff0c;这样最好的方式是一套程序能适应于多国语言。 Qt提供了这样的功能&#xff0c;使得一套程序可以呈现出不同的语言界面。本文将介绍QT如何实现多语言&#xff0c;以中文和英文为例。 QT开发…...

windows上elasticsearch的ik分词器的安装

下载 下载地址 在elasticsearch下的plugins文件夹下创建ik的文件夹 下载的ik压缩包解压到plugins/ik 重启elasticsearch 验证 http://ip:9200/_cat/plugins...

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发口罩识别系统对于提升公共卫生安全和疫情防控具有重要意义。本篇博客详细介绍了如何利用深度学习构建一个口罩识别系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5的对比&#xff0c;给出…...

在Windows系统中启动Redis服务

前言 Redis是一个开源、高性能的键值对数据库&#xff0c;常用于缓存、消息队列等场景。本文将详细指导您如何在Windows系统上启动Redis服务。 第一步&#xff1a;确认Redis安装 确保您已经在Windows系统上成功安装了Redis。官方提供了预编译好的Windows版本&#xff0c;您可…...

k8s.gcr.io/pause:3.2镜像丢失解决

文章目录 前言错误信息临时解决推荐解决onetwo 前言 使用Kubernetes&#xff08;k8s&#xff09;时遇到了镜像拉取的问题&#xff0c;导致Pod沙盒创建失败。错误显示在尝试从k8s.gcr.io拉取pause:3.2镜像时遇到了超时问题&#xff0c;这通常是因为网络问题或者镜像仓库服务器的…...

全面整理!机器学习常用的回归预测模型

Datawhale干货 作者&#xff1a;曾浩龙&#xff0c;Datawhale意向成员 前言 回归预测建模的核心是学习输入 到输出 &#xff08;其中 是连续值向量&#xff09;的映射关系。条件期望 是 到 的回归函数。简单来说&#xff0c;就是将样本的特征矩阵映射到样本标签空间。 图…...

在vue中对keep-alive的理解,它是如何实现的,具体缓存的是什么?

对keep-alive的理解&#xff0c;它是如何实现的&#xff0c;具体缓存的是什么&#xff1f; &#xff08;1&#xff09;keep-alive有以下三个属性&#xff1a;注意&#xff1a;keep-alive 包裹动态组件时&#xff0c;会缓存不活动的组件实例。主要流程 &#xff08;2&#xff09…...

章节一、认识three.js与开发环境学习笔记01;

一、如何学习WEB可视化3D技术与课程内容演示&#xff1b; 1、项目案例&#xff1a; 政府有大量的新基建的项目&#xff1a;如数字孪生、智慧城市、智慧园区、智慧工厂、智慧消防等等都涉及了3d的可视化技术&#xff1b; 2、如何系统的学号WEB 3D可视化技术&#xff1f; three…...

QT摄像头采集

主界面为显示框&#xff0c;两个下拉框&#xff0c;一个是所有相机&#xff0c;一个是相机支持的分辨率 系统根据UI界面自动生成的部分不再描述&#xff0c;以下为其他部分源码 widget.h #include <QWidget> #include <QMouseEvent> class QCamera; class QCamer…...

C语言第三十四弹---动态内存管理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、动态内存经典笔试题分析 1.1、题目1 1.2、题目2 1.3、题目3 1.4、题目4 2、柔性数组 2.1、柔性数组的特点 2.2、柔性数组的使用 2.3、…...

PDN分析及应用系列二-简单5V电源分配-Altium Designer仿真分析-AD

PDN分析及应用系列二 —— 案例1:简单5V电源分配 预模拟DC网络识别 当最初为PCB设计打开PDN分析仪时,它将尝试根据公共电源网络命名法从设计中识别所有直流电源网络。 正确的DC网络识别对于获得最准确的模拟结果非常重要。 在示例项目中已经识别出主DC网络以简化该过程。 …...

Vue开发实例(一)Vue环境搭建第一个项目

Vue环境搭建&第一个项目 一、环境搭建二、安装Vue脚手架三、创建Vue项目 一、环境搭建 下载方式从官网下载&#xff1a;http://nodejs.cn/download/ 建议下载v12.16.0版本以上的&#xff0c;因为版本低无法创建Vue的脚手架 检验是否安装成功 配置环境变量 新增NODE_HOME&…...

将SpringBoot项目改造成solon项目

solon项目介绍 官网 Java “生态型”应用开发框架&#xff1a;更快、更小、更简单。 启动快 5 &#xff5e; 10 倍&#xff1b;并发高 2&#xff5e; 3 倍&#xff1b; 内存省 1/3 ~ 1/2&#xff1b;打包缩到 1/2 ~ 1/10&#xff1b;同时支持 java8, java11, java17, java21&a…...

更详细的软件测试理论基础:流程,开发、测试模型,测试分类,测试用例及其设计方法,缺陷

文章目录 一、测试流程二、开发模型1、 瀑布模型2、增量模型3、快速模型4、其他 三、测试模型1、V模型2、W模型 四、测试分类五、测试用例 test case六、测试用例设计方法1、等价类划分法2、边界值分析法3、因果图法4、判定表法5、正交法6、场景法7、流程分析法8、错误推测法方…...

input css padding

这样控件会跑出外套控件在HTML JSP里面是经常出现的。但有些外国adobe的as控件不存在这种情况&#xff0c;这是因为内层控件定义的时候不能超出外层控件的范围。 修改下&#xff1a;去掉原来css padding&#xff0c;然后加上宽度和高度...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...