基于OrangePi Zero2的智能家居项目(开发阶段)

2024-04-01 08:36

本文主要是介绍基于OrangePi Zero2的智能家居项目(开发阶段),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

智能家居项目的软件实现

紧接上文 基于OrangePi Zero2的智能家居项目(准备阶段)-CSDN博客

目录

一、项目整体设计

1.1项目整体设计

1.2具体划分

二、开发工作的前期准备

1、进行分类,并用Makefile文件进行管理

参考:自己创建Makefile文件管理项目工程-CSDN博客

三、具体开发项目

1、添加语音监听接口

1.1 消息队列的实现

1.2语音控制模块的实现

​编辑

1.3 消息队列函数的继续实现(在main函数里面实现)

1.4 放到香橙派上面进交叉编译

2、添加网络监听接口

2.1增加文件

2.2整理框架

2.3 优化细节,注意改动

2.4、编译好传送过去执行找问题

2.5 网络调试助手启动!

上面这张图的结果其实是错误的!!!

3、添加烟雾监听的接口

3.1 增加相应的文件

额外补充

3.2 补全smoke_interface.c

3.3 编译并发送

 3.4 具体演示(见后续安装)

ps:优化之前写的代码(语音,socket,火灾)

4、添加消息接收监听接口

4.1 添加相应的文件

4.2 补全一部分代码,初始化消息,关闭消息

4.3 receive_get函数的实现

4.4 实现控制 设备(灯、风扇)线程的功能函数

4.5 编译测试成功

5、添加设备类结点接口(用消息接收监听队列去控制设备)

5.1 创建被控设备的链表结点​编辑

5.2 添加相应的文件(毕竟是个被控设备链表)

5.3 具体实现控制的设备要怎么控制

6、添加各类的被控设备结点

6.1 添加被控设备----客厅灯

ps:对oled显示做一个处理

编译测试.....(待补充)

6.2 添加卧室灯控制代码

编译测试.....(待补充)

6.3 添加风扇控制代码

编译测试.....(待补充)

6.4添加火灾报警(烟雾报警)检测功能

添加对应的文件

修改一下smoke_interface.c里面的值

增加蜂鸣器的报警

编译测试.....(待补充)

6.5 增加OLED显示功能

编译测试.....(待补充)

7 添加人脸识别开锁

7.1 添加对应的文件

7.2判断人脸的数据才能开门

7.3 开门之后也要关门

7.4 配置摄像头

7.5 报错

7.6 编译测试

四、ini文件解析本次项目

前言

1、什么是 ini文件配置格式 

2、下载源码和解析文件

3、在项目中运用ini文件

3.1 编译运行

3.2 项目优化

4、用ini配置文件去优化本次项目的代码

4.1 先把以前的设备文件删除

4.2 添加新的代码

4.3 更改配置文件的路径


一、项目整体设计

1.1项目整体设计

1.2具体划分

定义两个统一特征的结构体(控制与被控),都是通过链表进行连接

控制设备

被控设备

二、开发工作的前期准备

1、进行分类,并用Makefile文件进行管理

参考:自己创建Makefile文件管理项目工程-CSDN博客

三、具体开发项目

1、添加语音监听接口

1.1 消息队列的实现

1.2语音控制模块的实现

.

头插法的实现,串成一个一个的设备节点

main.c

1.3 消息队列函数的继续实现(在main函数里面实现)

main.c里面继续封装消息队列的实现

终于知道voice_get里面的mqd怎么传参了

编译通过

1.4 放到香橙派上面进交叉编译

再用mqtest传到香橙派进行测试

2、添加网络监听接口

2.1增加文件

2.2整理框架

2.3 优化细节,注意改动

2.4、编译好传送过去执行找问题

2.5 网络调试助手启动!

上面这张图的结果其实是错误的!!!

3、添加烟雾监听的接口

3.1 增加相应的文件

smoke.h

补全一部分的smoke_interface.c

额外补充

3.2 补全smoke_interface.c

3.3 编译并发送

 3.4 具体演示(见后续安装)

ps:优化之前写的代码(语音,socket,火灾)

4、添加消息接收监听接口

    

4.1 添加相应的文件

4.2 补全一部分代码,初始化消息,关闭消息

4.3 receive_get函数的实现

4.4 实现控制 设备(灯、风扇)线程的功能函数

4.5 编译测试成功

5、添加设备类结点接口(用消息接收监听队列去控制设备)

5.1 创建被控设备的链表结点

5.2 添加相应的文件(毕竟是个被控设备链表)

5.3 具体实现控制的设备要怎么控制

6、添加各类的被控设备结点

6.1 添加被控设备----客厅灯

往消息接收线程函数里面,声明客厅灯的初始化

ps:对oled显示做一个处理

编译测试.....(待补充)

6.2 添加卧室灯控制代码

编译测试.....(待补充)

6.3 添加风扇控制代码

编译测试.....(待补充)

6.4添加火灾报警(烟雾报警)检测功能

这里补充一下,蜂鸣器报警的流程:先是烟雾传感器检测到有烟雾时,将数据发送给板子,板子接收到发过来的数据之后,再去触发蜂鸣器

添加对应的文件

这里的.voice_set_status 其实是“1”  要设置的

修改一下smoke_interface.c里面的值

增加蜂鸣器的报警

pthread_create就这样就行了,不用在添加其他的东西

编译测试.....(待补充)

6.5 增加OLED显示功能

编译测试.....(待补充)

7 添加人脸识别开锁

7.1 添加对应的文件

7.2判断人脸的数据才能开门

7.3 开门之后也要关门

7.4 配置摄像头

参考文章:

基于OrangePi的智能垃圾桶(全程可实现)-CSDN博客

7.5 报错

记录关于智能家居的路程的一个bug___Segmentation fault(段错误)-CSDN博客

7.6 编译测试

四、ini文件解析本次项目

前言

上述的项目的基本功能都已实现,但是存在值得优化的地方

解决办法:写一个固定的配置文件,直接添加设备就行了

所以就引入了 ini文件配置格式

1、什么是 ini文件配置格式 

关键就是 键值对

2、下载源码和解析文件

apt-cache search libinih

一个简单的ini文件的一个解析

sudo apt source libinih-dev

安装源码包(此时可以尝试使用root权限来安装)

进入文件夹

查看 示例代码

3、在项目中运用ini文件

3.1 编译运行

这里补充一点:代码中没有循环语句,说明这个handle是多次调用的

3.2 项目优化

把文件添加到ini文件夹进行测试

ini_test.c 

/* Example: parse a simple configuration file */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ini.h"
#include "gdevice.h"#ifndef OUTPUT
#define OUTPUT 1
#define INPUT 0
#endif#ifndef LOW
#define LOW 0
#define HIGH 1
#endif //像receive文件里面那样添加被控设备链表
static struct gdevice *pdevhead = NULL;#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0//  if (MATCH("protocol", "version"))static int handler_gdevice(void* user, const char* section, const char* name,const char* value)
{//创建被控设备的临时的指针struct gdevice *pgdev = NULL;//找设备的逻辑就是:如果section都是一个字段,那么其他的东西(name value)肯定都是一个设备的//所以,我们只要找到一个section,那么这个section下面的所有name value就是同一个设备的//先找到section,再找name value,或者创建一个结构体,存放name value这些值if(NULL == pdevhead){pdevhead = (struct gdevice *)malloc(sizeof(struct gdevice));pdevhead->next = NULL;memset(pdevhead, 0, sizeof(struct gdevice));strcpy(pdevhead->dev_name, section);    //把section赋值给当前设备的名字}//第一个添加结点是没错这样,但是第二个结点添加进来的时候就有空间了else if (0 != strcmp(pdevhead->dev_name, section)){pgdev = (struct gdevice *)malloc(sizeof(struct gdevice));memset(pgdev, 0, sizeof(struct gdevice));strcpy(pgdev->dev_name, section);//头插法pgdev->next = pdevhead;pdevhead = pgdev;}if(NULL != pdevhead){if(MATCH(pdevhead->dev_name, "key"))  //假如第一个进来的是lock,就是挨着挨揍去比对他的key、gpio_pin、gpio_mode、gpio_status、check_face_status、voice_set_status这些值{sscanf(value , "%x" , &pdevhead->key);  //value是一个作为输入的值,想让其输出为16进制变成指令,所以%xprintf("%d | pdevhead->key = %x\n" , __LINE__,pdevhead->key);}else if (MATCH(pdevhead->dev_name, "gpio_pin")){pdevhead->gpio_pin = atoi(value);  //把字符串转换成整数}else if(MATCH(pdevhead->dev_name, "gpio_mode")){if(strcmp(value, "OUTPUT") == 0){pdevhead->gpio_mode = OUTPUT;  //OUTPUT}else if(strcmp(value, "INPUT") == 0){pdevhead->gpio_mode = INPUT;  //INPUT}}else if(MATCH(pdevhead->dev_name, "gpio_status")){if(strcmp(value, "LOW") == 0){pdevhead->gpio_mode = LOW;  }else if(strcmp(value, "HIGH") == 0){pdevhead->gpio_mode = HIGH;  }}else if(MATCH(pdevhead->dev_name, "check_face_status")){pdevhead->check_face_status = atoi(value);  //把字符串转换成整数}else if(MATCH(pdevhead->dev_name, "voice_set_status")){pdevhead->voice_set_status = atoi(value);  //把字符串转换成整数}}//打印有多少个ini文件里面的设备printf("---secition: %s, name: %s, value: %s\n", section, name, value);return 1;
}int main(int argc, char* argv[])
{if (ini_parse("gdevice.ini", handler_gdevice, NULL) < 0) {printf("Can't load 'gdevice.ini'\n");return 1;}//测试struct gdevice *pdev = pdevhead;while(pdev){printf("pdev->dev_name = %s\n", pdev->dev_name);printf("pdev->key = %x\n", pdev->key);printf("pdev->gpio_pin = %d\n", pdev->gpio_pin);printf("pdev->gpio_mode = %d\n", pdev->gpio_mode);printf("pdev->gpio_status = %d\n", pdev->gpio_status);printf("pdev->check_face_status = %d\n", pdev->check_face_status);printf("pdev->voice_set_status = %d\n", pdev->voice_set_status);pdev = pdev->next;}return 0;
}

编译运行:

4、用ini配置文件去优化本次项目的代码

4.1 先把以前的设备文件删除

4.2 添加新的代码

4.3 更改配置文件的路径

这篇关于基于OrangePi Zero2的智能家居项目(开发阶段)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866706

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ