esp32——点灯,按键,中断,定时器,i2c总线(oled显示屏)

预备工作:

1.配置Thonny

1.使用micro python(ESP)对应解释器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aju8XSFv-1688345629000)(D:\笔记\assets\image-20230702235412687.png)]

2.有些模块需要上载后才能使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1r0UfKHH-1688345629003)(D:\笔记\assets\image-20230702235316151.png)]

1.点亮第一个LED

from machine import Pin

#导入 Pin 模块

led=Pin(46,Pin.OUT)

#构建 led 对象,GPIO2,输出

led.value(1)

#点亮 LED,也可以使用 led.on()

  • Pin()模块:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-InGExhjr-1688345629004)(D:\笔记\assets\image-20230702235707440.png)]

    • Pin是用于控制I/O引脚的模块

      引脚对象用于控制 I/O 引脚(也称为 GPIO - 通用输入/输出)。引脚对象通常与可以驱动输出电压和读取输入电压的物理引脚相关联。pin 类具有设置 pin 模式(IN、OUT 等)的方法以及获取和设置数字逻辑电平的方法。有关引脚的模拟控制,请参见 ADC 类。

      引脚对象是通过使用明确指定某个 I/O 引脚的标识符来构造的。标识符的允许形式和标识符映射到的物理引脚是特定于端口的。标识符可能是整数、字符串或带有端口和引脚号的元组。

    • Pin模块构造函数:

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r47RkEIk-1688345629005)(D:\笔记\assets\image-20230703000330324.png)]

        访问与给定 id. 如果在构造函数中给出了额外的参数,那么它们将用于初始化引脚。任何未指定的设置将保持其先前状态。

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSgWHOxy-1688345629005)(D:\笔记\assets\image-20230703000416520.png)]

      • value()

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNBbjStH-1688345629006)(D:\笔记\assets\image-20230703000542771.png)]

2.按键(闪烁灯)

from machine import Pin
import time
LED=Pin(46,Pin.OUT) #构建 LED 对象,开始熄灭
KEY=Pin(0,Pin.IN,Pin.PULL_UP) #构建 KEY 对象
state=0 #LED 引脚状态
while True:
 
 if KEY.value()==0: #按键被按下
 time.sleep_ms(10) #消除抖动
导入 Pin、time 模块
构建对象 KEY 和 LED
检测按键是否被按下
按键被按下执行 LED 状态反转
 	if KEY.value()==0: #确认按键被按下
 
 	state=not state #使用 not 语句而非~语句
 	LED.value(state) #LED 状态翻转
 	print('KEY')
 
 while not KEY.value(): #检测按键是否松开
 	pass
from machine import Pin
import time

LED=Pin(40,Pin.OUT) #构建LED对象,开始熄灭
KEY=Pin(0,Pin.IN,Pin.PULL_UP) #构建KEY对象
state=1 
pan=1
   
# def shansuo():
#     while pan==1:
#         LED.value(1)
#         time.sleep_ms(100)
#         LED.value(0)
#         time.sleep_ms(100)
#         if KEY.value()==0:
#             break
    
while True:
    while pan==1:
        LED.value(1)
        time.sleep_ms(100)
        LED.value(0)
        time.sleep_ms(100)
        if KEY.value()==0:   #按键被按下
            time.sleep_ms(10) #消除抖动
            if KEY.value()==0:
                pan=0
                break
    
    if KEY.value()==0:   #按键被按下
        time.sleep_ms(10) #消除抖动
        if KEY.value()==0: #确认按键被按下

            state=not state  #使用not语句而非~语句
    #             while True:
            if state==0:
                LED.value(state)
            if state==1:
#                 shansuo(state)
                pan=1
            #time.sleep_ms(10000)
                
            print('KEY')
            
            while not KEY.value(): #检测按键是否松开
                pass

  • 构造KEY对象:

    • 可以实现按键控制开关(高低电平)

    • Pin.PULL_UP:上拉

      Pin.PUPP_DOWN:下拉(在micropython中下拉不能使用)

  • 延时函数sleep_ms(毫秒)

    • 可以防止抖动
    • 可以实现闪烁的功能
    • 包含在micro python标准库time中
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ybcKXLrf-1688345629006)(D:\笔记\assets\image-20230703001511918.png)]
  • time.ticks_ms() : 获取毫秒计时器开始值

  • time.ticks_diff(time.ticks_ms(), start) : 计算从上电开始到当前时间
    的差值

  • time模块

    import time
    
    time.sleep(1)           # sleep for 1 second
    time.sleep_ms(500)      # sleep for 500 milliseconds
    time.sleep_us(10)       # sleep for 10 microseconds
    start = time.ticks_ms() # get millisecond counter
    delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference
    
    • time.sleep(1):这会使程序暂停执行1秒钟。

    • time.sleep_ms(500):这会使程序暂停执行500毫秒(也就是0.5秒)。

    • time.sleep_us(10):这会使程序暂停执行10微秒(也就是0.01毫秒)。

    • time.ticks_ms():这个函数返回一个微秒级别的时间戳,通常用于计算时间差。

    • time.ticks_diff(time.ticks_ms(), start):这个函数用于计算两个时间戳之间的差异,返回差异值。

    • 请注意,这些函数在不同的平台和系统上可能会有所不同,因此请根据您的实际环境进行修改。

3.中断

from machine import Pin
import time

LED=Pin(46,Pin.OUT) #构建LED对象,开始熄灭
KEY=Pin(0,Pin.IN,Pin.PULL_UP) #构建KEY对象
state=0  #LED引脚状态

#LED状态翻转函数
def fun(KEY):
    global state
    time.sleep_ms(10) #消除抖动
    if KEY.value()==0: #确认按键被按下
        state = not state
        LED.value(state)

KEY.irq(fun,Pin.IRQ_FALLING) #定义中断,下降沿触发
#irq定义一个中断变量(fun),参数包括回调函数和下降沿触发(Pin.IRQ_FALLING)
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wN4imu5F-1688345629006)(D:\笔记\assets\image-20230703083146273.png)]

    irq方法会返回一个回调对象,但是这种方法不是核心Pin API的一部分,仅在部分端口可以实现。

4.定时器

from machine import Pin,Timer

led=Pin(46,Pin.OUT)
Counter = 0
Fun_Num = 0

def fun(tim):

    global Counter
#  定义一个全局变量,这样可以全局使用,不与def之外的counter冲突,并表示同一个变量
    Counter = Counter + 1
    print(Counter)
    led.value(Counter%2)

#使用定时器1
tim = Timer(1)
# 创建一个定时器对象,也就相当于声明
tim.init(period=1000, mode=Timer.PERIODIC,callback=fun)
# 初始化设置第一个定时器的相关参数,例如周期,回调函数,
# Timer.PERIODIC表示定时器工作在周期模式下
# 在一个周期结束后,就执行回调函数

# 拓展
# mode还有一种模式是Timer.DOWN,他的工作模式是倒计时,那么就可以定义一个回调函数,实现
# 比赛倒计时的功能,例如学习通随堂练习的倒计时截至
  • Timer(1):创建一个定时器对象,其实就相当于声明一个新的空的变量
  • tim.init方法:
    • 初始化一个定时器:给定时器相关的参数,包括周期,工作模式,回调函数
    • 工作模式除周期模式外还有倒计时和正计时

5.I2C 总线(OLED 显示屏)

# ESP32-S3 是通过 I2C 总线与 OLED 显示屏通讯
from machine import SoftI2C,Pin
#从machine模块导入I2C、Pin子模块
from ssd1306 import SSD1306_I2C#从ssd1306模块中导入SSD1306_I2C子模块

i2c = SoftI2C(sda=Pin(42), scl=Pin(40))
#I2C初始化:sda-->42, scl -->40
# 初始化一个i2c对象
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
#OLED显示屏初始化:128*64分辨率,OLED的I2C地址是0x3c(初始化oled显示屏对象)

oled.text("Hello World!", 0,  0)      #写入第1行内容
oled.text("MicroPython",  0, 20)      #写入第2行内容
oled.text("By 01Studio",  0, 50)      #写入第3行内容

oled.show()
#OLED执行显示

  • from machine import SoftI2C, Pin:这行代码导入了SoftI2CPin类,用于通过I2C总线与OLED显示屏进行通信。

  • from ssd1306 import SSD1306_I2C:这行代码从ssd1306模块中导入SSD1306_I2C类,用于操作OLED显示屏。

  • i2c = SoftI2C(sda=Pin(42), scl=Pin(40)):这行代码使用SoftI2C类初始化了一个I2C对象,将sda引脚设置为42号引脚,scl引脚设置为40号引脚。

  • oled = SSD1306_I2C(128, 64, i2c, addr=0x3c):这行代码使用SSD1306_I2C类初始化了一个OLED显示屏对象,设置显示屏的分辨率为128x64像素,使用前面初始化的I2C对象进行通信,OLED的I2C地址设置为0x3c。

  • oled.text("Hello World!", 0, 0):这行代码将字符串"Hello World!"写入OLED显示屏的第1行,起始位置为(0, 0)。

  • oled.text("MicroPython", 0, 20):这行代码将字符串"MicroPython"写入OLED显示屏的第2行,起始位置为(0, 20)。

  • oled.text("By 01Studio", 0, 50):这行代码将字符串"By 01Studio"写入OLED显示屏的第3行,起始位置为(0, 50)。

  • oled.show():这行代码将写入的内容显示在OLED屏幕上。

  • I2C(Inter-Integrated Circuit)总线是一种用于在集成电路之间进行通信的串行通信协议。它由飞利浦公司(Philips)于1982年开发,旨在简化不同芯片之间的通信。

    I2C总线具有以下主要特点:

    1. 串行通信:I2C使用两根线(SDA和SCL)进行串行通信,其中SDA线用于数据传输,SCL线用于时钟同步。

    2. 主从架构:I2C总线采用主―从(Master-Slave)结构,可以有多个从设备连接到单个主设备。主设备负责控制通信的发起,而从设备则被动响应主设备的请求。

    3. 地址设备:每个I2C设备都有一个唯一的7位或10位地址,主设备使用设备地址来选择要与之通信的从设备。

    4. 多主机支持:I2C总线支持多主机,允许多个主设备轮流控制总线。

    5. 时钟同步:I2C总线使用时钟同步机制,主设备产生时钟信号来同步数据传输。

    6. 速度可变:I2C总线的速度可以根据需求进行设置,常见的速度有标准模式(100 Kbps)、快速模式(400 Kbps)、高速模式(3.4 Mbps)等。

    I2C总线在许多应用中被广泛使用,例如连接各种外设模块,如传感器、显示屏、存储器、扩展IO等。它简单灵活,仅使用少量的引脚就可以实现多设备间的通信。

  • OLED 的特性是自己发光,不像 TFT LCD 需要背光,因此可视度和亮度均高, 其次是电压需求低且省电效率高,加上反应快、重量轻、厚度薄,构造简单,成 本低等特点。简单来说跟传统液晶的区别就是里面像素的材料是由一个个发光二 极管组成,因为密度不高导致像素分辨率低,所以早期一般用作户外 LED 广告 牌。随着技术的成熟,使得集成度越来越高。小屏也可以制作出较高的分辨率。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmLSpMiE-1688345629007)(D:\笔记\assets\image-20230703085002085.png)]

  • 定义好 I2C 后,还需要驱动一下 OLED。这里我们已经写好了 OLED 的库函 数,在 ssd1306.py 文件里面。开发者只需要拷贝到 pyBoard 文件系统里面,然后 在 main.py 里面调用函数即可。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ESP32中配置I2C总线可以通过以下步骤完成: 1. 调用i2c_param_config()函数来配置I2C参数。该函数的原型为:esp_err_t i2c_param_config(i2c_port_t i2c_num, const i2c_config_t* i2c_conf)。其中,参数i2c_num指定要配置的I2C通道(可以是I2C_NUM_0或I2C_NUM_1),参数i2c_conf是一个指向配置参数结构体的指针。[1] 2. 在调用i2c_param_config()函数之后,可以使用i2c_config_t结构体来设置I2C的配置参数。例如,可以设置I2C的时钟频率、I2C的GPIO引脚等。具体的配置参数可以参考ESP32的官方文档或相关资料。[2] 3. 安装I2C驱动程序。在配置完I2C参数之后,需要调用i2c_driver_install()函数来安装I2C驱动程序。该函数的原型为:esp_err_t i2c_driver_install(i2c_port_t i2c_num, i2c_mode_t mode, size_t rx_buf_len, size_t tx_buf_len, int intr_alloc_flags)。其中,参数i2c_num指定要安装驱动程序的I2C通道,参数mode指定I2C的工作模式,参数rx_buf_len和tx_buf_len分别指定接收和发送缓冲区的长度,参数intr_alloc_flags指定中断分配标志。[2] 4. 在初始化I2C端口的驱动程序配置时,i2c_param_config()函数会将一些I2C通信参数设置为I2C总线协议规范规定的默认值,并在I2C控制器的寄存器中预先配置其他相关参数。[3] 总结起来,配置ESP32的I2C总线需要调用i2c_param_config()函数来设置I2C参数,然后安装I2C驱动程序并进行相关的初始化配置。具体的配置参数可以根据需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北国137

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值