4月「掘金·日新计划」第28天
一、功能描述
-
硬件
- 树莓派3b
- 语音模块LD3320(3.3v)
- 安卓手机
- 火焰传感器(3.3v,有火焰低电平)
- 摄像头
- 4路继电器组(5v,低电平开)
- 继电器(3.3v,低电平开)
- 蜂鸣器(3.3或5v,低电平开)
- 锁(外接电源)
- stm32
- oled屏(5v)
-
实现功能
-
整体:通过手机或语音输入,对外设的控制
- 对灯开关控制:支持回家模式,离家模式
- 人脸识别开锁
- 火灾报警,蜂鸣器响
- 本地oled屏,显示语音播报信息
- app端显示监控画面+火灾报警+cpu温度+灯和锁状态
- app端除视频监控外,可实现远程操作(内网穿透)
- app端可控制摄像头功能(录像或监控画面显示)
- 守护进程,保证不退出
-
手机APP端
-
显示
- cpu温度
- 火灾信息
- 灯亮灭及锁状态信息
-
控制
- 灯
- 人脸识别开锁
- 监控,录像功能间切换
-
视频监控+录像
-
-
语音
-
显示
- oled屏显示播报信息
-
控制
- 灯
- 人脸识别开锁
-
-
-
内网穿透
- 手机远程控制灯,人脸识别开锁,显示灯及温度报警信息
- 监控视频,视频流穿透未实现
-
待实现功能
- 温度45开风扇降温,50强制杀死进程等待1分钟
二、整体框架结构及编译
2.1、整体框架
- 树莓派作为主控,整合处理输入输出工厂,实现对应功能
2.2、编译Makefile
-
APPlication
-
主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
-
分文件夹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)
-
obj文件下Makefile
# $^ 代表所有的依赖文件 # $@ 代表目标文件 # $< 代表第一个依赖文件 # = 引用此变量时是最后一次赋值 # := 引用变量时使用当前变量值 # ?= 引用变量时,如果变量已被初始化,则不重新赋值,否则重新赋值 # .PHONY TARGET := SmartHome OBJ = $(wildcard *.o) $(PWD_DIR)/SmartHome:$(OBJ) $(CC) -o $@ $^ $(CFLAG)
-
-
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:
-
树状图
├── 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
三、工厂模式
设备输出,控制输入分离(好处是加入新设备方便)
-
设备输出工厂
-
灯
- 客厅灯,livingroomLight
- 泳池灯,swimmingLight
- 浴室灯,bathroomLight
- 卧室灯,restaurantLight
-
蜂鸣器 buzzer
-
串口oled(stm32) oledUart
-
人脸识别 cameraFaceRecognition
- 锁 lock
-
手机APP(温度,火灾检测报警,灯锁状态) socketCpuFire
-
-
控制输入工厂
- 语音(串口) voice
- 手机APP(命令输入) socketServer
- 火灾检测 fireSensor(着火0,正常1)