MicroPython 环境下使用 ESP32 连接百度 AI 大模型

前言

在物联网领域,ESP32 由于其丰富的功能和低功耗性能成为了一种流行的选择。结合 MicroPython,它为开发者提供了一个高效的开发环量,让 Python 程序员也能轻松介入到嵌入式系统和 IoT 应用的开发之中。本文将介绍如何利用这些技术,将 ESP32 连接到百度的 AI 大模型服务中,实现智能对话和其它高级功能。

环境设置

硬件:

  • ESP32开发板,一块性能强大且成本低廉的物联网微控制器。

软件:

  • MicroPython固件:一种为微控制器优化的轻量级 Python 解释器。
  • Thonny IDE:一个简单且易于使用的 Python IDE,支持 MicroPython 开发。

选择大模型

  • 访问百度智能云官网,搜索千帆大模型,获取所需的 API 接入信息。

百度智能云官网

首页搜索:千帆大模型

Thonny上实现

连接WiFi

要让 ESP32 能够与互联网通信,首先需要连接到 WiFi。以下代码简单演示了如何在 MicroPython 中完成这一步骤:

import network
import time

# WiFi credentials
SSID = 'ssid'
PASSWORD = 'password'

# Connect to WiFi
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(SSID, PASSWORD)
    print('Connecting to', SSID)

    while not wlan.isconnected():
        time.sleep(1)
        print('Waiting for connection...')
    
    print('Connected to', SSID)
    print('IP Address:', wlan.ifconfig()[0])


connect_wifi()

连接百度大模型

一旦完成 WiFi 连接,我们可以编写代码,调用百度 AI 大模型的 API。以下是一个简单的示例:

import urequests as requests
import ujson as json

def main():
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_speed?access_token=粘贴你网页上调试获取的token"

    payload = json.dumps({
        "messages": [
            {
                "role": "user",
                "content": "你好"
            }
        ]
    })
    headers = {
        'Content-Type': 'application/json'
    }
    
    print("Sending payload: ", payload)
    print("Headers: ", headers)
    response = requests.post(url, headers=headers, data=payload.encode('utf-8'))

    # 打印完整的响应内容
    print("Status Code:", response.status_code)
    print("Response Text:", response.text)

if __name__ == "__main__":
    main()

注意点与坑

  1. 当我们发送数据到服务器时,特别是包含了中文的情况下,需要保证数据以 utf-8 的形式编码。

    • 错误示例:json=payload.encode('utf-8')
    • 正确示例:data=payload.encode('utf-8')

    正确的方式是对 payload 进行 utf-8 编码,然后才发送数据。错误的方式可能会导致请求失败,或返回意料之外的结果。并且参数是data,而不是json

  2. 使用 urequestsujson 能够为 MicroPython 环境提供流畅的开发体验。它们是为在资源限制更为显著的微控制器上运行而优化的库,针对这类设备和应用场景进行了特别设计。

这边还可以填写其他的参数,根据自己的需求来填写,然后复制里面的“payload”放在Thonny中

请求回应图示

完整代码

import network
import time

# WiFi credentials
SSID = '###'
PASSWORD = '###'

# Connect to WiFi
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(SSID, PASSWORD)
    print('Connecting to', SSID)

    while not wlan.isconnected():
        time.sleep(1)
        print('Waiting for connection...')
    
    print('Connected to', SSID)
    print('IP Address:', wlan.ifconfig()[0])


connect_wifi()

import urequests as requests
import ujson as json

def main():
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_speed?access_token=24.7d2d58b68086XXXXXXX790991.282335-81633959"

    payload = json.dumps({
        "messages": [
            {
                "role": "user",
                "content": "你好"
            }
        ]
    })
    headers = {
        'Content-Type': 'application/json'
    }
    
    print("Sending payload: ", payload)
    print("Headers: ", headers)
    response = requests.post(url, headers=headers, data=payload.encode('utf-8'))

    # 打印完整的响应内容
    print("Status Code:", response.status_code)
    print("Response Text:", response.text)

if __name__ == "__main__":
    main()


由于我是一名AI语言模型,无法直接使用MicroPython编写代码。但是,我可以提供一些基本的思路和步骤,以帮助您编写ESP32与STM32进行IIC通信的MicroPython代码。 1. 确定IIC总线的引脚 在ESP32和STM32中,IIC总线的引脚可能不同。因此,您需要查找ESP32和STM32的引脚图,以确定哪些引脚可以用于IIC通信。 通常,IIC总线需要两个引脚:SDA和SCL。在ESP32中,它们通常位于GPIO21和GPIO22上。在STM32中,它们通常位于PB6和PB7上。 2. 安装MicroPython库 要在ESP32和STM32上使用IIC通信,您需要安装MicroPython库。有很多可用的库,例如uasyncio库,uPySMBus库,micropython-i2c库等。 在安装库之前,您需要通过UART或Wi-Fi连接ESP32。然后,您可以通过REPL(交互式解释器)或WebREPL(通过Web浏览器访问的交互式解释器)来安装库。 在STM32中,您需要使用ST-Link或其他调试器连接到开发板,并使用MicroPython固件来安装库。有关详细信息,请参阅MicroPython文档。 3. 编写IIC通信代码 一旦您安装了MicroPython库,就可以开始编写IIC通信代码了。以下是一个基本的ESP32与STM32之间的IIC通信示例: ```python import machine # IIC总线引脚 i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21)) # STM32的IIC地址 address = 0x68 # 发送数据到STM32 i2c.writeto(address, b'Hello STM32!') # 从STM32读取数据 data = i2c.readfrom(address, 10) print(data) ``` 在这个例子中,我们使用machine模块来创建一个I2C对象,并使用scl和sda参数指定引脚。然后,我们使用writeto()方法将数据发送到STM32,并使用readfrom()方法从STM32读取数据。 注意,在实际使用中,您需要根据您的具体应用程序进行更改和调整。例如,您需要确定正确的IIC地址,以及如何编码和解码数据等。 希望这些提示对您有所帮助,祝您编写出成功的MicroPython代码!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

送外卖的CV工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值