堕落不振功业废,勤耕不辍日月新

arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)

综合 hailen 6℃

arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)

最近由于项目要求,需要开发物联网云平台,而本人对硬件和通信技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通信技术。

下面就是本人通过查阅大佬资料做的一个整合版本的通过手机APP来控制LED开关的实验:

第一步:连线使用软串口方式,利用arduino来对ESP8266进行AT命令操作。

连线参考图如下:

连线完后,利用串口调试工具和Arduino IDE 软件进行编程,实现对ESP8266的软串口指令下达:

 

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println(“Goodnight moon!”);

// set the data rate for the SoftwareSerial port
mySerial.begin(115200);
mySerial.println(“Hello, world?”);
}

void loop() // run over and over
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}

==程序效果==

打开串口,设置波特率为115200,串口显示:

Goodnight moon!
Hello, world?

ERROR

表示已经进入AT模式,如果只有Goodnight moon!,说明没有进入AT模式。

发送AT,反馈OK。

第二步:利用AT命令来对ESP8266进行设置,使其连接到和手机在同一wifi网络中。

 

1:发送AT+RST(执行指令)

指令:AT+RST

反馈:OK

说明:刚上电可以不发送该指令,有些厂家生产的ESP8266模块,无法即时重启复位,导致串口无响应,如已发送,则重新开关串口按钮即可。

2:发送AT+CWMODE=3或AT+CWMODE=2(设置指令)

指令:AT+CWMODE=<MODE>

说明:<MODE>:1为Station模式,2为AP模式,3为Station兼AP模式

反馈:OK

 

3:发送AT+CWJAP=“long”,”12345678”(选择你所要加入的路由器名称和密码进入)

指令:AT+CWJAP=<ssid>,<pwd>

<ssid>:字符串参数,ESP8266WIFI名字

<pwd>:字符串参数,WIFI密码,最长64字节,ASCII

具体内容如下:

//设置WiFi应用模式为Station
AT+CWMODE=3
//连接到WiFi路由器,请将SSID替换为路由器名称,Password替换为路由器WiFi密码
AT+CWJAP="SSID","Password"
//连接单连模式
AT+CIPMUX=0
//设置为透传模式
AT+CIPMODE=1
//进入透传模式,并保存(进入后模块就一直为透传模式,需要退出则取消发送新行,发送+++)
,IP地址为远端设备地址,例:我用手机控制,那么我的手机在路由器WIFI上的IP地址为192.168.1.110
AT+SAVETRANSLINK=1,"192.168.1.110",8080,"TCP"

2018.04.24补充:此时若无USB转TTL工具,不要使用AT+SAVETRANSLINK指令,该指令会将当前设置存储到RAM中去,ESP8266通电后自动进入连接模式,除非使用USB转TTL进行烧写,否则将无法恢复到调试模式(无法使用AT指令)。本人掉坑,后USB转TTL烧写版本后,才恢复正常。

第三步,将LED的正极引脚插入9号数字口,负极接地,进行编程。

  1. int led_pin = 9;
  2. //定义一个10字节的整型数据变量cmd作为命令,这里可以修改为不同的数字。此处设置为10是为了有更好的兼容性。
  3. char cmd[10];
  4. //判断收到的cmd是否有内容
  5. bool valid_cmd = false;
  6. void setup()
  7. {
  8. //定义连接led的引脚为输出信号
  9. pinMode(led_pin, OUTPUT);
  10. Serial.begin(115200);
  11. }
  12. void loop()
  13. {
  14. /*以下部分是串口信息处理过程*/
  15. //定义一个整数型变量i
  16. int i;
  17. //如果串口收到有数据
  18. if (Serial.available() > 0)
  19. {
  20. //变量i最大为10
  21. for (i = 0; i < 10; i++)
  22. {
  23. //清空缓存,存入cmd变量,并以作为结束符
  24. cmd[i] = ‘’;
  25. }
  26. //此时i只能取前9位,第10位是结束符
  27. for (i = 0; i < 9; i++)
  28. {
  29. //再次判断串口如果收到有数据,防止数据丢失
  30. if (Serial.available() > 0)
  31. {
  32. //给变量cmd赋值,取串口收到的前9位字符
  33. cmd[i] = Serial.read();
  34. delay(1);
  35. }
  36. else
  37. {
  38. //如果串口数据超过9位,后面的字符直接忽略,跳到下一步
  39. break;
  40. }
  41. }
  42. /*以上串口信息处理结束*/
  43. //得到最终变量cmd的有效值
  44. valid_cmd = true;
  45. }
  46. //判断变量cmd的值,开始处理
  47. if (valid_cmd)
  48. {
  49. //如果变量cmd的前2位的值是on
  50. if (0 == strncmp(cmd, “on”, 2))
  51. {
  52. //则连接led的引脚电压被置高5V,
  53. digitalWrite(led_pin, HIGH);
  54. //串口打印返回值ON,表示ON的操作执行成功
  55. Serial.println(“ON”);
  56. }
  57. else if (0 == strncmp(cmd, “off”, 3)) //否则如果变量cmd的前3位的值是off
  58. {
  59. //则连接继电器的引脚电压被置低0V,灯的电路被断开,灯灭
  60. digitalWrite(led_pin, LOW);
  61. //串口打印返回值F,表示OFF的操作执行成功
  62. Serial.println(“OFF”);
  63. }
  64. else //如果以上两个条件都不成立,前2位不是ON,或者前3位不是OFF,即不正确的命令
  65. {
  66. //仅串口打印返回值X,表示指令错误。
  67. Serial.println(“X”);
  68. }
  69. //到此,变量cmd的指令被处理完毕
  70. valid_cmd = false;
  71. }
  72. //延迟10毫秒,返回loop主程序继续读取新的串口指令
  73. delay(10);
  74. }

第四步,安装APP进行验证。

 

1、打开网络调试助手,点击TCP SERVER—-配置

18A52A9D8177DF9B8BE1276CC4941491

 

2、当开启服务端后,ESP8266自动连接上了:

93F62FF2778F7ECAEEC5835F2061EB72

 

3、在发送框内发送”on”即可点亮Arduino板载LED灯。

427716C31B543BA557EA6AC07D4D2C8D

BAD5F840EDD341B0F583D741F7E05841

 

4、在发送框内发送”off”即可熄灭Arduino板载LED灯。

38845248DABA686998901FA0E8F019AF

总结:通过对网上资料的整理学习,实现了一种不通过USB转TTL烧写ESP8266的方式,对APP实现同一WiFi网络内LED开关。

本文主要参考了如下资料:

手机通过ESP8266控制Arduino上的LED灯(AT指令方式)

手机通过ESP8266控制Arduino上的LED灯(烧写方式)

https://blog.csdn.net/sheng1522098487/article/details/79885501

转载请注明:我是IT » arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)

喜欢 (0)or分享 (0)