《从硬件到云端:STC8H ADC数据采集与华为物联网平台对接全解析》

引言

在现代物联网(IoT)系统中,模拟信号的精准采集与云端数据传输是实现智能化的关键环节。本文以STC8H微控制器的ADC模块为核心,结合华为云物联网平台,完整展示了从硬件电路设计、模拟信号采集到数据云端上报的全流程。通过滑动变阻器案例,读者将掌握ADC的配置方法、电压测量范围扩展技巧,并学习如何通过MQTT协议将数据上传至华为云,最终实现远程监控与分析。

技术背景

  • ADC的作用:在医疗设备、环境监测等场景中,ADC将连续的模拟信号(如电压、温度)转换为数字信号,供微处理器处理。
  • 华为云IoT平台:提供设备接入、数据管理和可视化能力,是构建物联网应用的理想选择。

正文

华为云配置

华为物联网平台:www.huaweicloud.com/product/iot...

云端数据下发:support.huaweicloud.com/usermanual-...

云端数据上报:support.huaweicloud.com/usermanual-...

1. 开通设备接入 IoTDA

打开console.huaweicloud.com/iotdm/?regi...

点击开通免费单元

编辑

点立即创建

编辑

等待创建完毕后,进入实例

编辑

2. 创建产品和设备

编辑

填写产品详清

编辑

进入产品详情

编辑

点击【上传模型文件】

编辑

上传如下zip文件:📎huawei_model.zip 也可自己进行自定义模型

编辑

效果如下

编辑

添加设备

编辑

点击详情查看设备

编辑

查看MQTT连接参数

编辑

设备发布话题

参考文档:云端数据上报 设备属性上报_设备接入 IoTDA_华为云

话题地址:$oc/devices/{device_id}/sys/properties/report,记得将{device_id}替换为设备id

话题内容:

json 复制代码
{
  "services": [
    {
      "service_id": "base",
      "properties": {
        "Temperature": 12.5,
        "Humidity": 35
      }
    }
  ]
}

使用AT指令发送:

ini 复制代码
AT+MQTTPUB=0,"$oc/devices/67e1017024865261be31d160_device001/sys/properties/report","{"services":[{"service_id":"base","properties":{"Temperature":22.5,"Humidity":23}}]}",0,0

参考示例

python 复制代码
import json
import time
import paho.mqtt.client as mqtt


# pip install paho-mqtt==1.6.1
# 1. 去到设备界面复制设备ID
# 2. 复制设备mqtt联网参数

# 订阅的话题
subTopic = "$oc/devices/xxxxxxxxxxxxxxx/sys/properties/set/request_id=123"
# 发布的话题
pubTopic = "$oc/devices/xxxxxxxxxxxxxx/sys/properties/report"

port = 1883

keepAlive = 300

"""
{
    "username": "x",
    "password": "x",
    "clientId": "x",
    "hostname": "x.iot-x.cn-north-4.myhuaweicloud.com",
    "port": 8883,
    "protocol": "MQTTS"
}
"""
username="x"
password= "x"
clientId= "x"
hostname= "x.iot-mqtts.cn-north-4.myhuaweicloud.com"

client = mqtt.Client(clientId)
client.username_pw_set(username=username, password=password)


def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connect huaweicloud IoT Cloud Sucess")
    else:
        print("Connect failed...  error code is:" + str(rc))

def on_message(client, userdata, msg):
    topic = msg.topic
    payload = msg.payload.decode()
    print("receive message ---------- topic is : " + topic)
    print("receive message ---------- payload is : " + payload)

    # {"paras":{"switch":1},"service_id":"heima8","command_name":"cmd_switch"}
    
    # json格式的字符串转成python里面的数据结构,字典
    data = json.loads(payload)
    print("switch:",data['paras']['switch'])

    # 回复服务器
    # $oc/devices/{device_id}/sys/properties/set/response/request_id={request_id}
    topic = "$oc/devices/67d92038dc85c43dcb35a707_heima8/sys/properties/set/response/request_id=123"
   
    client.publish(topic, "post_payload")

    if ("thing/service/property/set" in topic):
        on_thing_prop_changed(client, msg.topic, msg.payload)

def on_thing_prop_changed(client, topic, payload):
    post_topic = topic.replace("service","event")
    post_topic = post_topic.replace("set","post")
    Msg = json.loads(payload)
    params = Msg['params']
    post_payload = "{"params":" + json.dumps(params) + "}"
    print("reveice property_set command, need to post ---------- topic is: " + post_topic)
    print("reveice property_set command, need to post ---------- payload is: " + post_payload)
    client.publish(post_topic, post_payload)

def connect_mqtt():
    client.connect(hostname, port, keepAlive)
    return client

def publish_message():
    # publish 5 messages to pubTopic("/a1LhUsK****/python***/user/update")

    for i in range(50):

        data = {
            "services": [{
                    "service_id": "heima8",
                    "properties": {
                        "switch": i,
                    },
                }
            ]
        }

        message = json.dumps(data)
        
        client.publish(pubTopic, message)
        print("publish msg: " + str(i))
        print("publish msg: " + message)
        time.sleep(2)

def subscribe_topic():
    # subscribe to subTopic("/a1LhUsK****/python***/user/get") and request messages to be delivered
    client.subscribe(subTopic)
    print("subscribe topic: " + subTopic)

client.on_connect = on_connect
client.on_message = on_message
client = connect_mqtt()
client.loop_start()
time.sleep(2)

subscribe_topic()
publish_message()

while True:
    time.sleep(1)

micropython版-物联网

1. 环境搭建

安装umqtt.simple包

编辑

编辑

2. 实现步骤

  1. 准备好阿里云设备连接参数
  2. 连接wifi
  3. 创建MQTTClient对象
  4. 订阅消息
  5. 定时发布消息
  1. 准备阿里云设备参数

编辑

  1. 连接wifi
python 复制代码
def ConnectWifi(ssid, passwd):
        global wlan
        wlan = network.WLAN(network.STA_IF)  # create a wlan object
        wlan.active(True)  # Activate the network interface
        wlan.disconnect()  # Disconnect the last connected WiFi
        wlan.connect(ssid, passwd)  # connect wifi
        print("开始联网...")
        while (wlan.ifconfig()[0] == '0.0.0.0'):
                time.sleep(1)
        print("联网成功:",wlan.ifconfig())
  1. 创建MQTTClient

该操作api最后参数为维持心跳的时长,每隔60s就给服务器发消息,告诉服务器设备还活着

ini 复制代码
client = MQTTClient(CLIENT_ID, SERVER, 1883, username, password, 60) 
  1. 订阅消息
ini 复制代码
def subscribe_callback(topic, msg):
        msg = json.loads(msg)
        topic = topic.decode()
        print("接收到topic",topic)
        if(topic == subscribe_TOPIC):
            if msg['params']['AlarmSwitch'] !=0:         
                led.value(0)   
            else: 
                led.value(1)

# 设置订阅消息回调函数
client.set_callback(subscribe_callback)  # set callback
# 订阅话题
client.subscribe(subscribe_TOPIC)  # client subscribes to a topic
  1. 等待用户数据
python 复制代码
 while True:
          client.wait_msg() 

3. 示例代码

python 复制代码
#-*-coding:utf-8-*-
from umqtt.simple import MQTTClient
from machine import Pin
import network
import time
import machine
import dht
from machine import Timer
import json

"""
{
  "ProductKey": "k0ejus4OoQl",
  "DeviceName": "5Lq9OGQODLusHlBp97fl",
  "DeviceSecret": "307bf81677628905e79784b4d2f65ace"
}

{"clientId":"k0ejus4OoQl.5Lq9OGQODLusHlBp97fl|securemode=2,signmethod=hmacsha256,timestamp=1733748536747|",
"username":"5Lq9OGQODLusHlBp97fl&k0ejus4OoQl",
"mqttHostUrl":"iot-06z00epnznwak8t.mqtt.iothub.aliyuncs.com",
"passwd":"929e8ea099ddb639608637e4088e6ff75f617c358b954ab3c7d6f0f15f24fecc",
"port":1883}

"""

#---以下的参数值都需要根据自己的环境修改-----------------------------------------------
led=Pin(48,Pin.OUT) #ESP32的引脚2接了LED灯,可根据自己的ESP32板子的LED引脚来设置

SSID = "icheima"  #填写自己的WIFI名称
PASSWORD = "abcdefgh"   #填写自己的WIFI密码

SSID = "SUIXING-Hotel"  #填写自己的WIFI名称
PASSWORD = ""   #填写自己的WIFI密码


SERVER = "iot-06z00epnznwak8t.mqtt.iothub.aliyuncs.com"  # mqttHostUrl
CLIENT_ID = "k0ejus4OoQl.5Lq9OGQODLusHlBp97fl|securemode=2,signmethod=hmacsha256,timestamp=1733748536747|"  # clientId
username = "5Lq9OGQODLusHlBp97fl&k0ejus4OoQl" #username
password = "929e8ea099ddb639608637e4088e6ff75f617c358b954ab3c7d6f0f15f24fecc"  #密码
publish_TOPIC = "/sys/k0ejus4OoQl/5Lq9OGQODLusHlBp97fl/thing/event/property/post"
subscribe_TOPIC = "/sys/k0ejus4OoQl/5Lq9OGQODLusHlBp97fl/thing/service/property/set"
#---以上的参数值都需要根据自己的环境修改-----------------------------------------------

client = None

wlan = None

i = 0

def ConnectWifi(ssid, passwd):
        global wlan
        wlan = network.WLAN(network.STA_IF)  # create a wlan object
        wlan.active(True)  # Activate the network interface
        wlan.disconnect()  # Disconnect the last connected WiFi
        wlan.connect(ssid, passwd)  # connect wifi
        print("开始联网...")
        while (wlan.ifconfig()[0] == '0.0.0.0'):
                time.sleep(1)
        print("联网成功:",wlan.ifconfig())

def subscribe_callback(topic, msg):
        msg = json.loads(msg)
        topic = topic.decode()
        print("接收到topic",topic)
        if(topic == subscribe_TOPIC):
            if msg['params']['AlarmSwitch'] !=0:         
                led.value(0)   
            else: 
                led.value(1)
            

def publish_message(mytimer):
        global client
        global i
        
        i+=1
        try:
                request_params = {
                        "CurrentTemperature": 11+i,
                        "CurrentHumidity": 120+i,
                        "CurrentVoltage": 120+i,
                        "AlarmSwitch":1+i
                 }
                request = {
                    "id": 1,
                    "version": "1.0",
                    "params": request_params,
                    "method": "thing.event.property.post"
                }

                message = json.dumps(request)
                print('发布消息============================')
                print(message)
                client.publish(topic=publish_TOPIC, msg=message, retain=False, qos=0)
                print("发布消息成功")
                
        except Exception as e:
                print('exception:', e)
                mytimer.deinit()




def wifi_deng_run():
        global client
        global led
        global wlan
        print('物联网点灯大师启动...')
        try:
                
                ConnectWifi(SSID, PASSWORD)
                client = MQTTClient(CLIENT_ID, SERVER, 0, username, password, 60)  # create a mqtt client
                print('client:%s' % str(client))
                led.value(1)
                client.set_callback(subscribe_callback)  # set callback
                client.connect()  # connect mqtt
                client.subscribe(subscribe_TOPIC)  # client subscribes to a topic
                mytimer = Timer(0)
                mytimer.init(mode=Timer.PERIODIC, period=2000, callback=publish_message)
                while True:
                        client.wait_msg()  # wait message

        except Exception  as ex_results:
                print('exception1', ex_results)
                return "FAILED"
        finally:
                if (client is not None):
                        led.value(0)
                        client.disconnect()
                wlan.disconnect()
                wlan.active(False)
                print("重新连接")
                return 'FAILED'


while (True):
    if wifi_deng_run() == 'FAILED':
            print('FAILED,retry to connect')
            time.sleep(5)

总结与展望

通过本文实践,我们完成了以下目标:

  1. 硬件层 :配置STC8H的ADC模块,实现02.5V电压测量,并通过分压电路扩展量程(如05V)。
  2. 软件层:编写ADC数据采集代码,解析电压值并处理数据溢出问题。
  3. 云端对接:利用华为云IoT平台,通过MQTT协议上报数据,实现设备与云端的双向通信。

未来优化方向

  • 精度提升:采用更高精度的基准电压芯片(如REF5025)或软件滤波算法(如滑动平均)。
  • 低功耗设计:在电池供电场景下,优化ADC采样频率和云端通信间隔。
  • 多传感器融合:结合温湿度传感器(如DHT11),丰富数据采集维度。

结语

物联网技术的核心在于"连接"与"数据"。掌握ADC与云平台的结合,不仅为智能硬件开发奠定了基础,更为后续的大数据分析、AI决策提供了可能。希望本文能为读者的IoT项目开发带来启发,助力更多创新应用落地。


附录

  • 常见问题解答:如ADC读数不稳定、华为云连接超时等问题的排查方法。

相关推荐
技术不支持1 小时前
Qt Creator 11.0.3 语法高亮bug问题
java·服务器·数据库·qt·bug
木枷1 小时前
c2rust使用
人工智能·物联网·edge
Zhang.jialei1 小时前
HiveMQ 2024.9 设计与开发文档
hive·物联网·activemq
易ლ拉罐2 小时前
【计算机网络】Socket网络编程
服务器·网络·计算机网络
大大大大肉包2 小时前
linux中挂载磁盘和卸载
linux·运维·服务器
new对象吗什么类型都有3 小时前
服务器中切换盘的操作指南
运维·服务器
jxy pro max3 小时前
Corrosion2靶机练习笔记
服务器·网络·笔记
CODE_RabbitV7 小时前
Linux 文件与目录操作命令宝典
linux·运维·服务器
caz287 小时前
麒麟服务器版操作系统添加VNC
linux·服务器·centos·vnc
终端域名8 小时前
虚实共生:元宇宙与物联网的融合实践与未来图景
物联网·元宇宙