项目需要在stm32上开发MQTT,同时MQTT协议基于TCP/IP协议,因此先在探索者开发板上调通基于TCP的WiFi通信,同时采集温湿度数据,上传至PC端的网络调试助手服务端,为后面开发MQTT做准备。
1、准备工作
1.1.STM32F4开发板

1.2.DHT11温湿度传感器
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。

1.3.esp8266 WiFi模块
esp8266模块采用串口与MCU进行通信,内置TCP/IP协议栈,能够实现串口与WiFi之间的转换,模块支持串口转WiFi STA、串口转AP和WiFi STA+WiFiAP的模式,从而快速构建串口-WiFi数据传输方案。

2. esp8266模块使用
2.1 esp8266模块使用介绍
esp8266模块使用方便,开发过程中可使用AT指令对模块进行操作,及可使用stm32的串口发送相关AT指令控制模块。模块作为TCP连接客户端时使用的AT指令如下所示:
AT:测试模块是否工作正常
AT+RST:复位模块状态
设置客户端模式
AT+CWMODE=1:客服端 Station
AT+CWMODE=2:用户端 AP
AT+CWMODE=3:双端Station+AP
AT+CWJAP='wifi名','密码':连接指定WiFi
TCP连接:AT+CIPSTART='TCP','目标IP',目标端口号 如:AT+CIPSTART='TCP','192.168.1.1',8080
开启传透模式:AT+CIPMODE=1 关闭穿透模式:AT+CIPMODE=0
开启透传后,使用AT+CIPSEND开启数据发送
TCP发送数据到服务器全流程如下:
1. AT 检测模块是否工作正常
2. AT+CIPMODE=0 关闭透传
3. AT+CWMODE=1 客服端STA模式
4. AT+CWJAP='wifi','password'
5. AT+CIPSTART='TCP','目标ip地址',目标端口
6. AT+CIPMODE=0 开启透传
发送数据有两种方法
一 1. AT+CIPSEND (开启传输数据)
2. > (这个符号代表等待输入,回车发送,在程序里用rn转义发送)
3. +++ (发送+++代表退出发送,串口助手里需要关闭发送新行才能关闭发送,程序里用+++rn关闭)
二 1. AT+CIPSEND=num (指定发送数据长度,由于指定长度,达到长度后会自动发送,并退出发送)
2. > (这个符号代表等待输入,回车发送,在程序里用rn转义发送)
2.2 STM32操作esp8266模块
在实际使用中,STM32通过串口发送相关的AT指令给模块进行相应的操作。芯片上电后,首先进行串口3的初始化,初始化中波特率设置为115200,同时配置一个100ms的定时器中断,用于判断数据接收的连续性。这里也编写了相应的串口3中断服务函数,用于接收WiFi模块收到的数据。串口3中断服务函数如下:
//通过判断接收连续2个字符之间的时间差不大于100ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过100ms,则认为不是1次连续数据.也就是超过100ms没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
u16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
{
if(USART3_RX_STA TIM_SetCounter(TIM7,0);//计数器清空 if(USART3_RX_STA==0) TIM_Cmd(TIM7, ENABLE); //使能定时器7 USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值 }else { USART3_RX_STA|=1<<15; //强制标记接收完成 } } } } 串口3初始化完成后,通过发送AT指令进行WiFi模块的初始化,这里编写了esp8266_init()函数对模块进行了相关的配置,代码如下: void esp8266_init(void) { u8 *p; p=mymalloc(SRAMIN,100); //申请100字节的内存 atk_8266_quit_trans(); POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(30,50,200,16,16,'Wifi Connecting...'); while(atk_8266_send_cmd('AT','OK',20)); //检查WiFi模块是否在线 { atk_8266_quit_trans(); //退出透传 atk_8266_send_cmd('AT+CIPMODE=0','OK',200); //关闭透传模式 } while(atk_8266_send_cmd('ATE0','OK',20));//关闭回显 atk_8266_send_cmd('AT+CWMODE=3','OK',50); //设置为STA模式 atk_8266_send_cmd('AT+RST','OK',40); delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); atk_8266_send_cmd('AT+CWAUTOCONN=0','OK',50); sprintf((char*)p,'AT+CWJAP='%s','%s'',wifiap_ssid,wifiap_password); atk_8266_send_cmd(p,'OK',800); //连接AP delay_ms(3000); delay_ms(2000); atk_8266_send_cmd('AT+CIPMUX=0','OK',20); sprintf((char*)p,'AT+CIPSTART='TCP','%s',%s',(u8*)ip,(u8*)portnum); while(atk_8266_send_cmd(p,'OK',200)){} //连接服务端 Connect_Flag=1; atk_8266_send_cmd('AT+CIPMODE=1','OK',200); //开启透传 myfree(SRAMIN,p); //释放内存 } 其中,服务器用了PC端的网络调试助手进行模拟,WiFi模块与PC同时连接同一个WiFi热点,在PC上开启网络调试助手作为服务器,IP地址为局域网内分配给PC的I地址,端口号自己定义,如下图所示: esp8266模块配置完成后,当需要通过WiFi发送数据时,调用串口3发送函数即可向服务器发送数据。串口3发送数据可以使用库函数USART_SendData(USART_TypeDef* USARTx, uint16_t Data),这里使用该库函数重新封装了一个串口发送函数,可以进行固定长度的数据帧发送。 /************串口3的发送函数************/ //串口3,printf 函数 //确保一次发送数据不超过USART3_MAX_SEND_LEN字节 void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); i=strlen((const char*)USART3_TX_BUF);//此次发送数据的长度 for(j=0;j { while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //等待上次传输完成 USART_SendData(USART3,(uint8_t)USART3_TX_BUF[j]); //发送数据到串口3 } } 3.DHT11温湿度模块 3.1 模块介绍 DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。 DHT11管脚图 从DHT11读取的温湿度数据组成如下所示: 温湿度数据结构 3.2 STM32操作DHT11 检测DHT11是否正常 //等待DHT11的回应 //返回1:未检测到DHT11的存在 //返回0:存在 u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } DHT11读取温湿度并校验 //从DHT11读取一次数据 //temp:温度值(范围:0~50°) //humi:湿度值(范围:20%~90%) //返回值:0,正常;1,读取失败 u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++)//读取40位数据 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } }else return 1; return 0; } 4.运行结果 配置好DHT11和esp8266模块后,在主函数while(1)中循环计时,定时读取温湿度数据并通过WiFi上传至PC端。 while(1) { if(t%10==0)//每100ms读取一次 { DHT11_Read_Data(&temperature,&humidity); //读取温湿度值 LCD_ShowNum(30+40,150,temperature,2,16); //显示温度 LCD_ShowNum(30+40,170,humidity,2,16); //显示湿度 atk_8266_quit_trans(); atk_8266_send_cmd('AT+CIPSEND','OK',20); //开始透传 sprintf((char*)p,'温度为:%d℃,湿度为:%d %rn',temperature,humidity); u3_printf('%s',p); } delay_ms(100); t++; } 这里同时用到了LCD显示屏在开发板上显示温湿度的数据,作为辅助功能,本文就不展开讲LCD的配置与使用了。 image.png?imageView2/2/w/1000 在PC端网络调试助手上也定时接收到了温湿度数据。


开发板上读取温湿度的结果图如下
上一篇:STM32F4启动分析
下一篇:STM32CubeMX学习笔记(13)——PWM输出(呼吸灯)使用
- 热门资源推荐
- 热门放大器推荐
- 用于 7VIN 至 16VIN、1.5V 和 1.2V 输出的 LTM4628EV DC/DC 模块稳压器的典型应用电路
- 使用 Analog Devices 的 LTC3728LIGN 的参考设计
- DER-406 - 适用于 A19 灯的 5.76 W 高 PF 非隔离降压-升压型 TRIAC 调光 LED 驱动器
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用
- LT3970EDDB-3.42 2.5V 降压转换器的典型应用
- MC78M08BDTG 8V 电流调节器的典型应用
- LT1021DCN8-5 精密电压基准的典型应用
- DER-282 - 100W, 扁平(11 mm), LLC DC-DC转换器
- REF193 低压差开尔文连接电压基准的典型应用电路
- LT3088EM 线性稳压器用于添加软启动的典型应用

现代雷达系统的信号设计
5962-89541022A

BFR340T






京公网安备 11010802033920号