.. _esp8266_quickref: ESP8266 快速å‚考手册 =============================== .. only:: not latex .. image:: https://docs.01studio.cc/data/picture/pyWiFi-ESP8266_pinout.png :alt: pyWiFi-ESP8266 pinout :width: 700px .. only:: latex .. image:: https://docs.01studio.cc/data/picture/pyWiFi-ESP8266_pinout.png :alt: pyWiFi-ESP8266 pinout ESP8266å¼€å‘æ¿ï¼ˆå›¾ç‰‡æ¥æºï¼š01Studio) 以下是快速å‚考内容. å¦‚æžœä½ æ˜¯ç¬¬ä¸€æ¬¡ä½¿ç”¨ESP8266å¼€å‘æ¿ï¼Œè¯·è€ƒè™‘å…ˆé˜…è¯»ä»¥ä¸‹ç« èŠ‚å†…å®¹: .. toctree:: :maxdepth: 1 general.rst tutorial/index.rst 安装 MicroPython ---------------------- 请å‚考教程的相应部分: :ref:`intro`. 它还包括故障排除å°èŠ‚. 通用控制 --------------------- MicroPython 的串å£äº¤äº’调试(REPL)在 UART0 (GPIO1=TX, GPIO3=RX),波特率为:115200。 Tab按键补全功能对于找到æ¯ä¸ªå¯¹è±¡çš„使用方法éžå¸¸æœ‰ç”¨ã€‚ ç²˜è´´æ¨¡å¼ (ctrl-E) 对需è¦å¤åˆ¶æ¯”较多的python代ç 到REPLéžå¸¸æœ‰ç”¨ã€‚ The :mod:`machine` module:: import machine machine.freq() # 获å–CPU当å‰å·¥ä½œé¢‘率 machine.freq(160000000) # 设置CPU的工作频率为 160 MHz The :mod:`esp` module:: import esp esp.osdebug(None) # å…³é—原厂 O/S è°ƒè¯•ä¿¡æ¯ esp.osdebug(0) # 将原厂 O/S 调试信æ¯é‡å®šå‘到 UART(0) 输出 Networking ---------- The :mod:`network` module:: import network wlan = network.WLAN(network.STA_IF) # 创建stationæŽ¥å£ wlan.active(True) # æ¿€æ´»æŽ¥å£ wlan.scan() # æœç´¢å…许的访问SSID wlan.isconnected() # 检查创建的station是å¦è¿žæŽ¥åˆ°AP wlan.connect('essid', 'password') # 连接到指定ESSID网络 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') # 设置APçš„ESSIDå称 连接到本地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()) 一旦网络建立æˆåŠŸï¼Œå°±å¯ä»¥é€šè¿‡ :mod:`socket <usocket>` 模å—创æ·å’Œä½¿ç”¨ TCP/UDP socket通讯。 延时和时间 ------------ Use the :mod:`time <time>` module:: 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) # 计算从开始到当å‰æ—¶é—´çš„差值 定时器 ------ 支æŒè™šæ‹Ÿ (基于RTOS) 定时器。使用 :ref:`machine.Timer <machine.Timer>` 模å—通过设置 timer ID å·ä¸º -1:: from machine import Timer tim = Timer(-1) tim.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1)) #1次 tim.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(2)) #周期 该周期的å•ä½ä¸ºæ¯«ç§’(ms)。 引脚和GPIOå£ ------------- 使用 :ref:`machine.Pin <machine.Pin>` 模å—:: from machine import Pin p0 = Pin(0, Pin.OUT) # 创建对象p0,对应GPIO0å£è¾“出 p0.on() # 设置引脚为 "on" (1)高电平 p0.off() # 设置引脚为 "off" (0)低电平 p0.value(1) # 设置引脚为 "on" (1)高电平 p2 = Pin(2, Pin.IN) # 创建对象p2,对应GPIO2å£è¾“å…¥ print(p2.value()) # 获å–引脚输入值, 0(低电平) or 1(高电平) p4 = Pin(4, Pin.IN, Pin.PULL_UP) # 打开内部上拉电阻 p5 = Pin(5, Pin.OUT, value=1) # åˆå§‹åŒ–时候设置引脚的值为 1(高电平) 以下为å¯ç”¨å¼•è„š: 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 分别对应ESP8266芯片的实际GPIO引脚编å·ã€‚ 请注æ„,很多用户使用自己的开å‘æ¿æœ‰ç‰¹å®šçš„引脚命åæ–¹å¼ (例如: D0, D1, ...)。由于MicroPythonè‡´åŠ›äºŽæ”¯æŒ ä¸åŒçš„å¼€å‘æ¿å’Œæ¨¡å—ï¼Œå› æ¤æˆ‘们采用最原始简å•å…·ä¸”有共åŒç‰¹å¾çš„引脚命åæ–¹å¼ã€‚å¦‚æžœä½ ä½¿ç”¨è‡ªå·±çš„å¼€å‘æ¿ï¼Œè¯·å‚考其原ç†å›¾ã€‚ 请注æ„,引脚 Pin(1) and Pin(3) 是串å£äº¤äº’(REPL) UART TX å’Œ RX 引脚. åŒæ—¶è¯·æ³¨æ„ Pin(16) 是一个特殊的引脚 (用于从深度ç¡çœ 模å¼ä¸å”¤é†’) 所以有å¯èƒ½ä¸èƒ½ä½¿ç”¨é«˜çº§çš„类模å—如``Neopixel``. There's a higher-level abstraction :ref:`machine.Signal <machine.Signal>` which can be used to invert a pin. Useful for illuminating active-low LEDs using ``on()`` or ``value(1)``. UART (serial bus) ----------------- See :ref:`machine.UART <machine.UART>`. :: from machine import UART uart = UART(0, baudrate=9600) uart.write('hello') uart.read(5) # read up to 5 bytes Two UARTs are available. UART0 is on Pins 1 (TX) and 3 (RX). UART0 is bidirectional, and by default is used for the REPL. UART1 is on Pins 2 (TX) and 8 (RX) however Pin 8 is used to connect the flash chip, so UART1 is TX only. When UART0 is attached to the REPL, all incoming chars on UART(0) go straight to stdin so uart.read() will always return None. Use sys.stdin.read() if it's needed to read characters from the UART(0) while it's also used for the REPL (or detach, read, then reattach). When detached the UART(0) can be used for other purposes. If there are no objects in any of the dupterm slots when the REPL is started (on hard or soft reset) then UART(0) is automatically attached. Without this, the only way to recover a board without a REPL would be to completely erase and reflash (which would install the default boot.py which attaches the REPL). To detach the REPL from UART0, use:: import os os.dupterm(None, 1) The REPL is attached by default. If you have detached it, to reattach it use:: import os, machine uart = machine.UART(0, 115200) os.dupterm(uart, 1) PWM (脉宽调制) ---------------------------- PWM å¯ä»¥é€šè¿‡æ‰€æœ‰å¼•è„šè¾“出除了 Pin(16). 所有通é“都有1个特定的频率,从1到1000之间(å•ä½æ˜¯Hz)。å 空比的值为0至1023之间。 Use the ``machine.PWM`` class:: from machine import Pin, PWM pwm0 = PWM(Pin(0)) # 从1个引脚ä¸åˆ›å»º PWM 对象 pwm0.freq() # 获å–当å‰é¢‘率 pwm0.freq(1000) # 设置频率 pwm0.duty() # 获å–当å‰å 空比 pwm0.duty(200) # 设置å 空比 pwm0.deinit() # å…³é—引脚的 PWM pwm2 = PWM(Pin(2), freq=500, duty=512) # 在åŒä¸€è¯å¥ä¸‹åˆ›å»ºå’Œé…ç½® PWM ADC (模数转æ¢) ---------------------------------- ADC 需è¦ä½¿ç”¨ä¸“用的引脚。请注æ„ADC引脚输入电压必须是0v 至 1.0v。 Use the :ref:`machine.ADC <machine.ADC>` class:: from machine import ADC adc = ADC(0) # 在ADC引脚上创建ADC对象 adc.read() # 读å–测é‡å€¼, 0-1024 软件SPI总线 ---------------- EPS32内部有两个SPI驱动。其ä¸1个是通过软件实现 (bit-banging),并å…许é…置到所有 引脚, 通过 :ref:`machine.SPI <machine.SoftSPI>` 类模å—é…ç½®:: from machine import Pin, SoftSPI # 在给定的引脚上创建SPI总线 # polarity(æžæ€§ï¼‰æ˜¯æŒ‡ SCK ç©ºé—²æ—¶å€™çš„çŠ¶æ€ # phase=0 (相ä½ï¼‰è¡¨ç¤ºSCK在第1个边沿开始å–æ ·ï¼Œphase=1 表示在第2个边沿开始。 spi = SoftSPI(-1, baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4)) spi.init(baudrate=200000) # 设置频率 spi.read(10) # 在MISO引脚读å–10å—èŠ‚æ•°æ® spi.read(10, 0xff) # 在MISO引脚读å–10å—节数æ®åŒæ—¶åœ¨MOSI输出0xff 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) # 在MOSI引脚上写缓冲区的数æ®å¹¶å°†MISO读å–æ•°æ®å˜æ”¾åˆ°ç¼“冲区 硬件SPI总线 ---------------- 有两个硬件SPI通é“å…è®¸æ›´é«˜é€ŸçŽ‡ä¼ è¾“ï¼ˆåˆ°è¾¾80MHz)。åªå¯ä»¥è¿è¡Œåœ¨ä»¥ä¸‹å¯¹åº”引脚: ``MISO`` 是 GPIO12, ``MOSI`` 是 GPIO13, ä»¥åŠ ``SCK`` 是 GPIO14. 除了引脚å‚æ•°é…置外, 使用方法和上é¢è½¯ä»¶SPIæ€»çº¿ä¸€æ ·ï¼ˆå› ä¸ºå¼•è„šæ˜¯å›ºå®šçš„ï¼‰ :: from machine import Pin, SPI hspi = SPI(1, baudrate=80000000, polarity=0, phase=0) (``SPI(0)`` 用在内部flash上,ä¸å¯¹ç”¨æˆ·å¼€æ”¾ä½¿ç”¨ã€‚) I2C总线 ------- The I2C driver is implemented in software and works on all pins, and is accessed via the :ref:`machine.I2C <machine.I2C>` class (which is an alias of :ref:`machine.SoftI2C <machine.SoftI2C>`):: from machine import Pin, I2C # construct an I2C bus i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) i2c.readfrom(0x3a, 4) # 从地å€ä¸º0x3a的从机设备读å–4å—èŠ‚æ•°æ® i2c.writeto(0x3a, '12') # å‘地å€ä¸º0x3a的从机设备写入数æ®"12" buf = bytearray(10) # 创建1个10å—节缓冲区 i2c.writeto(0x3a, buf) # 写入缓冲区数æ®åˆ°ä»Žæœº 实时时钟 (RTC) --------------------- See :ref:`machine.RTC <machine.RTC>` :: from machine import RTC rtc = RTC() rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # 设置时间(年,月,日,星期,时,分,秒,微秒) # å…¶ä¸æ˜ŸæœŸä½¿ç”¨0-6表示星期一至星期日。 rtc.datetime() # 获å–当å‰æ—¥æœŸå’Œæ—¶é—´ # synchronize with ntp # need to be connected to wifi import ntptime ntptime.settime() # set the rtc datetime from the remote server rtc.datetime() # get the date and time in UTC .. note:: Not all methods are implemented: `RTC.now()`, `RTC.irq(handler=*) <RTC.irq>` (using a custom handler), `RTC.init()` and `RTC.deinit()` are currently not supported. WDT (Watchdog timer) -------------------- See :ref:`machine.WDT <machine.WDT>`. :: from machine import WDT # enable the WDT wdt = WDT() wdt.feed() 深度ç¡çœ æ¨¡å¼ --------------- å°†GPIO16引脚连接到å¤ä½ï¼ˆHUZZAHçš„RST)。那么下é¢çš„代ç å¯ä»¥ç”¨æ¥ ç¡çœ ã€å”¤é†’和检测å¤ä½å”¤é†’:: import machine # é…ç½® RTC.ALARM0 用于定时唤醒设备 rtc = machine.RTC() rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP) # 检测设备是å¦é€šè¿‡æ·±åº¦ç¡çœ GPIO16引脚唤醒 if machine.reset_cause() == machine.DEEPSLEEP_RESET: print('woke from a deep sleep') # 设置 RTC.ALARM0 定时器时间为10秒(唤醒设备) rtc.alarm(rtc.ALARM0, 10000) # 让设备进入ç¡çœ çŠ¶æ€ machine.deepsleep() å•æ€»çº¿é©±åŠ¨ï¼ˆOneWire) --------------------- å•æ€»çº¿é©±åŠ¨å…许通过软件在å„个引脚上实现:: from machine import Pin import onewire ow = onewire.OneWire(Pin(12)) # 在引脚 GPIO12 创建å•æ€»çº¿å¯¹è±¡ow ow.scan() # 扫æ设备 ow.reset() # å¤ä½ ow.readbyte() # 读å–1个å—节 ow.writebyte(0x12) # 写入1个å—节 ow.write('123') # 写入多个å—节 ow.select_rom(b'12345678') # æ ¹æ®ROMç¼–å·é€‰æ‹©æ€»çº¿ä¸Šçš„指定设备 下é¢æ˜¯ä¸€ä¸ª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 彩ç¯é©±åŠ¨ ------------------ Use the ``neopixel`` module:: from machine import Pin from neopixel import NeoPixel pin = Pin(0, Pin.OUT) # 设置引脚GPIO0æ¥é©±åŠ¨ NeoPixels np = NeoPixel(pin, 8) # 在GPIO0上创建一个 NeoPixel对象,包å«8个ç¯ç np[0] = (255, 255, 255) # 设置第一个ç¯ç 显示数æ®ä¸ºç™½è‰² np.write() # å†™å…¥æ•°æ® r, g, b = np[0] # 获å–第一个ç¯ç 的颜色 低级别的 NeoPixel 驱动:: import esp esp.neopixel_write(pin, grb_buf, is800khz) .. Warning:: By default ``NeoPixel`` is configured to control the more popular *800kHz* units. It is possible to use alternative timing to control other (typically 400kHz) devices by passing ``timing=0`` when constructing the ``NeoPixel`` object. APA102 驱动 ------------- Use the ``apa102`` module:: from machine import Pin from apa102 import APA102 clock = Pin(14, Pin.OUT) # set GPIO14 to output to drive the clock data = Pin(13, Pin.OUT) # set GPIO13 to output to drive the data apa = APA102(clock, data, 8) # create APA102 driver on the clock and the data pin for 8 pixels apa[0] = (255, 255, 255, 31) # set the first pixel to white with a maximum brightness of 31 apa.write() # write data to all pixels r, g, b, brightness = apa[0] # get first pixel colour For low-level driving of an APA102:: import esp esp.apa102_write(clock_pin, data_pin, rgbi_buf) DHT 驱动 ---------- 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) SSD1306 driver -------------- Driver for SSD1306 monochrome OLED displays. See tutorial :ref:`ssd1306`. :: from machine import Pin, I2C import ssd1306 i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) display = ssd1306.SSD1306_I2C(128, 64, i2c) display.text('Hello World', 0, 0, 1) display.show() WebREPL (Webæµè§ˆå™¨äº¤äº’æ示) ---------------------------------------- WebREPL (通过WebSocketsçš„REPL, å¯ä»¥é€šè¿‡æµè§ˆå™¨ä½¿ç”¨) 是ESP8266端å£å®žéªŒçš„功能。 å¯ä»¥ä»Ž https://github.com/micropython/webrepl 下载并打开html文件è¿è¡Œã€‚ (在线托管版å¯ä»¥é€šè¿‡è®¿é—® http://micropython.org/webrepl)直接使用, 通过执行以下 命令进行é…ç½®:: import webrepl_setup 按照å±å¹•çš„æ示æ“作。é‡å¯åŽï¼Œå…许使用WebREPLã€‚å¦‚æžœä½ ç¦ç”¨äº†å¼€æœºè‡ªåŠ¨å¯åŠ¨WebREPL,å¯ä»¥ 通过以下命令使用:: import webrepl webrepl.start() 这个 WebREPL 通过连接到ESP8266çš„AP使用,å¦‚æžœä½ çš„è·¯ç”±å™¨é…网络é…ç½®æ£ç¡®ï¼Œè¿™ä¸ªåŠŸèƒ½ 也å¯ä»¥é€šè¿‡STAæ–¹å¼ä½¿ç”¨ï¼Œé‚£æ„味ç€ä½ å¯ä»¥åŒæ—¶ä¸Šç½‘和调试ESP8266。(如果é‡åˆ°ä¸å¯è¡Œçš„特殊情况, 请先使用ESP8266 APæ–¹å¼)。 除了终端/命令符的访问方å¼, WebREPLåŒæ—¶å…è®¸ä¼ è¾“æ–‡ä»¶ (包å«ä¸Šä¼ 和下载)。Web客户端有相应的 功能按钮,也å¯ä»¥é€šè¿‡ ``webrepl_cli.py`` 模å—上å˜å‚¨çš„命令行进行æ“作。 æœ‰å…³å°†æ–‡ä»¶ä¼ è¾“åˆ°ESP8266其他支æŒçš„替代方法,请å‚阅MicroPython论å›ã€‚