【智能家居】一、工厂模式实现继电器灯控制
用户手册对应的I/O
工厂模式实现继电器灯控制
代码段
- controlDevice.h(设备设备)
- main.c(主函数)
- bathroomLight.c(浴室灯)
- bedroomLight.c(卧室灯)
- restaurantLight.c(餐厅灯)
- livingroomLight.c(客厅灯)
- 编译
- 运行结果
用户手册对应的I/O


工厂模式实现继电器灯控制


代码段
controlDevice.h(设备类)
#include <wiringPi.h> //wiringPi库
#include <stdio.h>
#include <stdlib.h>struct Devices //设备类
{char deviceName[128]; //设备名int status; //状态int pinNum; //引脚号int (*Init)(int pinNum); //“初始化设备”函数指针int (*open)(int pinNum); //“打开设备”函数指针int (*close)(int pinNum); //“关闭设备”函数指针int (*readStatus)(int pinNum); //“读取设备状态”函数指针 为火灾报警器准备int (*changeStatus)(int status); //“改变设备状态”函数指针struct Devices *next;
};struct Devices* addBathroomLightToDeviceLink(struct Devices *phead); //“浴室灯”加入设备链表函数声明 2
struct Devices* addBedroomLightToDeviceLink(struct Devices *phead); //“卧室灯”加入设备链表函数声明 8
struct Devices* addRestaurantLightToDeviceLink(struct Devices *phead); //“餐厅灯”加入设备链表函数声明 13
struct Devices* addLivingroomLightToDeviceLink(struct Devices *phead); //“客厅灯”加入设备链表函数声明 16
main.c(主函数)
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "controlDevice.h"// 按名称查找设备
struct Devices *findDeviceByName(char *name, struct Devices *phead)
{struct Devices *tmp =phead;if (phead == NULL) {return NULL;}else {while (tmp != NULL) {if (strcmp(tmp->deviceName,name)==0) {return tmp;}tmp = tmp->next;}return NULL;}
}int main()
{char name[128];struct Devices *tmp = NULL;// 初始化wiringPi库if (wiringPiSetup() == -1) {fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));return 1;}// 定义初始设备链表头struct Devices *pdeviceHead = NULL;// “浴室灯”加入设备链表pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);// “卧室灯”加入设备链表pdeviceHead = addBedroomLightToDeviceLink(pdeviceHead);// “餐厅灯”加入设备链表pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead);// “客厅灯”加入设备链表pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead);// 无限循环,接受用户输入while (1){printf("Input:\n");scanf("%s", name);tmp = findDeviceByName(name, pdeviceHead);// 如果找到设备if (tmp != NULL) {tmp->Init(tmp->pinNum); // 先初始化tmp->open(tmp->pinNum); // 打开设备}}return 0;
}
bathroomLight.c(浴室灯)
#include "controlDevice.h" //自定义设备类的文件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); //引脚置高电平,断开继电器
}int bathroomLightStatus(int status)
{}struct Devices bathroomLight = { //定义浴室灯(对象).deviceName = "bathroomLight", //名字.pinNum = 2, //香橙派 2号(wPi)引脚.Init = bathroomLightInit, //指定初始化函数.open = bathroomLightOpen, //指定“打开灯”函数.close = bathroomLightClose, //指定“关闭灯”函数.changeStatus = bathroomLightStatus
};struct Devices* addBathroomLightToDeviceLink(struct Devices *phead) //浴室灯(对象)加入设备链表函数
{if (phead == NULL) {return &bathroomLight;}else {bathroomLight.next = phead; //以前的头变成.nextphead = &bathroomLight; //更新头return phead;}
}
bedroomLight.c(卧室灯)
#include "controlDevice.h"int bedroomLightInit(int pinNum) //C语言必须要传参,JAVA不用,可直接访问变量的值
{pinMode(pinNum,OUTPUT); //配置引脚为输出模式digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}int bedroomLightOpen(int pinNum)
{digitalWrite(pinNum,LOW); //引脚置低电平,闭合继电器
}int bedroomLightClose(int pinNum)
{digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}int bedroomLightStatus(int status)
{}struct Devices bedroomLight = { //定义卧室灯(对象).deviceName = "bedroomLight", //名字.pinNum = 8, //香橙派 8号(wPi)引脚.Init = bedroomLightInit, //指定初始化函数.open = bedroomLightOpen, //指定“打开灯”函数.close = bedroomLightClose, //指定“关闭灯”函数.changeStatus = bedroomLightStatus
};struct Devices* addBedroomLightToDeviceLink(struct Devices *phead) //卧室灯(对象)加入设备链表函数
{if (phead == NULL) {return &bedroomLight;}else {bedroomLight.next = phead; //以前的头变成.nextphead = &bedroomLight; //更新头return phead;}
}
restaurantLight.c(餐厅灯)
#include "controlDevice.h" //自定义设备类的文件int restaurantLightInit(int pinNum) //C语言必须要传参,JAVA不用,可直接访问变量的值
{pinMode(pinNum,OUTPUT); //配置引脚为输出模式digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}int restaurantLightOpen(int pinNum)
{digitalWrite(pinNum,LOW); //引脚置低电平,闭合继电器
}int restaurantLightClose(int pinNum)
{digitalWrite(pinNum,HIGH); //引脚置高电平,断开继电器
}int restaurantLightStatus(int status)
{}struct Devices restaurantLight = { //定义餐厅灯(对象).deviceName = "restaurantLight", //名字.pinNum = 13, //香橙派 13号(wPi)引脚.Init = restaurantLightInit, //指定初始化函数.open = restaurantLightOpen, //指定“打开灯”函数.close = restaurantLightClose, //指定“关闭灯”函数.changeStatus = restaurantLightStatus
};struct Devices* addRestaurantLightToDeviceLink(struct Devices *phead) //餐厅灯(对象)加入设备链表函数
{if (phead == NULL) {return &restaurantLight;}else {restaurantLight.next = phead; //以前的头变成.nextphead = &restaurantLight; //更新头return phead;}
}
livingroomLight.c(客厅灯)
#include "controlDevice.h" //自定义设备类的文件int livingroomLightInit(int pinNum) // C语言必须要传参,JAVA不用,可直接访问变量的值
{pinMode(pinNum, OUTPUT); // 配置引脚为输出模式digitalWrite(pinNum, HIGH); // 引脚置高电平,断开继电器
}int livingroomLightOpen(int pinNum)
{digitalWrite(pinNum, LOW); // 引脚置低电平,闭合继电器
}int livingroomLightClose(int pinNum)
{digitalWrite(pinNum, HIGH); // 引脚置高电平,断开继电器
}int livingroomLightStatus(int status)
{
}struct Devices livingroomLight = { // 定义客厅灯(对象).deviceName = "livingroomLight", // 名字.pinNum = 16, // 香橙派 16号(wPi)引脚.Init = livingroomLightInit, // 指定初始化函数.open = livingroomLightOpen, // 指定“打开灯”函数.close = livingroomLightClose, // 指定“关闭灯”函数.changeStatus = livingroomLightStatus};struct Devices *addLivingroomLightToDeviceLink(struct Devices *phead) // 客厅灯(对象)加入设备链表函数
{if (phead == NULL) {return &livingroomLight;}else {livingroomLight.next = phead; // 以前的头变成.nextphead = &livingroomLight; // 更新头return phead;}
}
编译
gcc *.c -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt

运行结果


相关文章:
【智能家居】一、工厂模式实现继电器灯控制
用户手册对应的I/O 工厂模式实现继电器灯控制 代码段 controlDevice.h(设备设备)main.c(主函数)bathroomLight.c(浴室灯)bedroomLight.c(卧室灯)restaurantLight.c(餐厅…...
第三节:提供者、消费者、Eureka
一、 提供者 消费者(就是个说法、定义,以防别人叭叭时听不懂) 服务提供者:业务中被其他微服务调用的服务。(提供接口给其他服务调用)服务消费者:业务中调用其他微服务的服务。(调用…...
Leetcode刷题详解——等差数列划分
1. 题目链接:413. 等差数列划分 2. 题目描述: 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 …...
导出主机上所有docker 镜像并导入到其它主机
保存镜像列表到文件 docker images --format “{{.Repository}}:{{.Tag}}” > image_list.txt 导出列表中所有镜像到tar文件 cat image_list.txt | xargs -L 1 docker save -o all_images.tar 导入tar包中所有镜像 docker load -i all_images.tar...
HTML5+CSS3+JS小实例:焦点图波浪切换动画特效
实例:焦点图波浪切换动画特效 技术栈:HTML+CSS+JS 字体图标库:Font Awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name=&…...
Mac电脑如何安装git
一、简介 在Mac上安装Git之前,可以先使用git --version来查看一下是否安装了Git,因为Mac系统可能自带了Git,或者在你安装XCode(或者XCode的命令行工具)时,可能已经安装了 Git。 如果Mac还没有安装Git的话&…...
macOS本地调试k8s源码
目录 准备工作创建集群注意点1. kubeconfig未正常加载2. container runtime is not running3. The connection to the server 172.16.190.132:6443 was refused - did you specify the right host or port?4. 集群重置5.加入子节点 代码调试 准备工作 apple m1芯片 安装vmwa…...
JS 实现一键复制文本内容
1、演示: 2、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一键复制</title&g…...
【Linux】echo命令使用
echo命令 功能是在显示器上显示一段文字,一般起到一个提示的作用。此外,也可以直接在文件中写入要写的内容。也可以用于脚本编程时显示某一个变量的值,或者直接输出指定的字符串。 著者 由布莱恩福克斯和切特拉米撰写。 语法 echo […...
Day03 嵌入式---中断
目录 一、简单介绍 二、总体框架 三、NVIC 3.2 NVIC的寄存器 3.3 中断向量表 3.4 中断优先级 3.5 NVIC优先级分组 3.6 NVIC配置 3.6.1、设置中断分组 3.6.2、初始化 四、EXTI 外部中断 4.1.EXTI的基本概念 4.2.EXTI的⼯作原理 4.3 EXTI配置 五、SYSCFG 5.1 SYS…...
wpf devexpress 使用IDataErrorInfo实现input验证
此处下载源码 当form初始化显示,Register按钮应该启动和没有输入错误应该显示。如果用户点击注册按钮在特定的输入无效数据,form将显示输入错误和禁用的注册按钮。实现逻辑在标准的IDataErrorInfo接口。请查阅IDataErrorInfo接口(System.Com…...
shell_81.Linux在命令行中创建使用函数
在命令行中使用函数 在命令行中创建函数 两种方法 单行方式来定义函数: $ function divem { echo $[ $1 / $2 ]; } $ divem 100 5 20 $ 当你在命令行中定义函数时,必须在每个命令后面加个分号,这样 shell 就能知道哪里是命令的起止了&am…...
鱼香ROS一键安装命令(支持微信、docker、ros等)
按照指定的数字选择即可。 wget http://fishros.com/install -O fishros && . fishros小鱼的一键安装系列 [14个ROS版本任你选]一键安装Docker使用指南...
深入理解 Go 函数:从基础到高级
一、函数基础 1、函数定义 函数是组织好的、可重复使用的、用于执行指定任务的代码块Go 语言中支持:函数、匿名函数和闭包 package mainimport "fmt"func main(){ret : intSum(1,2)fmt.PrintIn(ret) //3 }func instSum(x,y int) int {return x y }…...
开启三层交换机DHCP服务
二层交换机上不需要配置任何东西,只需要在pc机上开启dhcp服务,配置好LSW1后就可以自动获取到IP地址。 sys Enter system view, return user view with CtrlZ. [Huawei]sys sw1 [sw1]dhcp enable Info: The operation may take a few seconds. Please wai…...
jspdf+html2canvas浏览器缩放问题
之前在弄页面导出为pdf的时候,jspdf配合html2canvas貌似很好用,我自己在使用的时候也没有觉得有什么问题,但是客户那边反馈说下载下来的pdf不全. 后来问了客户才发现客户的浏览器比例缩放到了125%;这就导致了pdf不全, 先看看原来的代码: download() {let jsPDF jspdf.jsPDF;l…...
西南科技大学模拟电子技术实验六(BJT电压串联负反馈放大电路)预习报告
一、计算/设计过程 BJT电压串联负反馈放大电路图1-1-1-1为BJT电压串联负反馈放大实验电路,若需稳定输出电压,减小从信号源所取电流,可引入电压串联负反馈闭合开关。 图1-1-1-1 理论算法公式(1)闭环电压放大倍数 (2)反馈系数 (3)输入电阻 (4)输出电阻 计算过程。开环…...
JS的监听事件
在JavaScript中,你可以使用监听器来捕获和处理不同类型的事件。通过添加事件监听器,你可以指定当特定事件发生时要执行的函数。 以下是几种常见的监听事件的方法: 1. addEventListener():用于在目标元素上添加事件监听器。它接受…...
JS Object.values()
一、官方定义 返回一个给定对象的自有可枚举字符串键属性值组成的数组 二、语法 Object.values(obj)参数 obj 被返回可枚举属性值的对象。返回值 一个包含对象自身的所有可枚举属性值的数组。描述 Object.values() 返回一个数组,其元素是在对象上找到的可枚举…...
基于Java SSM人力资源管理系统
人力资源管理系统实现对企业人力资源的科学管理。企业有多个部门,每个部门有——名经理和多名员工,公司设置多级岗位,对应不同薪酬标准,员工日常工作进行考勤,岗位变动需要进行登记。系统管理的对象及操作主要有&#…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
