智能家居 ——工厂模式继电器控制灯
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); //“餐厅灯”加入设备链表函数声明
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 ); //“餐厅灯”加入设备链表
struct Equipment *tmp = pequipHead ;
while(tmp != NULL){ //继电器功能测试,打开链表上所有灯
tmp->Init(tmp->pinNum); //先初始化
tmp->open(tmp->pinNum);
tmp = tmp->next;
}
return 0;
}
bathroomLight.c 文件(浴室灯)
#include "contrlEquipments.h" //自定义设备类的文件
int bathroomLightInit(); //初始化继电器函数声明
int bathroomLightOpen(); //“打开灯”函数声明
int bathroomLightClose(); //“关闭灯”函数声明
//struct Equipment *addBathroomLightToEquipmentLink(struct Equipment *phead);
//浴室灯(对象)加入设备链表函数声明
struct Equipment bathroomLight = { //定义浴室灯(对象)
.equipName = "bathroomLight", //名字
.pinNum = 26, //树莓派 26号(wPi)引脚
.Init = bathroomLightInit, //指定初始化函数
.open = bathroomLightOpen, //指定“打开灯”函数
.close = bathroomLightClose //指定“关闭灯”函数
};
int bathroomLightInit(int pinNum) //C语言必须要传参,JAVA不用,可直接访问变量的值
{
pinMode(pinNum,OUTPUT); //配置引脚为输出模式
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
int bathroomLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW); //引脚置低电平,闭合继电器
}
int bathroomLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
struct Equipment *addBathroomLightToEquipmentLink(struct Equipment *phead) //浴室灯(对象)加入设备链表函数
{
if(phead == NULL){
return &bathroomLight;
}else{
bathroomLight.next = phead; //以前的头变成.next
phead = &bathroomLight; //更新头
return phead;
}
}
secondfloorLight.c 文件(二楼灯)
#include "contrlEquipments.h" //自定义设备类的文件
int secondfloorLightInit(); //初始化继电器函数声明
int secondfloorLightOpen(); //“打开灯”函数声明
int secondfloorLightClose(); //“关闭灯”函数声明
//struct Equipment *addSecondfloorLightToLink(struct Equipment *phead);
//二楼灯(对象)加入设备链表函数声明
struct Equipment secondfloorLight = { //定义二楼灯(对象)
.equipName = "secondfloorLight", //名字
.pinNum = 27, //树莓派 22号(wPi)引脚
.Init = secondfloorLightInit, //指定初始化函数
.open = secondfloorLightOpen, //指定“打开灯”函数
.close = secondfloorLightClose, //指定“关闭灯”函数
};
int secondfloorLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT); //配置引脚为输出模式
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
int secondfloorLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW); //引脚置低电平,闭合继电器
}
int secondfloorLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
struct Equipment *addSecondfloorLightToEquipmentLink(struct Equipment *phead) //二楼灯(对象)加入设备链表函数
{
if(phead == NULL){
return &secondfloorLight;
}else{
secondfloorLight.next = phead;
phead = &secondfloorLight;
return phead;
}
}
livingroomLight.c 文件(客厅灯)
#include "contrlEquipments.h" //自定义设备类的文件
int livingroomLightInit(); //初始化继电器函数声明
int livingroomLightOpen(); //“打开灯”函数声明
int livingroomLightClose(); //“关闭灯”函数声明
//struct Equipment *addLivingroomLightToLink(struct Equipment *phead);
//客厅灯(对象)加入设备链表函数声明
struct Equipment livingroomLight = { //定义客厅灯(对象)
.equipName = "livingroomLight", //名字
.pinNum = 28, //树莓派 23号(wPi)引脚
.Init = livingroomLightInit, //指定初始化函数
.open = livingroomLightOpen, //指定“打开灯”函数
.close = livingroomLightClose, //指定“关闭灯”函数
};
int livingroomLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT); //配置引脚为输出模式
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
int livingroomLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW); //引脚置低电平,闭合继电器
}
int livingroomLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
struct Equipment *addLivingroomLightToEquipmentLink(struct Equipment *phead) //客厅灯(对象)加入设备链表函数
{
if(phead == NULL){
return &livingroomLight;
}else{
livingroomLight.next = phead;
phead = &livingroomLight;
return phead;
}
}
restaurantLight.c 文件(餐厅灯)
#include "contrlEquipments.h" //自定义设备类的文件
int restaurantLightInit(); //初始化继电器函数声明
int restaurantLightOpen(); //“打开灯”函数声明
int restaurantLightClose(); //“关闭灯”函数声明
struct Equipment *addRestaurantLightToLink(struct Equipment *phead);
//餐厅灯(对象)加入设备链表函数声明
struct Equipment restaurantLight = { //定义餐厅灯(对象)
.equipName = "restaurantLight", //名字
.pinNum = 29, //树莓派 24号(wPi)引脚
.Init = restaurantLightInit, //指定初始化函数
.open = restaurantLightOpen, //指定“打开灯”函数
.close = restaurantLightClose, //指定“关闭灯”函数
};
int restaurantLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT); //配置引脚为输出模式
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
int restaurantLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW); //引脚置低电平,闭合继电器
}
int restaurantLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}
struct Equipment *addRestaurantLightToEquipmentLink(struct Equipment *phead) //餐厅灯(对象)加入设备链表函数
{
if(phead == NULL){
return &restaurantLight;
}else{
restaurantLight.next = phead;
phead = &restaurantLight;
return phead;
}
}
调试验证
编译运行程序:
由于mainPro.c文件中指定继电器功能测试,打开链表上所有灯,可以发现继电器组全部亮红灯(如下图所示)。也可以将实际的家居灯接入到继电器中实现控制灯光的效果。
往期文章
智能家居 (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) ——人脸识别整合到智能家居系统
以上是关于智能家居 ——工厂模式继电器控制灯的主要内容,如果未能解决你的问题,请参考以下文章