您现在的位置是:首页 >技术交流 >智能家居项目网站首页技术交流
智能家居项目
简介智能家居项目
文章目录
一、功能描述
-
硬件
- 树莓派3b
- 语音模块LD3320(3.3v)
- 安卓手机
- 火焰传感器(3.3v,低电平有效)
- 摄像头
- 4路继电器组(5v,低电平有效)
- 继电器(3.3v,低电平有效)
- 蜂鸣器(3.3或5v,低电平有效)
- 锁(外接电源)
- stm32
- oled屏(5v)
-
实现功能
- 整体:通过手机或语音输入,对外设的控制
- 对灯开关控制:支持回家模式,离家模式
- 人脸识别开锁
- 火灾报警,蜂鸣器响
- 本地oled屏,显示语音播报信息
- app端
- 显示监控画面+火灾报警+cpu温度+灯和锁状态
- 除视频监控外,可实现远程操作(内网穿透)
- 可控制摄像头功能(录像或监控画面显示)
- 守护进程,保证不退出
- 整体:通过手机或语音输入,对外设的控制
-
待实现功能
1. 温度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)
- 语音(串口)
四、守护进程udev
守护智能家居进程(意外退出重启进程)
-
生存周期长[非必须],一般操作系统启动的时候就启动,关闭的时候关闭。
-
守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出
-
守护进程是在后台运行,不会占着终端,终端可以执行其他命令
-
一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程
-
代码演示
#include <unistd.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/stat.h> #include <time.h> #include <stdio.h> #include <stdbool.h> static bool flag = true; void handler(int sig) { printf("I got a signal %d I'm quitting. ", sig); flag = false; } int judMent() { FILE *file; char buffer[128] = {'