基于STM32F103RCT6之手把手教你写智能家居项目(2)

一:回顾

        上一节我们简述了智能家居项目,实现了点灯的相关代码编写,还有WIFI模块的固件烧录。

二:连接平台

连接什么平台:

        我们想要远程控制家具的开关和获取家中的状态,少不了一个可以传输数据的云平台。我认为易监控是一个简单好用的云平台。

怎么连接平台:

微信搜索“易监控”小程序

点击旧版入口

绑定账号

        对话框发送:绑定账号+账号+密码,例如:绑定账号+YIGEJIE+123456789

        这样就可以通过账号登录易监控了。

测试连接

使用网络调试助手

        这里顺便说一下,易监控的IP是114.215.65.250,客户端的端口号有两个,为4508和4509。

在调试助手中输入IP和端口号

         然后在对话框中输入你刚刚绑定的账号,格式为:KEY:账号+密码,点击发送即可。当然了,你要先点击上面的连接哈。

登录成功显示

        4508显示       

 

        4509显示

发送测试命令

        在4508端口:发送格式为:DATA:xxxx+xxxxx\r\n。

        在4509端口:发送格式为:ORDER:xxxx+xxxxx\r\n。

        观察两边是否能够接收到数据。如果能够接收到数据,那么你的WIFI模块基本上成功一般了。

三:WIFI模块基础知识

        到了这里,我们在了解一些WIFI模块的基础知识就应该开始着手书写代码了,首先我们先来了解一些基础知识。

WIFI模块的三种工作模式

        1,STA 站点,在此模式下,可以去连接路由器,连接互联网
        2,AP  路由,在此模式下,可以产生热点,让其他设备连接
        3,STA + AP 既可以去连接路由器,也可以产生热点

        我们这里没有别的设备连接就设置为STA模式。

WIFI模块登陆服务器步骤

    //测试指令
    AT
    //恢复出厂设置
    AT+RESTORE   
    // 设置成STA模式
	AT+CWMODE_CUR=1
    //连接路由器  
	AT+CWJAP="sss","123456" 
    //建立TCP连接
	AT+CIPSTART="TCP","114.215.65.250",4508 
    //发送前需要说明发送的长度,冒号和加号也算在内哦
	AT+CIPSEND=21
    //账号和密码
	KEY:YIGEJIE+123456789
	

延时函数

delay.c
#include "delay.h"


void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}


void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 

void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 
delay.h
#ifndef __DELAY_H
#define __DELAY_H

include "stm32f10x.h"

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

        延时函数呢,我在这里就不过多讲解了,因为我们的重点并不在这个上面,想要完全了解延时函数是怎么写的话,推荐你去B站看江协科技哈,说得很好。在下面我会说明为什么要用到延时函数。

四:WIFI模块代码编写

        如果说想要实现在手机上发送命令控制开发板上的设备的开启和关闭的话,还需要配置串口和写中断服务函数才行,代码量较大,我会在下一节来书写串口,并详细解释为什么这样写。

WIFI模块代码

wifi.c
#include "wifi.h"

//数据发送函数
void SendData_String(USART_TypeDef* USARTx, char *data, int len)
{
	int i;
	for(i=0; i < len; i++){	
		//等待发送数据寄存器空标准位失效
		while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)==RESET);
		USART_SendData(USARTx, *data);
		data++;
	}
}

//WIFI初始化函数
void Wifi_Config(void)
{
    //测试指令
	SendData_String(USART2,"AT\r\n",strlen("AT\r\n"));
	Delay_ms(200);

	//恢复出厂设置
	SendData_String(USART2,"AT+RESTORE\r\n",strlen("AT+RESTORE\r\n"));
	Delay_ms(400);

	//设置成STA模式
	SendData_String(USART2,"AT+CWMODE_CUR=1\r\n",strlen("AT+CWMODE_CUR=1\r\n"));
	Delay_ms(400);

    //连接路由器
	SendData_String(USART2,"AT+CWJAP_CUR=\"sss\"\"123456789\"\r\n",strlen("AT+CWJAP=\"WJJGAME\",\"66666666\"\r\n"));
	Delay_ms(8000);
	
    //建立TCP连接
    SendData_String(USART2,"AT+CIPSTART=\"TCP\",\"114.215.65.250\"4508\r\n",strlen("AT+CIPSTART=\"TCP\",\"114.215.65.250\",4508\r\n"));
    Delay_ms(7000);

    //发送前先告知字节数
    SendData_String(USART2,"AT+CIPSEND=21\r\n",strlen("AT+CIPSEND=21\r\n"));
	Delay_ms(300);

    //发送账号和密码
	SendData_String(USART2,"KEY:YIGEJIE+123456789\r\n",strlen("KEY:YIGEJIE+123456789\r\n"));
	Delay_ms(900);
wifi.h
#ifndef  __WIFI_H_
#define  __WIFI_H_

#include "stm32f10x.h"

void SendData_String(USART_TypeDef* USARTx, char *data, int len);

void Wifi_Config(void);

#endif

代码解析

        我们可以看到,wifi.c中的第一个函数是串口发送数据函数,可以将data里面的数据全部发送出去,而不是一位一位的发送。wifi.c中的第二个函数是WIFI初始化函数,根据我们上面的指令来进行设置,根据我的实测,有没有_CUR的影响其实不大,所以可加可不加。

        至于为什么要用延时函数来初始化WIFI而不用strcmp函数去比对AT指令响应的值,这是因为用strcmp函数去比对AT指令响应的值是可以加快WIFI初始化的速度,但是你要在函数中写很多以下代码:

while((strcmp(us2_buf,"OK")) != 0);//buf为接收的值

若是你的程序一直卡在某个while循环中的时候,你要不断的用USB转TTL设备去查看串口发送指令情况,所以为了省事,这样是一个不错的方法。

五:总结

        本篇描述了云平台的使用方法,简述了WIFI模块的基础知识,还有延时函数,WIFI模块代码的编写。

        下节更精彩......

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值