预备工作:
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
:这行代码导入了SoftI2C
和Pin
类,用于通过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总线具有以下主要特点:
-
串行通信:I2C使用两根线(SDA和SCL)进行串行通信,其中SDA线用于数据传输,SCL线用于时钟同步。
-
主从架构:I2C总线采用主―从(Master-Slave)结构,可以有多个从设备连接到单个主设备。主设备负责控制通信的发起,而从设备则被动响应主设备的请求。
-
地址设备:每个I2C设备都有一个唯一的7位或10位地址,主设备使用设备地址来选择要与之通信的从设备。
-
多主机支持:I2C总线支持多主机,允许多个主设备轮流控制总线。
-
时钟同步:I2C总线使用时钟同步机制,主设备产生时钟信号来同步数据传输。
-
速度可变: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 里面调用函数即可。