Micropython ESP8266板入门指南(二)开关控制负载
(一)USB接口电路使
用CH340G接口芯片,所以要用CH341SER驱动程序。
(二)ESP-12P模块
板载LED灯接在GPIO2脚上
常用GPIO脚的默认电位:这几只脚IC内已有电阻,不用外接电阻,可以直接接开关。
平时高电位(即IC内用电阻接Vcc的)是:Reset、EN、GPIO0、GPIO2
平时低电位(即IC内用电阻接GND的)是:GPIO15
8266与硬件相关的指令都在machine库中,并根据功能分成不同的类(class),例如,与脚有关的命令在machine库的Pin类中。
from machine import Pin(from库中只导入脚类)
import machine(导入这个库的所有类)
应用一:读取微动开关控制LED
from machine import Pin
>>> sw=Pin(0,Pin.IN)
>>> led=Pin(15,Pin.OUT)
>>> while 1:
... val=sw.value()
... led.value(val)
运行说明:微动开关接GND和GPIO0脚,LED灯接GPIO15脚;8266循环读取0脚状态,当开关导通0脚低电平;即val的值为0;接15脚的led的值也为0,关灯。
应用二:按一下亮灯,再按一下关灯
(1)简单方案
from machine import Pin #导入库
import time #导入控制时间库
toggle=1
led=Pin(15,Pin.OUT)
sw=Pin(0,Pin.IN)
while True:
if sw.value()==0:
toggle=not toggle
led.value(toggle)
本程序的缺点,按开关时,不是按一下就准确在反转,存在不稳定,主要原因是在while的作用下循环不断地进行,即不断地反转,而造成LED随机亮灭的结果。
(2)优化方案一:在按下开关时(读取开关脚的状态),程序什么也不做,这样就防止进入循环。程序见下:
from machine import Pin #导入库
import time #导入控制时间库
toggle=1
led=Pin(15,Pin.OUT)
sw=Pin(0,Pin.IN)
while True:
if sw.value()==0:
toggle=not toggle #将toggler的值进行not(反相
)
led.value(toggle)
while sw.value()==0: #while(当)开关按下时
pass # 什么也不做,暂停
(3)优化方案二:在按下开关时(读取开关脚的状态),对LED灯现状态进行反转,同时程序什么也不做,直至放开开关后再继续循环。对比优化方案一程序少了两行命令。程序见下:
from machine import Pin #导入库
import time #导入控制时间库
led=Pin(15,Pin.OUT)
sw=Pin(0,Pin.IN)
while True:
if sw.value()==0: #如果按下开关
led.value(not led.value()) #对LED状态进行反转
while sw.value()==0: #while(当)开关按下时
pass # 什么也不做,暂停
(4)优化进阶:消除开关切换时振动造成的开关铜片弹跳现象。方法是进行2-30毫秒的延时。
from machine import Pin #导入库
import time #导入控制时间库
led=Pin(15,Pin.OUT)
sw=Pin(0,Pin.IN)
while True:
if sw.value()==0: #如果按下开关
time.sleep(0.1) #延时0.1秒,或写成time.sleep_ms(100)
led.value(not led.value()) #对LED状态进行反转
while sw.value()==0: #while(当)开关按下时
pass # 什么也不做,暂停
(5)增加一个LED2灯与LED灯成反相
from machine import Pin #导入库
import time #导入控制时间库
led2=Pin(9,Pin.OUT)
led=Pin(15,Pin.OUT)
sw=Pin(0,Pin.IN)
while True:
if sw.value()==0: #如果按下开关
time.sleep(0.1) #延时0.1秒
led.value(not led.value()) #对LED状态进行反转
led2.value(not led.value())
while sw.value()==0: #while(当)开关按下时
pass # 什么也不做,暂停
(六)增加一个副程序(MINI)。主程序main.py ;副程序 MINI.py
主程序
#main.py
from machine import Pin #导入库
import time #导入控制时间库
import MINI #导入副程序MINI
led2=Pin(9,Pin.OUT)
led=Pin(15,Pin.OUT)
sw=Pin(0,Pin.IN)
while True:
if sw.value()==0: #如果按下开关
MINI.hello() #运行MINI中的自定义函数hello
time.sleep(0.1) #延时0.1秒
led.value(not led.value()) #对LED状态进行反转
led2.value(not led.value())
while sw.value()==0: #while(当)开关按下时
pass # 什么也不做,暂停
副程序
#MINI.py
def hello():
print("hello")