《从硬件到云端: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读数不稳定、华为云连接超时等问题的排查方法。

相关推荐
ARM2NCWU1 小时前
安卓原生兼容服务器
android·运维·服务器
nihuhui6662 小时前
NFS服务器实验
运维·服务器
PWRJOY2 小时前
Flask-SQLAlchemy核心概念:模型类与数据库表、类属性与表字段、外键与关系映射
服务器·数据库·flask
三三十二3 小时前
Labview基础使用教程
服务器·前端·javascript
2302_799525743 小时前
【Linux】第二十五章 运行容器
linux·运维·服务器
朱包林3 小时前
day18-特殊符号
linux·运维·服务器·ubuntu·centos
m0_747124535 小时前
服务器并发实现的五种方法
服务器·网络编程
Blossom.1185 小时前
Web3.0:下一代互联网的变革与机遇
人工智能·深度学习·物联网·机器学习·web3·区块链·边缘计算
无名之逆6 小时前
Build High-Performance Web Services with Hyperlane
服务器·开发语言·前端·http·rust
你是狒狒吗6 小时前
JWT了解
java·服务器·网络