ARM+Liunx项目(一)—基于工厂模式的树莓派+Liunx的智能家居系统(2)—第一部分、I/O控制灯(附代码)

上一章完成了框架设计,ARM+Liunx项目(一)—基于工厂模式的树莓派+Liunx的智能家居系统(1)—框架设计

完成的任务

本文章主要完成I/O控制灯的部分,通过四路继电器组,完成对四个地方灯的控制。
在这里插入图片描述

程序

程序分为:

程序分类 名称 功能
主程序 mainPro.c
头文件 inputCommand.h 用于声明指令工厂部分的函数、结构体
contrlDevice.h 用于声明控制工厂部分的函数、结构体
子程序 bathroom.c 浴室灯部分的程序、结构体
livingroom.c 客厅灯部分的程序、结构体
secondfloor.c 二楼灯部分的程序、结构体
Kitchen.c 餐厅灯部分的程序、结构体

注:在实现功能时,需充分发挥工厂模式的优点,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

==在代码编写,只需写好一个部分的灯控程序,其他部分直接ctrl+c\ctrl+v即可。==不明白的同学可以参考设计模式(二)—工厂模式(简单工厂模式)(附代码),这篇文章代码功能简洁,容易理解。

使用的I/O口:

在这里插入图片描述

头文件

inputCommand.h

本部分还未接入语音控制Socket,故使用的是scanf来手动输入指令,所以此处inputCommand.h未使用,后序章节会使用。

contrlDevice.h

#include<wiringPi.h>
#include<stdio.h>
#include<string.h>
/*控制工厂“设备”类声明*/
struct Device{
    
    
/*设备名称*/
	char deviceName[128];
/*设备IO口(wiringPi编码)*/
	int pinNum;
/*设备初始化*/
	int (*deviceInit)(int pinNum);
/*设备打开*/
	int (*deviceOpen)(int pinNum);
/*设备关闭*/
	int (*deviceClose)(int pinNum);
/*设备状态*/
	int deviceStatus;
/*设备状态读取*/
	int (*devicereadStatus)(int pinNum);
/*设备状态改变*/
	int (*devicechangeStatus)(int pinNum,int deviceStatus);
/*指向下一个设备对象*/
	struct Device *next;
};

/*头插法控制工厂链表生成函数声明*/
struct Device *putHeadLinkKitchenLight(struct Device *phead);
struct Device *putHeadLinkSecondroomLight(struct Device *phead);
struct Device *putHeadLinkBathroomLight(struct Device *phead);
struct Device *putHeadLinklivingroomLight(struct Device *phead);

子程序

bathroom.c

#include"contrlDevice.h"
/*浴室灯打开*/
int bathroomLightOpen(int pinNum)
{
    
    
	digitalWrite(pinNum,LOW);
}
/*浴室灯关闭*/
int bathroomLightClose(int pinNum)
{
    
    
	digitalWrite(pinNum,HIGH);
}
/*浴室灯初始化*/
int bathroomLightInit(int pinNum)
{
    
    
	pinMode(pinNum,OUTPUT);
	digitalWrite(pinNum,HIGH);
}
/*浴室灯状态改变(暂未用)*/
int bathroomLightChangeStatus(int pinNum,int deviceStatus)
{
    
    

}
struct Device bathroomLight={
    
    
	.deviceName="bathroomLight",
	.deviceInit=bathroomLightInit,
	.deviceOpen=bathroomLightOpen,
	.deviceClose=bathroomLightClose,
	.devicechangeStatus=bathroomLightChangeStatus,
	.pinNum=23,
	.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinkBathroomLight(struct Device *phead)
{
    
    
	if(phead==NULL){
    
    
		phead=&bathroomLight;
		return phead;
	}else{
    
    
		bathroomLight->next=phead;
		phead=&bathroomLight;
		return phead;
	}
}

livingroom.c

#include"contrlDevice.h"
int livingLightOpen(int pinNum)
{
    
    
	digitalWrite(pinNum,LOW);
}
int livingLightClose(int pinNum)
{
    
    
	digitalWrite(pinNum,HIGH);
}
int livingLightInit(int pinNum)
{
    
    
	pinMode(pinNum,OUTPUT);
	digitalWrite(pinNum,HIGH);
}
int livingLightChangeStatus(int pinNum,int deviceStatus)
{
    
    

}
struct Device livingLight={
    
    
	.deviceName="livingLight",
	.deviceInit=livingLightInit,
	.deviceOpen=livingLightOpen,
	.deviceClose=livingLightClose,
	.devicechangeStatus=livingLightChangeStatus,
	.pinNum=22,
	.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinklivingroomLight(struct Device *phead)
{
    
    
	if(phead==NULL){
    
    
		phead=&livingLight;
		return phead;
	}else{
    
    
		livingLight->next=phead;
		phead=&livingLight;
		return phead;
	}
}

secondfloor.c

#include"contrlDevice.h"
int secondroomLightOpen(int pinNum)
{
    
    
	digitalWrite(pinNum,LOW);
}
int secondroomLightClose(int pinNum)
{
    
    
	digitalWrite(pinNum,HIGH);
}
int secondroomLightInit(int pinNum)
{
    
    
	pinMode(pinNum,OUTPUT);
	digitalWrite(pinNum,HIGH);
}
int secondroomLightChangeStatus(int pinNum,int deviceStatus)
{
    
    

}
struct Device secondroomLight={
    
    
	.deviceName="secondroomLight",
	.deviceInit=secondroomLightInit,
	.deviceOpen=secondroomLightOpen,
	.deviceClose=secondroomLightClose,
	.devicechangeStatus=secondroomLightChangeStatus,
	.pinNum=24,
	.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinkSecondroomLight(struct Device *phead)
{
    
    
	if(phead==NULL){
    
    
		phead=&secondroomLight;
		return phead;
	}else{
    
    
		secondroomLight->next=phead;
		phead=&secondroomLight;
		return phead;
	}
}

Kitchen.c

#include"contrlDevice.h"
int kitchenLightOpen(int pinNum)
{
    
    
	digitalWrite(pinNum,LOW);
}
int kitchenLightClose(int pinNum)
{
    
    
	digitalWrite(pinNum,HIGH);
}
int kitchenLightInit(int pinNum)
{
    
    
	pinMode(pinNum,OUTPUT);
	digitalWrite(pinNum,HIGH);
}
int kitchenLightChangeStatus(int pinNum,int deviceStatus)
{
    
    

}
struct Device kitchenLight={
    
    
	.deviceName="kitchenLight",
	.deviceInit=kitchenLightInit,
	.deviceOpen=kitchenLightOpen,
	.deviceClose=kitchenLightClose,
	.devicechangeStatus=kitchenLightChangeStatus,
	.pinNum=21,
	.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinkKitchenLight(struct Device *phead)
{
    
    
	if(phead==NULL){
    
    
		phead=&kitchenLight;
		return phead;
	}else{
    
    
		kitchenLight->next=phead;
		phead=&kitchenLight;
		return phead;
	}
}

主程序

mainPro.c

#include"inputCommand.h"
#include"contrlDevice.h"
/*根据获取的指令在控制工厂内查找对应的控制对象,成功返回对象结构体地址,失败返回NULL*/
struct Device *findDeviceLinkByName(char *name,struct Device*Head)
{
    
    
	struct Device *tmp=Head;
	if(Head==NULL){
    
    
		printf("linkList is empty!\n");
		return NULL;
	}
	while(tmp!=NULL){
    
    
		if(strcmp(tmp->deviceName,name)==0){
    
    
			printf("Device name:%s\n",tmp->deviceName);
			tmp->deviceInit(tmp->pinNum);
			return tmp;
		}else{
    
    
			tmp=tmp->next;
		}
	}
	return NULL;
}
int main()
{
    
    
	int initflag=0;
	struct Device *tmp=NULL;
	struct Device *pLightHead=NULL;
	char name[16]={
    
    '\0'};
	/*树莓派I/O口初始化*/
	initflag=wiringPiSetup()if(initflag == -1){
    
    
			printf("硬件接口初始化失败\n");
			return -1;
	}
	/*控制工厂链表生成*/
	pLightHead=putHeadLinkKitchenLight(pLightHead);
	pLightHead=putHeadLinkSecondroomLight(pLightHead);
	pLightHead=putHeadLinkBathroomLight(pLightHead);
	pLightHead=putHeadLinklivingroomLight(pLightHead);
	pLightHead=putHeadLinkFireCheck(pLightHead);
	while(1){
    
    
	/*手动输入指令,模拟语音控制、socket,后序章节升级*/
		printf("intput Device name:\n");
		scanf("%s",name);
		/*根据获取的指令在控制工厂内查找对应的控制对象*/
		tmp=findDeviceLinkByName(name,pLightHead);
		/*控制对象执行控制指令*/
		if(tmp!=NULL){
    
    
			tmp->deviceOpen(tmp->pinNum);
			delay(1000);
			tmp->deviceClose(tmp->pinNum);
			delay(1000);
			tmp->deviceOpen(tmp->pinNum);
		}else{
    
    
			printf("NO find input name\n");
		}
	}
	return 0;
}

实验结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44933419/article/details/113801063