ESP32上的microPython
microPython是该团队针对微处理器(一般指无法运行Linux操作性系统)做出的一个python的实现,官方有一些支持的板子,esp32作为一块性能高于esp8266,同时也具备很不错的wifi、蓝牙功能的开发板,也在microPython的支持之中,当前开发文档参考microPython on esp8266,毕竟是同一类板子。
烧写和配置ESP32
编译固件
根目录
1 | $ make -C mpy-cross |
下载固件并烧写
https://micropython.org/download#esp32
另外需要esptool.py
,通过pip来安装。
1 | pip install esptool.py |
首先最好擦除原有的固件
1 | sudo esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash |
接着把刚刚下载的固件烧写上去
1 | sudo esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 ~/Downloads/esp32-20170803-v1.9.1-394-g79feb956.bin |
连接ESP32
在Linux上推荐使用picocom来打开串口连接ESP32,Windows直接使用putty也行,注意要指定115200的波特率
1 | $ sudo apt-get install picocom |
使用Python
用picocom打开串口之后,按一下板子上的rst,可以看到串口出来的是一个python的REPL(交互解释器),当前一般的开发方法是通过串口的这个解释器逐行写代码进去,但是重启之后就会失效,想要断电保存并上电自启动也行,但操作相对会比较麻烦,不在本文的讨论之内。
注意这里的python是python3.4加上一点点3.5的特性,支持绝大部分的python核心数据类型和一些核心库。
最简单的你可以测试一下一些简单的内建函数
这个REPL占用了esp32的UART0(GPIO1=TX,GPIO3=RX),不过它的tab补全非常给力,比pc上的iPython差一点,但比起PC上的python shell是好到哪里去都不知道了。
控制引脚
microPython通过一个叫machine
的module来控制引脚
1 | from machine import Pin |
比如下面的例子就能用一秒的间隔来闪烁LED
1 | import time |
另外对于这种比较长的代码,可以事先在PC上写完,然后在REPL中通过CRTL+E
进入粘贴模式,复制粘贴完之后CTRL+D
就行了。
microPython还有WiFi、PWM、SPI、I2C等一系列功能,以后的文章中会一个一个讲过来。
microPython常用函数
CPU主频
1 | import machine |
控制引脚
1 | from machine import Pin |
可以设置的GPIO有 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16;其中1、3作为REPL的串口使用,16用于从睡眠状态唤醒,使用的时候都需要注意。
PWM
1 | from machine import Pin, PWM |
除了GPIO16都可以使用PWM,频率参数的范围是1到1000,占空比参数的范围是0到1023。
ADC
1 | from machine import ADC |
软SPI
可以用于所有的引脚
1 | from machine import Pin, SPI |
硬件SPI
硬件SPI更快(达到80Mhz),但是只适用于特定的引脚:
MISO是GPIO12,MOSI是GPIO13,SCK是GPIO14
和软串口一样有同样的方法函数,只是构造函数不同
1 | from machine import Pin, SPI |
SPI(0)被用于FlashROM,不对用户开放
I2C
I2C适用于所有的引脚
1 | i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) |
深度睡眠模式
连接GPIO16和reset引脚
1 | import machine |
定时器
1 | from machine import Timer |
其中period的单位是毫秒
连接WIFI
1 | import network |
可以把下面这个函数放到boot.py
里面,每次启动一行代码就能连接WIFI了
1 | def do_connect(ssid, password): |
创建WIFI
1 | ap = network.WLAN(network.AP_IF) # 创建一个AP |
连接上WIFI之后就能进一步使用socket库了
延时和计时
1 | import time |
单总线
单总线协议适用于所有的引脚
1 | from machine import Pin |
ds18x20
用于DS18S20和DS18B20的驱动库
1 | import time, ds18x20 |
DHT驱动
DHT适用于所有的引脚
1 | import dht |
高级应用
内部文件系统
microPython支持标准的Python的文件模块,可以使用open()
这类原生函数。
需要注意的是esp32上实时资源少,需要及时关闭掉一些file、socket。
创建一个文件
1 | 'data.txt', 'w') f = open( |
其中这个9是指write()函数写进去的字节数
查看一个文件
1 | 'data.txt') f = open( |
文件目录操作
1 | import os # 引用os模块 |
esp启动顺序
首先运行_boot.py这个脚本,把文件系统挂载上,这个部分一般是固定的,不推荐用户来修改,可能会出很多奇怪的问题。
当文件系统挂载成功后,运行boot.py,在这个脚本里面,用户可以设置一些在REPL里面需要使用的变量或者函数,每次重启esp32,这个脚本也会运行一次,但是如果这个地方写错了代码, 比如进入了死循环之类的,你就需要重新刷固件了。
最后系统会从文件系统运行main.py(如果不存在,就不会运行),这个文件就是用来每次启动的时候运行用户程序而不是进入REPL的,对于一些小的脚本,你可以直接写成一个main.py名字的文件,不过也会推荐你把一个大应用分散来写,写成多个小程序,在main.py里面这么写就好了:
1 | import my_app |
设置开机自启动的脚本
对boot.py和main.py这两个文件进行修改都可以,比如对main.py进行修改:
1 | "main.py", 'w') file = open( |
通过快捷键ctrl+D
,软启动esp32,就能看到上面的效果了
1 | >>> |
网络socket应用
简单的连接WiFi和设置热点可以看上一篇教程,成功之后就可以考虑TCP socket连接了。
在这里我们可以用socket模块,但其实有更加方便的模块,urequests(u表示这个模块和标准python的模块相比有许多没有方法没有实现):
1 | import urequests |
urequests实现了主要的几个方法,比如get、post、put、delete这几种请求,在网络方面使用起来非常方便。