1.效果展示
可实现的功能:
- 温湿度测量+OLED显示+手机显示
- 检测火焰+OLED提醒+手机显示+蜂鸣器报警提示
- 手机控制开启小风扇(模拟空调),也可根据需求设置成温度过高过低时开启
- 一个为了凑数的控制开灯功能
2.前置准备
2.1 购买清单
硬件:
- ESP8266开发板
- 杜邦线若干
- 火焰传感器
- 继电器
- Dht11温湿度传感器
- OLED(不必须)
- 蜂鸣器
- 小风扇
- 面包板
- 数据线一条(是数据线!不是普通用的那种安卓充电线!)
软件:
- Arduino(电脑)
- Blinker(手机)
2.2 驱动安装+Arduino的配置
Arduino IDE基础配置具体内容可参考以下文章,写的很详细
https://blog.csdn.net/weixin_36193839/article/details/113070306
基础配置完毕后我们还需要在Arudino中添加一些要用到的库文件,在工具→管理库弹出的框中输入blinker并安装
同理,分别搜索dht(温湿度检测所用库)和u8g2(OLED模块所用库,如果不需要此功能的可以不添加)
2.3 Blinker的配置
在软件商城或百度搜索Blinker并下载
下载完成后打开Blinker,点击右上角的+新建设备
选择独立设备
选择右下角的网络接入
会自动生成密钥,这串数字很重要以后会用到
点击返回设备后一个新设备就创建完成了,如果上面的密钥没记住可以在右上角圆圈中随时查看
点击右上角可以开启编辑模式,在编辑模式中可以自定义一些需要的组件
注意:组件名称接下来会用,建议起一些自己能看懂的名称
还可以自定义界面的背景之类的,自定义完成后如下图所示:
不想自己做界面的同学可以直接用我定义的界面,在设置→界面设计中可以直接粘贴代码
已经定义好的同学直接忽略此步骤
配置代码如下:
{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/f1.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨空调已关闭¨¨t1¨¨文本2¨¨bg¨Ì¨cols¨Í¨rows¨Í¨key¨¨btn-door¨´x´Í´y´É¨lstyle¨Ë}{ßCßDßEßFßGÊßH¨灯已关闭¨ßJßKßLÌßMÍßNÍßO¨btn-light¨´x´É´y´ÉßQË}{ßC¨num¨ßH¨温度¨ßE¨fal fa-question¨¨clr¨¨#389BEE¨¨min¨É¨max¨¢1c¨uni¨´℃´ßLÉßMÍßNÍßO¨num-temp¨´x´É´y´ÎßQÎ}{ßCßTßH¨湿度¨ßEßVßWßXßYÉßZº0ßa´%´ßLÉßMÍßNÍßO¨num-humi¨´x´Í´y´ÎßQÎ}{ßC¨deb¨ßGÉßLÉßMÑßNÌßO¨debug¨´x´É´y´¤D}{ßC¨tex¨ßH¨没有明火出现¨ßJ´´¨size¨¤EßLÉßE¨fad fa-fire-alt¨ßMÑßNËßO¨tex-fire¨´x´É´y´¤AßQÏßW¨#00A90C¨}÷¨actions¨|÷¨triggers¨|÷¨rt¨|÷}
以上,基础配置就完成了,可以正式开始硬件设计部分了。
3. 硬件连线
ESP8266引脚说明如下图
因为要接的东西比较多,建议配块面包板一起食用~
面包板主要分为两种孔,一种是纵向孔,一种是横向孔。
如图所示,红色区域圈起来的五个孔就是一组纵向孔,他们内部是联通的,也就是他们五个之间是有导体相连的,可以导电。
绿色区域圈住的孔。整个一横排孔(一横排的蓝或一横排的红)的内部,都是联通的。通常我们用蓝线的孔连接地线(电压为0),用红线连接电源(电压为5V或3.3V)。
仪器 | 管脚 |
---|---|
继电器-IN | D0 |
温湿度传感器-DATA | D5 |
蜂鸣器-I/O | D6 |
火焰传感器-AO | A0 |
火焰传感器-DO | D7 |
OLED-SCL | D1 |
OLED-SDA | D2 |
GND | GND |
VCC | 3V |
风扇的接法如图:
4. 代码部分
4.1 绑定Blinker
char auth[] = "xxxxxxxx";
char ssid[] = "111";//WiFi用户名
char pswd[] = "123456789";//WiFi密码
注意,如果用手机热点记得在设置里将AP频段调成2.4Ghz
下面是组件的绑定
括号里的名称是之前在blinker里定义的组件名称
/***************************** Blinker组件 **************************************/
BlinkerButton Button1("btn-door");
BlinkerButton Button2("btn-light");
BlinkerNumber HUMI("num-humi"); //定义湿度数据键名
BlinkerNumber TEMP("num-temp"); //定义温度数据键名
BlinkerText Fire("tex-fire"); //定义火焰检测键名
/**********************************************************************************/
4.2 代码
直接附上源码,按照代码里的注释操作即可。文章来源:https://www.toymoban.com/news/detail-538995.html
#include <Arduino.h>
#include <DHT.h> //dht11库
#include <U8g2lib.h> //u8g2库
#include <SoftwareSerial.h> //软串口
#include <Blinker.h> //blinker库
#include <Servo.h>
#define BLINKER_WIFI
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,SCL,SDA); //配置构造函数
/***************************** WIFI账号密码 **************************************/
char auth[] = "1ea39f22dca6";
char ssid[] = "111";//WiFi用户名
char pswd[] = "123456789";//WiFi密码
/**********************************************************************************/
/***************************** Blinker组件 **************************************/
BlinkerButton Button1("btn-door");
BlinkerButton Button2("btn-light");
BlinkerNumber HUMI("num-humi"); //定义湿度数据键名
BlinkerNumber TEMP("num-temp"); //定义温度数据键名
BlinkerText Fire("tex-fire"); //定义火焰检测键名
/**********************************************************************************/
/******************** 继电器(空调) **********************/
int jidianqi=16; //定义继电器的引脚
void button1_callback(const String & state) {
BLINKER_LOG("状态: ", state);
if (state=="on") {
digitalWrite(jidianqi, HIGH);
Button1.color("#90EE90"); //1#按钮按下时,app按键颜色状态显示是绿色
// 反馈开关状态
Button1.text("空调已开启");
Button1.print("on");
BLINKER_LOG ("1#空调已开启on"); //串口打印
} else if(state=="off"){
digitalWrite(jidianqi, LOW);
Button1.color("#F08080"); 2#按钮没有按下时,app按键颜色状态显示是红色
// 反馈开关状态
Button1.text("空调已关闭");
Button1.print("off");
BLINKER_LOG ("1#空调已关off");
}
delay(1000);
}
/***************************************************************/
/******************** 温湿度传感器 **********************/
#define DHTTYPE DHT11 //定义类型DHT dht(DHTPIN,DHTTYPE);//进行初始化设
#define DHTPIN 14 //定义14号引脚
DHT dht(DHTPIN,DHTTYPE); //进行初始化设置
float humi_read = 0, temp_read = 0;//定义浮点型全局变量 储存传感器读取的温湿度数据
void dht11(){
float h = dht.readHumidity();//读取DHT11传感器的湿度 并赋值给h
float t = dht.readTemperature();//读取传感器的温度 并赋值给t
//打印
BLINKER_LOG("Humidity: ", h, " %");
BLINKER_LOG("Temperature: ", t, " *C");
humi_read = h; //将读取到的湿度赋值给全局变量humi_read
temp_read = t; //将读取到的温度赋值给全局变量temp_read
if(temp_read > 30)
{
digitalWrite(jidianqi,HIGH);//打开空调降低温度
delay(1000);
}
else {
digitalWrite(jidianqi,LOW);//关闭空调
delay(1000);
}
delay(1000); //延时
}
/***************************************************************/
/***************************灯*********************************************/
void button2_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
if (state=="on") {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Button2.color("#90EE90"); //1#按钮按下时,app按键颜色状态显示是绿色
// 反馈开关状态
Button2.text("灯已开启");
Button2.print("on");
BLINKER_LOG ("1#灯已开启on"); //串口打印
} else if(state=="off"){
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
Button2.color("#F08080"); 2#按钮没有按下时,app按键颜色状态显示是红色
// 反馈开关状态
Button2.text("灯已关闭");
Button2.print("off");
BLINKER_LOG ("1#灯已关off");
}
delay(1000);
}
/***************************火焰传感器及蜂鸣器*********************************************/
int buzzer =12; //定义蜂鸣器引脚
void fire(){
int i=analogRead(A0);
Serial.println(i,10);
delay(1000);
if(i<=800){
digitalWrite(buzzer,HIGH);
Fire.print("有明火出现");
Fire.color("#F08080");
delay(1000);
}
else {
digitalWrite(buzzer,LOW);
Fire.print("没有明火出现");
Fire.color("#90EE90");
delay(1000);
}
}
void heartbeat() //心跳包
{
HUMI.print(humi_read);
TEMP.print(temp_read);
}
/**********************************************************************************/
/***************************OLED*********************************************/
void OLED()
{
delay(1000);//延时
float h = dht.readHumidity();//读湿度
float t = dht.readTemperature();//读湿度
float f = analogRead(A0);//读酒精
char c[10];
dtostrf(t,1,2,c); //float 转换成char
char d[10];
dtostrf(h,1,2,d);
u8g2.clearBuffer(); //清空显示屏缓存
u8g2.setFont(u8g2_font_open_iconic_human_2x_t); //设置英文字体
u8g2.setFont(u8g2_font_unifont_t_chinese2); //设置字体
u8g2.drawUTF8(2,15,"wendu:"); //显示文字
u8g2.drawUTF8(70,15,c); //显示文字
u8g2.drawUTF8(2,35,"shidu:"); //显示文字
u8g2.drawUTF8(70,35,d); //显示文字
if(f<=800){
u8g2.drawUTF8(2,55,"warning: fire!!!!"); //显示文字
}
else{
u8g2.drawUTF8(30,55,"no fire"); //显示文字
}
u8g2.sendBuffer(); //加载以上内容
}
/**********************************************************************************/
//初始化
void setup()
{
/******************************u8g2******************************************/
u8g2.begin(); //启动u8g2驱动程序
u8g2.clearBuffer(); //清空显示屏缓存
dht.begin();//DHT开始工作
/************************************************************************/
// 初始化串口,并开启调试信息
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
//初始化蜂鸣器
pinMode(buzzer,OUTPUT);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
//将传感器获取的数据传给blinker app上
Blinker.attachHeartbeat(heartbeat);
dht.begin();//初始化DHT传感器
//在回调函数中反馈该控制状态
pinMode(jidianqi,OUTPUT);
digitalWrite(jidianqi,LOW);
}
void loop()
{
OLED(); //调用函数,显示图案
delay(1000); //持续一秒钟
Blinker.run();
dht11();
fire();
}
5.0 总结
一个之前在学校里做的小demo,算是自己在啥也不懂的阶段上自己慢慢摸索出来的一个小东西了,当时在CSDN上查了很多资料也看了很多教程,但大多数的资料并不是特别完整,所以出了一篇很详细的教程(要是自己当时能看见一些这样的资料也不会像无头苍蝇乱转了),希望能帮助到一些同样啥也不会的同学~
有问题可以私聊问我~文章来源地址https://www.toymoban.com/news/detail-538995.html
到了这里,关于基于Arudino+Esp8266+Blinker实现简易智能家居的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!