STM32f407 + ESP8266 连接onenet使用http协议上传温湿度数据

先把ESP8266的TX,RX引脚连接到我们单片机的PB10,PB11引脚。初始化USART3,

void usart3_init(uint32_t baud)
{
	
	//打开PA硬件时钟	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	

	//打开串口1硬件时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

	//配置PA9和PA10为复用功能模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_10;		//第9 10根引脚
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;	//多功能模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;	//推挽输出,增加输出电流能力。
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//高速响应
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;	//没有使能上下拉电阻

	GPIO_Init(GPIOB,&GPIO_InitStructure);


	//将PA9和PA10引脚连接到串口1的硬件
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);	
	
	
	
	//配置串口1相关参数:波特率、无校验位、8位数据位、1个停止位......
	USART_InitStructure.USART_BaudRate = baud;										//波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;						//8位数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;							//1个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;								//无奇偶校验
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//无硬件流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;					//允许收发数据
	USART_Init(USART3, &USART_InitStructure);
	
	
	//配置串口1的中断触发方法:接收一个字节触发中断
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
	
	
	//配置串口1的中断优先级
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	
	
	//使能串口1工作
	USART_Cmd(USART3, ENABLE);


}

用串口3发送数据的代码

void usart3_send_str(char *str)
{
	char *p = str;
	
	while(p && (*p!='\0'))
	{
	
		USART_SendData(USART3,*p);
		while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);	
		p++;
	}
}

最重要的是把串口3接收到的数据保存下来,用一个数组进行保存,把接收到的数据发送给我们的串口1。

static volatile uint8_t 	g_usart3_buf[64]={0};
static volatile uint32_t 	g_usart3_event=0;
static uint8_t g=0;
void USART3_IRQHandler(void)
{
static 
	uint32_t i=0;
	uint8_t d;
	
	//检测标志位
	if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
	{
		//接收数据
		g=d=USART_ReceiveData(USART3);
		
		
		//将接收到的数据,返发给PC
		USART_SendData(USART1,d);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);	

		g_usart3_buf[i] = d;
		
		i++;
		
		//判断是否有结束符‘#’,同时检测有没有超过缓冲区的大小
		if(d == '}' || i >=sizeof (g_usart3_buf))
		{
			i=0;
			g_usart3_event=1;
		}
		
		
		//清空标志位
		USART_ClearITPendingBit(USART3,USART_IT_RXNE);
	}

}

之后就可以用串口3发送AT指令了,初始化代码如下

    usart3_send_str("AT\r\n");
	delay_ms(1000);
	usart3_send_str("AT+CWMODE=1\r\n");
	delay_ms(2000);
	usart3_send_str("AT+CWJAP=\"test\",\"12345678\"\r\n"); //test是手机热点的名称,12345678是热点的密码
	delay_ms(15000);
	usart3_send_str("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n");
	delay_ms(3000);
	usart3_send_str("AT+CIPMODE=1\r\n");
	delay_ms(1000);
	usart3_send_str("AT+CIPSEND\r\n");

接下来是http需要的资源

1145659828是设备号

api-key是Master-APIkey,用手机号就可以得到,这是老版onenet的链接,需要可以取申请一下

https://open.iot.10086.cn/develop/global/product/#/public?protocol=3&other=1

char mod[32]={0};
char temp[512];
extern char *str[5] ;

char *str[6] = {"POST /devices/1145659828/datapoints?type=3 HTTP/1.1",
				"api-key:kSOfKDzxnza3csgzuanRYm7GsJ4=",
				"Host:api.heclouds.com",
				"Content-Length:32",
				""};

http请求

strcpy(temp, "");
for (i = 0; i < 5; i++)
{
	strcat(temp, str[i]);
	strcat(temp, "\r\n");
				

	delay_us(10);

}
//buf[2],buf[0],adc_vol%100 是温湿度传感器,跟光照传感器的值,可以自己设置
sprintf(mod,"{\"temp\":%d,\"humi\":%d,\"light\":%d}",buf[2],buf[0],adc_vol%100);
			//sprintf(mod,"{\"temp\":%d,\"humi\":%d}",buf[2],buf[0]);
			strcat(temp, mod);
			strcat(temp, "\r\n");
usart3_send_str(temp);

使用get获得onenet的数据,传入的是想要获得的数据 temp/humi/light都可以,返回onenet上传的值,

u16 esp8266_get_data(char *vStr)
{
	u8 i;
	u16 value = 0;
	char *back;
	char temp[160] = "GET /devices/1145659828/datastreams/";

	// 拼接请求报文
	strcat(temp, vStr);
	strcat(temp, " HTTP/1.1\r\n");
	for (i = 1; i < 3; i++)
	{
		strcat(temp, str[i]);
		strcat(temp, "\r\n");
	}
	//printf("%s",temp);
	// 发送报文, 获取返回字符串
	
	strcat(temp, "\r\n");
	usart3_send_str(temp);
	
	if(g_usart3_event)
	{
		
		if(strstr((const char *)g_usart3_buf,"current_value"))
		{
			back = strchr(strstr((char *)g_usart3_buf, "\"current_value\":"), ':') + 1;
		
			while (*back != '}')
			{
				if(*back == '\"'){
					back++;
					continue;
				}
				value = value * 10 + (*back - '0');
				back++;
			}
		}
		g_usart3_event = 0;
	}
	return value;
	
}

这些就配置完了,可以收发数据了,也可以用lcd显示数据,这里就不写了

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: STM32ESP8266是目前比较常用的物联网设备,可以实现对传感器的数据采集、处理和传输。如果要将其接入到OneNET平台上,需要以下步骤: 1. 准备硬件:需要一块STM32开发板和一块ESP8266模块,以及一个温湿度传感器。 2. 搭建开发环境:使用Keil等集成开发环境进行代码编写和调试。开发环境需要支持STM32的C语言编程。 3. 编写程序:首先要实现STM32温湿度传感器之间的通信,采集数据并监测数据的变化。然后再使用STM32ESP8266之间的串口通信,将数据发送到OneNET平台。 4. 配置OneNET平台:打开OneNET官网,注册帐号并创建设备模板,将上传数据添加到设备模板中。配置好硬件设备所属的产品和数据流,获取设备的Key和Topic。 5. 实现数据上传使用AT指令控制ESP8266OneNET服务器进行通信,将采集的数据上传到设备模板中。 总之,需要通过串口通信实现stm32esp8266之间的数据传输和控制,然后通过AT指令控制esp8266连接OneNET云平台并上传数据。需要充分理解OneNET平台的产品和设备模板、数据流等概念,并具备一定的开发经验和编程能力。 ### 回答2: 在将STM32ESP8266联合使用来接入onenet云平台中,需要遵循以下步骤。 第一步,选择合适的传感器来测量温湿度。通常可选择DHT11或DHT22等温湿度传感器。 第二步,在STM32连接传感器,通过ADC模块读取传感器测得的温湿度数据,并将数据存储在内存中。 第三步,通过STM32ESP8266进行串口通信,将读取到的温湿度数据传输给ESP8266。 第四步,通过AT指令将数据通过ESP8266连接onenet云平台。需要注意的是,需要在onenet平台中创建数据流,并获取到数据流ID、设备ID、以及密钥等信息。 第五步,将数据通过HTTP POST方式发送到onenet平台,实现数据上传。 最后,进行数据接入验证。可通过在onenet平台上查看数据流图表来确认数据是否上传成功。 总而言之,将STM32ESP8266联合使用来接入onenet温湿度,需要通过温湿度传感器获取数据,通过STM32ESP8266进行串口通信,并借助AT指令将数据上传onenet平台。务必进行数据接入验证,以确保数据上传成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊啊啊,学嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值