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

Posted 八倍体123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派——智能家居第一步相关的知识,希望对你有一定的参考价值。

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

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

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

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

以上是关于树莓派——智能家居第一步的主要内容,如果未能解决你的问题,请参考以下文章

如何用树莓派和Kali Linux搭建便携式的黑客工作站

远程桌面连接树莓派

树莓派小风扇怎么装

使用PyCharm连接树莓派远程编程

怎样通过外网ssh访问树莓派

从零打造树莓派智能助手——让树莓派说话