智能家居(上)

73 阅读2分钟

4月「掘金·日新计划」第28天

一、功能描述

  1. 硬件

    1. 树莓派3b
    2. 语音模块LD3320(3.3v)
    3. 安卓手机
    4. 火焰传感器(3.3v,有火焰低电平)
    5. 摄像头
    6. 4路继电器组(5v,低电平开)
    7. 继电器(3.3v,低电平开)
    8. 蜂鸣器(3.3或5v,低电平开)
    9. 锁(外接电源)
    10. stm32
    11. oled屏(5v)
  2. 实现功能

    1. 整体:通过手机或语音输入,对外设的控制

      1. 对灯开关控制:支持回家模式,离家模式
      2. 人脸识别开锁
      3. 火灾报警,蜂鸣器响
      4. 本地oled屏,显示语音播报信息
      5. app端显示监控画面+火灾报警+cpu温度+灯和锁状态
      6. app端除视频监控外,可实现远程操作(内网穿透)
      7. app端可控制摄像头功能(录像或监控画面显示)
      8. 守护进程,保证不退出
    2. 手机APP端

      1. 显示

        1. cpu温度
        2. 火灾信息
        3. 灯亮灭及锁状态信息
      2. 控制

        1. 人脸识别开锁
        2. 监控,录像功能间切换
      3. 视频监控+录像

    3. 语音

      1. 显示

        1. oled屏显示播报信息
      2. 控制

        1. 人脸识别开锁
  3. 内网穿透

    1. 手机远程控制灯,人脸识别开锁,显示灯及温度报警信息
    2. 监控视频,视频流穿透未实现
  4. 待实现功能

    1. 温度45开风扇降温,50强制杀死进程等待1分钟

二、整体框架结构及编译

2.1、整体框架

  1. 树莓派作为主控,整合处理输入输出工厂,实现对应功能

image.png

2.2、编译Makefile

  1. APPlication

    1. 主Makefile

      .PHONY:all clean
      ##生成:SmarHome(主进程),camera(监控进程),recording(录像进程),daemonsmarthome(守护进程),quit(退出)
      ##
      PWD_DIR    = $(shell pwd)
      OBJ_DIR    = $(PWD_DIR)/obj
      INPUT_DIR  = $(PWD_DIR)/input_factory
      OUTPUT_DIR = $(PWD_DIR)/output_factory
      MAIN_DIR   = $(PWD_DIR)/main
      THREAD_DIR = $(PWD_DIR)/thread
      CAEX_DIR   = $(PWD_DIR)/camera_and_exit
      INC_DIR    = $(PWD_DIR)/include
      INC_WIR    = /home/xw/pi
      INC_CURL   = /home/xw/curl-7.71.1/_install/include
      SO_WIR     = /home/xw/pi
      SO_CURL    = /home/xw/curl-7.71.1/_install/lib
      ​
      ##
      CC = arm-linux-gnueabihf-gcc
      CFLAG = -I $(INC_DIR) -I $(INC_WIR) -I $(INC_CURL) -L $(SO_WIR) -L $(SO_CURL) -lwiringPi -lcurl -pthread
      ​
      ##
      export  PWD_DIR OBJ_DIR INPUT_DIR OUTPUT_DIR MAIN_DIR THREAD_DIR INC_DIR INC_WIR INC_CURL SO_WIR SO_CURL CC CFLAG
      ​
      ##
      all:
          make -C $(MAIN_DIR)
          make -C $(INPUT_DIR)
          make -C $(OUTPUT_DIR)
          make -C $(THREAD_DIR)
          make -C $(OBJ_DIR)
          make -C $(OBJ_DIR)
          make -C $(CAEX_DIR)
      ##
      clean:
          $(RM) -rf $(OBJ_DIR)/*.o
          $(RM) SmartHome
          $(RM) quit
          $(RM) camera
          $(RM) recording
          $(RM) daemonsmarthome
      
    2. 分文件夹Makefile

      .PHONY:all
      ##编译.o文件,放入obj文件夹
      OBJS += $(OBJ_DIR)/bathroomLight.o
      OBJS += $(OBJ_DIR)/livingroomLight.o
      OBJS += $(OBJ_DIR)/restaurantLight.o
      OBJS += $(OBJ_DIR)/swimmingLight.o
      ​
      OBJS += $(OBJ_DIR)/buzzer.o
      OBJS += $(OBJ_DIR)/cameraFaceRecognition.o
      OBJS += $(OBJ_DIR)/lock.o
      OBJS += $(OBJ_DIR)/oledUart.o
      OBJS += $(OBJ_DIR)/socketCpuFire.o
      ​
      all:$(OBJS)$(OBJ_DIR)/%.o:%.c
          $(CC) -c $^ -o $@ $(CFLAG)
      
    3. obj文件下Makefile

      # $^        代表所有的依赖文件
      # $@        代表目标文件  
      # $<        代表第一个依赖文件
      # =         引用此变量时是最后一次赋值
      # :=        引用变量时使用当前变量值
      # ?=        引用变量时,如果变量已被初始化,则不重新赋值,否则重新赋值
      # .PHONY    
       
      TARGET := SmartHome
      ​
      OBJ = $(wildcard *.o)
       
      $(PWD_DIR)/SmartHome:$(OBJ)
          $(CC) -o $@ $^ $(CFLAG)
      
  2. drive

    # 开发板的linux内核的源码树目录
    KERN_DIR = /home/xw/xiaowei/linux-rpi-4.14.y
    ​
    obj-m   += buzzer_lock.o
    obj-m   += light.o
    obj-m   += fire.o
    ​
    all:
        make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 O=output/ -C $(KERN_DIR) M=`pwd` modules 
    .PHONY: clean   
    clean:
    
  3. 树状图

├── APPlication
│   ├── camera_and_exit
│   │   ├── daemonSmartHome.c
│   │   ├── mainMjpg.c
│   │   ├── mainRecording.c
│   │   ├── Makefile
│   │   └── quit.c
│   ├── include
│   │   ├── contrlDevices.h
│   │   ├── inputCommand.h
│   │   ├── smartHomeInit.h
│   │   └── smartHomeTread.h
│   ├── input_factory
│   │   ├── fireSensor.c
│   │   ├── Makefile
│   │   ├── socketContrl.c
│   │   └── voiceContrl.c
│   ├── main
│   │   ├── mainPro.c
│   │   ├── Makefile
│   │   └── smartHomeInit.c
│   ├── Makefile
│   ├── obj
│   │   └── Makefile
│   ├── output_factory
│   │   ├── bathroomLight.c
│   │   ├── buzzer.c
│   │   ├── cameraFaceRecognition.c
│   │   ├── livingroomLight.c
│   │   ├── lock.c
│   │   ├── Makefile
│   │   ├── oledUart.c
│   │   ├── restaurantLight.c
│   │   ├── socketCpuFire.c
│   │   └── swimmingLight.c
│   └── thread
│       ├── appControlThread.c
│       ├── appDisplayThread.c
│       ├── cameraMonitorThread.c
│       ├── cmdFaceHandleThread.c
│       ├── cmdLightHandleThread.c
│       ├── cmdOledHandleThread.c
│       ├── fireThread.c
│       ├── Makefile
│       └── voiceControlThread.c
└── drive
    ├── buzzer_lock.c
    ├── fire.c
    ├── light.c
    └── Makefile

三、工厂模式

设备输出,控制输入分离(好处是加入新设备方便)

image.png

  1. 设备输出工厂

      1. 客厅灯,livingroomLight
      2. 泳池灯,swimmingLight
      3. 浴室灯,bathroomLight
      4. 卧室灯,restaurantLight
    1. 蜂鸣器 buzzer

    2. 串口oled(stm32) oledUart

    3. 人脸识别 cameraFaceRecognition

      1. lock
    4. 手机APP(温度,火灾检测报警,灯锁状态) socketCpuFire

  2. 控制输入工厂

    1. 语音(串口) voice
    2. 手机APP(命令输入) socketServer
    3. 火灾检测 fireSensor(着火0,正常1)