ESP32-C3把温湿度数据显示到0.96寸OLED显示屏

上次实现了把温湿度数据上传到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 接口相对比较简单一些,只有两个信号线

  1. GND 电源地

  2. VCC 电源正(3~5.5V)

  3. SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚

  4. 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

生成海报
点赞 0

帕法西尔

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

嵌入式实时操作系统10——系统时钟节拍

1.系统节拍是什么 时间管理在操作系统内核中占有非常重要的地位,操作系统内核中有大量基于时间驱动的功能。有些任务是需要周期执行,比如一个软件定时器需要一秒钟周期性运行100次;有些功能任务需要延时一段

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf