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


树莓派读取火焰传感器状态 > 根据状态控制蜂鸣器

fireDetection.c 文件(火焰传感器):

当“火焰传感器”探测到火焰时,DO引脚会输出低电平

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

int fireDetectionInit(int pinNum);				//初始化“火焰传感器”函数声明
int readFireDetectionStatus(int pinNum);		//读取“火焰传感器”状态函数声明
struct Equipment *addFireDetectionToLink(struct Equipment *phead);
//火焰传感器(对象)加入设备链表函数声明

struct Equipment fireDetection = {				//定义火焰传感器(对象)
	.equipName = "fireDetection",				//名字
	.pinNum = 25,								//树莓派 25号(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 *addFireDetectionToLink(struct Equipment *phead)		//火焰传感器(对象)加入设备链表函数
{
	if(phead == NULL){
		return &fireDetection;
	}else{
		fireDetection.next = phead;
		phead = &fireDetection;
		return phead;
	}
}

buzzer.c 文件(蜂鸣器):

#include "equipment.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 = 29,								//树莓派 29号(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 *addBuzzerToLink(struct Equipment *phead)		//蜂鸣器(对象)加入设备链表函数
{
	if(phead == NULL){
		return &buzzer;
	}else{
		buzzer.next = phead;
		phead = &buzzer;
		return phead;
	}
}

equipment.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 *addBathroomLightToLink(struct Equipment *phead);			//“浴室灯”加入设备链表函数声明
struct Equipment *addSecondfloorLightToLink(struct Equipment *phead);		//“二楼灯”加入设备链表函数声明
struct Equipment *addLivingroomLightToLink(struct Equipment *phead);		//“客厅灯”加入设备链表函数声明
struct Equipment *addRestaurantLightToLink(struct Equipment *phead);		//“餐厅灯”加入设备链表函数声明
struct Equipment *addFireDetectionToLink(struct Equipment *phead);			//“火焰传感器”加入设备链表函数声明
struct Equipment *addBuzzerToLink(struct Equipment *phead);					//“蜂鸣器”加入设备链表函数声明

main.c 文件(主函数):

(火焰传感器功能测试)

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

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

	struct Equipment *equiphead = NULL;							//定义初始链表首端
	equiphead = addBathroomLightToLink(equiphead);
	equiphead = addSecondfloorLightToLink(equiphead);
	equiphead = addLivingroomLightToLink(equiphead);
	equiphead = addRestaurantLightToLink(equiphead);
	equiphead = addFireDetectionToLink(equiphead);				//“火焰传感器”加入设备链表
	equiphead = addBuzzerToLink(equiphead);						//“蜂鸣器”加入设备链表

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

	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;
}

往期文章:

智能家居 (1) ——工厂模式继电器控制灯

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~莘莘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值