用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);//串口调试的波特率为115200if ( 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 delaydelay(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.最终效果
6.改进计划
后面有时间可以画好PCB,将器件焊接上去,3D打印外壳,做成可以日常使用的物品。