【智能家居】二、添加火灾检测模块(烟雾报警功能点)

[可燃气体传感器 MQ-2 和 蜂鸣器](#可燃气体传感器 MQ-2 和 蜂鸣器)
代码段

  • controlDevice.h(设备控制)
  • smokeAlarm.c(烟雾报警器)
  • buzzer.c(蜂鸣器)
  • mainPro.c(主函数)
  • 运行结果

可燃气体传感器 MQ-2 和 蜂鸣器


代码段

controlDevice.h(设备类)

c 复制代码
#include <wiringPi.h>					//wiringPi库
#include <stdio.h>
#include <stdlib.h>
 
struct Devices                          //设备类
{
    char deviceName[128];               //设备名
    int status;                         //状态
    int pinNum;							//引脚号
 
    int (*Init)(int pinNum);			//"初始化设备"函数指针
	int (*open)(int pinNum);			//"打开设备"函数指针
	int (*close)(int pinNum);			//"关闭设备"函数指针
    int (*readStatus)(int pinNum);		//"读取设备状态"函数指针  为火灾报警器准备
	int (*changeStatus)(int status);	//"改变设备状态"函数指针
 
    struct Devices *next;
};
 
struct Devices* addBathroomLightToDeviceLink(struct Devices *phead);		//"浴室灯"加入设备链表函数声明      2
struct Devices* addBedroomLightToDeviceLink(struct Devices *phead);	        //"卧室灯"加入设备链表函数声明      8
struct Devices* addRestaurantLightToDeviceLink(struct Devices *phead);		//"餐厅灯"加入设备链表函数声明      13
struct Devices* addLivingroomLightToDeviceLink(struct Devices *phead);		//"客厅灯"加入设备链表函数声明      16
struct Devices* addSmokeAlarmToDeviceLink(struct Devices *phead);           //"烟雾报警器"加入设备链表函数声明  6
struct Devices* addBuzzerToDeviceLink(struct Devices *phead);		        //"蜂鸣器"加入设备链表函数声明      9

smokeAlarm.c(烟雾报警器)

c 复制代码
#include "controlDevice.h"			        //自定义设备类的文件
 
int smokeAlarmInit(int pinNum)              //C语言必须要传参,JAVA不用,可直接访问变量的值
{
	pinMode(pinNum,INPUT);				    //配置引脚为输入模式
	//digitalWrite(pinNum,HIGH);			//引脚置高电平,断开继电器
}
 
int smokeAlarmReadStatus(int pinNum)
{
	return digitalRead(pinNum);
}
 
int smokeAlarmStatus(int status)
{
	
}
 
struct Devices smokeAlarm = {			//定义烟雾报警器(对象)
	.deviceName = "smokeAlarm",			//名字
	.pinNum = 6,						//香橙派 6号(wPi)引脚
	.Init = smokeAlarmInit,				//指定初始化函数
    .readStatus = smokeAlarmReadStatus,
    .changeStatus = smokeAlarmStatus
};
 
struct Devices* addSmokeAlarmToDeviceLink(struct Devices *phead)		//烟雾报警器(对象)加入设备链表函数
{
	if(phead == NULL){
		return &smokeAlarm;
	}else{
		smokeAlarm.next = phead;  //以前的头变成.next
		phead = &smokeAlarm;      //更新头
		return phead;
	}
}

buzzer.c(蜂鸣器)

c 复制代码
#include "controlDevice.h"			//自定义设备类的文件
 
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 Devices buzzer = {						//定义蜂鸣器(对象)
	.deviceName = "buzzer",						//名字
	.pinNum = 9,								//香橙派 9号(wpi)引脚
	.Init = buzzerInit,							//指定初始化函数
	.open = buzzerOpen,							//指定"开启蜂鸣器"函数
	.close = buzzerClose,						//指定"关闭蜂鸣器"函数
};
 
 
struct Devices* addBuzzerToDeviceLink(struct Devices *phead)		//蜂鸣器(对象)加入设备链表函数
{
	if(phead == NULL){
		return &buzzer;
	}else{
		buzzer.next = phead;
		phead = &buzzer;
		return phead;
	}
}

mainPro.c(主函数)

c 复制代码
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "controlDevice.h"
 
struct Devices* findDeviceByName(char *name, struct Devices *phead)
{
    struct Devices *tmp =phead;
    if(phead == NULL){
        return NULL;
    }else{
        while(tmp != NULL){
            if(strcmp(tmp->deviceName,name)==0){
                return tmp;
            }
            tmp = tmp->next;
        }
        return NULL;
    }
}
 
int main()
{
    char *smokeName = "smokeAlarm";
    char *buzzerName = "buzzer";
    struct Devices *tmp = NULL;
    int smokeStatus;												//存放"烟雾传感器"状态
 
    if (wiringPiSetup () == -1) { 
        fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; 
        return 1 ; 
    }
 
    struct Devices *pdeviceHead = NULL;				                    //定义初始链表头
    //pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);            //"浴室灯"加入设备链表
    //pdeviceHead = addBedroomLightToDeviceLink(pdeviceHead);
    //pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);
    //pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);
    pdeviceHead = addSmokeAlarmToDeviceLink(pdeviceHead);
    pdeviceHead = addBuzzerToDeviceLink(pdeviceHead);
 
    while(1){
        tmp = findDeviceByName(smokeName, pdeviceHead);
        if(tmp != NULL){
            tmp->Init(tmp->pinNum);
            smokeStatus = tmp->readStatus(tmp->pinNum);
            tmp = findDeviceByName(buzzerName, pdeviceHead);
            if(tmp != NULL){
                if( smokeStatus == 0 ){
                    tmp->Init(tmp->pinNum);
                    tmp->open(tmp->pinNum);
                }else{
                    tmp->Init(tmp->pinNum);
                    tmp->close(tmp->pinNum);
                }           
            }
        }
    }
 
    return 0;
}

模块测试

相关推荐
智哪儿5 小时前
龙虾已至,智能家居的“被动响应”时代宣告终结
智能家居·全屋智能·龙虾大会
2601_9555052512 小时前
自然人身份确权可信基础设施赋能多源身份合规
金融·车载系统·智能家居·健康医疗·旅游·教育电商·政务
领麦微红外1 天前
ATT01-从出风口测温到感知头发温度
人工智能·智能家居
TOP品牌榜中榜1 天前
2026年智能门锁功能实测报告:10年用户真实体验下的高频刚需与低频冗余数据
智能家居·#智能门锁
三佛科技-134163842123 天前
腕式血压计方案开发设计,腕式血压计MCU控制芯片选择
单片机·嵌入式硬件·物联网·智能家居
Wireless_Link4 天前
蓝牙+WiFi融合产品深度调研:智能家居网关
智能家居·matter·家庭网关·方案调研
三佛科技-134163842126 天前
LP2601可以用PL3380替代吗?PL3380与LP2601对比分析 (参数、管脚、典型应用电路)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
电子科技圈8 天前
边缘AI赋能物联网,芯科科技推动智能边缘创新
人工智能·嵌入式硬件·物联网·智能家居·健康医疗·智能硬件·交通物流
三佛科技-134163842129 天前
PL3380 (PL338X系列)输出5V100MA非隔离AC-DC降压恒压输出芯片典型应用电路 与LP2601对比
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
三佛科技-1341638421210 天前
AIP8P005B 与FT60E112A(8位I/O型单片机)对比分析,FT60E112A能否兼容替代AIP8P005B?
单片机·嵌入式硬件·物联网·智能家居·pcb工艺