说明
忘记本文是否发出过。如果发出后,版主可以删贴。
开发顺畅了许多
得到@dcexpert的提示,重启PyBoard需要使用安全退出流程。虽然有些麻烦,但用户代码丢失和乱码现象少了许多。而且也不再傻傻的使用main.py了。而是将自己的用户代码在内部存储器中另外保存一个文件:demo.py。并在boot.py中将第一个文件指向demo.py。
# boot.py -- run on boot-up
# can run arbitrary Python, but best to keep it minimal
import machine
import pyb
pyb.main('demo.py')
#pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('CDC+MSC') # act as a serial and a storage device
#pyb.usb_mode('CDC+HID') # act as a serial device and a mouse
USB CDC + ADC采样
物联网的前端设备重头戏是数据采集。所以,我整理了一下代码,参考Arduino的命名方式来构建了一个新demo。
import pyb
import select
led = pyb.LED(1)
chx = pyb.ADC(pyb.Pin('X19'))
chy = pyb.ADC(pyb.Pin('X20'))
usb = pyb.USB_VCP()
def setup():
pass
def loop():
global led, chx, chy, usb
x = chx.read()
y = chy.read()
i = x // 33
j = y // 33
s = "x:%d,y:%d\t\t%s\r\n"%(x,y,'#'*i)
usb.write(s)
led.toggle()
pyb.delay(250)
setup()
while True:
loop()
增加功能:ADC定时采集+按键中断和去抖动
上面例子中,main loop + ADC polling + delay是非常传统的做法。但是毫无必要的delay()是无意义的,日后必然会被大量其他任务所替代。但是其他任务会造成ADC采样不平均,所以利用定时器来采样是比较合理。但究竟是在定时器ISR里直接读取ADC还是退回到主循环中读取,需要综合考虑了。
模块化编程
首先在存储方式上,内置文件系统是支持多个文件的。以及内置了boot.py/main.py/pyboard.inf/README.txt,我也增加了demo.py。
其次,让我们把某个功能做成一个模块和类来试试看。
调度器
虽然main loop + ISR + callback + timer可以成为很好的应用框架。之前有网友提到采用Thread,micropython明显现在没有。不过,Python2.7.11里面就有sched标准库,不过依赖于headpq(micropython有对应uheadq),和namedtuple(micropython没有,需要自建数据结构类型)。
但这个sched依然是很有用的库,架构很简单,蛮适合嵌入式小环境的任务调度。
增加功能:JSON编码
许多EE背景的工程师喜欢使用BINARY或者字符串的协议。但在物联网场景中能够使用标准化协议来序列化对象可以节省不少功夫,比如JSON/XML/msgpack等等。
micropython内置标准库中有ujson,虽然仅支持最核心的两种方法:dumps()和load(),却足够了。拿到JSON字符串,上位机无论是何种编程语言(Java/Javascript/Python/C/C++)都很容易适配。
客户端:Processing或者Python GUI
开源设计中已经有大量的GUI组件,甚至还有非常直接的数据采集组件。Python这方面也很强,此外,Arduino的开发原型Processing也是非常棒的UI设计工具。配合JSON格式数据可以很方便的将数据可视化。
本文来自论坛,点击查看完整帖子内容。