基于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 更改配置文件的路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/296504.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件了解 笔记 2

CPU 内存控制器&#xff1a;负责读写数据 代理系统和平台IO&#xff1a;与主板上的芯片组通信&#xff0c;并管理PC中其他组件之间的数据流 主板&#xff1a;巨大的印刷电路板 Chipset&#xff1a;芯片组&#xff0c;位于散热器下方&#xff0c;直接连接到CPU的系统代理部分 …

详解网络攻击的发生原因、类型及如何防范

网络攻击是访问计算机系统或者大小&#xff0c;修改或窃取数据的未经授权的企图。网络破坏分子可以使用多种攻击媒介&#xff0c;推出包括网络攻击的恶意软件&#xff0c;网络钓鱼&#xff0c;勒索&#xff0c;以及人在这方面的中间人攻击。固有风险和残余风险使这些攻击中的每…

【大数据存储】实验五:Mapreduce

实验Mapreduce实例——排序&#xff08;补充程序&#xff09; 实验环境 Linux Ubuntu 16.04 jdk-8u191-linux-x64 hadoop-3.0.0 hadoop-eclipse-plugin-2.7.3.jar eclipse-java-juno-SR2-linux-gtk-x86_64 实验内容 在电商网站上&#xff0c;当我们进入某电商页面里浏览…

鸿蒙实战开发:【实现应用悬浮窗】

如果你要做的是系统级别的悬浮窗&#xff0c;就需要判断是否具备悬浮窗权限。然而这又不是一个标准的动态权限&#xff0c;你需要兼容各种奇葩机型的悬浮窗权限判断。 fun checkPermission(context: Context): Boolean if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)…

[Arduino学习] ESP8266读取DHT11数字温湿度传感器数据

目录 1、传感器介绍 2、接线 3、DHT.h库 1、传感器介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;是简单环境监测项目的理想选择。 温度分辨率为1C&#xff0c;相对湿度为1&#xff05;。温度范围在0C到50C之间&#xff0c;湿度的测…

java Web 健身管理系统idea开发mysql数据库LayUI框架java编程计算机网页源码maven项目

一、源码特点 java Web健身管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 layUI bootst…

PVE设置显卡直通(二:Linux显卡直通,以及Linux系统下安装cuda库)

PVE设置显卡直通(一:硬件设置) 本文仅记录PVE关于Linux下的显卡直通步骤 例程不过多阐述 ps: 无直通经验的同学,先参阅 PVE设置显卡直通(一:硬件设置),再参阅本博文 参阅完成 PVE设置显卡直通(一:硬件设置)后,直接在PVE面板中添加显卡硬件到自己的主机即可,此文中…

CTK插件框架学习-插件注册调用(03)

CTK插件框架学习-新建插件(02)https://mp.csdn.net/mp_blog/creation/editor/136923735 一、CTK插件组成 接口类&#xff1a;对外暴露的接口&#xff0c;供其他插件调用实现类&#xff1a;实现接口内的方法激活类&#xff1a;负责将插件注册到CTK框架中 二、接口、插件、服务…

ABC318 F - Octopus

解题思路 对于每个宝藏维护个区间&#xff0c;答案一定在这些区间中对于每个区间的端点由小到大排序对于每个点进行判断&#xff0c;若当前位置合法&#xff0c;则该点一定为一个右端点则该点到前一个端点之间均为合法点若前一个点不合法&#xff0c;则一定是某一个区间限制的…

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…

SSTI模板注入(jinja2)

前面学习了SSTI中的smarty类型&#xff0c;今天学习了Jinja2&#xff0c;两种类型都是flask框架的&#xff0c;但是在注入的语法上还是有不同 SSTI&#xff1a;服务器端模板注入&#xff0c;也属于一种注入类型。与sql注入类似&#xff0c;也是通过凭借进行命令的执行&#xff…

【JavaWeb】Day32.MySQL概述

什么是数据库 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音类的app&#xff0c;那这些大家所…

项目5-验证码案例

选择使用Google的开源项目Kaptcha来实现. 1.Kaptcha 插件介绍 Kaptcha 是Google的⼀个高度可配置的实⽤验证码⽣成⼯具. 代码: http://code.google.com/p/kaptcha/ ⽹上有很多⼈甚⾄公司基于Google的kaptcha进⾏了⼆次开发. 我们选择⼀个直接适配SpringBoot的 开源项目 htt…

Vue 大文件切片上传实现指南包会,含【并发上传切片,断点续传,服务器合并切片,计算文件MD5,上传进度显示,秒传】等功能

Vue 大文件切片上传实现指南 背景 在Web开发中&#xff0c;文件上传是一个常见的功能需求&#xff0c;尤其是当涉及到大文件上传时&#xff0c;为了提高上传的稳定性和效率&#xff0c;文件切片上传技术便显得尤为重要。通过将大文件切分成多个小块&#xff08;切片&#xff0…

(免费分享)基于微信小程序自助停取车收费系统

本项目的开发和制作主要采用Java语言编写&#xff0c;SpringBoot作为项目的后端开发框架&#xff0c;vue作为前端的快速开发框架&#xff0c;主要基于ES5的语法&#xff0c;客户端采用微信小程序作为开发。Mysql8.0作为数据库的持久化存储。 获取完整源码&#xff1a; 大家点赞…

上位机图像处理和嵌入式模块部署(qmacvisual并发执行)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 类似于qmacvisual这样的软件&#xff0c;其实价格并不便宜。比如大家熟知的halcon、vision pro、vision master这样的软件&#xff0c;最便宜的版本…

AlexNet网络模型

AlexNet 是一个深度卷积神经网络&#xff0c;由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年的 ImageNet 大规模视觉识别挑战赛&#xff08;ILSVRC&#xff09;中首次提出并获得了显著的成功。它是深度学习历史上一个里程碑式的模型&#xff0c;对后来的深…

【漏洞复现】通天星CMSV6车载主动安全监控云平台inspect_file接口处存在任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【opencv】教程代码 —features2D(4)利用两张摄像机拍摄的图片计算单应性矩阵...

homography_from_camera_displacement.cpp Chessboard poses 棋盘姿态 使用根据相机位移计算的单应性扭曲图像 使用根据绝对相机姿势计算的单应性扭曲图像 Warped images comparison 扭曲图像比较 左侧-nfindHomography 右侧-使用根据相机位移计算的单应性扭曲图像 终端输出&a…

Electron 打包自定义NSIS脚本为安装向导增加自定义页面增加输入框

Electron 打包工具有很多&#xff0c;如Electron-build、 Electron Forge 等&#xff0c;这里使用Electron-build&#xff0c;而Electron-build使用了nsis组件来创建安装向导&#xff0c;默认情况nsis安装向导不能自定义安装向导界面&#xff0c;但是nsis提供了nsis脚本可以扩展…