本文介紹了ESP8266 MicroPython開發入門。

透過本文你能瞭解到如下知識:

燒錄MicroPython韌體

MicroPython基礎知識

編寫MicroPython程式

什麼是MicroPython?

MicroPython簡單來說就是用Python來對微控制器進行程式設計(Python for controller),使用MicroPython做開發簡潔明瞭。Micropython的由來得益於Damien George這位偉大的計算機工程師,Damien George每天都會使用Python工作,他有一天冒出一個大膽的想法:能否用Python來控制微控制器,從而實現對機器人的操作呢?

Python語言本身就是一款簡單上手的指令碼語言,一些非計算機專業的愛好者都選Python語言作為入門語言,但是美中不足(中國跟美國為什麼不參加世界盃足球賽),它不能實現對一些底層的操作,在硬體領域毫不起眼。所以,Damien George利用6個月時間打造了MicroPython,這就是MicroPyhton的由來。

MicroPython基於ANSI C,語法跟Python3基本一致,擁有獨立的解析器、編譯器、虛擬機器和類庫等。目前它支援STM32F401、STM32F405、STM32F407、ESP8266、ESP32、nRF52840等。相信不遠的將來MicroPython將會支援更多的微控制器,這樣Python統治應用層和底層硬體的時代將會到來。

MicroPython在ESP8266上支援哪些資源?

根據官方的快速參考的描述,MicroPython已經實現了ESP8266基本硬體資源介面,包括GPIO、PWM、ADC、軟SPI和硬SPI、I2C、睡眠模式(Deep-sleep mode)、OneWire單匯流排等,帶有APA102、DHT和DS18B20庫。所以使用MicroPython可以快速實現產品原型,比如智慧插座,溫溼度檢測、智慧RGB調光器等。

如何在ESP8266上執行MicroPython?

硬體

ESP8266開發板NodeMCU

2。 下載韌體

到MicroPython官網下載基於ESP8266的MicroPython的韌體。本文撰寫時最新的韌體版本是esp8266-20190529-v1。11。bin

3。 燒寫韌體

使用ESP8266官方提供的燒錄工具ESP Flash Download Tool選擇對應的串列埠,將韌體燒錄到0x0地址即可(勾選,先Erase擦除後再點選Start開始燒錄)。

如何在ESP8266上進行MicroPython開發?

ESP8266燒錄MicroPython配置

上電列印

開啟常用的串列埠工具,設定波特率為115200,開啟串列埠工具按下ESP8266開發板上的RST復位按鈕,重啟開發板。

一切正常的情況下,將會看到軟體的輸出視窗上一片亂碼,並在最終會顯示出當前的MicroPython版本資訊重啟上電,列印如下字元說明燒寫韌體成功:

如何在ESP8266上進行MicroPython開發?

如果按下開發板的RST按鈕後,並且串列埠工具上沒有收到任何資訊或者只收到一堆亂碼最後沒有以 Type “help()” for more information。結尾,均表示此次韌體燒寫失敗,需要

重新燒寫韌體

需要特別注意的是燒錄韌體時各項引數的設定(可嘗試選擇DIO或者DOUT等)。

自此,基本的ESP8266的MicroPython環境搭建完成。

4。 基本測試

串列埠工具勾選上加

回車換行

在串列埠工具上輸入help()列印的資訊會告訴你如何連線WiFi:

如何在ESP8266上進行MicroPython開發?

內建machine模組:

import machine

machine。freq() # get the current frequency of the CPU

machine。freq(160000000) # set the CPU frequency to 160 MHz

如何在ESP8266上進行MicroPython開發?

內建esp模組:

import esp

esp。osdebug(None) # turn off vendor O/S debugging messages

esp。osdebug(0) # redirect vendor O/S debugging messages to UART(0)

檢視記憶體資源

import micropython

micropython。mem_info()

聯網network模組:

import network

wlan = network。WLAN(network。STA_IF) # create station interface

wlan。active(True) # activate the interface

wlan。scan() # scan for access points

wlan。isconnected() # check if the station is connected to an AP

wlan。connect(‘meanea’, ‘{85208520}’) # connect to an AP(SSID/password)

wlan。config(‘mac’) # get the interface‘s MAC adddress

wlan。ifconfig() # get the interface’s IP/netmask/gw/DNS addresses

ap = network。WLAN(network。AP_IF) # create access-point interface

ap。active(True) # activate the interface

ap。config(essid=‘ESP-AP’) # set the ESSID of the access point

如何在ESP8266上進行MicroPython開發?

如何在ESP8266上進行MicroPython開發?

如何在ESP8266上進行MicroPython開發?

連線到本地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(‘meanea’, ‘{85208520}’)#Change to your SSID and password

while not wlan。isconnected():

pass

print(‘network config:’, wlan。ifconfig())

一旦連線上了網路,就可以像往常一樣使用socket模組用於建立和使用TCP/UDP套接字。

延遲和時間

使用

time

模組:

import time

time。sleep(1) # sleep for 1 second

time。sleep_ms(500) # sleep for 500 milliseconds

time。sleep_us(10) # sleep for 10 microseconds

start = time。ticks_ms() # get millisecond counter

delta = time。ticks_diff(time。ticks_ms(), start) # compute time difference

計時器

支援虛擬(基於RTOS)的計時器(週期以毫秒為單位)。使用計時器ID為-1 的machine。Timer類:

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))

GPIO引腳

使用machine。Pin類:

from machine import Pin

p2 = Pin(2, Pin。OUT) # create output pin on GPIO0

p2。on() # set pin to “on” (high) level

p2。off() # set pin to “off” (low) level

p2。value(1) # set pin to on/high

p0 = Pin(0, Pin。IN) # create input pin on GPIO2

print(p0。value()) # get value, 0 or 1

p4 = Pin(4, Pin。IN, Pin。PULL_UP) # enable internal pull-up resistor

p5 = Pin(5, Pin。OUT, value=1) # set pin high on creation

如何在ESP8266上進行MicroPython開發?

未按Flash按鍵時輸入命令print(p0。value()) 可看見列印為1;按住Flash按鍵時輸入命令print(p0。value()) 可看見列印為0;

如何在ESP8266上進行MicroPython開發?

操作GPIO2可看到ESP8266開發板上的燈亮/滅。

可用引腳為:0,1,2,3,4,5,12,13,14,15,16,分別對應ESP8266晶片的實際GPIO引腳編號。請注意,許多終端使用者板使用自己的邏輯引腳編號(標記為例如D0,D1,。。。)。有關板邏輯引腳和物理晶片引腳之間的對映參考如下:

如何在ESP8266上進行MicroPython開發?

注意,引腳(1)和引腳(3)分別是UART_TXD和UART_RXD。另請注意,Pin(16)是一個特殊引腳(用於從深度睡眠模式喚醒),可能無法用於更高級別的類

Neopixel

PWM(脈衝寬度調製)

除引腳(16)外,所有引腳均可用於輸出PWM。所有通道都有一個頻率,範圍在1Hz到1000Hz之間,佔空比介於0~1023之間。

使用

machine。PWM類

from machine import Pin, PWM

pwm2 = PWM(Pin(2)) # create PWM object from a pin

pwm2。freq() # get current frequency

pwm2。freq(1000) # set frequency

pwm2。duty() # get current duty cycle

pwm2。duty(200) # set duty cycle

pwm2。deinit() # turn off PWM on the pin

pwm2 = PWM(Pin(2), freq=500, duty=512) # create and configure in one go

pwm2 = PWM(Pin(2), freq=1000, duty=700) 調節duty的值能看到板上LED燈明亮的變化。

ADC(模數轉換)

ESP8266模數轉換ADC有一個專用引腳。請注意,ADC0引腳上的輸入電壓必須介於0v~1。0v之間。

使用machine。ADC類:

from machine import ADC

adc = ADC(0) # create ADC object on ADC pin

adc。read() # read value, 0-1024

軟體SPI匯流排

MicroPython在ESP8266上實現了兩個SPI驅動程式。一個是用軟體實現的(bit-banging),適用於所有引腳,可透過machine。SPI類:

from machine import Pin, SPI

# construct an SPI bus on the given pins

# polarity is the idle state of SCK

# phase=0 means sample on the first edge of SCK, phase=1 means the second

spi = SPI(-1, baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))

spi。init(baudrate=200000) # set the baudrate

spi。read(10) # read 10 bytes on MISO

spi。read(10, 0xff) # read 10 bytes while outputing 0xff on MOSI

buf = bytearray(50) # create a buffer

spi。readinto(buf) # read into the given buffer (reads 50 bytes in this case)

spi。readinto(buf, 0xff) # read into the given buffer and output 0xff on MOSI

spi。write(b‘12345’) # write 5 bytes on MOSI

buf = bytearray(4) # create a buffer

spi。write_readinto(b‘1234’, buf) # write to MOSI and read from MISO into the buffer

spi。write_readinto(buf, buf) # write buf to MOSI and read MISO back into buf

硬體SPI匯流排

硬體SPI速度更快(匯流排時鐘高達80Mhz),但僅適用於以下引腳:MISO—GPIO12,MOSI—GPIO13,SCK—GPIO14。除了建構函式和init的引腳引數(因為它們是固定的)硬體SPI具有與上面的bit-banging SPI類相同的方法,:

from machine import Pin, SPI

hspi = SPI(1, baudrate=80000000, polarity=0, phase=0)

注意:

SPI(0)

用於內部FlashROM,使用者無法使用。

I2C匯流排

I2C驅動程式以軟體實現,適用於所有引腳,可透過訪問machine。I2C類:

from machine import Pin, I2C

# construct an I2C bus

i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)

i2c。readfrom(0x3a, 4) # read 4 bytes from slave device with address 0x3a

i2c。writeto(0x3a, ‘12’) # write ‘12’ to slave device with address 0x3a

buf = bytearray(10) # create a buffer with 10 bytes

i2c。writeto(0x3a, buf) # write the given buffer to the slave

實時時鐘(RTC)

使用machine。RTC

from machine import RTC

rtc = RTC()

rtc。datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # set a specific date and time

rtc。datetime() # get date and time

深度睡眠模式

將GPIO16連線到復位引腳RST,然後可以使用以下程式碼來休眠,喚醒並檢查重置原因:

import machine

# configure RTC。ALARM0 to be able to wake the device

rtc = machine。RTC()

rtc。irq(trigger=rtc。ALARM0, wake=machine。DEEPSLEEP)

# check if the device woke from a deep sleep

if machine。reset_cause() == machine。DEEPSLEEP_RESET:

print(‘woke from a deep sleep’)

# set RTC。ALARM0 to fire after 10 seconds (waking the device)

rtc。alarm(rtc。ALARM0, 10000)

# put the device to sleep

machine。deepsleep()

OneWire單匯流排驅動程式

OneWire驅動程式在軟體中實現,適用於所有引腳:

from machine import Pin

import onewire

ow = onewire。OneWire(Pin(12)) # create a OneWire bus on GPIO12

ow。scan() # return a list of devices on the bus

ow。reset() # reset the bus

ow。readbyte() # read a byte

ow。writebyte(0x12) # write a byte on the bus

ow。write(‘123’) # write bytes on the bus

ow。select_rom(b‘12345678’) # select a specific device by its ROM code

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驅動程式

使用

neopixel

模組:

from machine import Pin

from neopixel import NeoPixel

pin = Pin(0, Pin。OUT) # set GPIO0 to output to drive NeoPixels

np = NeoPixel(pin, 8) # create NeoPixel driver on GPIO0 for 8 pixels

np[0] = (255, 255, 255) # set the first pixel to white

np。write() # write data to all pixels

r, g, b = np[0] # get first pixel colour

對於NeoPixel的低階驅動:

import esp

esp。neopixel_write(pin, grb_buf, is800khz)

APA102驅動程式

使用

apa102

模組:

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

對於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)

WebREPL(Web瀏覽器互動式提示)

WebREPL透過Web瀏覽器進行REPL,可透過Web瀏覽器訪問ESP8266和進行資訊互動。

我們先檢視主目錄下的檔案列表

可以使用os。listdir()命令檢視主目錄下的檔案,後面我們可以用webrepl下載或上傳檔案。

>>> import os

>>> os。listdir()

如何在ESP8266上進行MicroPython開發?

圖示直接輸入import os;os。listdir();

可以看到主目錄下只有一個boot。py檔案。

執行以下命令對其進行配置webrepl:

import webrepl_setup

如何在ESP8266上進行MicroPython開發?

輸入E後提示輸入4~9位密碼

如何在ESP8266上進行MicroPython開發?

如何在ESP8266上進行MicroPython開發?

輸入y重啟。這時一起輸入import os;os。listdir();可看到主目錄下多了一個webrepl_cfg。py檔案。

如何在ESP8266上進行MicroPython開發?

重啟後,它將可用於連線。如果在引導時禁用了自動啟動,則可以使用以下命令按需執行已配置的守護程式:

import webrepl

webrepl。start()

如何在ESP8266上進行MicroPython開發?

瀏覽器中開啟連結MicroPython WebREPL

將IP修改為串列埠工具提示的IP地址後點擊連線:

如何在ESP8266上進行MicroPython開發?

輸入密碼後回車。

如何在ESP8266上進行MicroPython開發?

輸入boot。py然後點選Get from device按鈕下載boot。py檔案,開啟能夠看見檔案的內容。

如何在ESP8266上進行MicroPython開發?

如何在ESP8266上進行MicroPython開發?

如何實現ESP8266上電自動連線WiFi?

MicroPython初始化後都會自動執行

main。py

檔案,所以我們只需要設定該檔案即可上電自動連線WiFi。開啟自己常用的編輯器,輸入下面程式碼(注意SSID修改為你本地路由器的名稱,PASSWORD修改為路由器密碼),並儲存為

main。py

檔案:

# main。py

import network

import webrepl

import time

SSID = “meanea”

PASSWORD = “{85208520}”

def do_connect():

import network

import time

wlan = network。WLAN(network。STA_IF)

wlan。active(True)

if not wlan。isconnected():

print(‘connecting to network。。。’)

wlan。connect(SSID, PASSWORD)

start = time。ticks_ms() # get millisecond counter

while not wlan。isconnected():

time。sleep(1) # sleep for 1 second

if time。ticks_ms()-start > 20000:

print(“connect timeout!”)

break

if wlan。isconnected():

print(‘network config:’, wlan。ifconfig())

do_connect()

如何在ESP8266上進行MicroPython開發?

透過WebREPL客戶端上傳該檔案,完成之後,按RST復位鍵重啟ESP8266,輸入命令可看到多了一個main。py檔案。

如何在ESP8266上進行MicroPython開發?

import network;wlan = network。WLAN(network。STA_IF);wlan。active(True);wlan。isconnected();wlan。connect(‘meanea’, ‘{85208520}’);wlan。isconnected();wlan。config(‘mac’);wlan。ifconfig();

然後啟動webrepl

import webrepl;webrepl。start();

重連,時間修改為30s重傳main。py

如何在ESP8266上進行MicroPython開發?

附件:

ESP Flash Download Tool 工具

MicroPython韌體

串列埠工具