RISC-V技术论坛
直播中

jf_07365693

2年用户 380经验值
擅长:嵌入式技术 控制/MCU
私信 关注

【BPI-CanMV-K230D-Zero开发板体验】Home Assistant 智能 ADC 电压表和温度计的 LabVIEW 数据采集

ha-adc-vol-temp

【BPI-CanMV-K230D-Zero开发板体验】Home Assistant 智能 ADC 电压表和温度计的 LabVIEW 数据采集

本文介绍了香蕉派 CanMV K230D Zero 开发板通过 ADC 实现电压和温度转换,结合 WiFi 和 MQTT 协议实现数据实时上传至 Home Assistant 平台,并进一步结合 LabVIEW 上位机实现演化曲线分析及数据采集的项目设计。

项目介绍

  • ADC 数据采集:ADC 数据打印、电压获取、温度转换;
  • WiFi 连接:实现 WiFi 连接和网络连通性测试;
  • MQTT 上传:结合 MQTT 协议,实现 ADC 电压和转换温度数据的上传;
  • Home Assistant (HA) 测试:添加 ADC 温度和电压的传感器卡片,实现对应的物联网设计;
  • LabVIEW 上位机:自动捕获 JSON 消息,采集、分析和保存数据。

ADC 数据采集

包括 ADC 数据打印、电压获取、温度转换等。

代码

打开 CanMV IDE 软件,新建文件并添加如下代码

from machine import ADC, Pin
import time

adc = ADC(0) # 初始化 ADC

def read_adc():
    """读取ADC原始值、转换为电压和温度"""
    raw_value = adc.read_u16()
    vol = adc.read_uv() / 1000000  # voltage
    temp = (vol - 0.5) * 100 - 7  # temperature
    return raw_value, round(vol, 2), round(temp, 2)  # 保留2位小数

# 主循环
while True:
    raw, vol, temp = read_adc()
    print(f"ADC原始值: {raw:4d} | 电压值: {vol}V | 温度值: {temp}℃")
    time.sleep(1)

保存代码,连接开发板,运行代码。

效果

打开串行终端,获取 ADC 原始值、转换的电压值以及温度值。

print-adc-vol-temp.jpg

WiFi连接

测试 WiFi 连接功能,并使用 ping 实现网络连通性测试。

代码

打开 CanMV IDE 软件,新建文件并添加如下代码

import network
import time
import socket

# WiFi 配置
WIFI_SSID = "xxx"
WIFI_PASSWORD = "xxx"

def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    if not wlan.isconnected():
        print("连接WiFi中...")
        wlan.connect(WIFI_SSID, WIFI_PASSWORD)
        for _ in range(10):
            if wlan.isconnected():
                break
            time.sleep(1)
    if wlan.isconnected():
        print(f"WiFi连接成功! IP: {wlan.ifconfig()[0]}")
        return True
    else:
        print("WiFi连接失败!")
        return False

def ping_test(host, port=80):
    try:
        ip = socket.getaddrinfo(host, port)[0][4][0]
        sock = socket.socket()
        sock.settimeout(3)
        sock.connect((ip, port))
        sock.close()
        print(f"Ping {host} ({ip}): 成功")
        return True
    except Exception as e:
        print(f"Ping {host}: 失败({e})")
        return False

if connect_wifi():
    targets = [
        ("百度HTTP", "www.baidu.com", 80),
        ("百度HTTPS", "www.baidu.com", 443),
        ("Google DNS", "8.8.8.8", 53)
    ]
    for name, host, port in targets:
        print(f"\\n测试 {name}...")
        ping_test(host, port)

保存代码,连接开发板,运行代码。

效果

打开串行终端,获取 WiFi 连接状态、ping 情况等。

wifi_ping.jpg

MQTT 上传

在实现 ADC 数据采集和 WiFi 连接的基础上,进一步结合 MQTT 协议,实现 ADC 电压和转换温度数据的上传。

准备工作

考虑到需要通过 MQTT 协议上传 ADC 数据,采用 MQTTClient 库的方案。

将开发板连接电脑,在 此电脑\\CanMV\\sdcard\\libs\\umqtt 路径下添加 simple.py 文件,以便编程时直接调用。

流程图

flowchart_adc_mqtt.jpg

代码

打开 CanMV IDE 软件,新建文件并添加如下代码

import network
import time
import json
from machine import Pin, ADC
from libs.umqtt.simple import MQTTClient

# ----------------- WiFi配置 -----------------
WIFI_SSID = "xxx"
WIFI_PASSWORD = "xxx"

def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print("Connecting to WiFi...")
        wlan.connect(WIFI_SSID, WIFI_PASSWORD)
        while not wlan.isconnected():
            time.sleep(0.5)
    print("WiFi Connected:", wlan.ifconfig())

# ----------------- 传感器初始化 -----------------
adc = ADC(0)  # 假设ADC连接到GPIO35(根据实际硬件调整)

def read_sensors():
    # 获取ADC电压
    adc_value = adc.read_u16()  # 12位ADC
    voltage = adc.read_uv() / 1000000  # 转换为电压值(V)
    temperature = (voltage - 0.5) * 100 - 7 # 转换为温度值(℃)

    return round(voltage, 2), temperature

# ----------------- MQTT配置 -----------------
MQTT_SERVER = "192.168.1.121"  # MQTT 服务器地址
MQTT_PORT = 1883
MQTT_CLIENT_ID = "bpi-adc-vol-temp"  # 加密认证格式
MQTT_USERNAME = "xxx"
MQTT_PASSWORD = "xxx"
MQTT_TOPIC = "bpi/adc/vol_temp"

def connect_mqtt():
    client = MQTTClient(
        client_id=MQTT_CLIENT_ID,
        server=MQTT_SERVER,
        port=MQTT_PORT,
        user=MQTT_USERNAME,
        password=MQTT_PASSWORD
    )
    client.connect()
    print("Connected to MQTT Server")
    return client

# ----------------- 主程序 -----------------
def main():
    # 连接WiFi
    connect_wifi()

    # 连接MQTT
    mqtt_client = connect_mqtt()

    # 主循环
    while True:
        try:
            # 读取传感器数据
            voltage, temperature = read_sensors()

            # 构造JSON数据
            payload = {
                "voltage": voltage,
                "temperature": temperature
            }

            # 发布MQTT消息
            mqtt_client.publish(MQTT_TOPIC, json.dumps(payload))
            print("Data sent:", payload)

        except Exception as e:
            print("Error:", e)
            # 尝试重新连接
            try:
                mqtt_client.disconnect()
            except:
                pass
            time.sleep(5)
            mqtt_client = connect_mqtt()

        time.sleep(2) # 延时

if __name__ == "__main__":
    main()

保存代码,连接开发板,运行代码。

效果

打开串行终端,获取 WiFi 连接、MQTT 服务器连接、JSON 数据上传状态等。

adc-mqtt-print.jpg

测试

使用 MQTTX 软件测试数据接收情况;

  • 新建连接
  • 配置 MQTT Broker 信息,如 ip 地址、MQTT 账户密码等 -
  • 添加订阅主题,实现数据监听;

mqttx-test.jpg

可见数据每 2 秒更新一次。

Home Assistant 测试

使用 Docker 部署 HA 平台,并添加 MQTT 集成和传感器,实现 ADC 温度计和电压表的物联网设计。

  • 进入 HA 界面,依次打开设置 - 设备与服务 - 添加集成 - MQTT;
  • 输入 MQTT 配置信息,包括 ip 地址、MQTT 账户密码等;
  • 打开 HA 目录下的 config/configuration.yaml 文件,添加如下代码
mqtt:
  sensor:
    - name: "Temperature"
      state_topic: "bpi/adc/vol_temp"
      suggested_display_precision: 1
      unit_of_measurement: "°C"
      value_template: "{{ value_json.temperature }}"
    - name: "Voltage"
      state_topic: "bpi/adc/vol_temp"
      suggested_display_precision: 1
      unit_of_measurement: "V"
      value_template: "{{ value_json.voltage }}"
  • 在 HA 概览界面添加温度和电压表传感器卡片即可。

ha_adc_vol_temp.jpg

动态效果见顶部视频。

HA 部署方案详见:Home Assistant .

LabVIEW 上位机

为了实现 ADC 数据采集,设计了 LabVIEW 上位机,通过 MQTT 协议,自动捕获信息并提取数据,获得演化曲线以及数据保存等。

前面板

前面板的设计主要包括发布和订阅两部分,订阅部分包括控制按钮、主题、保存路径等参数配置、数据指针显示、演化曲线等。

front-panel-labview-adc.jpg

程序框图

block-panel-labview-adc.jpg

使用方法

  1. 填写 MQTT 连接信息,包括 IP 地址、用户名、密码、订阅主题等;
  2. 运行程序,点击 Connect 连接到 EMQX MQTT Broker 服务器,当 subscribe Success绿灯亮起,表明订阅初始化成功;
  3. 点击 Subscribe 按钮,此时 RX Value 接收到 json 消息,并成功获得温湿度数据;
  4. 采集完成后,点击 Quit 按钮结束进程。

需安装 VIPM JSONtext 软件库,实现 JSON 字符串转换和数字提取。

数据保存

单次数据采集完成后,程序自动保存数据至指定文件夹,包括日期、时间、温度值、电压值。

labview-adc-data-save.jpg

动态效果见底部视频。

总结

本文介绍了香蕉派 CanMV K230D Zero 开发板通过 ADC 实现电压和温度转换,结合 WiFi 和 MQTT 协议实现数据实时上传至 Home Assistant 平台,并进一步结合 LabVIEW 上位机实现演化曲线分析及数据采集的项目设计,为该开发板在物联网和工业科研领域的开发和应用提供了参考。

adc-labview

回帖(1)

无垠的广袤

2025-8-19 16:26:24
打通HomeAssistant智能家居平台应用了~可以实现很多终端采集和控制项目了,感谢~
举报

更多回帖

发帖
×
20
完善资料,
赚取积分