上次实现了把温湿度数据上传到onenet平台,但是查看数据需要去云平台查看,硬件设备上看不到数据,所以这次加了个显示屏,我在网上买了一个0.96寸的蓝黄OLED显示屏。
一、OLED简介
OLED,即有机发光二极管( Organic Light Emitting Diode)。 OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示 OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。在此我们使用的 是0.96寸OLED显示屏,该屏有以下特点:
1、0.96 寸 OLED 有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上 1/4 部分为黄光,下 3/4 为蓝;而且是固定区域显示固定颜色,颜色和显示区域均不能修改;白光则为纯白,也就是黑底白字;蓝色则为纯蓝,也就是黑底蓝字。
2、分辨率为 128*64
3、多种接口方式;OLED 裸屏总共种接口包括:6800、8080 两种并行接口方式、3 线或 4 线的串行 SPI 接口方式、 IIC 接口方式(只需要 2 根线就可以控制 OLED 了!),这五种接口是通过屏上的 BS0~BS2 来配置的。
二、OLED模块
我买的是IIC模块的,四针 iic 接口相对比较简单一些,只有两个信号线
-
GND 电源地
-
VCC 电源正(3~5.5V)
-
SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚
-
SDA OLED 的 D1 脚,在 IIC 通信中为数据管脚
三、Arduino
1、要启动OLED显示屏,我们还需要使用Arduino-OLED第三方库,下方的链接是下载库的压缩包。esp8266和esp32都可以用的,通过下载好的压缩包,我们点击项目——>加载库——>添加zip库把它加载进去。
https://github.com/ThingPulse/esp8266-oled-ssd1306/tree/4.2.0
2、我们已经把需要的包加载进去了,接下来进行调用,实际上我们只需要调用一个.h文件
/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"
3、配置oled屏幕相关信息,这里要注意,因为ESP32-C3一些IO口不支持IIC,这里我接的是IO4、IO5口(ESP32-C3的RGB灯会亮蓝和绿灯)
/* 设置oled屏幕的相关信息 */ //有一些引脚接口不支持I2C
const int I2C_ADDR = 0x3c; // oled屏幕的I2c地址
#define SDA_PIN 4 // io4
#define SCL_PIN 5 // io5
/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);
4、这里顺便写一个屏幕测试显示,看能否正常工作
void drawRect(void) {
for (int16_t i=0; i<oled.getHeight()/2; i+=2) {
oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);
oled.display();
delay(50);
}
}
5、屏幕初始化
/* oled屏幕初始化 */
oled.init();
oled.flipScreenVertically(); // 设置屏幕翻转
oled.setContrast(255); // 设置屏幕亮度
drawRect(); // 测试屏幕显示
oled.clear(); oled.display(); // 清除屏幕
6、显示数据
温湿度数据定义的是float浮点数,但我oled显示采用的是String字符串,所以使用的时候需要把它强制转换一下类型。每隔三秒屏幕刷新一次(可自定义)
float h = dht.readHumidity();
float t = dht.readTemperature();
/* 显示字母 */
oled.setFont(ArialMT_Plain_16); // 设置字体
oled.drawString(0,0, "Temp:" +String(t)+"C"); // 将要显示的字母写入缓存
oled.drawString(0,20, "Humidity:"+String(h)+"%"); // 将要显示的字母写入缓存
oled.display(); // 将缓存里的文字在屏幕上显示
delay(3000); //3秒
oled.clear();
oled.display(); // 清除屏幕
7、效果展示
8、完整代码
#include "DHT.h"
/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"
//dht11定义
#define DHTPIN 7 //数据引脚
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
/* 设置oled屏幕的相关信息 */ //有一些引脚接口不支持I2C
const int I2C_ADDR = 0x3c; // oled屏幕的I2c地址
#define SDA_PIN 4 // io4
#define SCL_PIN 5 // io5
/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);
//测试屏幕显示
void drawRect(void) {
for (int16_t i=0; i<oled.getHeight()/2; i+=2) {
oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);
oled.display();
delay(50);
}
}
void setup() {
Serial.begin(115200); //串口频率
dht.begin(); //dht11
// put your setup code here, to run once:
/* oled屏幕初始化 */
oled.init();
oled.flipScreenVertically(); // 设置屏幕翻转
oled.setContrast(255); // 设置屏幕亮度
drawRect(); // 测试屏幕显示
oled.clear(); oled.display(); // 清除屏幕
}
void loop() {
delay(5000);
float h = dht.readHumidity();
float t = dht.readTemperature();
// put your main code here, to run repeatedly:
/* 显示字母 */
oled.setFont(ArialMT_Plain_16); // 设置字体
oled.drawString(0,0, "Temp:" +String(t)+"C"); // 将要显示的字母写入缓存
oled.drawString(0,20, "Humidity:"+String(h)+"%"); // 将要显示的字母写入缓存
oled.display(); // 将缓存里的文字在屏幕上显示
delay(3000);
oled.clear();
oled.display(); // 清除屏幕
//可以让我们通过串口查看数据
Serial.print(F(" Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("*C \n "));
}
觉得有用的话,请不要吝啬您的赞美,动动手指给肥仔点个赞吧*⁂((✪⥎✪))⁂*
版权声明:本文为CSDN博主「帕法西尔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44107116/article/details/122491820
暂无评论