STM32F103C8T6 BC20模块采集温湿度和经纬度发送到ONENET

  1. 云平台配置

第一步:配置OneNet平台

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++;
 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值