摘要
ESP32上面自带2个LED灯,一个在通电时会亮起,另一个可以通过程序点亮,本文将介绍如何通过代码控制该LED的亮灭、频闪。
所需硬件
1、电脑
2、ESP32开发板
3、USB数据线(要能传输的线,不能是只能充电的线)
前提
完成环境部署,具体可参考文章micropython ESP32环境部署-优快云博客
了解Thoney基本操作,Thonny安装-优快云博客
一、点亮LED灯
USB线连接ESP32和电脑,打开Thonny,解释器选择MicroPython(ESP32)
可以看到,此时ESP32只有一个LED灯是亮的
在代码编辑区输入如下三行代码
import machine
led = machine.Pin(2,machine.Pin.OUT)
led.value(1)
运行程序,此时ESP32两个LED灯都亮了
下面分析下这三行代码
第1行 import machine
导入machine包,machine包是ESP32硬件功能的基础包,里面包含了ESP32一系列功能,只要开发ESP32程序,都必须要引入这个包
第2行 led = machine.Pin(2,machine.Pin.OUT)
定义一个变量led,指向ESP32的GPIO2引脚,类型为输出,GPIO2即蓝色LED灯对应的引脚,machine.Pin.OUT表明我们要对该GPIO引脚进行输出,即设置其为高电平还是低电平
第3行 led.value(1)
将GPIO2设为高电平,此时蓝色LED灯亮起,如果执行led.value(0)会将该GPIO设为低电平,此时,蓝色LED灯灭
二、设置LED灯闪烁
想要让LED灯闪烁,只需设置让灯亮一会,灭一会,再亮一会,灭一会,依次循环,所以很容易想到用循环控制语句来实现
其代码为
import machine
import time
led = machine.Pin(2,machine.Pin.OUT)
while True:
led.value(1)
time.sleep(1)
led.value(0)
time.sleep(1)
点击运行,此时,我们可以看到蓝灯一直闪烁
下面我们分析下代码
第2行 import time
导入包time,该包用于让程序暂停一定时间,达到控制灯持续亮一段时间或持续灭一段时间的效果
第6和第8行 time.sleep(1)
该行的作用是让程序暂停1秒钟,程序暂停期间灯的亮灭状态不变
因此第5-8行的作用就是
让灯亮、程序暂停1秒钟,让灯灭,程序暂停1秒钟
结合外面的循环体,效果就是 灯亮1秒钟、灯灭1秒种、灯亮1秒钟、灯灭1秒种……,于是就看到灯闪烁的样子
注意:代码第8行即最后一行的time.sleep(1)不能省略,否则就变成
让灯亮、程序暂停1秒钟,让灯灭、让灯亮、程序暂停1秒钟,让灯灭……,灯灭了马上就亮,人眼看到的效果就是灯一直亮着。
修改程序的暂停时间可以控制灯闪烁的频率,比如,将第6和第8行改成 time.sleep(2),让灯亮2秒再灭2秒,就闪烁的比之前慢了,
将第6和第8行改成time.sleep_ms(500),让灯亮500毫秒再灭500毫秒,就闪烁的比之前快了
三、按钮控制灯的亮灭
ESP32自带两个按钮,EN按钮和BOOT按钮,其中BOOT按钮可以实现用户定义功能,在按下时触发用户自定义的逻辑。
在这里我们让每次按下BOOT按钮时都改变灯的亮灭状态。
其代码为
import machine
led = machine.Pin(2,machine.Pin.OUT)
def changeLed(pin):
led.value(not led.value())
btn = machine.Pin(0, machine.Pin.IN)
btn.irq(trigger=machine.Pin.IRQ_FALLING, handler=changeLed)
代码共6行
第1行 import machine
导入machine包,machine包是ESP32硬件功能的基础包,里面包含了ESP32一系列功能,只要开发ESP32程序,都必须要引入这个包
第2行 led = machine.Pin(2,machine.Pin.OUT)
定义一个变量led,指向ESP32的GPIO2引脚,类型为输出,GPIO2即蓝色LED灯对应的引脚,machine.Pin.OUT表明我们要对该GPIO引脚进行输出,即设置其为高电平还是低电平
第3、第4行,定义一个函数,在函数内对led的值取反,原本是1变成0,原本是0变成1,即改变LED灯的亮灭状态
第5行 btn = machine.Pin(0, machine.Pin.IN)
定义一个变量btn,指向ESP32的GPIO0引脚,类型为输入,GPIO0引脚即ESP32上USB口右边的BOOT按钮,类型为输入,表明我们要读取其状态
第6行 btn.irq(trigger=machine.Pin.IRQ_FALLING, handler=changeLed)
设置按钮的中断,trigger=machine.Pin.IRQ_FALLING指定当检测到引脚输入信号下降沿时触发中断程序,handler=changeLed表明中断服务程序是咱们前面第3行、第4行定义的函数changeLed,这样当我们按下按钮时,就会调用函数changeLed,修改灯的状态。
至此,我们实现了控制灯的亮灭和闪烁。