之前做過一個基於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