ESP8266的资源非常有限(比如RAM内存)。因此请避免分配太大的容器对象(列表,字典)和缓冲区。
ESP8266也没完整的操作系统来跟踪资源并自动清理它们,所以请务必在使用后尽快关闭打开的文件、套接字等。
boot过程
启动时,MicroPythonEPS8266在FlashROM中安装文件系统,执行_脚本,如果FlashROM不可用,则执行模块的首次安装并创建文件系统。该引导过程不能供普通用户定制。
一旦安装了文件系统,就执行。是在第一次设置模块时创建的,并具有启动WebREPL等守护进程的命令(默认禁用,可通过webrepl_setup模块进行配置),对文件的修改应该谨慎。
引导过程的最后一步,如果存在,则从文件系统执行。这个文件是一个钩子,用于在每次引导时启动用户应用程序(而不是转到REPL)。对于小型测试应用程序,可以直接将它们命名为,反之,建议将应用程序保存在单独的文件中,并在中引入(import)使用。
已知问题
实时时钟(RTC):
ESP8266中的RTC精度很差,误差可能是秒/分钟。为了测量足够短的时间间隔,可以使用()等函数,还可以使用附带的模块从网络同步时间。
由于ESP8266芯片的限制,内部实时时钟(RTC)将每7:45小时溢出一次。如果需要长期工作的RTC时间,则必须在7小时内至少调用time()或localtime()一次,MicroPython将处理溢出。
同时操作STA_IF和AP_IF
支持STA_IF和AP_IF接口同时操作。但是,由于硬件的限制,如果STA_IF没有连接和搜索到AP,AP_IF中可能存在性能问题。可以在只使用AP_IF的环境中禁用STA_IF。
socket和WiFi缓冲区溢出
套接字实例在显式关闭之前一直保持活动状态,这有两个问题。首先,它们会占用RAM,因此打开套接字而不关闭它们的应用程序最终可能会耗尽内存。其次,没有正确关闭socket会导致供应商WiFi堆栈的底层部分发出Lmac错误。如果数据进入套接字,但没有及时处理,就会发生这种情况。这可能会溢出WiFi堆栈输入队列并导致死锁,解锁的唯一方法是硬复位。
上述情况也可能发生在应用程序因任何原因(包括异常)终止并退出REPL之后。随后的数据到达会触发失败,并重复发出上述错误消息。因此,套接字在任何情况下都应该关闭,无论应用程序是否成功终止或通过异常终止,例如使用try/finally:
sock=socket()try:检查网络是否连接sta_()Falseap_()True激活sta模式sta_(True)验证网络是否正常连接sta_()可根据需要选择是否关闭AP模式ap_(False)
自动连接wifi网络配置脚本,可存放与文件,启动即执行。
defdo_connect():importnetworksta_if=(_IF)ifnotsta_():print('connectingtonetwork')sta_(True)sta_('ssid','key')whilenotsta_():passprint('networkconfig:',sta_())TCP套接字
大多数互联网的构建块是TCP套接字。这些套接字在连接的网络设备之间提供可靠的字节流。
从网上下载数据
获取服务器的IP地址:addr_info=("",23)使用IP地址创建一个套接字并连接到服务器s=()(addr)定义函数defhttp_get(url):importsocket_,_,host,path=('/',3)addr=(host,80)[0][-1]s=()(addr)(bytes('GET/%sHTTP/1.0\r\nHost:%s\r\n\r\n'%(path,host),'utf8'))whileTrue:data=(100)ifdata:print(str(data,'utf8'),='')else:()导入machine模块importmachine读取引脚状态()0定义回调函数,用于处理中断事件defcallback(p):print('pinchange',p)引脚0设置为仅在输入的下降沿上触发(当它从高到低时)(trigger=_FALLING,handler=callback)可以将高电压和低电压应用到引脚0和2,以查看正在执行的中断。触发中断事件并调用回调函数进行处理
硬件中断在事件发生时立即触发,并将中断任何正在运行的代码,包括Python代码。因此,回调函数所能做的事情是有限的(例如,它们不能分配内存),并且应该尽可能的简短。
PWM:PulseWidthModulation,脉冲宽度调制脉宽调制
(PWM)是一种在数字引脚上获得人工模拟输出的方法。它通过快速切换引脚电压从低到高来实现这一点。
有两个参数与此相关:切换频率和占空比。占空比定义为高电压与单个周期(低时间加高时间)的长度比。最大占空比是指引脚一直为高电压,最小占空比是指引脚一直低电压。
在ESP8266上,引脚0、2、4、5、12、13、14和15都支持PWM。限制是这些引脚必须处于相同的频率,并且频率必须在1Hz和1kHz之间。创建引脚对象
设置频率和占空比(500)(512)超过这个最小/最大值的值将被剪切。打印PWM对象,还可以调用不带参数的freq()和duty()方法来获取当前配置值。创建pwm引脚对象,并设置频率led=((2),freq=1000)调用foriinrange(10):pulse(led,20)
控制舵机
伺服电机可以使用PWM控制。要求频率为50Hz,占空比在40到115之间,以77为中心值。
servo=((12),freq=50)(40)(115)(77)
ADC
ESP8266有一个单独引脚(与GPIO引脚分开),可用于读取模拟电压并将其转换为数字值。
读取值()58
read()函数返回的值介于0(0.0伏)和1024(1.0伏)之间。请注意,此输入只能容忍最大1.0伏,必须使用分压器电路来测量更大的电压。
电源(功耗)控制
动态改变CPU频率获取当前CPU频率
()80000000
修改CPU频率为160MHz,可以在执行繁重的任务时更改为较高的频率,在完成处理时再更改回来用以控制功耗。
(160000000)()160000000
深度睡眠状态深度睡眠模式将关闭ESP8266及其所有外设,包括WiFi(但不包括用于唤醒芯片的实时时钟),能够有效降低电流消耗。为了使用深度睡眠功能,必须将GPIO16连接到复位引脚(RST)。
(wakingthedevice)(,10000)thedeviceisonGPIO12dat=(12)scanfordevicesonthebusroms=()print('founddevices:',roms)定义在GPIO4上配置一个8像素的NeoPixel条带np=((4),8)settored,fullbrightnessnp[1]=(0,128,0)settoblue,quarterbrightness在4-bpp模式下,记得使用4元组而不是3元组来设置颜色。np[0]=(255,0,0,128)Yellow-greeninanRGBYSetupnp[2]=(0,0,255,128)使用write()方法将颜色输出到()cycleforiinrange(4*n):forjinrange(n):np[j]=(0,0,0)np[i%n]=(255,255,255)()_ms(25)fadein/outforiinrange(0,4*256,8):forjinrange(n):if(i//256)%2==0:val=i0xffelse:val=255-(i0xff)np[j]=(val,0,0)()执行示例demo(np)控制APA102LEDs
APA102led,也称为DotStarled,是可单独寻址的全彩RGBled,通常以串形形式。与NeoPixels的不同之处在于,需要两个引脚来控制——一个时钟引脚和一个数据引脚。可以在比NeoPixels更高的数据和PWM频率下工作,并且更适合于视觉持久效果。创建APA102对象:配置一个60像素的APA102条带,时钟引脚GPIO5,数据引脚GPIO4。
importmachine,apa102strip=((5),(4),60)
RGB颜色数据,以及亮度等级,以一定的顺序被发送到APA102。通常是(红,绿,蓝,亮度)。如果使用的是较新的ap102cled,绿色和蓝色顺序交换(红,蓝,绿,亮度)。如果希望以RGB顺序提供颜色,而不是RBG,可以自定义元组颜色顺序:
设置像素颜色strip[0]=(255,255,255,31)settored,fullbrightnessstrip[2]=(0,255,0,15)settoblue,quarterbrightness1Mstripwith60LEDsstrip=((5),(4),60)brightness=1Helperforconverting0-255offsettoacolourtupledefwheel(offset,brightness):Demo1:RGBRGBRGBred=0xff0000green=red8blue=red16foriinrange():colour=red(i%3)*8strip[i]=((colourred)16,(colourgreen)8,(colourblue),brightness)()Demo3:Fadeallpixelstogetherthroughrainbowcolours,offseteachpixelforrinrange(5):forninrange(256):foriinrange():strip[i]=wheel(((i*256//)+n)255,brightness)()_ms(25):((0,0,0,0))()
使用温湿度传感器DHT11
DHT(DigitalHumidityTemperature)数字温湿度传感器是低成本的数字传感器,带有电容式湿度传感器和热敏电阻,其芯片能够将模拟信号转换为数字,并提供单总线接口(或I2C接口)。
DHT11(蓝色)和DHT22(白色)传感器提供相同的1-wire接口,DHT22需要一个单独的对象,具有更复杂的计算。DHT22对湿度和温度读数都有1个小数位分辨率。DHT11则是整数。
自定义的1-wire协议(与Dallas1-wire协议不同)用于从传感器获取测量数据。有效测量载荷由湿度值、温度值和校验和组成。使用1-wire接口,构造引用数据引脚对象
DHT22importdhtimportmachined=((4))sck=14(scl),mosi=13(sda),miso=12(unused)dc=Pin(4)resetcs=Pin(15)data/commandrst=Pin(5)chipselect,somemodulesdonothaveapinforthisdisplay=_SPI(128,64,spi,dc,rst,cs)
I2C接口
frommachineimportPin,I2Cimportssd1306poweroffthedisplay,()(255)(0)(False)writethecontentsoftheFrameBuffertodisplaymemory
子类FrameBuffer提供了对基本图形的支持:
(0)getpixelatx=0,y=10(0,10,1)drawhorizontallinex=0,y=8,width=4,colour=1(0,8,4,1)drawalinefrom0,0to127,63(10,10,107,43,1)drawasolidrectangle10,10to117,53,colour=1('HelloWorld',0,0,1)scroll20pixelstotherightdrawontopatx=10,y=10,key=0()示例:绘制MicroPython标志并显示一些文本信息:
(0)_rect(0,0,32,32,1)_rect(2,2,28,28,0)(9,8,22,1)(16,2,22,1)(23,8,22,1)_rect(26,24,2,4,1)('MicroPython',40,0,1)('SSD1306',40,12,1)('OLED128x64',40,24,1)()常用模块和功能参考
machine模块
()设置CPU频率为160MHz
esp模块
(None)重定向O/S调试信息到UART(0)
network模块
importnetwork创建STA接口(True)扫描()指定SSID和密码连接('mac')获取接口网络信息,包括IP/netmask/gw/DNS创建AP接口(True)设置AP的SSID睡眠1秒_ms(500)睡眠10微秒start=_ms()计算时间差timers:支持基于rtos的虚拟定时器。使用ID为-1的定时器类,周期单位为毫秒。
frommachineimportTimertim=Timer(-1)(period=5000,mode=_SHOT,callback=lambdat:print(1))(period=2000,mode=,callback=lambdat:print(2))
Pins和GPIO:使用类
可用引脚为:0、1、2、3、4、5、12、13、14、15、16
注意,引脚(1)和引脚(3)分别是REPLUART的TX和RX
Pin(16)是一个特殊的Pin(用于从深度睡眠模式唤醒),可能无法用于更高级别的类,如Neopixel。
高级抽象类用于翻转引脚电平,可用于低电平激活的LED。
frommachineimportPinp0=Pin(0,)设置引脚为高电平()设置引脚为高电平p2=Pin(2,)获取引脚的电平,1为高电平,0为低电平p4=Pin(4,,_UP)定义GPIO5输出高电平
UART(串口总线):两个uart可用。
UART0在引脚1(TX)和3(RX)上。UART0是双向的,默认情况下用于REPL
UART1位于引脚2(TX)和8(RX)上,但引脚8用于连接闪存芯片,因此UART1仅为TX。
当UART0附加到REPL时,UART(0)上的所有传入字符都会直接进入stdin,因此()将总是返回None。
如果需要从UART(0)中读取字符,则使用(),同时它也用于REPL(或分离,读取,然后重新连接)。分离后,UART(0)可以用于其他目的。
frommachineimportUARTuart=UART(0,baudrate=9600)('hello')(5)从REPL分离(None,1)对指定引脚创建PWM对象()设置频率()设置占空比()创建PWM对象并指定频率和占空比ADC(analogtodigitalconversion):模数转换
ADC在专用引脚上可用。
注意:ADC引脚上的输入电压必须在0v到1.0v之间。
frommachineimportADCadc=ADC(0)读取ADC的值,范围0-1024
软件SPI总线:
是通过软件实现的(bit-banging),可以在所有引脚上工作,并通过类访问。
frommachineimportPin,SoftSPIpolarity参数标识SCKidle状态的电平设置波特率(10)在MOSI上输出0xff同时读取10个字节buf=bytearray(50)读入给定的缓冲区(buf前面只当为50个字节)(buf,0xff)在MOSI上写5个字节buf=bytearray(4)写入到MOSI,并从MISO读入缓冲区_readinto(buf,buf)构造I2C总线i2c=I2C(scl=Pin(5),sda=Pin(4),freq=100000)(0x3a,4)向地址为0x3a的外设写入“12”buf=bytearray(10)对指定的外设写入缓冲区的数据
RTC(Realtimeclock)实时时钟
类方法中(),(handler=*)(使用自定义处理程序),()和()目前不支持。
frommachineimportRTCrtc=RTC()((2017,8,23,1,12,48,0,0))获取日期时间设置从远程服务器同步时间()启用WDTwdt=WDT()()
深度睡眠模式
将GPIO16连接到复位引脚(RST)。
importmachine检查设备是否是从深度睡眠模式唤醒_cause()==_RESET:print('wokefromadeepsleep')使设备进入深度睡眠模式()单总线(OneWire)
OneWire是软件实现的,可以在所有引脚上工作
frommachineimportPinimportonewireow=(Pin(12))返回单总线上连接的设备()读取一个字节(0x12)向总线写入字节_rom(b'12345678')设置GPIO0输出到NeoPixelsnp=NeoPixel(pin,8)设置第一个灯珠为白色()获取第一个灯珠的颜色
APA102
frommachineimportPinfromapa102importAPA102clock=Pin(14,)设置GPIO13为数据输出apa=APA102(clock,data,8)设置第一个灯珠为白色,最大亮度为31()获取第一个灯珠的颜色
APA102底层控制
_write(clock_pin,data_pin,rgbi_buf)
DHT
DHT驱动是软件实现的,可以在所有引脚上工作:
importdhtimportmachined=((4))()()湿度百分比d=((4))()()湿度百分比
SSD1306OLED
frommachineimportPin,I2Cimportssd1306i2c=I2C(scl=Pin(5),sda=Pin(4),freq=100000)display=_I2C(128,64,i2c)('HelloWorld',0,0,1)()WebREPL(webbrowserinteractiveprompt)
初始化webrepl配置
importwebrepl_setup
如果未设置启动时自动启动,可手动启动
()
其他