树莓派——智能家居第一步
辛辛苦苦配了成功让树莓派开始工作了,开始搞智能家居!
大体思路:基于工厂模式,分模块来实现

上图分为三部分:主控、外设、控制
主控我采用的是树莓派的4b4G版本,外设包括四个区域的灯(我的和上图有略微差异),火灾报警器,摄像头,人脸识别的锁(先实现这么多功能)、控制部分主要有语音控制和网络控制
业务代码采用工厂模式来编写,一个工厂代表一个结构体,结构体的具体对象可以有多种,这样代码更便于管理,代码部分主要包括两个工厂,多个设备和主函数
两个工厂分别是contrlDevices和socket工厂,每个工厂包括一个头文件(定义整个工厂的成员属性)和多个成员,然后通过主函数来调用
注:多个设备放到主函数上采用的是链表的形式
下面先通过实现点亮房间的灯来开启工厂模式的第一步:
一、编辑contrlDevices.h头文件确定该工厂的成员属性
#include <wiringPi.h>//设备在使用的过程当中需要对引脚进行操作,所以要包含此头文件,在这里包含了,设备的.c文件就不需要再包含struct Devices//定义一个名字叫Devices的结构体,属性尽可能全面包含所有设备要用到的属性,可定义不调用
{char devicesName[128];//设备名字int status;//设备状态int pin;//引脚名int (*open)(int pin);//灯的开启函数,注意要用函数指针的形式,因为访问结构体的时候是以访问地址的形式int (*close)(int pin);int (*deviceInit)(int pin);//初始化int (*readStatus)();int (*changeStatus)(int status);struct Devices *next;//链表的下一个链接地址放置位置}struct Devices *addroomLightToDeviceLink(struct Devices *phead);//链表成链方式的函数 二、编辑卧室灯的代码:
#include "contrlDevices.h"//上述的头文件
#include <stddef.h>//NULL的头文件int roomLightOpen(int pin)//具体的卧室灯打开函数
{digitalWrite(pin,LOW);}int roomLightClose(int pin)//关闭函数
{digitalWrite(pin,HIGH);}int roomLightInit(int pin)//初始化函数
{pinMode(pin,OUTPUT);digitalWrite(pin,HIGH);}struct Devices roomLight = {//编辑成员卧室灯的结构体,对Devices结构体内的属性按需写入.devicesName = "roomLight",.pin = 29,.open = roomLightOpen,//注意这里函数的调用不同于一般情况,不需要带括号以及里面的内容.close = roomLightClose,.deviceInit = roomLightInit};//按需的意思是在实现控制灯的功能的过程中需要用到什么东西
struct Devices *addroomLightToDeviceLink(struct Devices *phead)
{//主函数中传入链表头的地址,头插法成链if(phead == NULL){return &roomLight;//如果是第一个,把该设备的结构体地址(该设备的头)放上去作为链表头}else{//如果不是第一个roomLight.next = phead;//原链表头地址传给该设备的nextphead = &roomLight;//链表头重新更换为该设备的结构体地址}
}三、编写主函数:
#include <stdio.h>
#include "contrlDevices.h"
#include <string.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->devicesName,name)==0){//比较设备名称是否等于main中的namereturn tmp;//如果是则返回tmp}tmp = tmp->next;转换到下一个设备判断}return NULL;}}int main()
{char *name = "roomLight";//设备名称if(wiringPiSetup() ==-1){//判断wiringPi库是否初始化成功return -1;//不成功直接退出程序}struct Devices *pdeviceHead = NULL;//设置一个链表头,初始化为空pdeviceHead = addroomLightToDeviceLink(pdeviceHead);调用头插成链函数,把roomLight设备放入链表struct Devices *tmp = findDeviceByName(name,pdeviceHead);定义一个tmp接收判断结果if(tmp != NULL){//如果不为空tmp->deviceInit(tmp->pin);//设备初始化tmp->open(tmp->pin);//设备开启}return 0;
}
编写完成,在树莓派上编译运行:
:gcc main.c roomLight.c -lwiringPi
:./a.out运行结果(未接灯)

这里的继电器1亮了代表继电器接通,到时候接入灯泡就🆗!
相关文章:
树莓派——智能家居第一步
辛辛苦苦配了成功让树莓派开始工作了,开始搞智能家居!大体思路:基于工厂模式,分模块来实现上图分为三部分:主控、外设、控制主控我采用的是树莓派的4b4G版本,外设包括四个区域的灯(我的和上图有…...
【Golang】Golang基础入门级教程 -- 0基础安装搭建Go语言开发环境
目录 安装和下载GO语言 下载 下载地址 版本的选择 安装 Windows安装 Linux下安装 Mac下安装 检查 GOROOT和GOPATH GOPROXY Go开发编辑器 VS Code介绍 下载与安装 配置 Go扩展 第一个Go程序 Hello World go mod init 编写 编译 VSCode切换默认终端 本篇文章…...
MATLAB | 如何解决实验数据散点图重叠问题(overlap)
本期部分实验效果: 这期讲一下如果数据重合严重该咋办(overlap),事先说明,本文中的绘图均使用一个几行的简单小代码进行了修饰: function defualtAxes axgca;hold on;box on ax.XGridon; ax.YGridon; ax.XMinorTickon; ax.YMinor…...
Kubernetes 一键部署利器:kubeadm
文章目录集群部署痛点kubeadm 的工作原理kubeadm init 的工作流程kubeadm join 的工作流程kubeadm 的部署配置参数集群部署痛点 Kubernetes 的部署一直以来都是挡在初学者前面的一只“拦路虎”。尤其是在 Kubernetes 项目发布初期,它的部署完全要依靠一堆由社区维护…...
[jS 事件循环理解] 主线程 宏任务 微任务 - 执行顺序优先级理解
最近看了一个帖子 事件循环机制-宏任务-微任务 把js单线程中 , 主线程 | 宏任务 | 微任务 的调用顺序讲解的很直白精巧 , 记录一下以供查阅 1.主线程, 可以理解为从上到下顺序执行的一个js线程 2. 宏任务 script / setTimeOut /setInterval等 3. 微任务主要有promise等 4. 热…...
顺序表和链表的比较
这两个结构各有优势,相辅相成。 顺序表: 优点: 1.支持随机访问。 2.CPU高速缓存命中率更高。(物理空间连续) 缺点: 1.头部和中部插入和删除时间效率低(O(n))。 2.连续的物理空间,空间不够后需要增容:…...
Java为什么只能单继承???
目录 先屡清楚继承和实现的区别: 分析原因: 多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面: (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该…...
数据安全-分类分级 调研分析报告
目录 前言一、数据分类分级概述1.数据分类2.数据分级二、数据分类分级原则三、数据分类分级的框架和方法1.数据分类分级的框架2.分类标准分类常见的方法2.1 MECE2.2 线分法和面分法及混合分法2.3 数据主题域2.4 技术选型维度2.5 以业务应用维度2.6 信息安全隐私方面的分类法3.分…...
浏览器对象详解
文章目录浏览器对象详解一、参考资料二、认识浏览器运行态下的 js1.问:是否了解浏览器的执行态(分层设计)?2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向:2.[History](https…...
异步电路后端实现流程(cdc signOff 后端做什么)
一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路,后端会分析sta setup/hold,这里不在赘述。在该scenario下 异步电路是不会分析,也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置:将所…...
Linux网络编程实战介绍
文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...
C++概述 课堂笔记
函数的重载在C语言中函数名是唯一的,不可以重复定义,当我们利用函数执行,功能相似的函数,我们也不能使用同一个函数,比如说,求整型的函数,不能用来求浮点型、字符型。在C中引入函数重载的概念&a…...
一文读懂SpringBoot整合Elasticsearch(一)
(本篇文章主要介绍Spring Boot如何整合Elasticsearch,包括基本配置、数据操作、搜索功能等方面。) 一、前言 Elasticsearch是一款全文搜索引擎,可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...
(数论)(枚举)(前缀和)1230. K倍区间
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 ~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水&…...
万字带你深入理解 Linux 虚拟内存管理(下)
接上文:万字带你深入理解 Linux 虚拟内存管理(上) 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍,现在我们已经熟悉了进程虚拟内存空间的布局,以及内核如何管理这些虚拟内存区域&…...
【iOS】—— JSONModel源码学习
JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客:【iOS】—— JSONMo…...
单片机怎么实现真正的多线程?
所谓多线程都是模拟的,本质都是单线程,因为cpu同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换,看起来像同时执行的样子。据说最近有多核的单片机,不过成本应该会高很多。对于模拟的多线程,我知道的有两种…...
【LeetCode】剑指 Offer(23)
目录 题目:剑指 Offer 46. 把数字翻译成字符串 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 46. 把…...
[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 汽车威胁狩猎专栏长期更新,本篇最新内容请前往: …...
LinuxFTP文件传输服务和DNS域名解析服务
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
