MicroPython
文章目录
- MicroPython
- 前言
- 一、安装软件
- 二、点亮第一颗LED灯
- 三、KEY按键
- 四、外部中断
- 总结
前言
MicroPython比较简单但是没有系统的更新过文章,准备写一下ESP8266——MicroPython的文章做一个系列。
一、安装软件
安装开发软件 Thonny,安装这个软件就可以了,网上资料有很多就不重复造轮子了。
二、点亮第一颗LED灯
ESP8266 上有 1 个 LED(GPIO2),控制 LED 使用 machine 中的 Pin 对
象,其构造函数和使用方法如下:
led=machine.Pin(id,mode,pull)
构建 led 对象。id:引脚编号;mode:输入输出方式;pull:上下拉电阻配置。
led.value([x])
引脚电平值。输出状态:x=0 表示低电平,x=1 表示高电平;输入状态:无须参数,返回当前引脚值。
led.on()
使引脚输出高电平“1”。
led.off()
使引脚输出低电平“0”。
machine 是大模块,Pin 是 machine 下面的其中一个小模块,在 python 编程里有两种方式引用相关模块:
方式 1 是:import machine,然后通过 machine.Pin 来操作;
方式 2 是:from machine import Pin,意思是直接从 machine 中引入 Pin 模块,然后直接通过构建 led 对象来操作。显然方式 2 会显得更直观和方便。
这是ESP8266led灯的原理图 很明显低电平点亮 ESP32是高电平点亮
from machine import Pin #导入 Pin 模块
led=Pin(2,Pin.OUT) #构建 led 对象,GPIO2,输出
led.value(0) #点亮 LED
三、KEY按键
构造函数的使用方式是一样的,只是输入/输出状态的一个改变。
按键被按下时候可能会发生抖动,抖动如下图,有可能造成误判,因此需要使用延时函数来进行消抖
是当检测按键值为 0 时,延时一段时间,大约 10ms,再判断按键引脚值仍然是 0,是的话说明按键被按下。延时使用 time 模块
from machine import Pin
import time
LED=Pin(2,Pin.OUT,value=1) #构建LED对象,开始熄灭
KEY=Pin(0,Pin.IN,Pin.PULL_UP) #构建KEY对象
state=1 #LED引脚状态
while True:
if KEY.value()==0: #按键被按下
time.sleep_ms(10) #消除抖动
if KEY.value()==0: #确认按键被按下
state=not state #使用not语句而非~语句
LED.value(state) #LED状态翻转
while not KEY.value(): #检测按键是否松开
pass
这里注意使用了not语句,每次按键按下后通过使用 not 来改变。这里注意的是在 python 里使用‘not’而不是‘~’的方式。not 返回的是 True 和 False,即 0,1。而~ 是数值取反操作,会导致出错。
四、外部中断
我们在做普通的 GPIO 时候,虽然能实现 IO 口输入输出功能,但代码是一直在检测 IO 输入口的变化,因此效率不高,特别是在一些特定的场合,比如某个按键,可能 1 天才按下一次去执行相关功能,这样我们就浪费大量时间来实时检测按键的情况。为了解决这样的问题,我们引入外部中断概念,顾名思义,就是当按键被按下(产生中断)时,我们才去执行相关功能。这大大节省了 CPU 的资源。利用中断方式来检查按键 KEY 状态,被按键被按下(产生外部中断)后使 LED的亮灭状态翻转。
外部中断也是通过 machine 模块的 Pin 子模块来配置
KEY=machine.Pin(id,mode,pull)
构建按键对象。id:引脚编号;mode:输入输出方式;pull:上下拉电阻配置。
KEY.irq(handler,trigger)
配置中断模式。
handler:中断执行的回调函数;
trigger: 触发中断的方式,共 4 种,分别是 Pin.IRQ_FALLING(下降沿触发)、
Pin.IRQ_RISING(上升沿触发)、Pin.IRQ_LOW_LEVEL(低电平触发)、
Pin.IRQ_HIGH_LEVEL(高电平触发)。
上升沿和下降沿触发统称边沿触发。按键被按下时一个引脚值从 1 到 0 变化的过程,边沿触发就是指这个过程
高低电平就更好理解了
from machine import Pin
import time
LED=Pin(2,Pin.OUT,value=1) #构建LED对象,开始熄灭
KEY=Pin(0,Pin.IN,Pin.PULL_UP) #构建KEY对象
state=1 #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) #定义中断,下降沿触发
global关键字用于在函数内部声明一个变量是全局的,即它引用的是函数外部的变量,而不是创建一个新的局部变量。这允许你在函数中修改全局变量的值。
state 是全局变量,因此在 fun 函数里面用该变量必须添加 global state 代码,否则会在函数里面新建一样的变量造成冲突。这里要和普通C语言单片机区分一下
在定义回调函数 fun 的时候,需要将引脚对象 KEY 传递进去。
KEY.irq(fun,Pin.IRQ_FALLING) #定义中断,下降沿触发
总结
可以看出MicroPython还是比较简单的,当你想使用GPIO时导入machine 包就可以了,可以配置输入、输出、外部中断等等