之前做过一个基于51和STM32的无线射频智能家居,是采用2.4G无线射频模块将51采集的数据发送至STM32显示,但那个仅仅只是短距离通信,它的实用性不怎么强,之后有想过将之补充一下,做一个物联网的智能家居。
前段时间,接触到了一些开源服务器,Yeelink、传感云和乐联网等等,然后就有个想法,升级一下我的智能家居项目,刚开始打算使用Yeelink,但是网络调试的时候一直无法连接到Yeelink的服务器,最终选择了乐联网。单片机端选用了ESP8266无线通信模块,将ESP8266设置为Station模式,就可以作为无线网卡去访问服务器。
ESP8266模块:
本次实验采用的是ESP-01S模块,其图片如下: 引脚图如下:
TX:串口写
GND:接地
CH_PD:高电平为可用,低电平为关机
GPIO2:可悬空
RST:重置,可悬空
GPIO0:上拉为工作模式,下拉为下载模式,可悬空
VCC:3.3V(切不可接5V,烧片)
RX:串口读
8266接线示意:
ESP8266的串口默认波特率为115200,mega也可直接接RX0/TX0,为调试方便起见,本文中RX0/TX0留做调试窗口,用RX1/TX1和芯片交互。如果是UNO,如果要看调试信息,只能增加一个软串口。
STM32串口控制8266:
//引脚定义
/*******************************************************/
#define DEBUG_USART USART1
#define DEBUG_USART_CLK RCC_APB2Periph_USART1
#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_USART_RX_PIN GPIO_Pin_10
#define DEBUG_USART_RX_AF GPIO_AF_USART1
#define DEBUG_USART_RX_SOURCE GPIO_PinSource10
#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_USART_TX_PIN GPIO_Pin_9
#define DEBUG_USART_TX_AF GPIO_AF_USART1
#define DEBUG_USART_TX_SOURCE GPIO_PinSource9
/************************************************************/
//串口波特率
#define DEBUG_USART_BAUDRATE 115200
void Debug_USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd( DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK, ENABLE);
/* 使能 UART 时钟 */
RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);
/* 连接 PXx 到 USARTx_Tx*/
GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE, DEBUG_USART_RX_AF);
/* 连接 PXx 到 USARTx__Rx*/
GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);
/* 配置Tx引脚为复用功能 */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
/* 配置Rx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
/* 配置串DEBUG_USART 模式 */
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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(DEBUG_USART, &USART_InitStructure);
USART_Cmd(DEBUG_USART, ENABLE);
}
void Send_Buf(char *buf)
{
while(*buf)
{
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET){}
USART_SendData(USART1,*buf++);
}
}
这样便把串口的端口配置好了,接下来就是去向串口发送AT指令,配置8266为station模式,即客户端模式:
void Set_AP_MODE()
{
Send_Buf("AT+CWMODE=1\r\n"); //设置客户端模式
Delay(0xFFFFFF);
Delay(0xFFFFFF);
Send_Buf("AT+RST\r\n"); //重启8266
Delay(0xFFFFFF);
Delay(0xFFFFFF);
Send_Buf("AT+CWJAP=\"Nubia Z17s\", \"hujianfei\"\r\n"); //连接我的热点,或者其他无线网都可以
Delay(0xFFFFFF);
Delay(0xFFFFFF);
Send_Buf("AT+CIPSTART=\"TCP\",\"tcp.lewei50.com\",9960\r\n"); //访问乐联网服务器tcp.lewei50.com,端口为9960
Delay(0xFFFFFF);
Delay(0xFFFFFF);
Send_Buf("AT+CIPMODE=1\r\n"); //开启透传模式
Delay(0xFFFFFF);
Delay(0xFFFFFF);
Send_Buf("AT+CIPSEND\r\n"); //准备模块与电脑进行互传数据
Delay(0xFFFFFF);
Delay(0xFFFFFF);
}
全部初始化好之后就可以发送数据了:
int main(void)
{
/*初始化USART,配置模式为 115200 8-N-1*/
Debug_USART_Config();
/* 系统定时器初始化 */
SysTick_Init();
/* DHT11初始化 */
DHT11_GPIO_Config();
/*设置8266模式*/
Set_AP_MODE();
while(1)
{
/*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
if( Read_DHT11 ( & DHT11_Data ) == SUCCESS)
{
Send_Buf("{\"method\":\"update\",\"gatewayNo\": \"02\",\"userkey\":\"6512f82832f441f9aa5a8bc55509016e\"}&^!\r\n");
Delay(0xFFFFFF);
Delay(0xFFFFFF);
sprintf(e, "{\"method\":\"upload\",\"data\":[{\"Name\":\"H1\",\"Value\":\"%d.%d\"},{\"Name\":\"T1\",\"Value\":\"%d.%d\"}]}&^!\r\n", DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);
Send_Buf(e);
Delay(0xFFFFFF);
Delay(0xFFFFFF);
}
else
{
//printf("Read DHT11 ERROR!\r\n");
}
Delay_ms(50);
}
}
这便是单片机端的驱动代码。接下来讲一下乐联网的访问接口,具体详细的教程可以上网查,也可以阅读 此博客。
乐联网服务器网络调试
第一步,下载网络调试助手
第二步,创建连接
第三步,向服务器发送请求
这一步向服务器发送连接的请求,将自己注册的uerkey和网关号等等发送给服务器,服务器操作成功会发送ok回来:
第四步,更改服务器端传感器数据
首先在乐联网个人中心里面创建过设备和传感器,确定好传感器的名称,此步骤将传感器数据更改即可。
以上即为网络调试的部分,刚开始将网络调试通过,然后就开始着手将网络调试的步骤通过单片机串口实现即可。在STM32的mian程序中,即时以上步骤的具体实现。
本次实验采用STM32F429芯片,实验代码可以提供参考:https://pan.baidu.com/s/1c28lgPU