基于STM32的物联网环境监测与远程控制系统实训套件-淘宝网

任务2 数据上传OneNET平台

一、任务描述

本任务基于 STM32F103C8T6 最小系统板,通过传感器采集温度、湿度、光照强度数据,由 ESP-01S WiFi 模块以MQTT 协议将数据上传至OneNET物联网平台。实现硬件采集→ WiFi传输→MQTT上报→云端存储显示的完整物联网流程,掌握设备数据上报、平台数据解析、物联网通信格式等核心技能。

二、任务目标

1. 知识目标

1)理解MQTT 数据上报格式与 OneNET 平台数据解析规则。

2)掌握温湿度、光照传感器数据采集与格式转换方法。

3)熟悉 ESP-01S 通过AT 指令发布 MQTT 消息(PUBLISH)的流程。

4)理解 JSON 格式在物联网数据传输中的作用。

2. 能力目标

1)能够采集温度、湿度、光照模拟 / 数字数据。

2)能够将采集数据拼接为标准 JSON 上报格式。

3)能够通过 ESP-01S 将数据上传至 OneNET 平台。

4)能够在 OneNET 平台查看实时数据、历史曲线。

3. 素质目标

1)培养数据格式规范、通信时序严谨的工程习惯。

2)提升传感器采集、数据封装、云端调试综合能力。

3)建立 “采集→处理→上传→显示” 的完整物联网思维。

三、任务重难点

1. 任务重点

1)MQTT 数据上报主题:$sys/产品ID/设备ID/thing/property/post

2)标准 JSON 数据格式:包含温度、湿度、光照。

3)ESP-01S 发布指令:AT+MQTTPUB。

4)数据成功上传并在 OneNET 平台显示。

2. 任务难点

1)JSON 格式错误导致平台无法解析。

2)字符串拼接、转义字符处理不当。

3)MQTT 主题错误、数据无法上报。

4)浮点型数据(温度 / 湿度)格式转换。

四、知识准备

1.MQTT 数据上传原理

设备作为MQTT 客户端,通过PUBLISH报文,向指定主题(Topic)发送 JSON 格式数据,平台订阅主题并解析、存储、展示数据。

2.OneNET 数据上报主题(固定格式)

$sys/产品ID/设备ID/thing/property/post

·必须替换为自己平台的产品 ID和设备 ID

·主题错误 → 数据发不出去 / 平台收不到

3.标准 JSON 上报格式(必须严格遵守)

{

  "id": "1",

  "params": {

    "temp": { "value": 25.5 },

    "humi": { "value": 48 },

    "light": { "value": 320 }

  }

}

temp:温度

humi:湿度

light:光照

格式错误 → 平台显示无数据

4.ESP-01S MQTT 发布 AT 指令

AT+MQTTPUB=0,"主题","JSON数据",0,0\r\n

·功能:向平台发布传感器数据

·0,0:QoS=0,retain=0

5.完整执行流程

1)设备连 WiFi

2)连接 MQTT 服务器(任务 2 前半部分)

3)采集温湿度、光照

4)拼接成 JSON 字符串

5)使用AT+MQTTPUB上传

6)平台显示数据

五、硬件连接

ESP-01S模块与主控STM32F103C8T6的引脚连接如表1所示。

      表1 ESP-01S模块与主控STM32F103C8T6的引脚连接

编号

ESP-01S模块

主控STM32F103C8T6

1

VCC

3V3

2

GND

GND

3

TX

PA3(USART2_RX)

4

RX

PA2(USART2_TX)

硬件连接电路图如图1所示。

图1 硬件连接电路图

六、任务实现
任务 2.1 修改 main.c 代码

1.在/* USER CODE BEGIN 0 */和/* USER CODE END 0 */之间添加如下代码:

char LED[10]="false" ,fan[10]="false";

2. /* USER CODE BEGIN 2 */后的代码如下:

  /* USER CODE BEGIN 2 */

Led_Init(); //LED初始化

Init_BH1750();              //光照传感器初始化

PWM_Init();                 // 风扇驱动初始化

  Led_Set(LED_ON);             //开启LED灯

strcpy(LED,"true");

OLED_Init();

 printf("任务2 数据上传OneNET平台\r\n");

 HAL_UART_Receive_IT(&huart2,(uint8_t *)&Uart2_RxData, 1);//开启串口中断

HAL_Delay(500);

    esp01s_Init(); //初始化esp01s,连接wifi

 HAL_Delay(500);

 while(OneNet_DevLink()) //连接OneNET

HAL_Delay(1000);

  /* USER CODE END 2 */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

       DHT11_Read_Data(&temp, &humi);

       light = Value_GY30();

  printf("OneNet_SendData\r\n");

  OneNet_SendData(); //发送数据

  esp01s_Clear(); //清空数据缓存区

HAL_Delay(3000); //3s发送一次

/* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

任务 2.2 修改 onenet.c 代码

修改OneNet_FillBuf()函数的代码如下:

extern uint8_t temp,humi;

extern uint16_t light;

extern char LED[10] ,fan[10];

unsigned char OneNet_FillBuf(char *buf)

{

char text[120];

memset(text, 0, sizeof(text));

strcpy(buf, "{\"id\":\"123\",\"params\":{");

memset(text, 0, sizeof(text));

sprintf(text, "\"temp\":{\"value\":%d},", temp);

strcat(buf, text);

memset(text, 0, sizeof(text));

sprintf(text, "\"humi\":{\"value\":%d},", humi);

strcat(buf, text);

memset(text, 0, sizeof(text));

sprintf(text, "\"light\":{\"value\":%d},", light);

strcat(buf, text);

memset(text, 0, sizeof(text));

sprintf(text, "\"LED\":{\"value\":%s},", LED);

strcat(buf, text);

memset(text, 0, sizeof(text));

sprintf(text, "\"fan\":{\"value\":%s}", fan);

strcat(buf, text);

strcat(buf, "}}");

return strlen(buf);

}

 任务 2.3 编译、下载、查看结果

1.点击编译按钮,编译程序。

2.点击下载按钮,下载程序。

      3.打开串口调试助手,按stm32f103c8t6主控板上的复位键,在串口调试助手中输出打印信息,如图2所示。

图2 输出打印信息

       4.刷新 OneNET设备详情页面,设备数据已经上传到OneNet平台,如图3所示。

图3 设备数据上传到OneNet平台

更多推荐