我们之前学习了OLED屏幕和DHT11温湿度传感器,那么就可以做一个简单的温湿度计项目
通过OLED屏幕可以显示DHT11的温湿度数据
OLED教程:【Arduino uno教程 】(七)0.96寸OLED屏幕
DHT11教程:【Arduino uno教程 】(九)DHT11温湿度传感器
(二)程序
①引入库文件
#include <dht11.h>
#include <U8g2lib.h>
#include <Wire.h>
复制代码②定义
定义SCL引脚A5,SDA引脚A4
设置U8G2屏幕库引脚,并且设置屏幕
定义DHT11传感器和引脚
#define BOARD_I2C_SCL A5
#define BOARD_I2C_SDA A4
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ BOARD_I2C_SCL, /* data=*/ BOARD_I2C_SDA, /* reset=*/ U8X8_PIN_NONE);
dht11 DHT11;//定义传感器类型
#define DHT11PIN 2//定义传感器连接引脚。
复制代码③定义“温湿度”三个字的字模
uint8_t day[][32] =
{
{0x00,0x00,0xC4,0x1F,0x48,0x10,0x48,0x10,0xC1,0x1F,0x42,0x10,0x42,0x10,0xC8,0x1F,
0x08,0x00,0xE4,0x3F,0x27,0x25,0x24,0x25,0x24,0x25,0x24,0x25,0xF4,0x7F,0x00,0x00},/*"温",0*/
{0x00,0x00,0xE4,0x1F,0x28,0x10,0x28,0x10,0xE1,0x1F,0x22,0x10,0x22,0x10,0xE8,0x1F,
0x88,0x04,0x84,0x04,0x97,0x24,0xA4,0x14,0xC4,0x0C,0x84,0x04,0xF4,0x7F,0x00,0x00},/*"湿",1*/
{0x80,0x00,0x00,0x01,0xFC,0x7F,0x44,0x04,0x44,0x04,0xFC,0x3F,0x44,0x04,0x44,0x04,
0xC4,0x07,0x04,0x00,0xF4,0x0F,0x24,0x08,0x42,0x04,0x82,0x03,0x61,0x0C,0x1C,0x70},/*"度",2*/
};
复制代码④初始化函数
设置串口通信,波特率位115200
设置U8G2初始化,并且设置字体
void setup()
{
Serial.begin(115200);
Serial.println("Init u8g2 ....");
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB08_tr); //设置字体
}
复制代码⑤循环函数
设置temp和humi两个整数型变量
DHT11读取传感器信息
将DHT11传感器的数据保存在变量内
每次更新屏幕时,都清除缓存
U8G2设置中文和变量,并且将屏幕上传缓存区
void loop() {
int temp = 0;
int humi = 0;
DHT11.read(DHT11PIN); //更新传感器所有信息
humi = DHT11.humidity;
temp = DHT11.temperature;
u8g2.clearBuffer(); //清除缓存
u8g2.drawXBM(2,2,16,16,day[0]);
u8g2.drawXBM(18,2,16,16,day[2]);
u8g2.drawXBM(2,30,16,16,day[1]);
u8g2.drawXBM(18,30,16,16,day[2]);
u8g2.setCursor (50, 14);
u8g2.println(temp);
u8g2.setCursor (50, 42);
u8g2.println(humi);
u8g2.sendBuffer();
Serial.print("当前温度 (℃): ");
Serial.println(temp);
Serial.print("当前湿度 (%): ");
Serial.println(humi);
delay(2000);
复制代码⑥现象展示
![9e2da6814e00b72247447a502f11b78.jpg 9e2da6814e00b72247447a502f11b78.jpg](https://static.assets-stash.eet-china.com/forum/202411/23/173234705738323153057h55wkpp5dmu55wr1.jpg)
⑦完整代码
#include <dht11.h>//引入DHT11库
#include <U8g2lib.h>
#include <Wire.h>
#define BOARD_I2C_SCL A5
#define BOARD_I2C_SDA A4
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ BOARD_I2C_SCL, /* data=*/ BOARD_I2C_SDA, /* reset=*/ U8X8_PIN_NONE);
/********************###定义###********************/
dht11 DHT11;//定义传感器类型
#define DHT11PIN 2//定义传感器连接引脚。
uint8_t day[][32] =
{
{0x00,0x00,0xC4,0x1F,0x48,0x10,0x48,0x10,0xC1,0x1F,0x42,0x10,0x42,0x10,0xC8,0x1F,
0x08,0x00,0xE4,0x3F,0x27,0x25,0x24,0x25,0x24,0x25,0x24,0x25,0xF4,0x7F,0x00,0x00},/*"温",0*/
{0x00,0x00,0xE4,0x1F,0x28,0x10,0x28,0x10,0xE1,0x1F,0x22,0x10,0x22,0x10,0xE8,0x1F,
0x88,0x04,0x84,0x04,0x97,0x24,0xA4,0x14,0xC4,0x0C,0x84,0x04,0xF4,0x7F,0x00,0x00},/*"湿",1*/
{0x80,0x00,0x00,0x01,0xFC,0x7F,0x44,0x04,0x44,0x04,0xFC,0x3F,0x44,0x04,0x44,0x04,
0xC4,0x07,0x04,0x00,0xF4,0x0F,0x24,0x08,0x42,0x04,0x82,0x03,0x61,0x0C,0x1C,0x70},/*"度",2*/
};
void setup()
{
Serial.begin(115200);
Serial.println("Init u8g2 ....");
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB08_tr); //设置字体
}
void loop() {
int temp = 0;
int humi = 0;
DHT11.read(DHT11PIN); //更新传感器所有信息
humi = DHT11.humidity;
temp = DHT11.temperature;
u8g2.clearBuffer(); //清除缓存
u8g2.drawXBM(2,2,16,16,day[0]);
u8g2.drawXBM(18,2,16,16,day[2]);
u8g2.drawXBM(2,30,16,16,day[1]);
u8g2.drawXBM(18,30,16,16,day[2]);
u8g2.setCursor (50, 14);
u8g2.println(temp);
u8g2.setCursor (50, 42);
u8g2.println(humi);
u8g2.sendBuffer();
Serial.print("当前温度 (℃): ");
Serial.println(temp);
Serial.print("当前湿度 (%): ");
Serial.println(humi);
delay(2000);
}
复制代码