Esp8266学习7. 点亮JMD0.96C-1 OLED屏

news/2025/3/27 12:56:19/

Esp8266学习7. 点亮JMD0.96C-1 OLED屏

  • 一、ESP32-C3 I2C资源简介
    • 1. 简介
    • 2. 准备工作
  • 二、I2C协议简介
    • 1. 起始条件(Start Condition):
    • 2. 设备地址传输(Device Address Transmission):
    • 3. 从设备响应(Slave Acknowledgment):
    • 4. 数据传输(Data Transmission):
    • 5. 停止条件(Stop Condition):
    • 6. 重复起始条件(Repeated Start Condition):
  • 三、I2C通讯示例
    • 1. 接线
    • 2. 基本使用 查询I2C资源地址
    • 3. 点亮OLED屏

请添加图片描述

一、ESP32-C3 I2C资源简介

1. 简介

ESP8266具有一个I2C控制器,通常称为I2C主机。这个I2C控制器可以用来连接各种I2C外设,如传感器、显示屏等。

在ESP8266上,I2C控制器的引脚分配如下:

  • SDA(Serial Data Line):通信数据线
  • SCL(Serial Clock Line):时钟线

这两个引脚的位置可以根据具体的ESP8266开发板而有所不同。

使用ESP8266的Arduino库,可以通过以下步骤使用ESP8266的I2C功能:

  1. 引入Wire库:在Arduino代码中引入Wire库,该库提供了与I2C通信相关的函数。
  2. 初始化I2C:在setup()函数中,使用Wire.begin(sda, scl)函数初始化I2C控制器,其中sda和scl是你选择的引脚。
  3. 发送和接收数据:使用Wire.beginTransmission()和Wire.endTransmission()函数发送和接收数据。
  4. 读写数据:使用Wire.requestFrom()和Wire.write()函数来读写数据。

2. 准备工作

  • NodeMCU开发板 1.0
  • Arduino 开发工具 2.1.1

二、I2C协议简介

I2C(Inter-Integrated Circuit)是一种用于短距离通信的串行通信协议,通常用于连接芯片之间,比如连接微控制器、传感器、显示屏等。它使用两根信号线(SDA和SCL)来实现通信,具有简单、灵活和多设备连接的特点。

以下是I2C协议的基本通讯过程:

1. 起始条件(Start Condition):

通信开始前,主设备(通常是微控制器)发送一个起始条件,即将SDA从高电平转换为低电平,然后再将SCL从高电平转换为低电平。这表明通信开始。

2. 设备地址传输(Device Address Transmission):

主设备会发送要通信的设备的7位地址,最高位是读写位(0表示写操作,1表示读操作)。设备在总线上监听地址,匹配地址的设备响应。

3. 从设备响应(Slave Acknowledgment):

如果有设备的地址匹配,从设备会发送一个应答位,将SDA拉低表示接受通信。如果没有匹配设备,从设备不发送应答位,SDA保持高电平。

4. 数据传输(Data Transmission):

主设备发送数据位,从设备每接收一个位都会发送应答位。数据位是一个8位字节,从设备会在每个字节接收完毕后发送应答。

5. 停止条件(Stop Condition):

通信结束后,主设备发送一个停止条件,即将SDA从低电平转换为高电平,然后再将SCL从低电平转换为高电平。这表明通信结束。

6. 重复起始条件(Repeated Start Condition):

主设备可以在不释放总线的情况下发送重复的起始条件,用于在一个通信过程中切换到不同的设备。

I2C通信可以实现多主设备和多从设备的连接。在多主设备情况下,主设备之间需要协调以避免冲突。在多从设备情况下,每个从设备都有唯一的地址,主设备可以根据需要与特定的从设备通信。

三、I2C通讯示例

1. 接线

下面示例使用GPIO4作为 SDA引脚, GPIO5作为SCL引脚。
在这里插入图片描述
从图上看到,将 OLED 屏的SDA接到 D2引脚, SCL接到 D1引脚。

如果使用ESP32C3-mini-1开发板,则把SDA接到4脚, SCL接到5脚。

2. 基本使用 查询I2C资源地址

#include <Wire.h>
// 自定义 I2C 引脚
#define SDA_PIN 4
#define SCL_PIN 5void setup() {// 初始化I2C总线,指定SDA和SCL引脚Wire.begin(SDA_PIN, SCL_PIN);  Serial.begin(9600);while (!Serial);  // Leonardo: 等待串口监视器连接// 输出开始信息Serial.println("I2C Scanner");  
}void loop() {byte error, address;int nDevices;// 输出正在扫描信息Serial.println("Scanning...");  // 记录找到的设备数量nDevices = 0;for (address = 1; address < 127; address++) {// 启动与指定地址的I2C通信Wire.beginTransmission(address);// 结束I2C通信并获取错误码error = Wire.endTransmission();if (error == 0) {Serial.print("I2C device found at address 0x");if (address < 16)Serial.print("0");// 输出找到的设备地址        Serial.print(address, HEX);// 输出设备找到的标志Serial.println("  !"); // 增加找到设备的计数nDevices++; } else if (error == 4) {Serial.print("Unknown error at address 0x");if (address < 16)Serial.print("0");// 输出发生错误的地址        Serial.println(address, HEX);}}if (nDevices == 0){// 输出没有找到设备的信息Serial.println("No I2C devices found");}else{// 输出没有找到设备的信息Serial.println("done");}// 等待5秒进行下一次扫描delay(5000);
}

运行结果可以看到I2C的设备(这里是OLED屏)地址是0x3C。
在这里插入图片描述

3. 点亮OLED屏

#include <Wire.h>  // 引入Wire库
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>// 在这里定义你的自定义I2C引脚
#define SDA_PIN 4
#define SCL_PIN 5void setup() {Serial.begin(9600);Serial.println("begin...");// 初始化OLED显示屏对象,设置分辨率为128x64Wire.begin(SDA_PIN, SCL_PIN);Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);// 初始化OLED显示屏display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();// 设置文本样式display.setTextSize(1);display.setTextColor(SSD1306_WHITE);// 显示提示信息 Drawing Shapesdisplay.setCursor(30, 8);display.println("Drawing Shapes");// 绘制文本 Square:display.setTextSize(1);display.setCursor(10, 25);display.println("Square:");// 在屏幕内部绘制正方形display.drawRect(15, 40, 20, 20, SSD1306_WHITE);  // (x, y, width, height, color)// 显示文本 Circle:display.setTextSize(1);display.setCursor(60, 25);display.println("Circle:");// 在屏幕内部绘制圆display.drawCircle(80, 50, 12, SSD1306_WHITE);  // (centerX, centerY, radius, color)// 更新显示内容display.display();Serial.println("end");
}void loop() {}

运行示例:
在这里插入图片描述


http://www.ppmy.cn/news/1039281.html

相关文章

数据结构单链表

单链表 1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。 在我们开始讲链表之前&#xff0c;我们是写了顺序表&#xff0c;顺序表就是类似一个数组的东西&#xff0…

手撕单链表

目录 链表的概念和结构 单链表的实现 申请新结点 打印 尾插 头插 尾删 头删 ​编辑 查找 在pos位置前插入元素 在pos位置后插入元素 删除pos位置的元素 删除pos位置之后的位置的元素​编辑 完整代码 SListNode.h SListNode.c 链表的概念和结构 链表是一种物理存储…

C++新经典03--共用体、枚举类型与typedef

共用体 共用体&#xff0c;也叫联合&#xff0c;有时候需要把几种不同类型的变量存放到同一段内存单元&#xff0c;例如&#xff0c;把一个整型变量、一个字符型变量、一个字符数组放在同一个地址开始的内存单元中。这三个变量在内存中占的字节数不同&#xff0c;但它们都从同…

【Go 基础篇】Go语言基本数据类型转换:字符串、整数、浮点数、字符与布尔类型的转换

介绍 在计算机编程中&#xff0c;不同的数据类型用于表示不同种类的数据。在Go语言&#xff08;Golang&#xff09;中&#xff0c;基本数据类型包括字符串、整数、浮点数、字符和布尔类型。在实际开发中&#xff0c;经常需要进行不同数据类型之间的转换&#xff0c;以满足不同…

第九章 动态规划part10(代码随想录)

121. 买卖股票的最佳时机 1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 用二维dp数组表示第i天的2种状态 dp[i][0] 表示第i天持有股票所得最多现金&#xff0c;可能i-1天就买股票了 dp[i][1] 表示第i天不持有股票所得最多现金 最后求&#xff1a;dp[len-1][0…

干翻Dubbo系列第十一篇:Dubbo常见协议与通信效率对比

文章目录 文章说明 一&#xff1a;协议 1&#xff1a;什么是协议 2&#xff1a;协议和序列化关系 3&#xff1a;协议组成 &#xff08;一&#xff09;&#xff1a;头信息 &#xff08;二&#xff09;&#xff1a;体信息 4&#xff1a;Dubbo3中常见的协议 5&#xff1a;…

vue5种模糊查询方式

在Vue中&#xff0c;有多种方式可以实现模糊查询。以下是五种常见的模糊查询方式&#xff1a; 使用JavaScript的filter()方法&#xff1a;使用filter()方法可以对数组进行筛选&#xff0c;根据指定的条件进行模糊查询。例如&#xff1a; data() {return {items: [{ name: App…

Android EditText 使用(详细版)

经典好文推荐,通过阅读本文,您将收获以下知识点: 一、EditText 继承关系 二、EditText 常用举例 三、EditText 自定义背景框 四、EditText自动检测输入内容 五、Edittext 密文显示 六、EditText 限制只能输入特定字符 七、EditText 输入保存的字符串不能为空 一、EditText 继…