【智能家居】一、工厂模式实现继电器灯控制
用户手册对应的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人力资源管理系统
人力资源管理系统实现对企业人力资源的科学管理。企业有多个部门,每个部门有——名经理和多名员工,公司设置多级岗位,对应不同薪酬标准,员工日常工作进行考勤,岗位变动需要进行登记。系统管理的对象及操作主要有&#…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...