ESP8266从零学 笔记
L2 ESP8266读取DHT11的温湿数据+Blinker APP
P1 写在前面
废话不多说,上干货!!!
P2 Esp8266的完整程序代码
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "我是来自blinker的密钥";
char ssid[] = "HUAWEI nova 21";
char pswd[] = "我是密码";
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11 // DHT 11
//define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
uint32_t read_time = 0;
float humi_read, temp_read;
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
void heartbeat()
{
HUMI.print(humi_read);
TEMP.print(temp_read);
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
//应该是我自己添的,测试了一下板子是不是在工作
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Blinker.attachHeartbeat(heartbeat);
dht.begin();
}
void loop()
{
Blinker.run();
if (read_time == 0 || (millis() - read_time) >= 2000)
{
read_time = millis();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
BLINKER_LOG("Failed to read from DHT sensor!");
return;
}
float hic = dht.computeHeatIndex(t, h, false);
humi_read = h;
temp_read = t;
BLINKER_LOG("Humidity: ", h, " %");
BLINKER_LOG("Temperature: ", t, " *C");
BLINKER_LOG("Heat index: ", hic, " *C");
}
}
或者打开 Arduino IDE找到blinker库中的示例程序
P4 分段程序
第一段:准备工作
#define BLINKER_WIFI
#include <Blinker.h>
//以上都是声明要使用Blinker
#include <DHT.h> //引用DHT库
#define DHTPIN 2 //定义读取数据要使用的引脚 2
char auth[] = "我是来自blinker的密钥";
char ssid[] = "HUAWEI nova 21";
char pswd[] = "我是密码";
//设施Blinker上的设备密钥、esp8266连接的WIFI名称及密码
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//这部分挺有意思的、因为DHT有不止一款传感器,
//所以你使用的是什么型号就选择哪一款、DHT11相对便宜所以使用的较为很广泛
DHT dht(DHTPIN, DHTTYPE)
//刚刚有定义DHTPIN即传感器引脚、DHTTYPE即传感器型号,在这要要进行说明
//dht(注意小写)是本程序使用的传感器自定义名称
第二段:创建组件(数据)
BlinkerNumber HUMI("humi");
//在Blinker APP 中创建“数据组件”
//湿度数据 humi
BlinkerNumber TEMP("temp");
//在Blinker APP 中创建“数据组件”
//温度数据 humi
关于如何新建组件请参照之前的笔记
大家可以参照一下我的组件外观!
第三段:定义变量
uint32_t read_time = 0;
// 字面意思读取时间
float humi_read, temp_read;
//humi_read将要用来输出在Blinker湿度数据组件上
//temp_read将要用来输出在Blinker温度数据组件上
第四段:回调数据
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
//以上代码解析请参照前几节笔记
uint32_t BlinkerTime = millis();
//BlinkerTime变量用来保存板子运行当前程序的时间
Blinker.print("millis", BlinkerTime);
//向APP发送millis耗时
}
该回调函数在设备收到APP发来的数据时被调用
不包含在程序中的部分
millis();
//此函数用于返回的Arduino板开始运行当前程序时的毫秒数。
第五段:心跳包
void heartbeat()
//APP定时向设备发送心跳包,设备收到心跳包后会返回设备当前状态
{
HUMI.print(humi_read);
//发送湿度数据
TEMP.print(temp_read);
//发送温度数据
}
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。
设备建立连接后APP会立即发送心跳包,此后每30s-60s会发送一次心跳包
第六段: 初始化设置
void setup()
{
Serial.begin(115200);//通信波特率,用于串口监视观察
BLINKER_DEBUG.stream(Serial);//详解见第一节笔记
Blinker.begin(auth, ssid, pswd);//发送密钥、WIFI名称及密码
Blinker.attachData(dataRead);
//注册回调函数
Blinker.attachHeartbeat(heartbeat);
//注册心跳包的回调函数
dht.begin();
//初始化dht11
}
第七段:
void loop()
{
Blinker.run();//详解见第一节笔记
if (read_time == 0 || (millis() - read_time) >= 2000)
//如果设备运行时间为0即刚开始工作 或者2秒内内没有更新readtime
{
read_time = millis();//readtime时间变更为设备运行时间
float h = dht.readHumidity();
//定义湿度h变量,读取DHT11的湿度数据
float t = dht.readTemperature();
//定义湿度t变量,读取DHT11的温度数据
if (isnan(h) || isnan(t))
//如果读取到的“湿度h” 或者 “温度t” 是 非字符 数据
{
BLINKER_LOG("Failed to read from DHT sensor!");
//发送“DHT传感器数据读取失败”
return;
//再试一次
}
humi_read = h;
temp_read = t;
//更新用于显示在APP中的数据
//[小白说]咱是没太明白为啥非得转一手,搞得大家懵懵的
BLINKER_LOG("Humidity: ", h, " %");
BLINKER_LOG("Temperature: ", t, " *C");
//发送温湿度数据
//例如 {"temp":{"val":20},"humi":{"val":15}}
}
}
因为BLINKER_LOG与dataRead()函数显示在APP中所以需要在APP中新建一个“调试”组件,用来观察APP收到的其他数据