ARM+Liunx项目(一)—基于工厂模式的树莓派+Liunx的智能家居系统(2)—第一部分、I/O控制灯(附代码)
发布日期:2021-05-04 19:13:22 浏览次数:36 分类:原创文章

本文共 5692 字,大约阅读时间需要 18 分钟。

上一章完成了框架设计,

完成的任务

本文章主要完成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;}

实验结果:

在这里插入图片描述

上一篇:Liunx树莓派(ARM)开发篇—第十章、ARM平台交叉编译工具链的安装
下一篇:ARM+Liunx项目(一)—基于工厂模式的树莓派+Liunx的智能家居系统(1)—框架设计

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月03日 18时12分16秒