前言
笔者是桂工大三通信工程学生郭某,在机缘巧合之下,了解到了esp8266,长期使用51单片机去做课设的我,不由得对它的WiFi模块产生了一丝好奇。碰巧,购买nodemcu的时候,店家送了个DHT11温湿度传感器和四针的OLED显示屏。
那正好, 不如我就做一个温湿度计吧。
对于温湿度计的构想
- 能够探测到温湿度。
- 可以利用oled屏去进行温湿度的本地实时显示。
- 在串口要有温湿度的状态输出,要方便调试
- 把数据上传到blinker,进行数据的云存储,app实时查询。
基于nodemcu的温湿度计制作
元件清单
- 四针oled屏ssd1306
- DHT11温湿度传感器
- nodemcu
- 杜邦线若干根
开发环境及工具
- Arduino IDE
- blinker的SDK
- DHT-SENSOR的库
- ssd1306的库
注:DHT的库可能会有编译错误,会提示少了一个头文件Adafruit_Sensor.h,读者遇到这个问题自己去下载这个头文件,放进库里即可。
代码编写思路
对于头文件,我们对于自己需要实现一些什么功能要有一个初步的认知。
#define BLINKER_WIFI //定义wifi模块
#include <Blinker.h>//包含Blinker头文件
#include <DHT.h>//包含DHT头文件
#include "SSD1306Wire.h"
#define DHTPIN D4 //定义DHT11模块连接管脚也可以通过gpio去进行定义
#define DHTTYPE DHT11 // 使用温度湿度模块的类型为DHT11
对于温湿度的读取和打印
if (isnan(h) || isnan(t))//判断是否成功读取到温湿度数据,isnan()可以用于判断空或非数
{
BLINKER_LOG("Fail to read from DHT sensor!");//无法读取温湿度
}
else//成功读取到数据
{
//输出温湿度的值
BLINKER_LOG("Humidity: ", h, " %");
BLINKER_LOG("Temperature: ", t, " *C");
humi_read = h;//将读取到的湿度赋值给全局变量humi_read
temp_read = t;//将读取到的温度赋值给全局变量temp_read
}
利用心跳包把数据上传到blinker,在app上添加相应的键名就可以实时查询到温湿度,更新频率为一分钟一次。
void heartbeat()
{
HUMI.print(humi_read); //给blinkerapp回传湿度数据
TEMP.print(temp_read); //给blinkerapp回传温度数据
}
Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上
上传了温湿度数据之后,我们还可以利用它的云存储去进行一个数据的曲线图回顾。
void dataStorage() {
Blinker.dataStorage("humi",humi_read );
Blinker.dataStorage("temp",temp_read );
}
对于oled显示,代码实现就简单的多了。
display.setFont(ArialMT_Plain_16);
display.drawString(0, 0, "\n"+String(t)+"*C"+"\n"+String(h)+"%"+"\n");
对字体的选择,和显示数据就可以达到目的。
实物接线
外设 | nodemcu |
---|---|
oled的SCL | D3 |
OLED的SDA | D2 |
DHT11 | D4 |
注。nodemcu的D0管脚不能用于DHT11数据的读取。VCC和GND并没有写,读者看着连就行
实物效果
代码编译完成,烧录进去之后,通过blinker,绑定键名,查看数据即可。
至此,这个小小的温湿度计也算是完成了。