更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进入--------------》跳转接口
更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进入--------------》跳转接口
目录
- 工厂模式火焰报警部分代码
- contrlEquipments.h 文件(设备类)
- mainPro.c 文件(主函数)
- fireDetection.c(火焰传感器)
- buzzer.c 文件(蜂鸣器)
- 调试验证
- 往期文章
工厂模式火焰报警部分代码
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端控制