MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。
MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。
MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。
使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。
总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
MicroPython 是一种适用于微控制器的 Python 语言的精简实现,它可以让开发者使用 Python 语法和标准库来编写嵌入式应用程序。WiPy 是一种基于 ESP32 芯片的无线开发板,它支持运行 MicroPython 固件。MicroPython 特定于 WiPy 的库是一组为 WiPy 设计的模块,它们提供了 WiPy 的特有功能和硬件接口的访问。MicroPython 特定于 WiPy 的库的主要特点如下:
1、它包含了一些与 WiPy 相关的模块,如 machine, network, pycom, uos 等,它们分别提供了 WiPy 的机器级别控制,网络连接,灯光控制,操作系统接口等功能。
2、它还包含了一些通用的 MicroPython 模块,如 binascii, hashlib, math, random, struct, time 等,它们提供了一些常用的数据处理,加密,数学,随机数,数据结构,时间等功能。
3、它遵循了 MicroPython 的设计原则,即简洁,高效,可移植和兼容。
MicroPython的 wipy.machine.I2C.readfrom()是一个用于从I2C总线上读取数据的方法,它可以接收一个从设备的7位地址和一个要读取的字节数,然后返回一个包含读取数据的字节对象。它有两个参数:
addr是一个整数,表示从设备的7位地址。
nbytes是一个整数,表示要读取的字节数。
wipy.machine.I2C.readfrom()的主要特点有:
它是一个软件I2C的实现,使用位组合来执行读写操作,可以在任何引脚上使用,但效率不高。
它只能在I2C对象处于控制器模式时有效,即在创建或初始化I2C对象时指定mode为I2C.CONTROLLER。
它在读取数据之前会自动发送起始信号和从设备地址,并在读取数据之后会自动发送终止信号。
wipy.machine.I2C.readfrom()的应用场景有:
在需要从I2C协议兼容的外部设备读取数据时,可以调用该方法来简化通信过程。
在需要读取固定长度的数据时,可以调用该方法来指定要读取的字节数。
在需要读取不含内存地址的数据时,可以调用该方法来直接读取数据。
wipy.machine.I2C.readfrom()需要注意的事项有:
在使用wipy.machine.I2C.readfrom()之前,需要先导入machine模块,并创建相应的I2C对象。
在使用wipy.machine.I2C.readfrom()时,需要保证SCL和SDA引脚上有合适的上拉电阻,否则可能导致通信失败或不稳定。
在使用wipy.machine.I2C.readfrom()时,需要注意与外部设备匹配好通信参数,如地址,频率,位宽等。
以下是MicroPython的 wipy.machine.I2C.readfrom()几个实际运用程序参考案例:
案例一:使用wipy.machine.I2C.readfrom()从DS18B20温度传感器读取温度值
from machine import I2C, Pin
import time
i2c = I2C(scl=Pin(4), sda=Pin(5), freq=100000, mode=I2C.CONTROLLER) # 创建并初始化I2C对象
addr = 0x48 # 从设备地址
while True:
i2c.writeto(addr, b'\x44') # 发送转换命令
time.sleep_ms(750) # 等待转换完成
i2c.writeto(addr, b'\xbe') # 发送读取命令
data = i2c.readfrom(addr, 9) # 读取9个字节的数据
temp = (data[1] << 8 | data[0]) * 0.0625 # 解析温度值
print(temp) # 打印温度值
time.sleep(1) # 暂停1秒
案例二:使用wipy.machine.I2C.readfrom()从Nokia 5110液晶显示器读取状态
from machine import I2C, Pin
i2c = I2C(scl=Pin(4), sda=Pin(5), freq=100000, mode=I2C.CONTROLLER) # 创建并初始化I2C对象
addr = 0x3c # 从设备地址
i2c.writeto(addr, b'\x21') # 发送扩展指令集命令
i2c.writeto(addr, b'\x0f') # 发送状态寄存器命令
data = i2c.readfrom(addr, 1) # 读取一个字节的数据
status = data[0] # 解析状态寄存器
print(status) # 打印状态寄存器
案例三:使用wipy.machine.I2C.readfrom()从W25Q64闪存芯片读取数据
from machine import I2C, Pin
i2c = I2C(scl=Pin(4), sda=Pin(5), freq=100000, mode=I2C.CONTROLLER) # 创建并初始化I2C对象
addr = 0x50 # 从设备地址
i2c.writeto(addr, b'\x03') # 发送读取命令
i2c.writeto(addr, b'\x00\x00\x00') # 发送地址
data = i2c.readfrom(addr, 16) # 读取16个字节的数据
print(data) # 打印数据
案例四:从设备读取固定长度的数据:
import machine
# 初始化I2C总线
i2c = machine.I2C(0, pins=("P9", "P10"))
# 设置目标设备地址
device_address = 0x50
# 从设备读取固定长度的数据
data = i2c.readfrom(device_address, 4)
print("Received data:", data)
# 关闭I2C总线
i2c.deinit()
在这个示例中,我们初始化了一个I2C对象并指定其为0号I2C总线。我们设置了I2C总线的引脚,使用"P9"作为SDA引脚,"P10"作为SCL引脚。然后,我们设置了要读取数据的目标设备地址为0x50,并使用i2c.readfrom()方法从该设备读取4个字节的数据。读取到的数据存储在data变量中,并打印出来。
案例五:从设备读取可变长度的数据:
import machine
# 初始化I2C总线
i2c = machine.I2C(0, pins=("P9", "P10"))
# 设置目标设备地址
device_address = 0x50
# 从设备读取可变长度的数据
data = bytearray(8) # 分配存储数据的缓冲区
bytes_read = i2c.readfrom(device_address, data)
print("Bytes read:", bytes_read)
print("Received data:", data[:bytes_read])
# 关闭I2C总线
i2c.deinit()
在这个示例中,我们初始化了一个I2C对象并指定其为0号I2C总线。我们设置了I2C总线的引脚,使用"P9"作为SDA引脚,"P10"作为SCL引脚。然后,我们设置了要读取数据的目标设备地址为0x50,并创建了一个长度为8的字节数组作为存储数据的缓冲区。我们使用i2c.readfrom()方法从设备读取数据,并将读取的字节数存储在bytes_read变量中。读取到的数据存储在data缓冲区中,并打印出来。
案例六:从不同设备连续读取数据:
import machine
# 初始化I2C总线
i2c = machine.I2C(0, pins=("P9", "P10"))
# 读取第一个设备的数据
device_address1 = 0x50
data1 = i2c.readfrom(device_address1, 4)
print("Data from device 1:", data1)
# 读取第二个设备的数据
device_address2 = 0x60
data2 = i2c.readfrom(device_address2, 6)
print("Data from device 2:", data2)
# 关闭I2C总线
i2c.deinit()
在这个示例中,我们初始化了一个I2C对象并指定其为0号I2C总线。我们设置了I2C总线的引脚,使用"P9"作为SDA引脚,"P10"作为SCL引脚。然后,我们分别设置了要读取数据的两个不同设备的地址,即0x50和0x60。首先,我们使用i2c.readfrom()方法从第一个设备读取4个字节的数据,并存储在data1变量中。然后,我们使用相同的方法从第二个设备读取6个字节的数据,并存储在data2变量中。最后,我们分别打印出从两个设备读取的数据。这些示例展示了在使用wipy.machine.I2C.readfrom()方法时的不同应用场景。根据具体的需求和硬件配置,您可以根据这些示例进行适当的调整。
案例七:读取传感器数据:使用wipy.machine.I2C.readfrom()方法可以读取连接到I2C总线上的传感器的数据。以下是一个示例:
import machine
# 初始化I2C对象
i2c = machine.I2C(0, scl=machine.Pin(5), sda=machine.Pin(4), freq=400000)
# 启动I2C通信并读取传感器数据
i2c.start()
data = i2c.readfrom(0x50, 4) # 从设备地址为0x50的传感器中读取4个字节的数据
i2c.stop()
# 处理读取到的传感器数据
sensor_value = int.from_bytes(data, 'big')
print("Sensor value:", sensor_value)
在这个示例中,我们首先创建了一个I2C对象,并通过指定I2C总线的编号、时钟和数据线引脚以及通信频率进行初始化。然后,我们使用i2c.start()方法启动I2C通信,并使用i2c.readfrom()方法从设备地址为0x50的传感器中读取4个字节的数据。读取数据后,我们使用int.from_bytes()函数将字节数据转换为整数,并进行进一步处理。
案例八:与LCD显示屏通信:使用wipy.machine.I2C.readfrom()方法可以与连接到I2C总线上的LCD显示屏进行通信,并读取显示屏上的数据。以下是一个示例:
import machine
# 初始化I2C对象
i2c = machine.I2C(0, scl=machine.Pin(5), sda=machine.Pin(4), freq=400000)
# 启动I2C通信并读取LCD显示屏数据
i2c.start()
data = i2c.readfrom(0x27, 8) # 从设备地址为0x27的LCD显示屏中读取8个字节的数据
i2c.stop()
# 处理读取到的LCD显示屏数据
lcd_data = data.decode('utf-8')
print("LCD data:", lcd_data)
在这个示例中,我们创建了一个I2C对象,并通过指定I2C总线的编号、时钟和数据线引脚以及通信频率进行初始化。然后,我们使用i2c.start()方法启动I2C通信,并使用i2c.readfrom()方法从设备地址为0x27的LCD显示屏中读取8个字节的数据。读取数据后,我们使用decode()方法将字节数据解码为字符串,并进行进一步处理。
案例九:与外部EEPROM存储器通信:使用wipy.machine.I2C.readfrom()方法可以与连接到I2C总线上的外部EEPROM存储器进行通信,并读取存储在其中的数据。以下是一个示例:
import machine
# 初始化I2C对象
i2c = machine.I2C(0, scl=machine.Pin(5), sda=machine.Pin(4), freq=400000)
# 启动I2C通信并读取EEPROM存储器数据
i2c.start()
address = 0x50 # EEPROM存储器的设备地址
start_address = 0x00 # 起始读取地址
data = i2c.readfrom(address, 16, start_address) # 从EEPROM存储器中读取16个字节的数据,起始地址为0x00
i2c.stop()
# 处理读取到的EEPROM存储器数据
for i, byte_data in enumerate(data):
print("Byte {} data: {}".format(i, byte_data))
在这个示例中,我们创建了一个I2C对象,并通过指定I2C总线的编号、时钟和数据线引脚以及通信频率进行初始化。然后,我们使用i2c.start()方法启动I2C通信,并使用i2c.readfrom()方法从设备地址为0x50的EEPROM存储器中读取16个字节的数据,起始地址为0x00。读取数据后,我们可以对每个字节进行进一步处理,例如打印其十进制或十六进制值。
请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。