- 云平台配置
第一步:配置OneNet平台
登入个人账号后,点击进入开发者中心,进入管理后台。


在页面左侧导航栏中,依次选择[产品开发]→[创建产品],进入产品创建页面。
在产品创建页面配置产品基本信息
产品品类:根据实际需求在下拉菜单中选择(如智能家居等)。

智能化方式选择:
1.设备接入(自定义开发)
适用于已有硬件设备需接入平台的场景,可自主开发设备通信协议。
2.产品智能化(OneNet平台方案)
可直接使用OneNet自带的[中移和物]APP实现设备管理与控制,无需额外开发客户端。

在产品列表找到已创建产品,点击对应产品开发按钮,进入产品开发详情页。
在产品开发详情页,设置物模型。

可选自定义功能,按需填写功能名称、数据类型、标识符等信息。

在此处,我们新增三组数据:一组用于传输温度信息,一组用于传输湿度信息,另一组用于传输经纬度信息。



在页面左侧导航栏,找到设备接入管理分类下的设备管理选项并点击,随后在对应功能区,点击添加设备。

经上述步骤,OneNet平台相关配置已全部完成。
设备接线
GPS的天线要放室外。

实物接线




代码
main.c
#include "stm32f10x.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"
#include "bsp_usart.h"
#include "oled.h"
#include "BC20.h"
#include "bsp_dht11.h"
GPS_Data gps_data = {0};
float temp,humi;
extern BC20_Status s_bc20_status;
int count=0;
char OLEDBuff[512];
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SysTick_Init(72); //系统时钟初始化
usart1_init(115200);//串口1初始化
printf("USART1 OK!\r\n");
usart2_init(9600);//串口2初始化(BC20模块)
usart3_init(115200);//串口3初始化
OLED_Init();
OLED_Clear();
BC20_Init();
// 连接OneNet平台,带重试机制
int connect_retry = 3;
while(connect_retry-- > 0) {
if(BC20_ConnectOneNet() == BC20_OK) {
break;
}
printf("OneNet连接失败,剩余重试次数: %d\r\n", connect_retry);
delay_ms(2000);
}
if(connect_retry <= 0) {
printf("OneNet连接失败,系统将重启...\r\n");
delay_ms(2000);
NVIC_SystemReset();
}
DHT11_Init(); //DHT11温湿度传感器初始化
OLED_ShowString(40,0,"BC20");
OLED_ShowString(0, 2, "温度: 湿度: ");
OLED_ShowString(0,4,"经度");
OLED_ShowString(0,6,"纬度");
while(1)
{
BC20_ProcessReceivedData();
// 读取温湿度
if(DHT11_Read_TempAndHumidity(&DHT11_Data) == SUCCESS) {
temp = DHT11_Data.temp_int + DHT11_Data.temp_deci * 0.1;
humi = DHT11_Data.humi_int + DHT11_Data.humi_deci * 0.1;
OLED_ShowNum(40, 2, (int)temp, 2, 16);
OLED_ShowNum(100, 2, (int)humi, 3, 16);
} else {
printf("DHT11读取失败\r\n");
}
// 定时发送数据
count++;
if(count >= 40) { // 40 * 50ms = 2秒
printf("温度: %.1f 湿度: %.1f\r\n", temp, humi);
count = 0;
// 获取GPS数据(增加超时限制,避免长时间阻塞)
static uint32_t gps_retry = 0;
uint32_t gps_start = 0;
gps_start++;
if(BC20_GetGPSData(&gps_data) != BC20_OK)
{
gps_retry++;
printf("GPS数据获取失败,重试次数: %d\r\n", gps_retry);
if(gps_retry >= 5) {
BC20_InitGPS();
gps_retry = 0;
}
} else {
gps_retry = 0;
sprintf(OLEDBuff,"%.6f",gps_data.latitude);
OLED_ShowString(40,4,OLEDBuff);
sprintf(OLEDBuff,"%.6f",gps_data.longitude);
OLED_ShowString(40,6,OLEDBuff);
}
BC20_SendToOneNet(temp, humi, &gps_data);
}
delay_ms(50);
}
}
BC20.c
#include "BC20.h"
#include "stm32f10x_iwdg.h"
#include "oled.h"
#include "bsp_usart.h"
#include "delay.h"
#include <math.h>
// 静态内部变量
static char s_recv_buf[BC20_BUF_LEN]; // 接收缓冲区
BC20_Status s_bc20_status = {0}; // 模块状态
// 私有函数声明
void BC20_ClearRecvBuf(void);
static BC20_ErrorCode BC20_SendAT(const char *cmd, const char *expected_resp, uint32_t timeout_ms);
static BC20_ErrorCode BC20_SendAT_NOOLED(const char *cmd, const char *expected_resp, uint32_t timeout_ms);
BC20_ErrorCode BC20_InitGPS(void);
static BC20_ErrorCode BC20_ParseGPRMC(const char *rmc_str, GPS_Data *gps);
// 清空接收缓冲区
void BC20_ClearRecvBuf(void)
{
memset(s_recv_buf, 0, BC20_BUF_LEN);
Clear_Buffer_UART2(); // 确保串口2缓冲区也被清空
delay_ms(50); // 缩短延迟,避免阻塞
}
// OLED显示AT指令(辅助函数)
void OLED_ShowAT(char* cmd)
{
char cmd_display[32] = {0};
if (strncmp(cmd, "AT", 2) == 0) {
const char *after_at_plus = cmd + 0;
const char *q_pos = strchr(after_at_plus, '=');
if (q_pos != NULL) {
size_t len = q_pos - after_at_plus;
if (len > 0) {
strncpy(cmd_display, after_at_plus, len);
cmd_display[len] = '\0';
} else {
strcpy(cmd_display, "+");
}
} else {
strncpy(cmd_display, after_at_plus, sizeof(cmd_display)-1);
char *newline = strchr(cmd_display, '\r');
if (newline) *newline = '\0';
newline = strchr(cmd_display, '\n');
if (newline) *newline = '\0';
}
} else {
strncpy(cmd_display, cmd, sizeof(cmd_display)-1);
}
OLED_Clear();
OLED_ShowString(0,2,cmd_display);
}
// 发送AT命令(带OLED显示)
static BC20_ErrorCode BC20_SendAT(const char *cmd, const char *expected_resp, uint32_t timeout_ms) {
uint32_t count = 0;
uint32_t max_count = timeout_ms / 10;
if (timeout_ms % 10 != 0) max_count++;

最低0.47元/天 解锁文章
860

被折叠的 条评论
为什么被折叠?



