当前位置: 首页 > news >正文

树莓派——智能家居第一步

辛辛苦苦配了成功让树莓派开始工作了,开始搞智能家居!

大体思路:基于工厂模式,分模块来实现

上图分为三部分:主控、外设、控制

主控我采用的是树莓派的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亮了代表继电器接通,到时候接入灯泡就🆗!

相关文章:

树莓派——智能家居第一步

辛辛苦苦配了成功让树莓派开始工作了&#xff0c;开始搞智能家居&#xff01;大体思路&#xff1a;基于工厂模式&#xff0c;分模块来实现上图分为三部分&#xff1a;主控、外设、控制主控我采用的是树莓派的4b4G版本&#xff0c;外设包括四个区域的灯&#xff08;我的和上图有…...

【Golang】Golang基础入门级教程 -- 0基础安装搭建Go语言开发环境

目录 安装和下载GO语言 下载 下载地址 版本的选择 安装 Windows安装 Linux下安装 Mac下安装 检查 GOROOT和GOPATH GOPROXY Go开发编辑器 VS Code介绍 下载与安装 配置 Go扩展 第一个Go程序 Hello World go mod init 编写 编译 VSCode切换默认终端 本篇文章…...

MATLAB | 如何解决实验数据散点图重叠问题(overlap)

本期部分实验效果&#xff1a; 这期讲一下如果数据重合严重该咋办(overlap)&#xff0c;事先说明&#xff0c;本文中的绘图均使用一个几行的简单小代码进行了修饰&#xff1a; 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 项目发布初期&#xff0c;它的部署完全要依靠一堆由社区维护…...

[jS 事件循环理解] 主线程 宏任务 微任务 - 执行顺序优先级理解

最近看了一个帖子 事件循环机制-宏任务-微任务 把js单线程中 , 主线程 | 宏任务 | 微任务 的调用顺序讲解的很直白精巧 , 记录一下以供查阅 1.主线程, 可以理解为从上到下顺序执行的一个js线程 2. 宏任务 script / setTimeOut /setInterval等 3. 微任务主要有promise等 4. 热…...

顺序表和链表的比较

这两个结构各有优势&#xff0c;相辅相成。 顺序表&#xff1a; 优点&#xff1a; 1.支持随机访问。 2.CPU高速缓存命中率更高。(物理空间连续) 缺点&#xff1a; 1.头部和中部插入和删除时间效率低(O(n))。 2.连续的物理空间&#xff0c;空间不够后需要增容&#xff1a…...

Java为什么只能单继承???

目录 先屡清楚继承和实现的区别&#xff1a; 分析原因&#xff1a; 多继承虽然能使子类同时拥有多个父类的特征&#xff0c;但是其缺点也是很显著的&#xff0c;主要有两方面&#xff1a; (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量&#xff0c;子类在引用该…...

数据安全-分类分级 调研分析报告

目录 前言一、数据分类分级概述1.数据分类2.数据分级二、数据分类分级原则三、数据分类分级的框架和方法1.数据分类分级的框架2.分类标准分类常见的方法2.1 MECE2.2 线分法和面分法及混合分法2.3 数据主题域2.4 技术选型维度2.5 以业务应用维度2.6 信息安全隐私方面的分类法3.分…...

浏览器对象详解

文章目录浏览器对象详解一、参考资料二、认识浏览器运行态下的 js1.问&#xff1a;是否了解浏览器的执行态&#xff08;分层设计&#xff09;&#xff1f;2.BOM1.[location](https://developer.mozilla.org/zh-CN/docs/Web/API/Location)拓展方向&#xff1a;2.[History](https…...

异步电路后端实现流程(cdc signOff 后端做什么)

一种后端异步电路的signOff流程同步电路和异步电路分别signOff对于同步电路&#xff0c;后端会分析sta setup/hold&#xff0c;这里不在赘述。在该scenario下 异步电路是不会分析&#xff0c;也不会关注异步电路之间的走线在cdc scenario(mode)下sdc有一下设置&#xff1a;将所…...

Linux网络编程实战介绍

文章目录 前言一、Linux网络编程介绍二、文章目录总结前言 本专栏将为大家讲解Linux网络编程的知识,本专栏只需要有C语言基础即可学习,学习本专栏将大大提高你的C语言水平,当然了我也还会在ARM板子上进行实验将Linux驱动也和网络编程联系起来,方便大家去实现自己的项目。我…...

C++概述 课堂笔记

函数的重载在C语言中函数名是唯一的&#xff0c;不可以重复定义&#xff0c;当我们利用函数执行&#xff0c;功能相似的函数&#xff0c;我们也不能使用同一个函数&#xff0c;比如说&#xff0c;求整型的函数&#xff0c;不能用来求浮点型、字符型。在C中引入函数重载的概念&a…...

一文读懂SpringBoot整合Elasticsearch(一)

&#xff08;本篇文章主要介绍Spring Boot如何整合Elasticsearch&#xff0c;包括基本配置、数据操作、搜索功能等方面。&#xff09; 一、前言 Elasticsearch是一款全文搜索引擎&#xff0c;可用于快速、准确地存储、搜索和分析大量数据。而Spring Boot是一款快速开发框架&a…...

(数论)(枚举)(前缀和)1230. K倍区间

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 1230. K倍区间 - AcWing题库 &#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&…...

万字带你深入理解 Linux 虚拟内存管理(下)

接上文&#xff1a;万字带你深入理解 Linux 虚拟内存管理&#xff08;上&#xff09; 6. 程序编译后的二进制文件如何映射到虚拟内存空间中 经过前边这么多小节的内容介绍&#xff0c;现在我们已经熟悉了进程虚拟内存空间的布局&#xff0c;以及内核如何管理这些虚拟内存区域&…...

【iOS】—— JSONModel源码学习

JSONModel 文章目录JSONModel关于JSONModel的用法initWithDictionary等方法load方法实现load方法调用时机init方法__setup__方法__inspectProperties:方法__doesDictionary方法__importDictionary方法关于JSONModel的用法 可以参考之前写的博客&#xff1a;【iOS】—— JSONMo…...

单片机怎么实现真正的多线程?

所谓多线程都是模拟的&#xff0c;本质都是单线程&#xff0c;因为cpu同一时刻只能执行一段代码。模拟的多线程就是任务之间快速切换&#xff0c;看起来像同时执行的样子。据说最近有多核的单片机&#xff0c;不过成本应该会高很多。对于模拟的多线程&#xff0c;我知道的有两种…...

【LeetCode】剑指 Offer(23)

目录 题目&#xff1a;剑指 Offer 46. 把数字翻译成字符串 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 46. 把…...

[免费专栏] 汽车威胁狩猎之不应该相信的几个威胁狩猎误区

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 汽车威胁狩猎专栏长期更新&#xff0c;本篇最新内容请前往&#xff1a; …...

LinuxFTP文件传输服务和DNS域名解析服务

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

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

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...