【智能家居】二、添加火灾检测模块(烟雾报警功能点)
可燃气体传感器 MQ-2 和 蜂鸣器
代码段
- controlDevice.h(设备控制)
- smokeAlarm.c(烟雾报警器)
- buzzer.c(蜂鸣器)
- mainPro.c(主函数)
- 运行结果
可燃气体传感器 MQ-2 和 蜂鸣器


代码段
controlDevice.h(设备类)
#include <wiringPi.h> //wiringPi库
#include <stdio.h>
#include <stdlib.h>struct Devices //设备类
{char deviceName[128]; //设备名int status; //状态int pinNum; //引脚号int (*Init)(int pinNum); //“初始化设备”函数指针int (*open)(int pinNum); //“打开设备”函数指针int (*close)(int pinNum); //“关闭设备”函数指针int (*readStatus)(int pinNum); //“读取设备状态”函数指针 为火灾报警器准备int (*changeStatus)(int status); //“改变设备状态”函数指针struct Devices *next;
};struct Devices* addBathroomLightToDeviceLink(struct Devices *phead); //“浴室灯”加入设备链表函数声明 2
struct Devices* addBedroomLightToDeviceLink(struct Devices *phead); //“卧室灯”加入设备链表函数声明 8
struct Devices* addRestaurantLightToDeviceLink(struct Devices *phead); //“餐厅灯”加入设备链表函数声明 13
struct Devices* addLivingroomLightToDeviceLink(struct Devices *phead); //“客厅灯”加入设备链表函数声明 16
struct Devices* addSmokeAlarmToDeviceLink(struct Devices *phead); //“烟雾报警器”加入设备链表函数声明 6
struct Devices* addBuzzerToDeviceLink(struct Devices *phead); //“蜂鸣器”加入设备链表函数声明 9
smokeAlarm.c(烟雾报警器)
#include "controlDevice.h" //自定义设备类的文件int smokeAlarmInit(int pinNum) //C语言必须要传参,JAVA不用,可直接访问变量的值
{pinMode(pinNum,INPUT); //配置引脚为输入模式//digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}int smokeAlarmReadStatus(int pinNum)
{return digitalRead(pinNum);
}int smokeAlarmStatus(int status)
{}struct Devices smokeAlarm = { //定义烟雾报警器(对象).deviceName = "smokeAlarm", //名字.pinNum = 6, //香橙派 6号(wPi)引脚.Init = smokeAlarmInit, //指定初始化函数.readStatus = smokeAlarmReadStatus,.changeStatus = smokeAlarmStatus
};struct Devices* addSmokeAlarmToDeviceLink(struct Devices *phead) //烟雾报警器(对象)加入设备链表函数
{if(phead == NULL){return &smokeAlarm;}else{smokeAlarm.next = phead; //以前的头变成.nextphead = &smokeAlarm; //更新头return phead;}
}
buzzer.c(蜂鸣器)
#include "controlDevice.h" //自定义设备类的文件int buzzerInit(int pinNum)
{pinMode(pinNum,OUTPUT); //配置引脚为输出模式digitalWrite(pinNum,HIGH); //引脚置高电平,蜂鸣器关闭
}int buzzerOpen(int pinNum)
{digitalWrite(pinNum,LOW); //引脚置低电平,蜂鸣器开启
}int buzzerClose(int pinNum)
{digitalWrite(pinNum,HIGH); //引脚置高电平,蜂鸣器关闭
}struct Devices buzzer = { //定义蜂鸣器(对象).deviceName = "buzzer", //名字.pinNum = 9, //香橙派 9号(wpi)引脚.Init = buzzerInit, //指定初始化函数.open = buzzerOpen, //指定“开启蜂鸣器”函数.close = buzzerClose, //指定“关闭蜂鸣器”函数
};struct Devices* addBuzzerToDeviceLink(struct Devices *phead) //蜂鸣器(对象)加入设备链表函数
{if(phead == NULL){return &buzzer;}else{buzzer.next = phead;phead = &buzzer;return phead;}
}
mainPro.c(主函数)
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "controlDevice.h"struct Devices* findDeviceByName(char *name, struct Devices *phead)
{struct Devices *tmp =phead;if(phead == NULL){return NULL;}else{while(tmp != NULL){if(strcmp(tmp->deviceName,name)==0){return tmp;}tmp = tmp->next;}return NULL;}
}int main()
{char *smokeName = "smokeAlarm";char *buzzerName = "buzzer";struct Devices *tmp = NULL;int smokeStatus; //存放“烟雾传感器”状态if (wiringPiSetup () == -1) { fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; return 1 ; }struct Devices *pdeviceHead = NULL; //定义初始链表头//pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead); //“浴室灯”加入设备链表//pdeviceHead = addBedroomLightToDeviceLink(pdeviceHead);//pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);//pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);pdeviceHead = addSmokeAlarmToDeviceLink(pdeviceHead);pdeviceHead = addBuzzerToDeviceLink(pdeviceHead);while(1){tmp = findDeviceByName(smokeName, pdeviceHead);if(tmp != NULL){tmp->Init(tmp->pinNum);smokeStatus = tmp->readStatus(tmp->pinNum);tmp = findDeviceByName(buzzerName, pdeviceHead);if(tmp != NULL){if( smokeStatus == 0 ){tmp->Init(tmp->pinNum);tmp->open(tmp->pinNum);}else{tmp->Init(tmp->pinNum);tmp->close(tmp->pinNum);} }}}return 0;
}
模块测试
相关文章:
【智能家居】二、添加火灾检测模块(烟雾报警功能点)
可燃气体传感器 MQ-2 和 蜂鸣器 代码段 controlDevice.h(设备控制)smokeAlarm.c(烟雾报警器)buzzer.c(蜂鸣器)mainPro.c(主函数)运行结果 可燃气体传感器 MQ-2 和 蜂鸣器 代码段 …...
history和hash两种路由模式原理,和优缺点
Hash Hash 模式是在 URL 中使用井号(#)来作为路由的模式。在 Hash 模式下,即使页面刷新,浏览器仍然只会请求页面的初始 HTML 文件,所有的路由变化都会在 URL 前面添加 “#/” 符号。 原理 在 Hash 模式下,路…...
Nginx 具体应用
1 Nginx 1.1 介绍 一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它占有的内存少,并发能力强,中国大陆使用 nginx 的网站有:百度、京东、新浪、网易、腾讯、淘宝等。第一个公开版本发布于…...
计算机网络之网络传输,三次握手和四次挥手
网络传输通过高低电压 流 基本类型数组 低电压转高电压,通过网卡 传输模式: 全双工:互相传输且能同时传输 半双工:互相传输但是不能同时传输 单工:单向传输,(键盘,显示器&#…...
Azure Machine Learning - 在 Azure AI 搜索中创建全文查询
Azure AI搜索中如果要为全文搜索生成查询,本文提供了设置请求的步骤。 本文还介绍了查询结构,并说明了字段属性和语言分析器如何影响查询结果。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&a…...
基于YOLOv8深度学习的钢材表面缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...
深度学习常见回归分支算法逐步分析,各种回归之间的优缺点,适用场景,举例演示
文章目录 1、线性回归(Linear Regression)1.1 优点1.2 缺点1.3 适用场景1.4 图例说明 2、多项式回归(Polynomial Regression)2.1 优点2.2 缺点2.3 适用场景2.4 图例说明 3、决策树回归(Decision Tree Regression&#…...
Programming Contest 2023(AtCoder Beginner Contest 331)D题 Tile Pattern --- 题解
目录 D - Tile Pattern 题目大意: 思路: 代码: D - Tile Pattern D - Tile Pattern (atcoder.jp) 题目大意: 给你一个n和q,n为局部棋盘大小(n*n) 并且给出局部棋盘中黑白子位置的放置情况,q为查询次数…...
Google测试框架googletest简介与使用方法
环境准备(Ubuntu) 下载 git clone https://github.com/google/googletest.git 安装 cd googletest // 创建build目录 mkdir build cd build //编译安装 cmake .. make sudo make install 检查是否安装成功 ls /usr/local/lib// 存在以下文件则说明…...
进程的创建:fork()
引入 创建进程的方式我们已经学习了一个!在我们运行指令(或者运行我们自己写的可执行程序)的时候不就是创建了一个进程嘛?那个创建进程的方式称为指令级别的创建子进程! 那如果我们想要在代码中创建进程该怎么办呢? fork() for…...
Fabric:创建应用通道
搭建自定义网络可以参考文章: https://blog.csdn.net/yeshang_lady/article/details/134113296 1 创建通道 网络搭建完成之后,就可以开始创建通道了。Fabric V2.5.4中可以在不创建系统通道的情况下直接创建应用通道。 1.1 修改配置文件 先创建配置文…...
力扣每日一题(2023-11-30)
力扣每日一题 题目:1657. 确定两个字符串是否接近 日期:2023-11-30 用时:21 m 07 s 时间:11ms 内存:43.70MB 代码: class Solution {public boolean closeStrings(String word1, String word2) {if(word1.…...
内部类Lambda
静态内部类 /*** 静态成员是在类加载成字节码时就已经存在的,静态只能访问静态*/ public class Demo {public static void main(String[] args) {Outer.Inner.show();} }class Outer {int num1 10;static int num2 20;static class Inner {static void show() {Outer outer …...
设一棵二叉树中各结点的值互不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A[1...n]和 Bfl...n]中,试编写算法建立该二叉树的二叉链表。
题目描述:设一棵二叉树中各结点的值互不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A[1…n]和 B[1…n]中,试编写算法建立该二叉树的二叉链表。 分析: 对于一颗二叉树,知道其中序和先序序列就可以完全确定…...
什么是Daily Scrum?
Daily Scrum(每日站会),Scrum Master要确保这个会在每天都会开。这个会的目的就是检查正在做的东西和方式是否有利于完成Sprint目的,并及时做出必要的调整。 每日站会一般只开15分钟,为了让事情更简单些,这…...
逆波兰表达式求值[中等]
优质博文:IT-BLOG-CN 一、题目 给你一个字符串数组tokens,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。 每个操作数(运算对象)都…...
Oracle连接和使用
5. Oracle连接和使用 5.1. sqlplus sqlplus作为甲骨文公司提供的一款本族工具产品,有着悠久的历史和积淀,它几乎伴随着Oracle数据库产生至今的整个生命周期,而且,还会继续和Oracle数据库产品相伴一直发展下去。该工具看似简单灵活的背后,却为广大用户使用Oracle数据库提…...
redis单线程为什么这么快
redis单线程为什么这么快 redis是使用的单线程来进行操作的,因为所有的数据都是在内存中的,内存操作特别快。而且单线程避免了多线程切换性能损耗问题 单线程如何处理并发客户端连接? redis利用epoll来实现IO多路复用,将连接信息和…...
工业机器视觉megauging(向光有光)使用说明书(五,轻量级的visionpro)
这个说明主要介绍抓线功能。 第一步,添加线工具,鼠标双击工具箱“抓线”,出现如下界面: 第二步,我们拉一条,“九点标定”到“抓线1”的线,和visionpro操作一样: 第三步,…...
【LittleXi】2023年广东工业大学腾讯杯新生程序设计竞赛
文章目录 【LittleXi】2023年广东工业大学腾讯杯新生程序设计竞赛A.星期几考试?C.信件D、乘除法E、不知道叫什么名字F.我要学会盾反!G.闪闪发光心动不已!H.不想想背景的gcdI.uu爱玩飞行棋J.火柴人小游戏K .有趣的BOSS 【LittleXi】2023年广东…...
面试题杂记
1.问:react的Fabric实现原理答:实际上就是虚拟dom那一套东西,只不过换了个名词2.问:react的fiber架构实现原理答:在react15及以前的协调过程是基于栈(stack-based)的,缺点是一个组件…...
一键部署文档分析服务:YOLO X Layout模型Docker实战教程
一键部署文档分析服务:YOLO X Layout模型Docker实战教程 1. 为什么需要文档版面分析? 在日常工作中,我们经常遇到这样的场景:收到一份扫描的合同PDF,需要提取关键条款;或者拿到一份企业年报,想…...
Symfony Monolog Bundle与现代日志系统:Sentry、Elasticsearch、Slack集成终极指南
Symfony Monolog Bundle与现代日志系统:Sentry、Elasticsearch、Slack集成终极指南 【免费下载链接】monolog-bundle Symfony Monolog Bundle 项目地址: https://gitcode.com/gh_mirrors/mo/monolog-bundle Symfony Monolog Bundle是Symfony框架中功能强大的…...
【数据结构与算法】二叉树从建立开始
为什么你学了二叉树却还是不会做题?从“建树”到“解题”的完整思维体系在学习数据结构的过程中,二叉树几乎是每个人都会接触的内容。但一个很现实的问题是:很多人会写遍历,却不会做题。表面上看是代码能力的问题,实际…...
Ubuntu 20.04下Mathematica 12.3安装全攻略(附Jupyter集成技巧)
Ubuntu 20.04下Mathematica 12.3安装与Jupyter集成实战指南 在科研计算与符号数学领域,Mathematica始终保持着不可替代的地位。对于Ubuntu用户而言,安装特定历史版本(如12.3)往往比最新版本更具挑战性——官方默认提供最新版下载&…...
家庭知识库中心:OpenClaw+Qwen3.5-9B管理个人数字资产
家庭知识库中心:OpenClawQwen3.5-9B管理个人数字资产 1. 为什么需要家庭知识库 去年搬家时,我在整理纸质文件的过程中发现一个严重问题:孩子的疫苗接种记录、房产合同、医疗报告等重要文档分散在多个文件夹中,紧急情况下根本找不…...
PCIe AVIP架构
验证工程师可以用C语言接口快速实现仿真加速。C实现的仿真文件testbench可以直接访问AVIP,与总线功能模块BFM交换数据。PCIe AVIP的C接口就是一组C类;C程序或工具可以调用这些类的方法。C类可以实现如下功能:与BFM建立通信;向BFM发…...
无失效数据的产品可靠性评估案例
当所有寿命相关的试验全部通过且无失效发生时如何评价产品可靠性作者:Julius王政 关键点o 一个产品可能有几项与寿命相关的可靠性验证试验。例如,车辆中使用的电子控制模块(我们称之为 ECU)通常有以下四项与寿命相关的试…...
logback 只能有 1 个 <root> 标签!
<?xml version"1.0" encoding"UTF-8"?> <configuration> <!-- 路径 --> <property name"PATH" value"./log/open"/> <!-- 控制台输出 --> <appender name"STDOUT" class"ch.qos.lo…...
1-1 从零实现邻接矩阵:构建无向图的核心步骤与实战解析
1. 邻接矩阵与无向图:从概念到代码的桥梁 第一次接触图论时,我完全被那些抽象的概念搞晕了。直到有一天,导师在黑板上画了个简单的社交网络图:"你看,每个人是一个点,好友关系是连线,这不就…...
