请参见相应部分的教程: 开始使用MicroPython ESP8266。它还包括一个故障排除分段。
MicroPython REPL位于baudrate 115200的UART0 (GPIO1=TX, GPIO3=RX)上。制表符补全对于查明对象具有哪些方法是有用的。粘贴模式(ctrl-E)用于将大块Python代码粘贴到REPL中。
载入machine模块:
import machine
machine.freq() # 获取CPU的当前频率
machine.freq(80000000) # 设置CPU频率为80mhz
载入esp模块:
import esp
esp.osdebug(None) # 关闭供应商O/S调试消息
esp.osdebug(0) # 将供应商O/S调试消息重定向到UART(0)
载入network模块:
import network
wlan = network.WLAN(network.STA_IF) # 创建工作模式为客服端模式
wlan.active(True) # 激活界面
wlan.scan() # 扫描可用的WIFI
wlan.isconnected() # 检查连接是否成功
wlan.connect('essid', 'password') #连接到WIFI
wlan.config('mac') # 获取接口的MAC
wlan.ifconfig() # 获取接口的IP/netmask/gw/DNS地址
ap = network.WLAN(network.AP_IF) # 创建工作模式为AP模式
ap.active(True) # 激活界面
ap.config(essid='ESP-AP') # 设置接入点的WIFI名字
连接本地WiFi网络的一个有用功能是:
def do_connect():
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('essid', 'password')
while not wlan.isconnected():
pass
print('network config:', wlan.ifconfig())
一旦网络建立,socket模块就可以像往常一样创建和使用TCP/UDP套接字。
载入time模块:
import time
time.sleep(1) # 延时1秒钟
time.sleep_ms(500) # 延时500毫秒
time.sleep_us(10) # 延时10微秒
start = time.ticks_ms() # 得到毫秒计数器
delta = time.ticks_diff(time.ticks_ms(), start) # 计算时差
定时循环:8266LED亮2秒,熄灭2秒
from machine import Pin,Timer
import time
a1 = Pin(2,Pin.OUT)
de = 0
while True:
time.sleep(2)
if(de == 0):
a1.off()
de = 1
else:
if(de == 1):
a1.on()
de = 0
支持虚拟计时器。使用machine.Timer定时器类,定时器ID为-1:
Timer.init(period, mode, callback) 初始化定时器
period:定时时长,单位:毫秒。
0 < period ≤ 0xCCCC CCCC
mode:定时模式
Timer.ONE_SHOT — 只执行一次
Timer.PERIODIC — 循环执行
callback:回调函数
from machine import Timer
tim = Timer(-1)
tim.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
tim.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(2))
tim.deinit() #关闭定时器
系统每隔2秒打印led1函数的print输出内容,隔5秒打印5
from machine import Pin,Timer
a2 = Pin(2,Pin.OUT)
def led1(t):
print("ok-002")
tim1 = Timer(-1)
tim1.init(period=2000, mode=Timer.PERIODIC, callback=led1)
tim2 = Timer(-1)
tim2.init(period=3000, mode=Timer.PERIODIC, callback=lambda t:print(5))
使用machine.Pin类:
from machine import Pin #载入Pin模块
p0 = Pin(0, Pin.OUT) # 在GPIO0上创建输出pin
p0.on() # 将引脚设置为“on”(高)电平
p0.off() #将引脚设置为“off”(低)电平
p0.value(1) # 把别针固定在on/high上
p0.value(0) # 同样是操作IO口,0为低电平,没懂
p2 = Pin(2, Pin.IN) # 在GPIO2上创建输入pin
print(p2.value()) # 获取IO口值,0或1
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # 启用内部上拉电阻
p5 = Pin(5, Pin.OUT, value=1) # 在创建时设置高引脚
可用引脚为:0、1、2、3、4、5、12、13、14、15、16,对应于ESP8266芯片的实际GPIO引脚号。注意,许多终端用户板使用他们自己的专用pin编号(标记如D0、D1、…)。由于MicroPython支持不同的板和模块,因此选择物理pin编号作为最小公分母。有关开发板板逻辑引脚和物理芯片引脚之间的映射,请参阅开发板文档.
注意:引脚(1)和引脚(3)分别为REPL UART TX和RX。还要注意,Pin(16)是一个特殊的Pin(用于从深度睡眠模式中唤醒),可能无法与Neopixel之类的高级类一起使用
除了引脚(16)外,PWM可以在所有引脚上启用。所有通道都有一个单一频率,范围在1到1000之间(以Hz测量)。占空比在0到1023之间(含1023)。如果多个IO口同时输出pwm,那么频率将统一到设定的最低频率
使用machine.PWM 类
from machine import Pin, PWM
pwm0 = PWM(Pin(0)) # 从一个引脚创建PWM对象
pwm0.freq() # 得到当前的频率
pwm0.freq(1000) # 设定频率
pwm0.duty() # 得到当前占空比
pwm0.duty(200) # 设置占空比
pwm0.deinit() # 在引脚上关闭PWM
pwm2 = PWM(Pin(2), freq=500, duty=512) # 一次性创建和配置
ADC可以在专用pin上使用。注意ADC引脚上的输入电压必须在0v和1.0v之间。
使用machine.ADC类:
from machine import ADC
adc = ADC(0) # 在ADC引脚上创建ADC对象
adc.read() # 读值,0 - 1024
有两个SPI驱动程序。一种是通过软件(bit-banging)实现的,可以在所有pin上工作,并通过 machine.SPI控制:
from machine import Pin, SPI
# 在给定的引脚上构造SPI总线
# 极性是SCK的空闲状态
# 相位=0表示SCK第一个边的样本,相位=1表示第二个边
spi = SPI(-1, baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))
spi.init(baudrate=200000) # 设置波特率
spi.read(10) # 在MOSI上读取10字节
spi.read(10, 0xff) # 在MOSI上输出0xff时读取10字节
buf = bytearray(50) # 创建一个缓冲区
spi.readinto(buf) # 读取给定缓冲区(在本例中读取50字节)
spi.readinto(buf, 0xff) # 在MOSI上读入给定缓冲区并输出0xff
spi.write(b'12345') # 在MOSI上写入5字节
buf = bytearray(4) # 创建一个缓冲区
spi.write_readinto(b'1234', buf) # 写入MOSI并从MISO读取到缓冲区
spi.write_readinto(buf, buf) # 写buf给MOSI,读MISO回buf
硬件SPI总线:
硬件SPI速度更快(最高可达80Mhz),但只能在以下引脚上工作:MISO:GPIO12,MOSI:GPIO13, SCK:GPIO14。除了构造函数和init的pin参数(这些参数是固定的),它具有与上面的bitknock SPI类相同的方法:
from machine import Pin, SPI
hspi = SPI(1, baudrate=80000000, polarity=0, phase=0)
(SPI(0)用于FlashROM,用户无法使用。)
I2C驱动程序是在软件中实现的,可以在所有引脚上工作,并通过machine.I2C 类控制:
from machine import Pin, I2C
# 构造一个I2C总线
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
i2c.readfrom(0x3a, 4) # 从地址0x3a的从设备读取4字节
i2c.writeto(0x3a, '12') # 将“12”写入地址为0x3a的从设备
buf = bytearray(10) # 创建一个10字节的缓冲区
i2c.writeto(0x3a, buf) # 将给定的缓冲区写入从服务器
from machine import RTC
rtc = RTC()
rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # 设定一个具体的日期和时间
rtc.datetime() # 获取日期和时间
将GPIO16连接到reset pin(在HUZZAH上的RST)。然后用下面的代码可以进行休眠、唤醒和复位原因的检查:
import machine
# 配置RTC.ALARM0能够唤醒设备
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
# 检查设备是否从深度睡眠中醒来
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
print('woke from a deep sleep')
# 设置RTC.ALARM0,10秒后报警(唤醒设备)
rtc.alarm(rtc.ALARM0, 10000)
# 让设备进入睡眠状态
machine.deepsleep()
单线驱动程序是在软件中实现的,可以在所有引脚上工作:
from machine import Pin
import onewire
ow = onewire.OneWire(Pin(12)) # 在GPIO12上创建一个单线总线
ow.scan() # 返回总线上的设备列表
ow.reset() # 重置总线
ow.readbyte() #读一个字节
ow.writebyte(0x12) # 在总线上写一个字节
ow.write('123') # 在总线上写入字节
ow.select_rom(b'12345678') # 根据ROM代码选择特定的设备
DS18S20和DS18B20设备有一个特定的驱动程序:
import time, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
print(ds.read_temp(rom))
确保在数据线上放一个4.7k的上拉电阻。注意,每次需要对温度进行采样时,都必须调用convert_temp()方法。
使用neopixel模块:
from machine import Pin
from neopixel import NeoPixel
pin = Pin(0, Pin.OUT) # 将GPIO0设置为输出,以驱动NeoPixels
np = NeoPixel(pin, 8) # 在GPIO0上创建8像素的NeoPixel driver
np[0] = (255, 255, 255) # 设置第一个像素为白色
np.write() # 将数据写入所有像素
r, g, b = np[0] # 获取第一个像素颜色
对于低水平的新像素:
import esp
esp.neopixel_write(pin, grb_buf, is800khz)
使用apa102模块:
from machine import Pin
from apa102 import APA102
clock = Pin(14, Pin.OUT) # 将GPIO14设置为输出以驱动时钟
data = Pin(13, Pin.OUT) # 将GPIO13设置为输出以驱动数据
apa = APA102(clock, data, 8) # 在时钟上创建APA102驱动程序和8像素的数据pin
apa[0] = (255, 255, 255, 31) # 设置第一个像素为白色,最大亮度31
apa.write() # 将数据写入所有像素
r, g, b, brightness = apa[0] # 获取第一个像素颜色
APA102的低水平驾驶:
import esp
esp.apa102_write(clock_pin, data_pin, rgbi_buf)
DHT驱动程序在软件中实现,在所有引脚上工作:
import dht
import machine
d = dht.DHT11(machine.Pin(4))
d.measure()
d.temperature() # eg. 23 (°C)
d.humidity() # eg. 41 (% RH)
d = dht.DHT22(machine.Pin(4))
d.measure()
d.temperature() # eg. 23.6 (°C)
d.humidity() # eg. 41.3 (% RH)
WebREPL(通过websocket的REPL,可以通过web浏览器访问)是ESP8266端口提供的一个实验性特性。在线版:http://micropython.org/webrepl/,也可以从https://github.com/micropython/webrepl下载web客户端并通过执行以下命令配置它:
import webrepl_setup
并遵循屏幕上的指示。重新启动后,它将可用于连接。如果您在引导时禁用了自动启动,您可以使用以下命令按需运行配置的守护进程:
import webrepl
webrepl.start()
WebREPL功能需要8266先连接网络,并且知道它的IP,端口为:8266,如连接地址为:ws://192.168.4.1:8266/