【雕爷学编程】MicroPython手册之 ESP32 特定端口库 esp32.NVS.set_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.set_blob()是一个用于在ESP32芯片上的非易失性存储(NVS)中存入一个键值对的方法,其中值必须为变长的二进制数据(blob)。

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

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

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

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

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

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

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

案例一:使用esp32.NVS.set_blob()来存储和读取一个数组,并在启动时打印。

import esp32
import array

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

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

# 创建一个数组
arr = array.array('i', [1, 2, 3, 4, 5])

# 将数组转换为二进制数据并存储
nvs.set_i32('arr_len', len(arr))
nvs.set_blob('arr', arr)

# 提交更改并关闭命名空间
nvs.commit()
nvs.close()

# 从NVS中读取二进制数据并转换为数组
nvs.open('r')
arr_len = nvs.get_i32('arr_len')
arr = array.array('i', bytearray(arr_len * 4))
nvs.get_blob('arr', arr)
nvs.close()

# 打印数组
print('Array:', arr)

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

import esp32
import uhashlib
import ubinascii

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

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

# 输入并加密一个字符串
msg = input('Enter a secret message: ')
key = b'mykey'
cipher = uhashlib.sha256(key + msg.encode()).digest()

# 将加密的字符串转换为二进制数据并存储
nvs.set_i32('cipher_len', len(cipher))
nvs.set_blob('cipher', cipher)

# 提交更改并关闭命名空间
nvs.commit()
nvs.close()

# 从NVS中读取二进制数据并转换为加密的字符串
nvs.open('r')
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.set_blob()来存储和读取一个图像,并在需要时显示。

import esp32
import framebuf

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

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

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

# 在图像上绘制一个笑脸
fb.fill(0)
fb.rect(0, 0, width, height, 1)
fb.fill_rect(16, 16, 16, 16, 1)
fb.fill_rect(32, 16, 16, 16, 1)
fb.fill_rect(16, 40, 32, 8, 1)

# 将图像转换为二进制数据并存储
nvs.set_i32('width', width)
nvs.set_i32('height', height)
nvs.set_blob('buf', buf)

# 提交更改并关闭命名空间
nvs.commit()
nvs.close()

# 从NVS中读取二进制数据并转换为图像
nvs.open('r')
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)

# 显示图像

案例四:图像存储:在某些应用中,你可能需要将图像数据存储在ESP32的非易失性存储器中。你可以使用esp32.NVS.set_blob()方法将图像数据以二进制形式存储,并在需要时检索出来。以下是一个示例:

import esp32

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

# 读取图像文件
with open('image.jpg', 'rb') as f:
    image_data = f.read()

# 存储图像数据
nvs.set_blob('image', image_data)

# 打印图像数据大小
print('Image size:', len(image_data))

案例六:传感器数据存储:如果你有一个传感器,产生大量数据,并且想要在设备重启后保留这些数据,那么可以使用esp32.NVS.set_blob()方法将传感器数据存储在ESP32的非易失性存储器中。以下是一个示例:

import esp32
import struct

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

# 读取传感器数据
sensor_data = read_sensor()

# 将传感器数据打包为二进制格式
packed_data = struct.pack('fff', sensor_data[0], sensor_data[1], sensor_data[2])

# 存储传感器数据
nvs.set_blob('sensor_data', packed_data)

# 打印存储的传感器数据大小
print('Stored sensor data size:', len(packed_data))

在这个示例中,read_sensor()函数用于模拟传感器数据的读取。读取的传感器数据被打包为二进制格式,并使用esp32.NVS.set_blob()方法存储在NVS中。

案例六:配置存储:esp32.NVS.set_blob()方法还可以用于存储复杂的配置数据,例如JSON对象或其他自定义数据结构。以下是一个示例:

import esp32
import json

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

# 配置数据
config = {
    'device_name': 'ESP32',
    'timeout': 10,
    'parameters': {
        'param1': 100,
        'param2': 200
    }
}

# 将配置数据转换为JSON字符串
config_json = json.dumps(config)

# 存储配置数据
nvs.set_blob('config', config_json)

# 打印存储的配置数据大小
print('Stored config size:', len(config_json))

在这个示例中,配置数据以JSON格式表示,并使用esp32.NVS.set_blob()方法存储在NVS中。这些示例展示了如何使用esp32.NVS.set_blob()方法在ESP32上存储不同类型的数据。请注意,存储的数据大小可能受到NVS的限制。具体的ESP32模块和MicroPython版本可能会有所不同,因此请查阅相关文档以获取更多详细信息和示例代码。

案例七:存储图像数据:

import esp32

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

# 读取图像文件
with open('image.jpg', 'rb') as file:
    image_data = file.read()

# 存储图像数据
nvs.set_blob('image', image_data)

print('Image data stored.')

这个示例程序展示了如何使用esp32.NVS.set_blob()方法存储图像数据。首先,创建一个esp32.NVS对象。然后,使用open()函数读取图像文件,并将其作为二进制数据存储在名为’image’的键下。

案例八:存储传感器数据:

import esp32
import struct

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

# 传感器数据
temperature = 25.5
humidity = 60.2

# 将数据打包为二进制格式
sensor_data = struct.pack('ff', temperature, humidity)

# 存储传感器数据
nvs.set_blob('sensor_data', sensor_data)

print('Sensor data stored.')

这个示例程序展示了如何使用esp32.NVS.set_blob()方法存储传感器数据。首先,创建一个esp32.NVS对象。然后,使用struct.pack()函数将温度和湿度数据打包为二进制格式。最后,将打包的传感器数据存储在名为’sensor_data’的键下。

案例九:存储音频数据:

import esp32

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

# 读取音频文件
with open('audio.wav', 'rb') as file:
    audio_data = file.read()

# 存储音频数据
nvs.set_blob('audio', audio_data)

print('Audio data stored.')

这个示例程序展示了如何使用esp32.NVS.set_blob()方法存储音频数据。首先,创建一个esp32.NVS对象。然后,使用open()函数读取音频文件,并将其作为二进制数据存储在名为’audio’的键下。

这些示例程序展示了如何使用esp32.NVS.set_blob()方法存储二进制数据(例如图像数据、传感器数据或音频数据)。你可以根据实际需求将不同类型的二进制数据存储在NVS中,并使用相应的键进行访问和检索。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值