ESP8266学习笔记(3):手机发送数据经WiFi模块透传控制Arduino开发板上的led灯

时间:2021-04-08 22:20:23

本文参考:
基于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下载方式
ESP8266学习笔记(3):手机发送数据经WiFi模块透传控制Arduino开发板上的led灯
走到这一步说明我们前面的准备工作都做完了,接下来附上需上传到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 的串口监视器
ESP8266学习笔记(3):手机发送数据经WiFi模块透传控制Arduino开发板上的led灯
手机端发送数据就可在串口监视器收到信息了。

这里我附上一个手机端(安卓)开发源码: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灯。)