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;
}
实验结果:

在这里插入图片描述

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值