table of Contents:
Raspberry Pi reads the flame sensor status> Control the buzzer according to the status
fireDetection.c file (flame sensor):
When the "flame sensor" detects a flame, the DO pin will output a low level
#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 file (buzzer):
#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 file (equipment class):
#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 file (main function):
(Flame sensor function test)
#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;
}