本文参考:
基于esp8266的智能家居控制系统-局域网篇2,tcpserver
准备工作:
ESP-01模块
USB转串口
杜邦线若干
Arduino IDE软件
需要注意的事情就是,ESP-01模块需要和手机连接在同一个局域网内。
Arduino IDE需要下载支持ESP的开发板,我们的模块是ESP-01这里选用NodeMCU 0.9 下载开发板的方法可参考:
基于esp8266的智能家居控制系统-基础篇1介绍arduino ide for esp8266
附上:已经可以直接使用的Arduino IDE下载方式
走到这一步说明我们前面的准备工作都做完了,接下来附上需上传到ESP-01模块的代码:
#include <ESP8266WiFi.h>
#define MAX_SRV_CLIENTS 3 //最大同时联接数,即你想要接入的设备数量,8266tcpserver只能接入五个,哎
const char *ssid = "WIFI"; ////这里是我的wifi,你使用时修改为你要连接的wifi ssid
const char *password = "1234567890"; //你要连接的wifi密码
WiFiServer server(8266);//你要的端口号,随意修改,范围0-65535
WiFiClient serverClients[MAX_SRV_CLIENTS];
void setup()
{
Serial.begin(115200);
delay(10);
pinMode(16, OUTPUT);
digitalWrite(16, 0);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
server.begin();
server.setNoDelay(true); //加上后才正常些
}
void loop()
{
blink();
uint8_t i;
if (server.hasClient())
{
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (!serverClients[i] || !serverClients[i].connected())
{
if (serverClients[i]) serverClients[i].stop();//未联接,就释放
serverClients[i] = server.available();//分配新的
continue;
}
}
WiFiClient serverClient = server.available();
serverClient.stop();
}
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
digitalWrite(16, 0);//有链接存在,就一直长亮
if (serverClients[i].available())
{
while (serverClients[i].available())
Serial.write(serverClients[i].read());
}
}
}
if (Serial.available())
{
size_t len = Serial.available();
uint8_t sbuf[len];
Serial.readBytes(sbuf, len);
//push UART data to all connected telnet clients
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
serverClients[i].write(sbuf, len); //向所有客户端发送数据
delay(1);
}
}
}
}
void blink()
{
static long previousMillis = 0;
static int currstate = 0;
if (millis() - previousMillis > 200) //200ms
{
previousMillis = millis();
currstate = 1 - currstate;
digitalWrite(16, currstate);
}
}
点击Arduino IDE左上角的“√”号进行编译,成功后点击右边的“→”进行上传。(不懂如何进入烧录模式的看这里: ESP8266-01学习笔记01:如何使用USB转串口对ESP-01进行入门调试、烧录固件?)
一定要注意独立供电,检查好杜邦线的连接。另外需要断电后再次上电才能进入烧录模式。注意波特率是否和你的端口属性设置的一致。
另外:不建议直接复制代码进去,可以先把代码复制到Notepad里面再复制进Arduino IDE(否则容易出现问题)
烧录成功后,重新上电进入运行模式。会发现ESP-01已经连接上你的WIFI了。
下面附上客户端,这里我们可以自己下载一个网络调试助手,打开TCP client,输入ESP-01的IP和端口号(我们设置的8266)IP如何查询?打开192.168.1.1查看路由器的设置界面找到IP。没有路由器的,咱们用电脑开一个WIFI共享大师,然后电脑打开CMD,输入IPconfig,就可以查看了。
然后打开ArduinoIDE 的串口监视器
手机端发送数据就可在串口监视器收到信息了。
这里我附上一个手机端(安卓)开发源码:client
下载之后找到bin 文件夹下的apk文件,安装手机上即可直接使用。
趁热打铁,我们将ESP-01模块和Arduino连接,使用手机通过ESP控制Arduino上面的led灯。(ESP也就是透传)
参考文章:手机通过ESP8266控制Arduino上的LED灯(烧写方式)
接线方式:
ESP-01 | Arduino Mega 2560 |
VCC | 3v3 |
GND | GND |
RX | RX |
TX | TX |
CH_PD | 3V3 |
上传到Arduino的代码:
int led_pin = 13;
//定义一个10字节的整型数据变量cmd作为命令,这里可以修改为不同的数字。此处设置为10是为了有更好的兼容性。
char cmd[10];
//判断收到的cmd是否有内容
bool valid_cmd = false;
void setup()
{
//定义连接led的引脚为输出信号
pinMode(led_pin, OUTPUT);
Serial.begin(115200);
}
void loop()
{
/*以下部分是串口信息处理过程*/
//定义一个整数型变量i
int i;
//如果串口收到有数据
if (Serial.available() > 0)
{
//变量i最大为10
for (i = 0; i < 10; i++)
{
//清空缓存,存入cmd变量,并以\0作为结束符
cmd[i] = '\0';
}
//此时i只能取前9位,第10位是结束符\0
for (i = 0; i < 9; i++)
{
//再次判断串口如果收到有数据,防止数据丢失
if (Serial.available() > 0)
{
//给变量cmd赋值,取串口收到的前9位字符
cmd[i] = Serial.read();
delay(1);
}
else
{
//如果串口数据超过9位,后面的字符直接忽略,跳到下一步
break;
}
}
/*以上串口信息处理结束*/
//得到最终变量cmd的有效值
valid_cmd = true;
}
//判断变量cmd的值,开始处理
if (valid_cmd)
{
//如果变量cmd的前2位的值是on
if (0 == strncmp(cmd, "on", 2))
{
//则连接led的引脚电压被置高5V,
digitalWrite(led_pin, HIGH);
//串口打印返回值ON,表示ON的操作执行成功
Serial.println("ON");
}
else if (0 == strncmp(cmd, "off", 3)) //否则如果变量cmd的前3位的值是off
{
//则连接继电器的引脚电压被置低0V,灯的电路被断开,灯灭
digitalWrite(led_pin, LOW);
//串口打印返回值F,表示OFF的操作执行成功
Serial.println("OFF");
}
else //如果以上两个条件都不成立,前2位不是ON,或者前3位不是OFF,即不正确的命令
{
//仅串口打印返回值X,表示指令错误。
Serial.println("X");
}
//到此,变量cmd的指令被处理完毕
valid_cmd = false;
}
//延迟10毫秒,返回loop主程序继续读取新的串口指令
delay(10);
}
然后供电运行,会发现ESP-01接入WIFI,然后找到他的IP,使用网络调试助手,新建TCPclient,接入服务端,发送on或者off就可以控制arduino上的led灯了(不需外接led,13口对应arduino上的led灯。)