OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4605|回复: 0

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

[复制链接]

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2016-5-17
在线时间
23 小时
发表于 2018-4-5 16:38:26 | 显示全部楼层 |阅读模式

本文参考:
基于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下载方式

httpsweidian.comuserid=1238350417&wfr=c&ifr=shopdetail

走到这一步说明我们前面的准备工作都做完了,接下来附上需上传到ESP-01模块的代码:

#include <ESP8266WiFi.h>#define MAX_SRV_CLIENTS 3   //最大同时联接数,即你想要接入的设备数量,8266tcpserver只能接入五个,哎const char *ssid = "WIFI"; ////这里是我的wifi,你使用时修改为你要连接的wifi ssidconst char *password = "1234567890"; //你要连接的wifi密码WiFiServer server(8266);//你要的端口号,随意修改,范围0-65535WiFiClient 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 || !serverClients.connected())            {                if (serverClients) serverClients.stop();//未联接,就释放                serverClients = server.available();//分配新的                continue;            }        }        WiFiClient serverClient = server.available();        serverClient.stop();    }    for (i = 0; i < MAX_SRV_CLIENTS; i++)    {        if (serverClients && serverClients.connected())        {            digitalWrite(16, 0);//有链接存在,就一直长亮            if (serverClients.available())            {                while (serverClients.available())                     Serial.write(serverClients.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 && serverClients.connected())            {                serverClients.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);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

点击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(){/*以下部分是串口信息处理过程*///定义一个整数型变量iint i;//如果串口收到有数据if (Serial.available() > 0){//变量i最大为10for (i = 0; i < 10; i++){//清空缓存,存入cmd变量,并以\0作为结束符cmd = '\0';}//此时i只能取前9位,第10位是结束符\0for (i = 0; i < 9; i++){//再次判断串口如果收到有数据,防止数据丢失if (Serial.available() > 0){//给变量cmd赋值,取串口收到的前9位字符cmd = Serial.read();delay(1);}else{//如果串口数据超过9位,后面的字符直接忽略,跳到下一步break;}}/*以上串口信息处理结束*///得到最终变量cmd的有效值valid_cmd = true;}//判断变量cmd的值,开始处理if (valid_cmd){//如果变量cmd的前2位的值是onif (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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

然后供电运行,会发现ESP-01接入WIFI,然后找到他的IP,使用网络调试助手,新建TCPclient,接入服务端,发送on或者off就可以控制arduino上的led灯了(不需外接led,13口对应arduino上的led灯。)

学习、干货获取

学习、干货获取

学习  干货    长按二维码,加关注


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表