智能家居 (4) ——工厂模式火焰报警

工厂模式火焰报警部分代码

contrlEquipments.h 文件(设备类)

#include <wiringPi.h>						//使用wiringPi库,也可使用自己写的驱动
#include <stdio.h>
#include <stdlib.h>

struct Equipment							//设备类
{
	char equipName[128];					//设备名
	int pinNum;								//引脚号
	int (*Init)(int pinNum);				//“初始化设备”函数指针
	int (*open)(int pinNum);				//“打开设备”函数指针
	int (*close)(int pinNum);				//“关闭设备”函数指针

	int (*readStatus)(int pinNum);			//“读取设备状态”函数指针
	int (*changeStatus)(int status);		//“改变设备状态”函数指针

	struct Equipment *next;
};

struct Equipment *addBathroomLightToEquipmentLink(struct Equipment *phead);			//“浴室灯”加入设备链表函数声明
struct Equipment *addSecondfloorLightToEquipmentLink(struct Equipment *phead);		//“二楼灯”加入设备链表函数声明
struct Equipment *addLivingroomLightToEquipmentLink(struct Equipment *phead);		//“客厅灯”加入设备链表函数声明
struct Equipment *addRestaurantLightToEquipmentLink(struct Equipment *phead);		//“餐厅灯”加入设备链表函数声明
struct Equipment *addFireDetectionToEquipmentLink(struct Equipment *phead);			//“火焰传感器”加入设备链表函数声明
struct Equipment *addBuzzerToEquipmentLink(struct Equipment *phead);				//“蜂鸣器”加入设备链表函数声明

mainPro.c 文件(主函数)

#include <stdio.h>
#include <string.h>
#include "contrlEquipments.h"

int main()
{
	if(wiringPiSetup() == -1){									//使用wiringPi库,需初始化硬件
		printf("wiringPiSetup failed!\n");
		return -1; 
	}

	struct Equipment *pequipHead = NULL;						//定义初始链表首端
//	pequipHead = addBathroomLightToEquipmentLink(pequipHead);
//	pequipHead = addSecondfloorLightToEquipmentLink(pequipHead);
//	pequipHead = addLivingroomLightToEquipmentLink(pequipHead);
//	pequipHead = addRestaurantLightToEquipmentLink(pequipHead);
	pequipHead = addFireDetectionToEquipmentLink(pequipHead);	//“火焰传感器”加入设备链表
	pequipHead = addBuzzerToEquipmentLink(pequipHead );			//“蜂鸣器”加入设备链表

	int fireStatus;												//存放“火焰传感器”状态
	char *fireName = "fireDetection";
	char *buzzerName = "buzzer";
	struct Equipment *firetmp = pequipHead;
	struct Equipment *buztmp = pequipHead;

	while(buztmp != NULL){										//寻找链表中蜂鸣器对应链节
		if(strcmp(buzzerName,buztmp->equipName) == 0){
			buztmp->Init(buztmp->pinNum);						//初始化“蜂鸣器”
			break;
		}
		buztmp = buztmp->next;
	}
	
	while(firetmp != NULL){
		if(strcmp(fireName,firetmp->equipName) == 0){
			firetmp->Init(firetmp->pinNum);						//初始化火焰传感器的引脚为输入模式
			while(1){
				fireStatus = firetmp->readStatus(firetmp->pinNum);	//读取“火焰传感器”状态
				if(fireStatus == 0){							//“火焰传感器”处于 0状态
					buztmp->open(buztmp->pinNum);				//开启蜂鸣器
				}else if(fireStatus == 1){						//“火焰传感器”处于 1状态
					buztmp->close(buztmp->pinNum);				//关闭蜂鸣器
				}
				delay(1000);                      //有火蜂鸣器响一秒
			}
		}
		firetmp = firetmp->next;
	}

	return 0;
}

fireDetection.c(火焰传感器)

#include "contrlEquipments.h"							//自定义设备类的文件

int fireDetectionInit(int pinNum);				//初始化“火焰传感器”函数声明
int readFireDetectionStatus(int pinNum);		//读取“火焰传感器”状态函数声明


struct Equipment fireDetection = {				//定义火焰传感器(对象)
	.equipName = "fireDetection",				//名字
	.pinNum = 21,								//树莓派 21号(wPi)引脚
	.Init = fireDetectionInit,					//指定初始化函数
	.readStatus = readFireDetectionStatus,		//指定读取“火焰传感器”状态函数
};

int fireDetectionInit(int pinNum)
{
	pinMode(pinNum,INPUT);						//配置引脚为输入模式
	digitalWrite(pinNum,HIGH);					//引脚置高电平,状态为1
}

int readFireDetectionStatus(int pinNum)
{
	return digitalRead(pinNum);					//读取引脚电平,并返回,高电平返回 1,低电平返回 0(有火)
}

struct Equipment *addFireDetectionToEquipmentLink(struct Equipment *phead)		//火焰传感器(对象)加入设备链表函数
{
	if(phead == NULL){
		return &fireDetection;
	}else{
		fireDetection.next = phead;
		phead = &fireDetection;
		return phead;
	}
}

buzzer.c 文件(蜂鸣器)

#include "contrlEquipments.h"							//自定义设备类的文件

int buzzerInit(int pinNum);						//“初始化蜂鸣器”函数声明
int buzzerOpen(int pinNum);						//“开启蜂鸣器”函数声明
int buzzerClose(int pinNum);					//“关闭蜂鸣器”函数声明
struct Equipment *addBuzzerToLink(struct Equipment *phead);
//蜂鸣器(对象)加入设备链表函数声明

struct Equipment buzzer = {						//定义蜂鸣器(对象)
	.equipName = "buzzer",						//名字
	.pinNum = 22,								//树莓派 22号(wpi)引脚
	.Init = buzzerInit,							//指定初始化函数
	.open = buzzerOpen,							//指定“开启蜂鸣器”函数
	.close = buzzerClose,						//指定“关闭蜂鸣器”函数
};

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 Equipment *addBuzzerToEquipmentLink(struct Equipment *phead)		//蜂鸣器(对象)加入设备链表函数
{
	if(phead == NULL){
		return &buzzer;
	}else{
		buzzer.next = phead;
		phead = &buzzer;
		return phead;
	}
}

调试验证

编译运行:
在这里插入图片描述

在这里插入图片描述

往期文章

智能家居 (1) ——智能家居整体功能框架
智能家居 (2) ——设计模式的引入
智能家居 (3) ——工厂模式继电器控制灯
智能家居 (4) ——工厂模式火焰报警
智能家居 (5) —— LD3320语音模块二次开发
智能家居 (6) ——语音识别线程控制
智能家居 (7) ——网络服务器线程控制
智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)
网络编程知识预备(1) ——了解OSI网络模型
网络编程知识预备(2) ——浅显易懂的三次握手与四次挥手
网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系
网络编程知识预备(4) ——了解HTTP协议与HTTPS协议
网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页
智能家居 (9) ——人脸识别摄像头安装实现监控功能
智能家居 (10) ——人脸识别祥云平台编程使用
智能家居 (11) ——树莓派摄像头捕捉人脸并识别
智能家居 (12) ——人脸识别整合到智能家居系统
智能家居 (13) ——智能家居加入手机app端控制

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行稳方能走远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值