单片机智能家居的升级——物联网智能家居

  之前做过一个基于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

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值