【雕爷学编程】MicroPython手册之 ESP32 特定端口库 esp32.NVS.get_blob()

在这里插入图片描述

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的esp是指针对ESP8266和ESP32芯片的MicroPython固件和相关软件库。ESP8266和ESP32是一类广泛应用于物联网和嵌入式系统的低成本、低功耗的Wi-Fi和蓝牙模块。MicroPython的esp为这两种芯片提供了高级的脚本编程环境,使开发者能够使用Python语言进行快速原型设计和开发。

ESP8266:是一款低成本、低功耗的Wi-Fi模块/芯片,由Espressif Systems开发。它内置了TCP/IP协议栈,可以用于连接互联网,并具备较强的处理能力。MicroPython的esp提供了针对ESP8266的固件和相关软件库,使开发者可以使用MicroPython语言进行ESP8266应用的开发。

ESP32:是Espressif Systems推出的一款高度集成的Wi-Fi和蓝牙模块/芯片,与ESP8266相比,它具备更强大的处理能力、更多的外设接口和更多的内存。MicroPython的esp也提供了针对ESP32的固件和相关软件库,使开发者可以使用MicroPython语言进行ESP32应用的开发。

MicroPython的esp固件:是专门针对ESP8266和ESP32芯片的MicroPython固件版本。这些固件经过了针对性的优化,使得它们可以在ESP8266和ESP32上运行,并提供了与硬件交互、网络通信和外设控制等功能的API。

软件库:MicroPython的esp还提供了一系列与ESP8266和ESP32硬件相关的软件库,用于简化和加速开发过程。这些软件库提供了丰富的功能接口,涵盖了Wi-Fi、蓝牙、GPIO(通用输入输出)、I2C、SPI、PWM等常用的硬件和通信协议,使开发者可以方便地访问和控制硬件资源。
在这里插入图片描述

MicroPython的esp32.NVS.get_blob()是一个用于从ESP32芯片上的非易失性存储(NVS)中读取一个键值对的方法,其中值必须为变长的二进制数据(blob)。

esp32.NVS.get_blob()的主要特点是:

它可以在不同的命名空间中读取不同类型的数据,例如字符串、整数、浮点数或二进制数据。
它可以在设备断电或重启后读取存储的数据,不会丢失或损坏。
它可以在运行时动态地获取存储的数据,也可以清空整个命名空间。

esp32.NVS.get_blob()的应用场景有:

读取一些复杂的数据结构,例如数组、字典、对象等,方便在启动时自动加载或设置。
读取一些加密或压缩的数据,例如密钥、证书、文件等,方便在需要时解密或解压。
读取一些图像或音频等多媒体数据,方便在需要时显示或播放。

esp32.NVS.get_blob()的需注意事项有:

在使用esp32.NVS.get_blob()之前,需要先导入esp32模块,并使用esp32.NVS(namespace)函数来创建一个NVS对象,其中namespace是一个字符串,表示要访问的命名空间。
在使用NVS对象的方法之前,需要先调用NVS对象的open(mode)方法来打开命名空间,其中mode是一个字符串,表示打开模式,可以是’r’(只读)或’w’(读写)。
在使用NVS对象的方法之后,需要调用NVS对象的close()方法来关闭命名空间,并调用NVS对象的commit()方法来提交更改。
在使用esp32.NVS.get_blob()时,需要注意二进制数据的长度不能超过508,000字节或97.6%的分区大小减去4000字节,以较小者为准。如果超过这个限制,会返回错误码ESP_ERR_NVS_VALUE_TOO_LONG。

以下是几个使用MicroPython的esp32.NVS.get_blob()的实际运用程序案例:

案例一:使用esp32.NVS.get_blob()来读取和显示一个图像。

import esp32
import framebuf

# 创建一个NVS对象,指定命名空间为'image'
nvs = esp32.NVS('image')

# 打开命名空间为只读模式
nvs.open('r')

# 从NVS中读取二进制数据并转换为图像
width = nvs.get_i32('width')
height = nvs.get_i32('height')
buf = bytearray(width * height // 8)
nvs.get_blob('buf', buf)
nvs.close()

# 创建一个framebuf对象,表示一个图像
fb = framebuf.FrameBuffer(buf, width, height, framebuf.MONO_HLSB)

# 显示图像
# 这里假设有一个oled对象连接到I2C总线上
oled.blit(fb, 0, 0)
oled.show()

案例二:使用esp32.NVS.get_blob()来读取和解密一个字符串,并在需要时显示。

import esp32
import uhashlib
import ubinascii

# 创建一个NVS对象,指定命名空间为'secret'
nvs = esp32.NVS('secret')

# 打开命名空间为只读模式
nvs.open('r')

# 从NVS中读取二进制数据并转换为加密的字符串
cipher_len = nvs.get_i32('cipher_len')
cipher = bytearray(cipher_len)
nvs.get_blob('cipher', cipher)
nvs.close()

# 解密并显示字符串
key = b'mykey'
msg = ubinascii.hexlify(cipher)[len(key) * 2:].decode()
print('Secret message:', msg)

案例三:使用esp32.NVS.get_blob()来读取和播放一个音频文件。

import esp32
import uio
import audio

# 创建一个NVS对象,指定命名空间为'audio'
nvs = esp32.NVS('audio')

# 打开命名空间为只读模式
nvs.open('r')

# 从NVS中读取二进制数据并转换为音频文件
audio_len = nvs.get_i32('audio_len')
audio_data = bytearray(audio_len)
nvs.get_blob('audio', audio_data)
nvs.close()

# 创建一个uio对象,表示一个内存文件
audio_file = uio.BytesIO(audio_data)

# 播放音频文件
# 这里假设有一个i2s对象连接到DAC芯片上
audio.play(i2s, audio_file)

案例四:图像检索:假设你先前使用esp32.NVS.set_blob()方法将图像数据存储在ESP32的非易失性存储器中。现在你可以使用esp32.NVS.get_blob()方法来检索图像数据。以下是一个示例:

import esp32

# 创建NVS对象
nvs = esp32.NVS('my_nvs')

# 检索图像数据
image_data = nvs.get_blob('image')

# 将图像数据写入文件
with open('retrieved_image.jpg', 'wb') as f:
    f.write(image_data)

# 打印检索到的图像数据大小
print('Retrieved image size:', len(image_data))

在这个示例中,通过调用nvs.get_blob(‘image’)方法,从NVS中检索之前存储的图像数据。然后,将图像数据写入文件以保存。

案例五:传感器数据检索:在之前的示例中,我们使用esp32.NVS.set_blob()方法将传感器数据存储在NVS中。现在,我们可以使用esp32.NVS.get_blob()方法来检索传感器数据。以下是一个示例:

import esp32
import struct

# 创建NVS对象
nvs = esp32.NVS('my_nvs')

# 检索传感器数据
packed_data = nvs.get_blob('sensor_data')

# 解包传感器数据
sensor_data = struct.unpack('fff', packed_data)

# 打印检索到的传感器数据
print('Retrieved sensor data:', sensor_data)

在这个示例中,通过调用nvs.get_blob(‘sensor_data’)方法,从NVS中检索之前存储的传感器数据。然后,使用struct.unpack()方法解包二进制数据,以获取原始的传感器数据。

案例六:配置检索:假设你之前使用esp32.NVS.set_blob()方法将配置数据存储在NVS中。现在,你可以使用esp32.NVS.get_blob()方法来检索配置数据。以下是一个示例:

import esp32
import json

# 创建NVS对象
nvs = esp32.NVS('my_nvs')

# 检索配置数据
config_json = nvs.get_blob('config')

# 将配置数据解析为JSON对象
config = json.loads(config_json)

# 打印检索到的配置数据
print('Retrieved config:', config)

在这个示例中,通过调用nvs.get_blob(‘config’)方法,从NVS中检索之前存储的配置数据。然后,使用json.loads()方法将JSON字符串解析为Python对象,以获取原始的配置数据。

案例七:读取图像数据:

import esp32

# 创建一个 NVS 对象
nvs = esp32.NVS()

# 读取图像数据
image_data = nvs.get_blob('image')

if image_data is not None:
    # 将图像数据保存到文件
    with open('image.jpg', 'wb') as file:
        file.write(image_data)
    print('Image data saved.')
else:
    print('Image data not found.')

这个示例程序展示了如何使用 esp32.NVS.get_blob() 方法读取存储的图像数据。首先,创建一个 esp32.NVS 对象。然后,使用 get_blob() 方法获取名为 ‘image’ 的键对应的二进制数据。如果数据存在,将其保存到文件中。如果数据不存在,打印相应的消息。

案例八:读取传感器数据:

import esp32
import struct

# 创建一个 NVS 对象
nvs = esp32.NVS()

# 读取传感器数据
sensor_data = nvs.get_blob('sensor_data')

if sensor_data is not None:
    # 解析传感器数据
    temperature, humidity = struct.unpack('ff', sensor_data)
    print('Temperature:', temperature)
    print('Humidity:', humidity)
else:
    print('Sensor data not found.')

这个示例程序展示了如何使用 esp32.NVS.get_blob() 方法读取存储的传感器数据。首先,创建一个 esp32.NVS 对象。然后,使用 get_blob() 方法获取名为 ‘sensor_data’ 的键对应的二进制数据。如果数据存在,使用 struct.unpack() 函数解析二进制数据并提取温度和湿度值。最后,打印温度和湿度值。如果数据不存在,打印相应的消息。

案例九:读取音频数据:

import esp32

# 创建一个 NVS 对象
nvs = esp32.NVS()

# 读取音频数据
audio_data = nvs.get_blob('audio')

if audio_data is not None:
    # 处理音频数据
    # ...
    print('Audio data processed.')
else:
    print('Audio data not found.')

这个示例程序展示了如何使用 esp32.NVS.get_blob() 方法读取存储的音频数据。首先,创建一个 esp32.NVS 对象。然后,使用 get_blob() 方法获取名为 ‘audio’ 的键对应的二进制数据。如果数据存在,可以根据需求进行音频数据的处理。如果数据不存在,打印相应的消息。

这些示例展示了如何使用esp32.NVS.get_blob()方法从ESP32的非易失性存储器中检索不同类型的数据。请注意,检索的数据应与之前存储的数据类型和格式相匹配。具体的ESP32模块和MicroPython版本可能会有所不同,因此请查阅相关文档以获取更多详细信息和示例代码。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值