用Arduino结合OLED、DHT11测量温湿度
1.项目起因
最近买了一块温湿度传感器DHT11,想着结合之前买的OLED屏幕和arduino nano 单片机来搭建一个将温湿度传感器DHT11测量到的数据,通过arduino处理后,在OLED屏幕上显示出来,得到一个即时温湿度显示的效果。
2.硬件准备
arduino单片机1
DHT11温湿度传感器1
OLED屏幕1
面包板1
杜邦线若干
3.硬件连接
本人使用的OLED屏幕分别有4个引脚,GND、VCC、SCL、SDA,分别接到单片机的GND、5V、A5、A4四个引脚上。温湿度传感器DHT11有3个引脚,VCC、DAT、GND,分别接到单片机的3V3、D10、GND三个引脚上。
单片机通电,下面是软件部分,注入灵魂。
4.软件部分
先贴上项目完整代码,已验证可行。
#include <DFRobot_DHT11.h>
#include "U8glib.h"
#define DHT11_PIN 10//设置D10引脚为DHT11数据采集端
DFRobot_DHT11 DHT;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
void draw(void) {
u8g.setFont(u8g_font_unifont);//设置在OLED屏幕显示的字体
u8g.drawStr( 40, 12, "Welcome!");
u8g.drawStr( 20, 30, "temp:");
u8g.setPrintPos(60,30);
u8g.print(DHT.temperature);//显示温度
u8g.drawStr( 80, 30, "C");
u8g.drawPixel(78,20);
u8g.drawStr( 20, 50, "humi:");
u8g.setPrintPos(60,50);
u8g.print(DHT.humidity);//显示湿度
u8g.drawStr( 80, 50, "%");
}
void setup(){
Serial.begin(115200);//串口调试的波特率为115200
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}
void loop(){
DHT.read(DHT11_PIN);
Serial.print("temp:");
Serial.print(DHT.temperature);//串口显示温度
Serial.print(" humi:");
Serial.println(DHT.humidity);//串口显示湿度
delay(1000);
u8g.firstPage();
do {
draw();//在OLED屏幕上显示
} while( u8g.nextPage() );
// rebuild the picture after some delay
delay(50);
}
首先说明:
Arduino代码主要分为两个部分,void setup(),void loop()。
void setup()是Arduino运行初的初始设置,只在程序一开始执行一遍。
void loop()是Arduino循环执行的部分。
本项目中需要用到DHT11和OLED屏幕,所以需要用到"DFRobot_DHT11.h"和"U8glib.h"这两个库文件。
注意:DHT.read(DHT11_PIN)这条语句最好放在loop()循环中,循环一次,收集一次数据。不要放入draw()函数中,会反复出现初始值(225),怀疑是每次在draw()函数中DHT11模块要重启一次,然后直接将初始值显示出来了。放到draw()函数外面则功能正常。
具体代码解释已在注释中注明,有疑惑或者错误欢迎私信。
5.最终效果![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/b4ba41b5c2fb96c3a03d72fbdbc1b8d4.jpeg)
6.改进计划
后面有时间可以画好PCB,将器件焊接上去,3D打印外壳,做成可以日常使用的物品。