毕业设计| 手把手教你制作智能家居系统
-
本次分享的毕设来自B站up主 一顿晚上饭,用了六篇文章详细的记录了项目设计细节。达尔闻将文章分享给大家,希望可以帮助正在做毕设的同学。文章有点长,值得收藏哦~
终于在2021年毕业了,从2020年11月开始的毕业设计在5月份也答辩完成,大学生活也结束了,在指导老师的帮助下,我的毕业设计及论文评选为校级优秀。现在终于有时间来写一篇比较详细的Arduino uno R3开发板+ESP8266-01s+机智云平台的智能家居开发详解。网上关于成套的智能家居详解少之又少,因此想帮助后面的同学们进行设计!我的设计可能大部分同学看不上,但是可以对一些学校论文检查不算认真,只需要有设计就行的同学省一笔钱233333
在选题之后直接开始面向CSDN编程(bushi),因为智能家居的方向太广,大多数都是基于STM32单片机制作的,也有部分51单片机。但因为选题原因,我需要找到Arduino单片机的例程,关于这一部分又杂又乱,所以我只能把所有看起来有用的东西全部收藏,然后在后面着手制作的时候拿出来看。最后的成品状态如下图:
总而言之呢,我的毕业设计实现了以下几个功能,这几个功能应付一下毕设应该是没问题的:1)在手机端单独控制每个控制端的开关。
2)在手机端查看传感器数据。
3)监测到火焰自动报警、开窗、开门。
4)监测到下雨自动关窗。
5)在进行操作时有声音提示。
6)按键实现在自动模式和手动模式切换的功能。
7)在白天回家开门时自动开门、开窗;在夜晚回家时自动开门、开灯、开窗;离家时自动 关灯、关窗。
8)多种模式选择,包括正常模式、睡觉模式、电影模式、下雨模式、自动模式。
9)自动模式实现传感器与家具联动,根据传感器设置的值自动开关家具。
功能不算很多,也不是很高大上,同时还是有略微的几个bug(毕竟谁不会写bug呢),但是基本运行完全没问题,具有很强的参考意义。
机智云平台的配置
要制作智能家居系统,大家的第一想法就是远程控制,其次就是设备之间的联动。所以要解决远程控制这个问题,有很多方式,比如自己架设服务器、使用平台提供的服务等,对于这一系列教程来说,我们就要使用最简单的方式快速的开发自己的智能家居系统,因此我选择了机智云平台。
选择机智云的原因就是它提供了一系列的服务,就像自动代码生成服务,云端服务等。我们只需要自己设置数据点(硬件的数据范围、名称),它就可以一键生成硬件端的配置代码以及手机APP控制端的源码,可以说是非常方便了。
关于机智云平台的简介我就不在这里多说了,有想深入了解的小伙伴可以自行查阅百度或者机智云开发文档。下面直接进入正题,我的教程全部依照我自己的设计进行讲解。
首先需要注册一个机智云账号:https://www.gizwits.com/,注册之后进入开发者中心,点击创建新产品,进入如下界面并选择:
创建完成后即可自动进入项目管理界面,
左侧工具栏中,基本信息包含了产品名字,产品类型,通讯方式以及Product Key,Product Secret 。数据点是项目中使用到的硬件模块的各种信息,这部分信息需要自己创建数据点,在后续自动生成代码时就会自动把数据的get、set、send生成好,差不多就这个意思。
虚拟设备是模拟调试,数据点创建好之后可以在网页中实时的模拟数据的上传和数据的读取,可以用来判断数据点设置的是否正确。
再到服务一栏,应用配置就是对APP安装包文件的配置,在这里生成一个ios或者安卓的安装应用程序,可以在其中添加QQ\微信登录选项(需要自己去申请api接口key),
应用开发就是生成APP的源码包的地方,这个地方在APP篇会在讲解,最开始调试可以使用机智云提供的默认APP。
MCU开发是这篇需要用到的,自动生成的硬件端代码。
首先对数据点进行配置:
进入数据点一栏后,点击新建数据点,根据自己的设备进行选择,比如说我现在要添加一个LED灯,标识名(自己定)我就填写LED_Bedroom,大家也知道要控制一个LED灯,通常使用1,0表示开和关,因此我们需要设置一个可写的数据点,来写入开关信息,数据类型选择布尔就可以个,只需要ture和false值就好。完成后点击添加,这样我们就添加进了第一个数据点。
接下来我们添加一个光照传感器的数据点,光照传感器的运行模式就是将模块中的光照数值传入开发板中,因此光照传感器的读写类型设为只读即可,数据类型选择数值,经过资料查询发现光照传感器的数值范围为1-65535,分辨率的意思就是保留几位小数,根据光照传感器的最大参数自行设定即可。接下来创建一个枚举类型的数据点,用来设置不同的模式,我在自己的项目中设置了正常模式、睡觉模式、电影模式、下雨模式和自动模式五种模式,用来一键切换。如下:
常用的数据点设置就是这样,根据自己使用的模块设置即可,在数据点主界面可以编辑中文名称,会显示在最后生成的APP中。我的数据点设置如下:
数据点设置完成之后一定要保存,否则刷新会消失。
接下来就可以自动生成代码了,在左侧工具栏选择基本信息,点击显示Product Secret,复制显示出来的代码,再选择左侧工具栏的MCU开发,并将刚才复制的Secret粘贴上,并如下选择:
点击生成代码包,稍等片刻即可下载。此时就可以放一边备用了,关于机智云的配置就结束了。
ESP8266-01S的固件烧录
我们选择了机智云平台,因此我们要给它烧录进相应的固件——Gagent固件,下载地址:
https://download.gizwits.com/zh-cn/p/92/94
下载这个即可。
下载好之后就可以进行烧录的,因为ESP8266-01s并没有USB接口,因此我们需要一个下载器烧录模块,usb转ttl模块,型号为cp2102,长这个样子:
使用时需要下载驱动,这里读者可以自己去搜索安装。同时我们需要下载固件烧录工具,flash_download_tool_v3.8.5,这里读者可以自己去搜索安装。以及需要下载机智云的Gagent_Debugger_v3.2.3软件,用来烧写好后进行调试固件。
https://download.gizwits.com/zh-cn/p/98/119
下面是连线说明,连线不够用可以借助面包板:
USB转TTL的RX连接ESP8266-01s的TX
USB转TTL的TX连接ESP8266-01s的RX
USB转TTL的3v3连接ESP8266-01s的3v3
ESP8266-01s的IO0接地!
ESP8266-01s的EN接高(接到3v3即可)
USB转TTL的GND连接ESP8266-01s的GND
ESP8266的gpio0端口控制着模块的工作模式,GPIO0为低时是下载(烧录)模式,正常时为工作模式,因此烧录完成之后将此线拔掉在上电即可正常工作。
在这里需要注意,ESP8266-01s模块需要非常标准的3.3v供电,千万不要接到非3.3供电接口。
准备工作正式完成,下面我们就可以开始准备烧录固件了,
首先打开下载好的flash_download_tool_v3.8.5,选择Developer Mode:
选择ESP8266 DownloadTool,
打开后如下图选择:第一行中的文件选择刚才下载好的ESP8266-01s的Gagent固件(GAgent_00ESP826_04020034_8MbitUser1_combine),之后将usb转ttl插入电脑,选择好COM端口,点击START就可以烧写了,其中可能烧写失败或者连接失败很多次,可以尝试更换电脑、USB端口、多试几次进行烧写,直到Success为止。
此时固件烧写完成了,下面进行调试:
打开刚才下载的Gagent_Debugger_v3.2.3,转到配置左边的配置框
点击右下角新增,将机智云网页中的 product key 和 product secret 复制进去,
添加成功后选择模拟 mcu 选项卡,
此时可以看到上一篇中添加的数据点在右边显示了出,
此时将ESP8266-01s的IO0线拔掉不要接,再次将USB转TTL模块插入电脑中,在Debugger软件中选择好串口和波特率,点击打开串口,即可进行调试,此时也可以进行网络的连接,但是需要配合机智云平台提供的软件进行网络配置,如果有兴趣的小伙伴可以自己试一下,在后面也会讲。点击左下角的Airlink即可进入网络配置,在机智云的软件中选择添加设备,选择好乐鑫ESP8266即可自动搜索,搜索到就是正常的网络连接信息,填写即可。
ESP8266-01s固件烧录以及配置就完成了。
开发板与模块的连接
首先主控板使用的是Arduino uno R3,无线模块使用的是ESP8266-01s,在前面的文章已经介绍过了,其次就是各种模块了。介绍的所有模块的连接都是按照毕业设计的针脚号进行连接,后面读者可以自己设置针脚自己连接。在初步连接时可以使用面包板验证可行性(就是测试一下能不能运行,并且能不能成功显示数据)。我也会在模块下方贴出我自己在网上找的并且应用的使用代码。
1)DHT11 温湿度传感器模块
3pin,3.3v或者5v供电都可以,中间是数据口,代码中需要设置端口为INPUT,接在D2口。
#include <DHT.h> //这里需要自己下载DHT.h库,并放入 文档/\Arduino\libraries文件夹下
byte DHTPIN = 2; //定义端口
#define DHTTYPE DHT11 //温湿度功能定义
DHT dht(DHTPIN, DHTTYPE); //初始化
//温湿度传感器获取数据
void DHT11_Read_Data(unsigned char * temperature, unsigned char * humidity)
{*temperature = (unsigned char)dht.readTemperature();
*humidity = (unsigned char)dht.readHumidity();
return;
}
2)低电平触发的有源蜂鸣器3pin,接3.3v或者5v都可以,5v更响(没必要2333),中间是数据口,要在代码中设置端口为OUTPUT,并初始化为高电平HIGH,接在D3口。使用代码(ps:使用时记得加延时 ):
#define buzzerIO 3 //定义端口号
digitalWrite(buzzerIO, LOW); //输出低电平,响
digitalWrite(buzzerIO, HIGH; //输出高电平,不向
3)SG90 舵机 360度/180度舵机有360度舵机和180度舵机,360度就是能360度来回转圈,180度只能转到设定的角度。
3pin,红色正极,棕色负极,黄色数据,3.3v和5v都可以带动,但是3.3v会有干扰问题导致360度设定一致时转动圈数不一致,所以建议用5v(因为好像要设计什么滤波电路,我并不会23333)。
360度是模拟窗帘,180度模拟门,360度端口接到D5,180度接到D4。
360度舵机使用代码:
#include <Servo.h> //库文件自行下载
Servo myServo1; //定义舵机1 (180度)
Servo myServo2; //定义舵机2 (360度)
byte posdoor = 0; //180舵机端口
byte poscurtain = 0; //360度舵机端口
setup(){ //初始化函数
myServo1.attach(DoorPin); //设置180度舵机端口
myServo1.write(0); //在180度舵机中:0为0度,里面的参数为度数,设置多少度就会转到多少度。
myServo2.attach(curtainPin); //设置360度舵机端口
myServo2.write(90); //在360度舵机中:参数90为停止,0和180为正反转。
}
myServo2.write(0); // 正转360度舵机
delay(2000); //延时2000ms,此时一直在转动,如果不设置下一条代码就停
myServo2.write(90); //停止转动360度舵机
myServo1.write(120); //180舵机转到120度方向myServo1.write(0); //180度舵机转到0度方向
4)BH1750光照强度传感器
5pin,其中一个没用,接3.3v电源,走的I2C通道(虽然我看了半天没看懂这个协议),SCL接SCL,SDA接SDA,这里要注意接触不良问题,在最后的程序中因为接触不良经常导致整个进程直接卡死,当时找不到原因伤透了脑筋。使用代码:
#include <Wire.h>
#define ADDRESS_BH1750FVI 0x23 //ADDR="L" for this module
#define ONE_TIME_H_RESOLUTION_MODE 0x20byte buff[2];
//光照传感器获取数据
int BH1750_read() {
Wire.beginTransmission(ADDRESS_BH1750FVI); //获取传感器地址Wire.write(ONE_TIME_H_RESOLUTION_MODE); //设置开始模式
Wire.endTransmission();
Wire.requestFrom(ADDRESS_BH1750FVI, 2); //让主机从传感器获取2位字节的数据
highByte = Wire.read(); //获取高位字节
lowByte = Wire.read(); // 获取低位字节
sensorOut = (highByte << 8) | lowByte;illuminance = sensorOut / 1.2;
return illuminance;
}5)雨滴传感器
走的是模拟接口也就是A的那一排,3.3v供电,模块上的D端口可以不接,A0接开发板的A0。使用代码:
#define RainIO A0
//雨滴传感器读取数据
int value = analogRead(RainIO); //value值就是当前的数据
6)火焰传感器3.3v供电,模块的D0接板子的D13,可以调节上面的旋钮来调整灵敏度,调整到打火机在旁边打火时出现警报即可。
使用代码:
#define fireIO 13
int value = digitalRead (fireIO);
当示数为1时,代表检测到火焰,为0时表示没有火焰。7)继电器+风扇
风扇买最小的需要电压最小的即可,同时需要电池盒对风扇进行供电。继电器就是一个电磁开关,有电时闭合,没电时打开。在图中左边是开关接口(或许可以这么说),右边是开发板控制端。
右边需要接开发板,3.3v或5v供电,中间是数据接口,接开发板的D10.
风扇与电池盒串联,在将其中一条线接到继电器左边中间的接口,另一条线接到左边或右边的端口,两个端口区别就是一个是低电平触发一个是高电平触发,可以看作“双开门”的样子。
8)LED灯
LED灯用了三个,分别用作厨房、卧室、客厅的灯光模拟,长腿是正,短腿是负,接反了不亮,同时所有灯我都串联了一个电阻,亲测直接接5v会立即烧坏,所以不管3.3还是5v我都串联了10k电阻。
9)key按键
对角接线,左上角接地,右下角接开发板D12口。
至此接线部分就全部完成了,关于代码部分在这里确实不详细,因为我从网上copy下来的代码在我的程序中多多少少都做了更改,网上也是有完整的运行代码,读者可以自己去搜索。
代码的合并、编写及烧录可以至B站(ID: 一顿晚上饭)查看。
-