智能家居 ——工厂模式火焰报警器
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能家居 ——工厂模式火焰报警器相关的知识,希望对你有一定的参考价值。
目录
工厂模式火焰报警部分代码
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) ——内容整合(网络TCP、语音控制灯,火灾报警系统)
网络编程知识预备(1) ——了解OSI网络模型
网络编程知识预备(2) ——浅显易懂的三次握手与四次挥手
网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系
网络编程知识预备(4) ——了解HTTP协议与HTTPS协议
网络编程知识预备(5) ——libcurl库简介及其编程使用
智能家居 (9) ——人脸识别摄像头安装实现监控功能
智能家居 (10) ——人脸识别祥云平台编程使用
智能家居 (11) ——树莓派摄像头捕捉人脸并识别
智能家居 (12) ——人脸识别整合到智能家居系统
以上是关于智能家居 ——工厂模式火焰报警器的主要内容,如果未能解决你的问题,请参考以下文章