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

news2024/9/25 19:18:51

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

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

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

主控我采用的是树莓派的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;//原链表头地址传给该设备的next
                phead = &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中的name
                                return 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亮了代表继电器接通,到时候接入灯泡就🆗!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】特征衍生

特征衍生1. 单变量特征衍生1.1 数据重编码1.2 高阶多项式2. 双变量特征衍生2.1 四则运算2.2 多项式衍生2.2.1 导包 & 数据2.2.2 二阶衍生2.2.3 三阶衍生3. 交叉组合3.1 导包 & 数据3.2 生成衍生列和名称3.3 独热编码1. 单变量特征衍生 1.1 数据重编码 连续变量 标准化…

对程序员来说最重要的小事——整洁代码

文章目录为什么要写整洁代码命名名副其实做有意义的区分类名、方法名函数短小只做一件事注释注释类型好注释坏注释格式目的垂直格式横向格式团队规则总结为什么要写整洁代码 现在阅读这篇博客的你不论是刚入行的新人还是开发了很多年的老鸟一定碰到过"祖传代码"&…

【原创】java+swing+mysql户籍管理系统设计与实现

户籍管理系统感觉跟学生管理系统有些类似&#xff0c;一个是对学生进行信息的管理&#xff0c;一个是对社会人员进行信息管理&#xff0c;难度系数基本一样&#xff0c;今天我们就来介绍一下使用javaswing和mysql进行户籍管理系统的开发。 功能分析&#xff1a; 户籍管理&…

【java 8】方法引用与构造器引用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

INT3断点和硬件断点

Ollydbg动态调试的时候需要打一些断点&#xff0c;断点分为INT3断点和硬件断点&#xff0c;本文是区分两个断点的文章。 目录 INT3断点 好处 坏处 硬件断点 原理 优点 缺点 INT3断点 OD中使用F2快捷键设置的断点就是INT3断点 打INT3断点的时候&#xff0c;断点处就会被…

Unity学习笔记--在Editor下实现一个有下拉菜单的文件路径记忆功能(保姆级教程)

目录前言需求分析知识前提一、下拉菜单的实现二、选取对应文件夹路径三、写入到.txt文件完整代码前言 最近需要在Unity编辑器下实现一个面板&#xff0c;有一个下拉菜单&#xff0c;其他人可以往这个下拉菜单里面添加一些文件夹路径&#xff0c;保证下次进来的时候能够直接通过…

Linux SPI-NAND 驱动开发指南

文章目录Linux SPI-NAND 驱动开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员3 流程设计3.1 体系结构3.2 源码结构3.3 关键数据定义3.3.1 flash 设备信息数据结构3.3.2 flash chip 数据结构3.3.3 aw_spinand_chip_request3.3.4 ubi_ec_hdr3.3.5 ubi_vid_hdr3.4 关键接口说…

webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题

webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 文章目录webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题记录个iusse. 插入音频数据后,GetAudioInternal 进行操作决策: Normal&#xff1a;正常播放。 Acceleration&#xff1a;变声不变调的减速播放算法。 Pr…

【学习笔记】互联网金融:芝麻信用分的建模过程

学习资料&#xff1a; 数据分析学习随记 | 互联网金融行业2C授信模型(芝麻信用) 1. 背景 互联网金融的本质是风控。 1.1 数据分析师的角色 数据分析师在金融行业基本上有两种角色&#xff1a; 1.1.1 数据建模师 偏算法&#xff0c;但要很懂业务。要求对算法的理解较深&am…

电子标签播种墙方案

一、PTL优势&#xff1a; 二、系统构架&#xff1a; v1.2基站软件管理系统仓库标签v1.4仓库标签三、基站特点&#xff1a; 接收PC下达的操作指令&#xff0c;解析后再通过RF发送给电子标签 无线通讯距离30m无线通信速率200/50kbps网络通信速率10/100 Mbps自定义双向数据通讯协…

接口测试很难?3分钟带你入门接口自动化测试

1、什么是接口&#xff1f; 接口是连接前台和后台的桥梁&#xff0c;前台通过接口调用后端已完成的功能&#xff0c;而无需关注内部的实现细节。借助于接口&#xff0c;可以实现前后台分离&#xff0c;各自完成开发工作后&#xff0c;进行联调&#xff0c;提高工作效率。 2、接…

开学季电容笔怎么选?学生党高性价比电容笔推荐

或许许多人会认为苹果Pencil是无可取代的&#xff0c;但是我认为这压感取决于我们的预算和需求。要是我们对于绘画没有过高的要求的话&#xff0c;其实可以选择使用平替电容笔&#xff0c;而没必要入手apple pencil。为了让你对电容笔有更多的认识&#xff0c;我接下来推荐几款…

Flutter第三方插件objectbox的使用

Flutter基础 demo地址 参考地址 文章目录Flutter基础前言一、demo效果图二、objectbox是什么&#xff1f;三、objectbox的使用1.在pubspec.yaml文件中添加2.执行flutter pub get命令3.创建数据库模型4.执行flutter pub run build_runner build 命令5.如果报错则执行flutter pu…

Renderdoc中一个daraw的API调用以及其作用

分析renderdoc中一个draw调用的api接口&#xff0c;如下是一个draw调用的渲染api的过程&#xff0c;下面来分析一下这几个函数的作用。 PSSetShaderResources、VSSetShader、PSSetShader这三个方法在renderdoc调用过程使用的方法&#xff0c;这三个方法的做法分别如下&#xff…

【华为OD机试模拟题】用 C++ 实现 - 日志采集系统(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

NMS详解

(类别&#xff0c;坐标1&#xff0c;坐标2&#xff0c;坐标3&#xff0c;坐标4&#xff0c;类别分数) step1&#xff1a;对最后一列分数进行排序 &#xff0c;可以看到类别就被打乱了 step2&#xff1a; 弹出得到selected_bboxes作为基准&#xff0c;减少bbox_list。其实就是准…

寻路库recastnavigation改造

本文是介绍对寻路库recastnavigation 改造&#xff0c;使得使用更加友好。 Git仓库: https://github.com/jiangguilong2000/recastnavigation 首先&#xff0c;我们要做一些前置操作 SDL: 开放源代码的跨平台多媒体开发库 Premake&#xff1a;量跨平台构建系统 环境: VS 2019…

国内知名插画培训机构有哪些,学习插画怎么选培训班

国内知名插画培训机构有哪些&#xff1f;给大家梳理了国内5家专业的插画师培训班&#xff0c;最新无大插画班排行榜&#xff0c;各有优势和特色&#xff01; 一&#xff1a;国内知名插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画…

Linux 计划任务讲解

目录 计划任务 一次性计划任务 长期性计划任务 计划任务 管理员可以编辑自己的和普通用户的计划任务 普通用户只可以编辑自己的计划任务 计划任务根据执行方式分为一次性计划任务、长期性计划任务 一次性计划任务 此计划只执行一次&#xff0c;执行后或就不会再执行了 通…

项目管理之三点估算(正态分布)

三点估算法主要来自于项目的计划评审技术 PERT&#xff0c;能评估时间与概率的关系。 三点估算法不仅可以用于定量风险分析&#xff0c;也可用于进度管理中活动历时估算。先记住几个概念&#xff1a;最乐观时间TO&#xff1a;完成该工作最少需要的时间&#xff1b;最悲观时间TP…