單片機智能家居的升級——物聯網智能家居

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

  本次實驗採用的是STM32F429開發板,採集到溫溼度的信息後,將數據通過8266發送到樂聯網服務器,然後可以通過手機APP或者微信公衆號去查看具體數據信息。
首先是STM32端串口的配置:
//引腳定義
/*******************************************************/
#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);
	} 
}

這便是單片機端的驅動代碼。接下來講一下樂聯網的訪問接口,具體詳細的教程可以上網查,也可以閱讀此博客
本文主要介紹一下上傳數據是用到的網絡調試步驟。

樂聯網服務器網絡調試

第一步,下載網絡調試助手

  本次實驗採用的是安信可科技的網絡調試助手,可以點此下載
  

第二步,創建連接

  將樂聯網的IP地址和端口號正確填入點擊創建即可:
  

第三步,向服務器發送請求

  這一步向服務器發送連接的請求,將自己註冊的uerkey和網關號等等發送給服務器,服務器操作成功會發送ok回來:

  

第四步,更改服務器端傳感器數據

  首先在樂聯網個人中心裏面創建過設備和傳感器,確定好傳感器的名稱,此步驟將傳感器數據更改即可。

  

  以上即爲網絡調試的部分,剛開始將網絡調試通過,然後就開始着手將網絡調試的步驟通過單片機串口實現即可。在STM32的mian程序中,即時以上步驟的具體實現。

本次實驗採用STM32F429芯片,實驗代碼可以提供參考:https://pan.baidu.com/s/1c28lgPU

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章