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

上次实现了把温湿度数据上传到onenet平台,但是查看数据需要去云平台查看,硬件设备上看不到数据,所以这次加了个显示屏,我在网上买了一个0.96寸的蓝黄OLED显示屏。

文章目录

      • 一、OLED简介
      • 二、OLED模块
      • 三、Arduino

一、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 通信中为数据管脚
    ESP32-C3把温湿度数据显示到0.96寸OLED显示屏_第1张图片

三、Arduino

1、要启动OLED显示屏,我们还需要使用Arduino-OLED第三方库,下方的链接是下载库的压缩包。esp8266和esp32都可以用的,通过下载好的压缩包,我们点击项目——>加载库——>添加zip库把它加载进去。

https://github.com/ThingPulse/esp8266-oled-ssd1306/tree/4.2.0

ESP32-C3把温湿度数据显示到0.96寸OLED显示屏_第2张图片
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

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 "));
}

觉得有用的话,请不要吝啬您的赞美,动动手指给肥仔点个赞吧*⁂((✪⥎✪))⁂*

你可能感兴趣的:(ESP32-C3,iot,单片机,c语言)