
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;}
实验结果:
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月03日 18时12分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
轮播图——旋转木马(Jquery)
2019-03-04
普通平衡树板子
2019-03-04
操作DOM(二):删除节点、、复制节点、替换节点
2019-03-04
刷题笔记--树的遍历
2019-03-04
爬虫(5)—— 获取中国大学排名
2019-03-04
爬虫(4)—— Beautiful Soup
2019-03-04
关于mysql路径下找不到my.ini配置文件
2019-03-04
JavaScript数组(1):定义数组、使用数组
2019-03-04
vue(4):计算属性、监听属性
2019-03-04
vue(7):表单输入绑定
2019-03-04
JSP内置对象:操作cookie、session对象
2019-03-04
vue(8):组件基础(1)
2019-03-04
【数算-27】多路查找树【了解】
2019-03-04
【数算-31】【十大常用算法-03】动态规划算法与背包问题
2019-03-04
【SE-02】多线程-02
2019-03-04
利用PHP编写简单的API接口、Ajax请求php返回代码问题
2019-03-04
vue:项目开发的记录与优化
2019-03-04
Node:模块
2019-03-04
vue(8):组件入门:组件之间的传参
2019-03-04
$set的使用(视图不能实时更新)
2019-03-04