STM32F103C8T6+ESP8266WIFI+DHT11模块连接巴法云

STM32F103C8T6通过ESP8266模块连接巴法云

一、硬件介绍

1.MCU:STM32F103C8T6
2.ESP8266:正点原子WIFI模块
3.串口模块:正点原子串口模块

二、准备工作

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. ESP8266固件刷写
    我用的是安信可的固件,可以在官网上下载。正点原子也提供相关的刷写教程

  2. 硬件连接
    单片机的串口3连接WiFi模块。WiFi模块的Vcc接3.3V。串口1接在串口模块上。

三、STM32主要代码介绍

mcu跟wifi模块的代码实现(涉及串口、定时器):

  1. 实现思想
    单片机向esp8266模块发送at指令,并且在一定的时间内等待esp8266的回复,如果回复错误的指令或者超时回复就把错误通过串口1发送到电脑上。

  2. 代码介绍
    AT指令发送函数

uint8_t esp8266_send_cmd(char *cmd, char *ack, uint16_t waittime) //ESP8266发送指令(底层函数)
{
	uint8_t res = 0;
	USART3_RX_STA = 0;
	memset(USART3_RX_BUF,0,USART3_REC_LEN); //将串口3的缓存空间清0
	WIFI_printf("%s\r\n", cmd); //调用WIFI模块专用的发送函数
	if(waittime) //需要等待应答
	{
		while(--waittime) //等待倒计时
		{
			HAL_Delay(10);//HAL库延时函数
			if(USART3_RX_STA&0x8000) //接收到期待的应答结果
			{
				if(esp8266_check_cmd((uint8_t *)ack))
				{
					printf("回复信息:%s\r\n",(uint8_t *)ack);//反馈应答信息
					break; //得到有效数据
				}
				USART3_RX_STA=0; //串口3标志位清0
			} 
		}
		if(waittime==0)res=1;
	}
	return res;
}

uint8_t* esp8266_check_cmd(uint8_t *str) //ESP8266检查指令(底层函数)
{
	char *strx=0;
	if(USART3_RX_STA&0X8000) //接收到一次数据了
	{
		USART3_RX_BUF[USART3_RX_STA&0X7FFF] = 0; //添加结束符
		printf("%s\r\n",(char*)USART3_RX_BUF);
		strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
	} 
	return (uint8_t*)strx;
}

uint8_t esp8266_quit_trans(void) //ESP8266退出判断(底层函数)
{
	while((USART3->SR&0X40)==0); //等待发送空
	USART3->DR='+';      
	HAL_Delay(15); //大于串口组帧时间(10ms)
	while((USART3->SR&0X40)==0); //等待发送空
	USART3->DR='+';      
	HAL_Delay(15); //大于串口组帧时间(10ms)
	while((USART3->SR&0X40)==0); //等待发送空
	USART3->DR='+';      
	HAL_Delay(500); //等待500ms
	return esp8266_send_cmd("AT","OK",20); //退出透传判断
}

接收状态标记、接收缓冲、接收状态标记的宏定义

uint8_t USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART1_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14:接收到0x0d,bit13~0:接收到的有效字节数目
uint8_t USART1_NewData;//当前串口中断接收的1个字节数据的缓存

uint8_t USART2_RX_BUF[USART2_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART2_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14:接收到0x0d,bit13~0:接收到的有效字节数目
uint8_t USART2_NewData;//当前串口中断接收的1个字节数据的缓存
uint8_t RS485orBT;//当RS485orBT标志位为1时是RS485模式,为0时是蓝牙模式

uint8_t USART3_RX_BUF[USART3_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART3_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14:接收到0x0d,bit13~0:接收到的有效字节数目
uint8_t USART3_NewData;//当前串口中断接收的1个字节数据的缓存

串口3跟esp8266通信的底层函数

void WIFI_printf (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
    HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
}
//WIFI模块在TCP模式下的数据发送:TCP发送的规定是先发AT+CIPSEND=数量,等待返回“>“后再发送数据内容。
//调用方法:WIFI_TCP_SEND("123\r\n"); //TCP方式发送字符123和回车换行
void WIFI_TCP_SEND (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
	WIFI_printf("AT+CIPSEND=%d\r\n",i);//先发送AT指令和数据数量
	HAL_Delay(100);//等待WIFI模块返回">",此处没做返回是不是">"的判断。稳定性要求高的项目要另加判断。
    HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//发送数据内容(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
}

串口1的重定向和串口3、定时器的中断回调函数,

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//串口中断回调函数
{
	
	if(huart ==&huart3)//判断中断来源(串口3:WIFI模块)//接收完的一批数据,还没有被处理,则不再接收其他数据
	{
		if(USART3_RX_STA<USART3_REC_LEN)//还可以接收数据
		{
			__HAL_TIM_SET_COUNTER(&htim2,0); //计数器清空
			if(USART3_RX_STA==0) //使能定时器2的中断
			{
			__HAL_TIM_ENABLE(&htim2); //使能定时器2
			}
			USART3_RX_BUF[USART3_RX_STA++] = USART3_NewData;//最新接收数据放入数组
		}
		else
		{
			USART3_RX_STA|=0x8000;//强制标记接收完成
		}
		HAL_UART_Receive_IT(&huart3,(uint8_t *)&USART3_NewData,1); //再开启串口3接收中断
		

	}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	  if(htim ==&htim2)//判断是否是定时器2中断(定时器到时表示一组字符串接收结束)
    {
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
		USART3_RX_STA|=0x8000;//接收标志位最高位置1表示接收完成
		__HAL_TIM_CLEAR_FLAG(&htim2,TIM_EVENTSOURCE_UPDATE );//清除TIM2更新中断标志
		__HAL_TIM_DISABLE(&htim2);//关闭定时器2
    }
}
int fputc(int ch, FILE *f)                             //串口重定向
 {	 
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
   return ch;
 }

##不想写了,主要核心代码可以参考正点原子的,大家不懂的可以私信,看到一定回复。

### 回答1: 首先,您需要将ESP8266连接STM32F4的串口。然后,您需要使用AT指令将ESP8266连接巴法云。以下是连接步骤: 1. 将ESP8266连接STM32F4的串口。 2. 在STM32F4上编写代码,将串口设置为与ESP8266通信的波特率。 3. 在ESP8266上使用AT指令连接巴法云。您需要使用以下AT指令: AT+CWMODE=1 //设置为STA模式 AT+CWJAP="SSID","password" //连接到Wi-Fi网络 AT+CIPSTART="TCP","api.beebotte.com",80 //连接巴法云服务器 AT+CIPSEND //发送数据 4. 在STM32F4上编写代码,将数据发送到ESP8266。 5. ESP8266将数据发送到巴法云服务器。 6. 您可以在巴法云控制台上查看数据。 ### 回答2: STM32F4是一种高性能的MCU,而ESP8266是一种WiFi模块,用于连接Wi-Fi网络和建立TCP/IP协议集。巴法云是一种平台,可提供一些特定的服务(如存储、远程控制、数据传输等),以满足智能家居、IoT等应用场景。 为了将STM32F4与ESP8266连接巴法云上,应首先在ESP8266上安装巴法云SDK,并将其(如账户、密码、终端ID等信息)配置为适当的值。然后,使用UART(或SPI或其他适当的接口)将ESP8266STM32F4连接起来,并使用AT命令或API等方式控制ESP8266WiFi连接,以连接到互联网。 一旦ESP8266已经连接到互联网,它便可以通过HTTP(或MQTT等)和巴法云进行通信,发送/接收数据。使用STM32F4进行控制和数据处理(如传感器数据采集、设备控制等),并将数据(如场景、设备状态、告警等)发送到巴法云,然后通过移动应用或Web应用等进行实时查看并执行操作。 总的来说,STM32F4与ESP8266结合使用,可以实现智能家居、物联网等应用场景,而连接巴法云则可以让用户获得更多的服务和优化体验。 ### 回答3: 首先需要明确的是,巴法云是一个物联网平台,支持多种协议和设备接入。其中,ESP8266STM32F4都是常用的物联网设备之一。 连接巴法云的具体步骤如下: 一、创建设备 在巴法云注册账号并登录后,需要创建一个设备。设备的创建需要填写设备名称、型号、所属分类、制造商等信息,并生成一个唯一的设备ID。创建完成后,在设备详细页面可以获取到设备的三元组(设备ID、设备密钥、产品ID)。 二、配置设备 ESP8266STM32F4分别需要安装对应的开发环境并配置网络连接。其中,ESP8266可以通过AT指令或者Arduino IDE进行连接配置。而STM32F4则需要通过HAL库或者CubeMX进行网络连接配置。需要注意的是,ESP8266STM32F4之间的通信协议需要统一。 三、接入巴法云 ESP8266STM32F4都可以通过MQTT、HTTP等协议进行巴法云的接入。其中,MQTT协议是一种轻量级的通信协议,可以实现设备与端之间的双向通信。通过MQTT协议可以实现设备与端的数据传输、指令下发等功能。 四、测试与调试 完成巴法云的接入后,需要进行测试和调试。可以通过发送数据、接收指令等方式进行验证。如果存在问题,可以通过巴法云提供的文档、社区等方式进行解决。 总之,ESP8266STM32F4的巴法云接入过程需要考虑设备和网络的配置、数据传输协议、以及测试和调试等方面。只有全面了解和掌握这些内容,才能实现成功的设备接入和数据传输。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值