智能家居3 - 实现烟雾报警模块

  这一模块的思路和前面的语言控制模块很相似,差别只是调用TCP 去控制

废话少说,放码过来

增添/修改代码

smoke_interface.c


#include <pthread.h>
#include <wiringPi.h>
#include <stdio.h>#include "smoke_interface.h"
#include "control.h"
#include "mq_queue.h"
#include "global.h"
#include <netinet/tcp.h> // 设置 tcp 心跳 的参数#define SMOKE_PIN   6 // 烟雾报警模块接的引脚
#define SMOKE_MODE INPUTstatic int s_fd = -1;static int  smoke_init(void)
{printf("%s|%s|%d\n",__FILE__,__func__,__LINE__);pinMode(SMOKE_PIN, SMOKE_MODE); // 引脚 和 模式配置return 0;
}static void smoke_final(void) 
{// do nothing
}static void* smoke_get(void *arg)
{// AA 55 45 00  55 AA -->  45 00 -->触发警报int status = HIGH; //低电平有效 -- 默认设置为高电平int switch_status = 0;  // 报警开关 -- 默认设置为不开 -- 0ssize_t byte_send = -1;unsigned char buffer[6] = {0xAA,0x55,0x00,0x00,0x55,0xAA};mqd_t mqd = -1;ctrl_info_t * ctrl_info = NULL; if(NULL != arg)ctrl_info = (ctrl_info_t*)arg;if(NULL != ctrl_info)mqd = ctrl_info->mqd;      if((mqd_t)-1 == mqd){pthread_exit(0);  }pthread_detach(pthread_self());  // 父子线程分离printf("%s thread start.\n",__func__);while(1){status = digitalRead(SMOKE_PIN); // 读取当前引脚状态if(LOW == status) //  探测到烟雾 -- 发生报警{switch_status = 1; // 打开报警器开关buffer[2] = 0x45;buffer[3] = 0x00;// 低电平触发警报 --//蜂鸣器是低电平触发 --> 我们这里把buffer 修改得与beep匹配,方便与他产生联系printf("%s|%s|%d,  0x%x,0x%x,0x%x,0x%x,0x%x,0x%x\n",__FILE__,__func__,__LINE__,buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);byte_send = mq_send(mqd, buffer, 6,0); // 向消息队列里面发送数据 -- 接收到后语言模块会识别播报 - 火灾警报if (-1 == byte_send){continue;}}else if(HIGH == status && 1 == switch_status) // 未探测到烟雾,并且报警器开关还没关闭 -- 关闭报警器开关{switch_status = 0; //  关闭报警器开关buffer[2] = 0x45;buffer[3] = 0x01;//警报结束printf("%s|%s|%d,  0x%x,0x%x,0x%x,0x%x,0x%x,0x%x\n",__FILE__,__func__,__LINE__,buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);byte_send = mq_send(mqd, buffer, 6,0);if (-1 == byte_send){continue;}}sleep(5);}pthread_exit(0); // 退出线程
}struct  control smoke_control ={.control_name = "smoke",.init = smoke_init,.final = smoke_final,.get = smoke_get,.set = NULL, //不需要实现 设置.next = NULL
};struct control *add_smoke_to_ctrl_list(struct control *phead)
{return add_interface_to_ctrl_list(phead,&smoke_control);}



smoke_interface.h

#ifndef ___SMOKE_INTERFACE_H___
#define ___SMOKE_INTERFACE_H___#include "control.h"
struct control *add_smoke_to_ctrl_list(struct control *phead);#endif

修改的main.c

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <wiringPi.h>#include "control.h"
#include "mq_queue.h"
#include "voice_interface.h"
#include "socket_interface.h"
#include "smoke_interface.h"
#include "receive_interface.h"
#include "global.h"// msg_queue_createint main() {pthread_t thread_id;struct control *control_phead = NULL;struct control *pointer = NULL;ctrl_info_t *ctrl_info = NULL;ctrl_info = (ctrl_info_t *)malloc(sizeof(ctrl_info_t));ctrl_info->ctrl_phead = NULL;ctrl_info->mqd = -1;int node_num = 0; // 统计节点数if(-1 == wiringPiSetup())// 初始化 wiringPi 库{perror("wiringPi Init");return -1;}// 创建消息队列ctrl_info->mqd = msg_queue_create();if(-1 == ctrl_info->mqd)// 创建消息队列失败{printf("%s|%s|%d, mqd= %d\n",__FILE__,__func__,__LINE__,ctrl_info->mqd);return -1;}//  头插法插入 , so 头一直在变化ctrl_info->ctrl_phead = add_voice_to_ctrl_list(ctrl_info->ctrl_phead);ctrl_info->ctrl_phead = add_tcpsocket_to_ctrl_list(ctrl_info->ctrl_phead);ctrl_info->ctrl_phead = add_smoke_to_ctrl_list(ctrl_info->ctrl_phead);ctrl_info->ctrl_phead = add_receive_to_ctrl_list(ctrl_info->ctrl_phead);pointer = ctrl_info->ctrl_phead;while(NULL!=pointer) // 对所有控制结构体初始化,并且统计节点数{if(NULL != pointer->init){printf("%s|%s|%d   control_name = %s\n",__FILE__,__func__,__LINE__,pointer->control_name);pointer->init();}pointer = pointer->next;node_num++; // 统计节点数}// 根据节点的总数 --> 创建对应数目的线程pthread_t *tid = (pthread_t *)malloc(sizeof(int) *node_num);pointer = ctrl_info->ctrl_phead;for(int i=0;i<node_num;++i)//遍历所有节点{if(NULL != pointer->get){printf("%s|%s|%d   control_name = %s\n",__FILE__,__func__,__LINE__,pointer->control_name);pthread_create(&tid[i],NULL,(void *)pointer->get,(void *)ctrl_info); // 传入这个结构体参数,方便同时调用多组线程里面的API}pointer = pointer->next;}for(int i=0;i<node_num;++i){pthread_join(tid[i],NULL);}for(int i=0;i<node_num;++i){if(NULL != pointer->final)pointer->final(); // 接打开的使用接口关闭pointer = pointer->next;}msq_queue_final(ctrl_info->mqd);if(NULL != ctrl_info)free(ctrl_info); // 这个是malloc 堆区申请的内存 -->  需要手动的释放if(NULL != tid)free(tid);return 0;
}

编译执行:

编译:

make

发送到arm-64平台

scp ./obj/smarthome  orangepi@192.168.1.11:/home/orangepi

// 需要用到阿里云人脸识别接口,需要调用 py文件,一起传过去
 scp src/face.py  orangepi@192.168.1.11:/home/orangepi

执行:

sudo -E ./smarthome

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

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

相关文章

knex与sequelize 以及断点工具使用

knex 使用 SQL Query Builder for Javascript | Knex.js 首先下载 npm install knex 使用 const knex require(knex)({client: mysql,connection: {host: localhost, // 地址user: root, // 账号password: 123456, // 密码database: user // 数据库}});/*** kn…

React-组件基础使用

组件是什么 概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观&#xff0c;组件之间可以互相嵌套&#xff0c;也可以复用多次 组件化开发可以让开发者像搭积木一样构建一个完整的庞大的应用 React组件 在React中&#xff0c;一个组件就是首…

云动态摘要 2024-05-24

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]大模型知识引擎体验招募 腾讯云 2024-05-21 大模型知识引擎产品全新上线&#xff0c;为回馈新老客户&#xff0c;50万token免费送&#xff0c;开通服务即领取&#xff01; 云服…

git教程(IDEA + 命令行)

首先假设你已经安装 git 且 已经初始化完成&#xff1a; // 初始化git config --global user.name "你的用户名" git config --global user.email "你的邮箱"在当前文件夹下创建一个仓库&#xff0c;且该文件夹下会有多个项目 首先在当前文件夹下新建git…

微信小程序毕业设计-校园综合服务系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

JavaScript-对象

对象的概念 所有事物都可以是对象,对象可以是一种数据类型&#xff0c;或多种数据类型&#xff0c;也可以是一个函数或多个函数。 在一个程序里面&#xff0c;通常会用多个变量来描述一些实体的属性 对象是JavaScript的一种数据类型 例如描述一个学生&#xff0c;它的属性应该是…

VSCode开发Python-Django入门

一、安装配置Python环境及配置Python环境变量 1、python安装包安装后&#xff0c;需要注意pip.exe和pip3.exe的安装&#xff1b; 2、环境变量需要配置两个目录&#xff1b; 3、验证python是否安装成功 通过cmd命令执行&#xff1a;python --version 查看python版本&#xff…

理解JavaScript的内存管理详解

JavaScript的内存管理是指如何分配、使用和释放内存的过程。在JavaScript中&#xff0c;内存管理是由JavaScript引擎自动处理的&#xff0c;开发者不需要手动操作内存。 JavaScript使用垃圾回收器来管理内存。垃圾回收器的主要任务是找出不再使用的内存&#xff0c;并将其释放…

【前端每日基础】day25——事件处理

事件处理 事件处理允许网页响应用户的交互&#xff0c;例如点击、键盘输入、鼠标移动等。 添加事件监听器 可以使用addEventListener来添加事件监听器&#xff1a; let button document.getElementById("myButton");// 添加点击事件监听器 button.addEventListene…

高中生是否需要上电子阅览室

高中生是否需要上电子阅览室&#xff0c;取决于学生的学习需求和个人喜好。以下是一些考虑因素&#xff1a; 1. 便利性&#xff1a;电子阅览室通常提供电脑设备和网络连接&#xff0c;方便学生在线获取学习资源。对于家中没有电脑或者网络不稳定的学生&#xff0c;上电子阅览室…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一&#xff1a;模拟支付宝蚂蚁森林的能量产生过程 支付宝的蚂蚁森林通过日常的走步、生活缴费、线下支付、网络购票、共享单车等低碳、环保行为…

pyspark==windows单机搭建

下载安装JDK17,配置JAVA_HOME 下载安装hadoop-3.3.5并完整替换bin目录,配置HADOOP_HOME Index of /hadoop/common/hadoop-3.3.5 GitHub - cdarlint/winutils: winutils.exe hadoop.dll and hdfs.dll binaries for hadoop windows 下载spark配置SPARK_HOME 安装pyspark Demo …

java函数编程-黑马学习笔记

第一章 01合格的函数 函数就是一个规则 合格的函数就是只要你输入相同&#xff0c;无论多少次调用&#xff0c;不论什么时间调用&#xff0c;输出是相同的。 函数可以引用外部的数据&#xff0c;但是需要去保证外部的数据不可变 static关键字修饰的静态方法本质上和函数没…

XDebug配置几件教程,phpstorm实现http请求断点调试

写这篇的文章的初衷:网络上配置XDebug的文章有很多,XDebug也有官方的文档, PhpStorm也有官方的文档,为什么还要写那? 相信不少人,都有一种感觉,虽然教程很多,但是按教程走一遍,自己的确不能正常调试。 问题出在下面几个方面: 1. 对调试过程中,没有一定的认识,因此…

HBase分布式数据库入门到精通

文章目录 HBase分布式数据库入门到精通 一、简单介绍 二、HBase数据模型 三、HBase的架构 四、HBase写操作流程 五、HBase读操作流程 六、HBase minor小合并和major大合并 七、HBase目标表meta表 八、HBase特点 九、HBase的使用场景 HBase分布式数据库入门到精通 一、…

没开玩笑!高速信号不能参考电源网络这条规则,其实很难做到

高速先生成员--黄刚 看到这篇文章的题目&#xff0c;我相信大家心里都呈现出了这么一个场景&#xff1a;高速信号线在L20层&#xff0c;我只要把L19和L21层都铺上完整的地平面&#xff0c;这不就满足了高速信号线不能参考电源平面这条规则了吗&#xff1f;这难道很难做到吗&…

鸿蒙大厂目前政策变现沉淀思考

鸿蒙引擎定制优化 鸿蒙端hotfix&#xff1a; 技术栈太大了&#xff0c;但是鸿蒙需要学习什么呢&#xff1f; 什么最有价值&#xff1f; 这就是接下来需要表达下我的观点&#xff1a; 1、APP开发 2、应用市场技术专员 【游戏、电商重型APP性能的处理 SmartPerf、构建自己的工…

kotlin基础之扩展函数及运算符重载

Kotlin 是一种强大的静态类型编程语言&#xff0c;它特别擅长与 Java 互操作&#xff0c;并提供了许多实用的功能来简化代码和提高可读性。其中&#xff0c;扩展函数和运算符重载是 Kotlin 中的两个强大特性&#xff0c;它们允许你以更加自然和简洁的方式编写代码。 1. 扩展函…

基于SpringBoot的在线文档管理系统源码数据库

基于SpringBoot的在线文档管理系统源码数据库 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景&…

JVM、JRE 和 JDK 的区别,及如何解决学习中可能会遇到的问题

在学习Java编程的过程中&#xff0c;理解JVM、JRE和JDK之间的区别是非常重要的。它们是Java开发和运行环境的核心组件&#xff0c;各自扮演不同的角色。 一、JVM&#xff08;Java Virtual Machine&#xff09; 定义 JVM&#xff08;Java虚拟机&#xff09;是一个虚拟化的计算…