使用ESP8266和51单片机的智能开关/智能灯
2017-03-29 11:04
239 查看
本文章所介绍的智能开关为在局域网内实现手机开关的简单方法,功能能简单,仅供参考。
如果对ESP8266模块不了解,请阅读以下两篇文章:
ESP8266与电脑连接
ESP8266基础功能调试
手机应用编程:Android Studio
TCP通信调试:Python3
ESP8266最小系统与单片机最小系统连接:
![](https://img-blog.csdn.net/20170329104734799?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2h1cGFzaHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在正常使用的时候,固件刷写开关不需要打开,如果需要热刷写固件,可以考虑将刷写固件的引脚与单片机的引脚相连。
ESP8266内是一块单片机,也可以通过模块本身直接控制开关,本文仅使用模块的TCP透传功能,这里不再展开。
接下来是缓存字符串比较函数,用于判断返回值中是否含有
程序的变量已经定义完,接下来是介绍主程序的部分。
串口配置及中断配置:
调用这一段代码中的
全部初始化完毕后,就可以使用代码对ESP8266配置了。
这时,模块已经被配置成Station模式连接上我们测试的路由器,并且开放了3122端口,我们就可以进行开关灯的操作了。
如果对ESP8266模块不了解,请阅读以下两篇文章:
ESP8266与电脑连接
ESP8266基础功能调试
一、软件工具
单片机编程:keil手机应用编程:Android Studio
TCP通信调试:Python3
二、硬件电路连接
ESP8266的最小系统参照:ESP8266与电脑连接ESP8266最小系统与单片机最小系统连接:
在正常使用的时候,固件刷写开关不需要打开,如果需要热刷写固件,可以考虑将刷写固件的引脚与单片机的引脚相连。
ESP8266内是一块单片机,也可以通过模块本身直接控制开关,本文仅使用模块的TCP透传功能,这里不再展开。
三、单片机程序编写
(1)首先定义如下变量/常量:
/**********类型定义**************/ #define u8 unsigned char #define u16 unsigned int #define u32 unsigned long #define code const /***********IO定义***************/ //定义P5.5口 LED指示灯 sbit LED=P2^4; /**********缓存变量**************/ //串口接受缓存 u8 xdata RX_buffer[tbuf]; //接收计数变量 u8 RX_num; /**********预定义字符串**************/ //握手连接指令,返回"OK" u8 code esp_at[]="AT\r\n"; //设置ESP8266的工作模式1 Station,返回"OK"或者"no change" u8 code esp_cwmode[]="AT+CWMODE=1\r\n"; //连接到WiFi热点或无线路由上,NXP为无线路由名称,12345678为密码;连接成功返回“OK” u8 code esp_cwjap[]="AT+CWJAP=\"NXP\",\"123456789\"\r\n"; //本机IP地址查询指令 u8 code esp_cifsr[]="AT+CIFSR\r\n"; //连接到TCP服务器,返回“Linked” //192.168.0.149为服务器IP地址 6000为服务器端口号 不同电脑不同软件可能会不一样的 u8 code esp_cipsta[]="AT+CIPSTART=\"TCP\",\"192.168.0.149\",6000\r\n"; // 设置发送数据长度 u8 code esp_cipsend[]="AT+CIPSEND=5\r\n"; //设置多链接 u8 code esp_DuoLianjie []="AT+CIPMUX=1\r\n"; //设置端口号 u8 code esp_Port []="AT+CIPSERVER=1,3122\r\n"; //查询模块自身IP,返回IP地址 u8 code esp_IP []="AT+CIFSR\r\n"; //服务器发送 握手数据 u8 code esp_Woshou []=":test"; //服务器发送 LED检测数据 u8 code esp_test_LED []=":LED"; //服务器发送 打开LED u8 code esp_LED_ON []=":LED ON"; //服务器发送 关闭LED u8 code esp_LED_OFF []=":LED OFF"; //复位重启 u8 code esp_Rst []="AT+RST\r\n"; //发送数据长度 u8 code esp_DATA []="AT+CIPSEND=1024\r\n";
接下来是缓存字符串比较函数,用于判断返回值中是否含有
OK等来自ESP8266模块的工作标识。如需用到更复杂的匹配,可以将之替换为正则表达式引擎。
//指定字符串与缓存数组数据进行数据比较 //*p 要比较的指定字符串指针数据 //返回:1 数据一致 0 数据不一致 u8 Data_compare(u8 *p) { if(strstr(RX_buffer,p)!=NULL) return 1; else return 0; }
程序的变量已经定义完,接下来是介绍主程序的部分。
(2)端口初始化
51单片机部分无需初始化端口,另一部分需要初始化端口才能使用://针对 IAP15W4K61S4 STC15W4K56S4 系列 IO口初始化 //io口初始化 P0 P1 P2 P3 P4 为准双向IO口 //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 void IO_init(void) { P0M0 = 0X00; P0M1 = 0X00; P1M0 = 0X00; P1M1 = 0X00; P2M0 = 0X00; P2M1 = 0X00; P3M0 = 0X00; P3M1 = 0X00; P4M0 = 0X00; P4M1 = 0X00; }
串口配置及中断配置:
void UartInit(void) { S2CON = 0x50; //8位数据,可变波特率 AUXR |= 0x04; //定时器2时钟1为FOSC,即1T T2L=(65536-(11059200/4/115200)); //设置定时初值 T2H=(65536-(11059200/4/115200))>>8; //设置定时初值 AUXR |= 0x10; //启动定时器2 } //串口2发送串口数据(字节) void Uart2SendByte(u8 ch) { S2BUF = ch; //写数据到UART2数据寄存器 while(!(S2CON&S2TI)); S2CON&=~S2TI; } //串口2发送字符串 void Uart2SendStr(u8 *s) { IE2 = 0x00; while (*s) //检测字符串结束标志 { Uart2SendByte(*s++); //发送当前字符 } IE2 = 0x01; } //串口2中断 void Uart2() interrupt 8 using 1 { IE2 = 0x00; //关闭串口2中断 if (S2CON & S2RI) { S2CON &= ~S2RI; RX_buffer[RX_num] = S2BUF; RX_num++; if(RX_num>tbuf) RX_num = 0; } if (S2CON & S2TI) { S2CON &= ~S2TI; } IE2 = 0x01; //开启串口2中断 }
调用这一段代码中的
UartInit(void)函数初始化串口。
全部初始化完毕后,就可以使用代码对ESP8266配置了。
// 1 发送AT 进行握手 while(1) { Uart2SendStr(esp_at); //串口2对wifi模块发送握手指令 即AT if(Data_compare("OK"))break; else Uart1SendStr("ERROR1,some problems with ESP8266 \r\n"); delay1ms(600); } Uart1SendStr("OK,mcu connection success with ESP8266! \r\n"); memset(RX_buffer, 0, tbuf);//清缓存数据 RX_num=0; //接收计数变量清0 // 2 配置wifi工作模式为SA模式 while(1) { Uart2SendStr(esp_cwmode); //串口2对wifi模块工作模式进行设置 if(Data_compare("OK")||Data_compare("no change"))break; delay1ms(600); } memset(RX_buffer, 0, tbuf);//清缓存数据 RX_num=0; //接收计数变量清0 // 3 连接热点wifi wifi名 密码 如果失败 延时继续连接 while(1) { Uart2SendStr(esp_cwjap); //串口2发送 指点wifi名 密码 等待模块连接 if(Data_compare("OK"))break; delay1ms(3000); } memset(RX_buffer, 0, tbuf);//清缓存数据 RX_num=0; //接收计数变量清0 // 4 设置多链接 while(1) { Uart2SendStr(esp_DuoLianjie); //设置多链接 if(Data_compare("OK"))break; delay1ms(3000); } memset(RX_buffer, 0, tbuf);//清缓存数据 RX_num=0; //接收计数变量清0 // 5 设置端口号 while(1) { Uart2SendStr(esp_Port); //设置端口号 if(Data_compare("OK")) { delay1ms(3000); break; } delay1ms(3000); } Uart1SendStr("OK,Succeed esp_Port\r\n"); memset(RX_buffer, 0, tbuf);//清缓存数据 RX_num=0; //接收计数变量清0
这时,模块已经被配置成Station模式连接上我们测试的路由器,并且开放了3122端口,我们就可以进行开关灯的操作了。
相关文章推荐
- 手把手使用esp8266一起来做智能插排-硬件篇
- 手把手使用esp8266一起来做智能插排-软件篇
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序。
- 智能ABC漏洞使用
- 回到使用智能客户端的将来
- 使用 C# 开发智能手机软件:推箱子(一)
- 使用 C# 开发智能手机软件:推箱子(五)
- 使用 C# 开发智能手机软件:推箱子(二)
- VS2005设计智能客户端(二)使用clickonce部署应用程序
- 使用vs2005创建智能设备的C#和C++混合项目
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- 回到使用智能客户端的将来
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- “分享智能手机使用心得”新春茶话会·1月29日·北京·希格马中心
- 使用JavaScript创建智能表单
- 如何使用 Netsh.exe 工具和命令行开关
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- 使用 C# 开发智能手机软件:推箱子(四)