物联网-wemos D1 Mini (esp8266)实验九 --- blynk APP远程控制格力空调开机并显示温湿度
- 概述
- 实验材料
- 硬件
- 硬件连接图
- 引脚连接对照表
- Arduino端软件编写
- 测试Wemos D1 Mini温湿度采集程序
- DHT库的安装
- 将DHT采集代码整合到实验八中
- Bylnk端软件编写
- 最终显示效果
- 完整源代码
概述
这个实验室在实验八的基础上增加了温湿度数据的采集,需要在之前的Bylnk项目中新增加一个显示控件。
实验材料
- Wemos D1 Mini开发板 *1 (10元)
- KY-005红外发射模块 *1 (1元)
或者 5mm 940nm红外发射管 (0.1元) - 170孔mini面包板*1(可选)(1元)
- 可选:2N2222*1(或者2N3904)
- Wemos D 1Mini DHT22扩展板(19元)
/
DHT22模块(14元)/
DHT11(5.5元)模块 3选1
合计:16-31元
硬件
硬件连接图
连线图中使用的是DHT11模块,DHT22的连接方式相同。扩展板的使用最为简单,之间插上即可(注意插的时候板子的缺口要在同一个方向
)。
引脚连接对照表
- KY-005引脚连接图
KY-005 | Wemos D1 Mini |
S | D3 |
|
|
Gnd | Gnd |
- DHT11引脚连接图
DHT11 | Wemos D1 Mini |
|
|
2 | D4 |
3 | 悬空 |
4 | Gnd |
- DHT22引脚连接图
DHT22 | Wemos D1 Mini |
|
|
OUT | D4 |
- | Gnd |
Arduino端软件编写
测试Wemos D1 Mini温湿度采集程序
DHT库的安装
会安装的这步可以略过
DHT库下载地址
- 在页面中第一步点击Clone or download,第二步点击Download ZIP
- 打开Arduino IDE,在项目->加载库->添加一个.ZIP库的对话框中选择你刚刚下载的
.zip
文件即可。 - 注意:这个DHT库依赖另外一个
Adafruit Unified Sensor Driver
库,所以为了正确运行还要装一下这个库。否则会报错。提示找不到一个文件,名字我忘记了。我安装的时候就报错了,又加装了这个好了。
Adafruit Unified Sensor Driver库下载 - github上有关于wemos D1 Mini非常丰富的示例程序
github上的关于wemos D1 Mini全部例程下载地址 打开上面的地址后,会显示下图的结构,examples->04.Shields->DHT_Shield->Simple目录下有完整测试代码。 - 上传程序到开发板,打开arduino IDE自带的串口软件观察是否正确的采集到了数据。
- 完整中文注释代码
/* DHT Shield - Simple
*
* Example testing sketch for various DHT humidity/temperature sensors
* Written by ladyada, public domain
*
* Depends on Adafruit DHT Arduino library
* 这个程序依赖Adafruit DHT Arduino library这个库文件
* https://github.com/adafruit/DHT-sensor-library
* 库文件的下载地址见上述连接
*/
#include "DHT.h"
#define DHTPIN D4 // what pin we're connected to 我们连
//接到传感器信号引脚的接口
// Uncomment whatever type you're using!
//将你选用的器件型号前面的注释去掉
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
//引脚连接说明,特别提出如果板子是3.3v逻辑的dht电源就接3.3v而不要接5v,比如我们的wemos D1 MIni
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);//初始化一个dht示例
void setup() {
Serial.begin(9600);//开启串口
Serial.println("DHTxx test!");
dht.begin();//开启dht
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);//延时2S
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();//读湿度
// Read temperature as Celsius (the default)
float t = dht.readTemperature();//读温度
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
//串口输出
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
将DHT采集代码整合到实验八中
- 将获取温湿度的代码写成函数供Bylnk虚拟写程序调用
int getTemperat() {
float h = _dht.readHumidity();//读取湿度值放入h变量
float t = _dht.readTemperature();//读取温度值放入t变量
float f = _dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(“Failed to read from DHT sensor!”);
return 0 ;
}
// Compute heat index in Fahrenheit (the default)
float hif = _dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = _dht.computeHeatIndex(t, h, false);
return int(t);
}
- 增加对虚拟引脚v5的操作函数
BLYNK_READ(V5) {//上传温湿度数据 Blynk.virtualWrite(V5,getTemperat());//虚拟引脚写事件
}
- 编译上传程序到开发板
Bylnk端软件编写
- 添加一个湿度显示控件
- 设置它的参数,虚拟引脚V5
其中LABEL
部分要特别注意,你书写中/pin/
位置就是你接收的温湿度数据显示位置。其他部分的文字你可以根据自己喜好设定。但是这个软件貌似对中文不是很友好。。我卡bug了。。。切换到英文输入法,起个英文显示比较安全。
最终显示效果
完整源代码
#include <ESP8266WiFi.h>//ESP8266WiFi设置库
#include <IRremoteESP8266.h>//ESP8266红外控制库
#include <IRsend.h>//红外发送库
#include <ir_Gree.h>//添加格力空调的库
#include <BlynkSimpleEsp8266.h>
#include "DHT.h"//添加DHT的库
#define DHTPIN D4 // 扩展板连接的是D4引脚
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)//板载的温湿度传感器是DHT22款
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
IRGreeAC _ac(D3); //创建一个格力空调的控制实例
DHT _dht(DHTPIN, DHTTYPE);//创建一个DHT的实例
BLYNK_WRITE(V1)//Blynk端的按钮按下
{
int pinValue = param.asInt(); //将按钮控件上传的值放入pinValue变量中
Serial.print("V1 Slider value is: ");
Serial.println(pinValue);//测试时方便串口进行监测
if(pinValue){//如果按钮按下发送空调ON红外码 开:1 关:0
_ac.on();//生成空调“开”的红外码//-ac是格力空调实例
_ac.send();//发送红外命令
}
}
BLYNK_READ(V5) {//上传温湿度数据
Serial.println("entered");
Blynk.virtualWrite(V5,getTemperat());//虚拟引脚写事件
}
int getTemperat() {
float h = _dht.readHumidity();//读取湿度值放入h变量
float t = _dht.readTemperature();//读取温度值放入t变量
float f = _dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return 0 ;
}
// Compute heat index in Fahrenheit (the default)
float hif = _dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = _dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
return int(t);
}
void setup() {
Serial.begin(115200);
_ac.begin();//开启空调红外
_dht.begin();//开启DHT
Serial.print("dht ok");
Blynk.begin(u8"ce88b0934e6e425fbf9c99743f3cf2b8", u8"iPhone", u8"00000000");
Blynk.begin(u8"token值", u8"wifi名字", u8"wifi对应的密码");
}
// the loop function runs over and over again forever
void loop() {
Blynk.run();
}