【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.readfrom()

2023-11-11

在这里插入图片描述

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版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.readfrom() 的相关文章

随机推荐

  • centos8用阿里云安装yum源

    Centos8用阿里云装yum源 首先ping外网 ping baidu com能通就可以开始做了 阿里云yum源设置官方文档 https developer aliyun com mirror centos spm a2c6h 13651
  • Blender几个简单建模

    吉普车 这里车窗添加了玻璃材质 看起来更真实 简易台灯 可以设置成自己喜欢的形状 颜色 酒瓶 这是还没有上色的 啤酒瓶大多数都是绿色的 一把红色的椅子 个人喜欢红色系列的 就添加了红色 以上都是简单的模型 初学者还需要继续努力
  • Ajax&JavaScript&css模仿百度一下模糊查询功能

    1 效果 如下图所示 我们在输入大学时 程序会到后端查询名字中包含大学的数据 并展示到前端页面 用户选择一个大学 该大学值会被赋值到input表单 同时关闭下拉表单 当页面展示的数据都不符合条件时 用户点击空白处 可关闭表单 2 前端 2
  • 微信小程序案例分享

    微信小程序 后台管理类 1 社区团购小程序 2 音乐播放器小程序 3 家具商城小程序 4 二手交易小程序 5 疫苗小程序 6 智慧停车小程序 7 读书小程序 8 美食小程序 前后端分类 管理后台类 1 企业招聘 2 客户关系管理系统 3 试
  • 敏捷开发中asp.net MVC的开发次序感受(先开发View?先开发Model?先开发Controller!)

    转载自 http blog csdn net cheny com article details 6592493 各种思路和顺序都试过 最开始时先编写Model 毕竟Model是所有一切的基础 再说没有Model Controller里边用
  • 2019年中山大学数据科学与计算机学院研究生统考机试

    2019年中山大学数据科学与计算机学院研究生统考机试题目回忆 本文回忆了2019年中山大学数据科学与计算机学院研究生考试机试题目 希望能对以后的同学的学习有所帮助 机试共十道题 1 继承 一共有3个类 animal cat dog cat和
  • ciscn 2022 misc 部分wp

    everlasting night 提示是注意png数据块 然后注意图片通道数据可以用来lsb解码 下载是一张图片 尝试几种方法之后没有太大发现 得到提示于是看了一下stegsolve f78dcd383f1b574b 这里发现了一串可疑字
  • 90、Tensorflow实现分布式学习,多台电脑,多个GPU 异步试学习

    Created on 2017年5月28日 author weizhen import time import tensorflow as tf from tensorflow examples tutorials mnist import
  • Vue 实现左边导航栏且右边显示具体内容(element-ui)

    最终效果图 现在开始进入正题 1 安装element ui npm i element ui S CDN 目前可以通过 unpkg com element ui 获取到最新版本的资源 在页面上引入 js 和 css 文件即可开始使用
  • 探索人工智能

    前言 模型训练是指使用算法和数据对机器学习模型进行参数调整和优化的过程 模型训练一般包含以下步骤 数据收集 数据预处理 模型选择 模型训练 模型评估 超参数调优 模型部署 持续优化 文章目录 前言 数据收集 数据预处理 模型选择 模型训练
  • Tracy 小笔记 Vue - 路由

    Vue Router 路由中有一个非常重要的概念叫路由表 本质上就是一个映射表 决定了数据包的指向 服务器渲染 后端渲染 如 jsp php java 服务器直接生产渲染好对应的 html 页面 返回到客户端进行展示 这种情况下渲染好的页面
  • java实现截图功能

    java实现截图功能 java实现截图 录屏 public static void main String args throws InterruptedException 截取整个屏幕 保存在H盘下 名字为当前时间毫秒值 格式为png T
  • Unity3D-UI--Layout组件

    Layout组件 自动排版 Layout Group Vertical Layout Group 垂直布局 垂直布局组 组件将其子布局元素彼此重叠 它们的高度由各自的最小高度 首选高度和柔性高度决定 具体取决于以下模型 Vertical L
  • Activity之间的跳转的两种实现方法

    概括 在Android当中 Activity的跳转有两种方法 第一个是利用startActivity Intent intent 的方法 第二个则是利用startActivityForResult Intent intent int req
  • QT添加外部动态库

    编译完动态库 将动态库debug文件夹中的 a和 dll拷贝下来 在window中 dll 动态库 lib 静态库 在linux中 so 动态库 a 静态库 在根目录下新建include 并放入其中 同样的把头文件也放入include中 然
  • 图论基本概念

    文章目录 图 相邻 度 简单图 路径 子图 连通 无向图 有向图 本章概述了图论中的一些概念 部分内容来源于 OI Wiki 图 图 Graph 是一个由 点集 Vertex set 和 边集 Edge set 组成的二元组 常用 G V
  • 哈工大深圳计算机水平怎么样,还原一个真实的哈工大!——十问(转载)

    发信人 hiticeberg 千面怪 信区 NewExpress 标 题 还原一个真实的哈工大 十问 发信站 水木社区 Fri May 30 19 37 50 2008 站内 作为哈工大的土著 也许也是目前连续在校时间最长的哈工大学子 在毕
  • [蓝桥杯][2013年第四届真题]剪格子

    一定要好好审题啊 行号和列号跟题意要求的搞反了 结果de到怀疑人生了 这个题给的数据量不大 所以我就放心大胆的在每个中间节点里各开了一个vis标记数组 用来记录每一条广搜路径走过的节点 include
  • 微信小程序使用 scss

    一 在 vscode 中安装 easy sass 扩展 二 在微信开发者工具导入 vscode 安装的 easy sass 扩展 安装完成后会让重新加载扩展 再次打开后就可以看到扩展已经有 easy sass 了 三 修改 easy sas
  • 【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.readfrom()

    MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器 与常规Python相比 MicroPython解释器体积小 仅100KB左右 通过编译成二进制Executable文件运行 执行效率较高 它使用