ESP8266
面向物联网应用的,高性价比、高度集成的WiFi MCU
简介:
高度集成: ESP8266EX集成了32位Tensilica 处理器、标准数字外设接口、天线开关、射频balun、功率放大器、底噪放大器、过滤器和电源管理模块,可将所占的PCB空间降低。
32位Tensilica 处理器: 内置低功耗Tensilica L106 32位 RISC处理器、cpu时钟最高达160MHz、支持实时操作系统(RTOS)和wifi协议栈,可将高达80%的处理能力留给应用编程和开发。
WiFi模块–ESP-01s ,通信模块是通过串口调试助手发送AT指令实现联网
AT指令
AT指令集是从终端设备或数字终端设备向终端适配器或数据电路终端设备发送的。
其对传输的数据包大小有定义:即对于AT指令的发送,除AT字符外,最多可接收1056字符长度(包含最后的空字符)
每个AT命令行中只能包含一条AT指令;对于由终端设备主动向pc端报告的URC指示或者response响应,也要求一行最多有1个,不允许上报的一行中有多条指示或响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾。
ESP-01s出场波特率正常是115200,注意:AT指令,控制类都要加回车,数据传输时不加回车。
AT指令实操:
(波特率要选择9600,115200不通信)
①初始化设置:
AT指令基本都要勾选发送新行
AT+RST:重启指令,响应ready结束
AT+UART=9600,8,1,0,0:配置9600波特率(8个数据位1个停止位)响应OK结束
②入网设置:
设置工作模式:
AT+CWMODE=3
模式设置1、station(设备)模式
2、AP(路由)模式
3、是双模
响应OK结束,错误为ERROR
以设备模式借入家中路由器配置:
AT+CWJAP="wifi名","wifi密码"
响应:WIFI CONNECTED //连接过会先断开
WIFI GOT IP
OK结束
查询ip地址:
AT+CIFSR
+CIFSR:APIP,"192.168.4.1" //ESP-01S作为路由器的时候的网关
+CIFSR:APMAC,"2e:3a:e8:17:5e:57"
+CIFSR:STAIP,"0.0.0.0"
+CIFSR:STAMAC,"2c:3a:e8:17:5e:57"
响应OK结束
③连接到TCP server(网络调试助手)
打开网络助手,设立TCP服务器
(1)协议类型,选择TCP server
(2)本地ip地址,自己电脑ip地址(cmd中ipconfig查询电脑ip地址)
(3)本地端口号,通信端口号(尽量不用8080)
④连接服务器
AT+CIPSTART="TCP","10.0.22.249",8880
响应CONNECT
OK结束
⑤发送数据
方法一、
AT+CIPSEND=4
//设置即将发送数据的长度为4字节
出现>:输入要发送的4个字节的数据(不勾选发送新行)
网络助手不显示字符,显示代码,去掉16进制显示
响应SEND OK结束
方法二、透传模式
AT+CIPMODE=1
响应OK结束,开启CIPMODE模式
AT+CIPSEND
响应> 开始发送模式
退出透传模式:
(不勾选发送新行)发送+++两遍退出,回到AT指令模式
单片机发送AT指令
定义指令信息:
// 网络连接
code char LJWL[]="AT+CWJAP=\"WiFi名\",\"WiFi密码\"\r\n";
//转义字符,\"保留原本的引号字符意义,否则出错
//服务器连接
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.43.112\",8880\r\n";
//开启透传模式
char KQTCMS[]="AT+CIPMODE=1\r\n";
//开始数据传输
char KSSJCS[]="AT+CIPSEND\r\n";
**code**专门存储比较大的数据的空间,否则报错
main函数中执行信息,每项操作之后延时5s
使用白盒测试,检验是否能执行。
电脑用过串口助手查看ESP8266的执行结果。
接线方式:
连接 连接
C51 \VCC\GND / TX ← VCC\GND\RX/ESP8266 /TX → RX \ PC串口调试助手
#include "reg52.h"
#include "intrins.h"
#include <string.h>
#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
char cmd[SIZE]; //数组操作发送字符串
// 网络连接
code char LJWL[]="AT+CWJAP=\"123456\",\"wbr0729@\"\r\n";
//转义字符,\"保留原本的引号字符意义,否则出错
//服务器连接
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.43.112\",8880\r\n";
//开启透传模式
char KQTCMS[]="AT+CIPMODE=1\r\n";
//开始数据传输
char KSSJCS[]="AT+CIPSEND\r\n";
//串口初始化
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开启总中断
ES = 1; //开启串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)
{
//往发送缓冲区中写入数据,就完成了数据的发送
SBUF = data_msg;
while(!TI); //超声波中,用while等待,发送成功后T1 == 1
TI = 0;
}
void sendString(char* str)
{
while(*str != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
D5 = 1; //D5通电以后为灭的状态
//配置c51串口的通信方式
UartInit();
while(1){
Delay1000ms();
sendString("laowang lihai!\r\n");
sendString(LJWL); // 网络连接
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(LJFWQ); //服务器连接
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(KQTCMS); //开启透传模式
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(KSSJCS); //开始数据传输
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
}
}
//中断函数
void UART_Rountine(void) interrupt 4
{
static int i = 0; //静态的局部变量,被初始化一次
if(RI){ //接收中断
RI = 0; //软件复位
cmd[i] = SBUF; //读数据
i++;
if(i == SIZE){
i = 0;
}
if(strstr(cmd,"en")){ //strcmp函数,比较函数,两个函数都为open,向下执行
//查找子串,获得的字符串中间有没有en
D5 = 0; //D5点亮
i = 0;
memset(cmd,'\0',SIZE); //清空数组,\0没有任何东西,大小12
}
if(strstr(cmd,"se")){
D5 = 1; //D5熄灭
i = 0;
memset(cmd,'\0',SIZE);
}
}
if(TI); //发送中断
}
优化:通过TCP通信点亮led
#include "reg52.h"
#include "intrins.h"
#include <string.h>
#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
char cmd[SIZE]; //数组操作发送字符串
// 网络连接
code char LJWL[]="AT+CWJAP=\"123456\",\"wbr0729@\"\r\n";
//转义字符,\"保留原本的引号字符意义,否则出错
//服务器连接
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.43.112\",8880\r\n";
//开启透传模式
char KQTCMS[]="AT+CIPMODE=1\r\n";
//开始数据传输
char KSSJCS[]="AT+CIPSEND\r\n";
//串口初始化
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1; //开启总中断
ES = 1; //开启串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)
{
//往发送缓冲区中写入数据,就完成了数据的发送
SBUF = data_msg;
while(!TI); //超声波中,用while等待,发送成功后T1 == 1
TI = 0;
}
void sendString(char* str)
{
while(*str != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
int mark = 0;
D5 = 1; //D5通电以后为灭的状态
//配置c51串口的通信方式
UartInit();
while(1){
//Delay1000ms();
//sendString("laowang lihai!\r\n");
if(mark == 0){
sendString(LJWL); // 网络连接
Delay1000ms();
sendString(LJFWQ); //服务器连接
Delay1000ms();
sendString(KQTCMS); //开启透传模式
Delay1000ms();
sendString(KSSJCS); //开始数据传输
Delay1000ms();
mark = 1;
}else{
sendString("laowang lihai!\r\n");
Delay1000ms();
}
}
}
//中断函数
void UART_Rountine(void) interrupt 4
{
static int i = 0; //静态的局部变量,被初始化一次
if(RI){ //接收中断
RI = 0; //软件复位
cmd[0] = SBUF; //读数据
if(cmd[0] == '1'){
D5 = 0; //D5点亮
i = 0;
}
if(cmd[0] == '0'){
D5 = 1; //D5熄灭
}
}
if(TI); //发送中断
}