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

news2024/11/23 1:14:09

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 5

void 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 5


void setup() {
  Serial.begin(9600);
  Serial.println("begin...");
  // 初始化OLED显示屏对象,设置分辨率为128x64
  Wire.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 Shapes
  display.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.coloradmin.cn/o/891702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩转单元测试之gtest

引言 程序开发的时候&#xff0c;往往需要编写一些测试样例来完成功能测试&#xff0c;以保证自己的代码在功能上符合预期&#xff0c;能考虑到一些异常边界问题等等。 gtest快速入门 1.引入gtest # 使用的是1.10版本&#xff0c;其他版本可根据需要选择 git clone -b v1.1…

踩坑经验:JavaScript 中的 for...of 和 for...in 循环

在 JavaScript 编程中&#xff0c;for...of 和 for...in 是常用的循环语法&#xff0c;但它们在使用时可能会引发一些意想不到的问题。本文将分享我在使用这两种循环时所遇到的坑和经验。 两者的区别&#xff1a; 适用对象类型&#xff1a; for…of&#xff1a;主要用于遍历可…

微信开发之一键删除好友的技术实现

简要描述&#xff1a; 删除联系人 请求URL&#xff1a; http://域名地址/delContact 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wI…

小红书运营 新号快速涨粉方法

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家分享一下小红书新号快速涨粉的方法。 新手博主在刚开始使用小红书时往往会陷入一个误区&#xff0c;他们热衷于发布自己认可的笔记&#xff0c;然后迫不及待地去查看数据&#xff0c;却发现没有获得赞赏和关注。 然而&…

微信小程序登录及登录态管理

一&#xff0c;小程序登录 小程序登录 | 微信开放文档 接口应在服务器端调用&#xff0c;详细说明参见服务端API。 接口说明 接口英文名 code2Session 功能描述 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使…

Android Framework 全局替换系统字体

基于Android 11 Android Framework 全局替换系统字体 第一种通过替换系统默认字体 将需要替换的字体资源放置frameworks/base/data/fonts/目录下。 将系统默认的Roboto字体替换为HarmonyOs字体。 frameworks/base/data/fonts/fonts.xml frameworks/base/data/fonts/Android.…

Docker容器与虚拟化技术:Docker镜像创建、Dockerfile实例

目录 一、理论 1.Docker镜像的创建方法 2.Docker镜像结构的分层 3.Dockerfile 案例 4.构建Systemctl镜像&#xff08;基于SSH镜像&#xff09; 5.构建Tomcat 镜像 6.构建Mysql镜像 二、实验 1.Docker镜像的创建 2. Dockerfile 案例 3.构建Systemctl镜像&#xff08;…

AI抢饭碗!新闻集团将使用生成式AI,每周自动写3000篇新闻丨IDCF

作者&#xff1a;AIGC开放社区 8月1日&#xff0c;英国卫报消息&#xff0c;全球最大新闻媒体公司之一的新闻集团&#xff0c;将使用生成式AI每周自动创建3000篇澳大利亚本地新闻。 据悉&#xff0c;新闻集团在内部成立了一个名为“Data Local”的部门只有4名员工&#xff0c;…

爱校对:塑造无瑕公文的强大工具

在公文处理的世界中&#xff0c;每个字、每个标点都需要细心打磨&#xff0c;确保无一瑕疵。如何能达到这种精确无误的程度呢&#xff1f;让我们一起来看看强大的爱校对软件如何帮助我们塑造无瑕的公文。 首先&#xff0c;爱校对软件采用先进的自然语言处理和深度学习技术&…

IDA远程调试真机app

IDA远程调试真机app 第一步&#xff1a;启动 android_server&#xff0c;并修改端口 # 启动android_server ./android_server -p31928第二步&#xff1a;端口转发、挂起程序 # 端口转发adb forward tcp:31928 tcp:31928# 挂起程序 adb shell am start -D -n com.qianyu.antid…

shell和Python 两种方法分别画 iostat的监控图

在服务器存储的测试中,经常需要看performance的性能曲线&#xff0c;这样最能直接观察HDD或者SSD的性能曲线。 如下这是一个针对HDD跑Fio读写的iostat监控log,下面介绍一下分别用shell 和Python3 写画iostat图的方法 1 shell脚本 环境:linux OS gnuplot工具 第一步 :解析iosta…

Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间

场景 SpringBootMybatis定时任务实现大数据量数据分表记录和查询&#xff1a; SpringBootMybatis定时任务实现大数据量数据分表记录和查询_mybatis 定时任务创建日表_霸道流氓气质的博客-CSDN博客 通过以上分表实现的同结构不同表名之间的表&#xff0c;如何将一个表中的数据…

Flink学习笔记(一)

流处理 批处理应用于有界数据流的处理&#xff0c;流处理则应用于无界数据流的处理。 有界数据流&#xff1a;输入数据有明确的开始和结束。 无界数据流&#xff1a;输入数据没有明确的开始和结束&#xff0c;或者说数据是无限的&#xff0c;数据通常会随着时间变化而更新。 在…

python模块中的_all__属性的作用

文章目录 前言 一、python模块中的_all__属性的作用 总结 前言 python模块中的特殊变量_all__的用法总结。 一、python模块中的_all__属性的作用 顾名思义&#xff1a;我们如果导一个包里面的函数或者变量&#xff0c;会把暴露在外部的变量和函数导出。那么有些变量或者函…

如何做好小程序的运营,有哪些运营策略?

小程序用完即走的特性&#xff0c;使得小程序留存用户比较困难。任何一个产品的出现&#xff0c;绕不过推广运营这个话题&#xff0c;小程序也是一样。抓住用户&#xff0c;培养用户的忠诚度是所有产品的根本&#xff0c;我们该怎样从零开始运营好小程序&#xff1f; 一、人群…

免费批量ppt转pdf?一个方法教你完美转换

随着科技的不断发展&#xff0c;电子文档的使用越来越普遍。在商业、教育和个人领域&#xff0c;我们经常需要将PPT文件转换为PDF格式&#xff0c;以便更方便地共享和存档。幸运的是&#xff0c;现在有许多在线工具和软件可以帮助我们轻松地完成免费批量ppt转pdf。下面将介绍一…

LabVIEW开发设计热稳定器

LabVIEW开发设计热稳定器 使用与PC控制单元接口的电子设备进行数据采集和控制已广泛用于不同的工业应用。精确的温度控制是一个巨大的挑战&#xff0c;这就是为什么一些工业应用需要使用适当的材料和设备比更好的温度精度。 ​ 为了追踪[-50至250C]之间的温度变化&#xff0c…

【LeetCode】205. 同构字符串

205. 同构字符串&#xff08;简单&#xff09; 方法&#xff1a;哈希映射 思路 判断两个字符串是不是同构字符串&#xff0c;只需要判断对应的字符是不是存在映射关系&#xff0c;我们可以使用 map 来保存字符间的映射关系。由于 “不同字符不能映射到同一个字符上&#xff0…

babylonjs基于自定义网格生成围栏动画

效果&#xff1a; import { Vector3, Mesh, MeshBuilder, StandardMaterial, Texture, Animation, Color3 } from "babylonjs/core"; import imgUrl from "./image/headerwangge2.png" // 创建模型护栏特效 export default class CreateRail {constructor…

Flutter实战·第二版-第三章 基础组件笔记

第三章&#xff1a;基础组件 3.1文本及样式 3.1.1 Text Text("Hello world",textAlign: TextAlign.left, );Text("Hello world! Im Jack. "*4,maxLines: 1,overflow: TextOverflow.ellipsis, );Text("Hello world",textScaleFactor: 1.5, );3.1…