当前位置:   article > 正文

ESP8266与ARDUINO UNO的连接及使用笔记_arduino uno esp8266

arduino uno esp8266

ARDUINO UNO跟ESP8266结合

电路

程序

1. 第一步——ARDUINO引用软串口库

基本的只引用软串口

  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(10, 11); // RX, TX 配置1011为软串口

带有各种检测的

  1. #include <SoftwareSerial.h>
  2. // 软串口
  3. SoftwareSerial WIFISerial(6, 7); // RX, TX交叉接线
  4. #define OK "OK"
  5. #define SENDOK "SEND OK"
  6. #define WIFIPIN 4 //配网按键,按住2秒配网
  7. bool WIFIPINAvailable = true;// 配网按钮是否可用
  8. bool wifiLinked = false;// WIFI是否连接上AP
  9. bool serverLinked = false;// 服务器是否连接
  10. unsigned long lastTime;

2. 第二步——初始化

  1. void setup() {
  2. pinMode(WIFIPIN, INPUT);
  3. // 硬件串口 initialize serial for debugging
  4. Serial.begin(115200);
  5. while (!Serial) {}
  6. // 软串口 initialize serial for ESP module
  7. WIFISerial.begin(57600);
  8. // WIFISerial.println("AT+UART_DEF=57600,8,1,0,0");//解决乱码
  9. // delay(1000);
  10. while (!WIFISerial) {}
  11. WIFISerial.listen();// 开始监听
  12. Serial.println(F("---setup start---"));
  13. // 查询网络连接状态,等待wifi连网几秒
  14. bool _link = false;
  15. int _i = 0;
  16. bgnwifi:
  17. for (int i = 0; i < 3; i++) {
  18. // STATUS 2:获得 IP ,3:已连接,4:断开连接,5:未连接到 WiFi
  19. if (doCMD(F("AT+CIPSTATUS"), F("STATUS:2|STATUS:3"), 3000)) {
  20. _link = true;
  21. break;
  22. }
  23. delay(1000);
  24. }
  25. if (!_link && _i == 0) {
  26. doCMD(F("AT+RST"), F("ready"), 3000);// 重启wifi模块
  27. delay(4000);// 等待连接
  28. _i++;
  29. goto bgnwifi;
  30. }
  31. if (!_link) {
  32. smartConfig();// 启动一键配网
  33. }else {
  34. wifiLinked = true;
  35. }
  36. lastTime = millis();
  37. Serial.println(F("---setup end---"));
  38. }

3. 第三步——开始使用LOOP函数

  • 简单 直接在arduino IDE中的串口监视器中进行AT指令的发送
  1. void loop() // run over and over
  2. {
  3. if (mySerial.available())
  4. Serial.write(mySerial.read());
  5. if (Serial.available())
  6. mySerial.write(Serial.read());
  7. }
  • 复杂 使用一些封装的函数,然后再进行loop 的使用
    找到的一个封装公共函数–飘易封装的公共函数
  1. // 执行AT指令
  2. // cmd AT指令,返回值包含flag则true(2个以|分割),timeout超时时间ms(200的整数倍)
  3. bool doCMD(String cmd, String flag, long timeout) {
  4. String str = "";
  5. WIFISerial.println(cmd); //发送AT指令
  6. delay(300);
  7. flag.toLowerCase();// 小写
  8. // 限期时间
  9. long deadline = millis() + timeout;
  10. while (millis() < deadline)
  11. {
  12. str = "";
  13. while (WIFISerial.available()) {
  14. str += (char)WIFISerial.read();
  15. delay(2);
  16. }
  17. if (str != "") {
  18. Serial.println(str);// 打印输出
  19. str.toLowerCase();// 小写
  20. // 判断 flag 是否需要切割,以 | 切割,逻辑或关系
  21. String flag1 = "", flag2 = "";
  22. int commaPosition = flag.indexOf('|');
  23. if (commaPosition > -1)
  24. {
  25. flag1 = flag.substring(0, commaPosition);
  26. flag2 = flag.substring(commaPosition + 1, flag.length());
  27. }
  28. if (flag1 != "" && flag2 != "") {
  29. if (str.indexOf(flag1) > -1 || str.indexOf(flag2) > -1 ) {
  30. return true;
  31. }
  32. }
  33. if (str.indexOf(flag) > -1) {
  34. return true;
  35. }
  36. }
  37. delay(100);
  38. }
  39. return false;
  40. }
  41. // 一键配网 smartconfig
  42. void smartConfig() {
  43. // 启动smartconfig之前,先停止一下,以避免上次未复位
  44. doCMD(F("AT+CWSTOPSMART"), OK, 3000);
  45. // SmartConfig 仅支持在 ESP8266 单 station 模式下调用
  46. if (!doCMD(F("AT+CWMODE_DEF=1"), OK, 3000)) {}
  47. // 上电自动连接AP
  48. if (!doCMD(F("AT+CWAUTOCONN=1"), OK, 3000)) {}
  49. // 启动smartconfig,支持ESP-Touch和Airkiss智能配网
  50. // 在 SmartConfig 过程中请勿执行其他指令
  51. Serial.println(F("~~ Start SmartConfig ~~"));
  52. bool res = doCMD(F("AT+CWSTARTSMART=3"), F("WIFI GOT IP"), 60000);// 60秒超时
  53. if (res) {
  54. wifiLinked = true;
  55. Serial.println(F("SmartConfig OK"));
  56. } else {
  57. wifiLinked = false;
  58. Serial.println(F("SmartConfig Fail"));
  59. }
  60. doCMD(F("AT+CWSTOPSMART"), OK, 3000);// 无论配网是否成功,都释放快连所占的内存
  61. }
  62. // 连接TCP服务器
  63. bool connectTcp() {
  64. bool linkOk = true;
  65. //连接服务器
  66. String s(F("AT+CIPSTART=\"TCP\",\"tcp.x.com\",9960"));// 字符串存入FLASH
  67. if (!doCMD(s, F("OK|CONNECTED"), 3000)) {
  68. linkOk = false;
  69. }
  70. if (linkOk) {
  71. // 登录,也是心跳包,1分钟内必须上报一次,如有其他定时上报,则可不使用本心跳包
  72. s = F("{\"method\": \"update\",\"gatewayNo\": \"01\",\"userkey\": \"123\"}&^!");// 字符串存入FLASH
  73. doCMD("AT+CIPSEND=" + String(s.length()), ">", 3000);
  74. if (!doCMD(s, SENDOK, 3000)) {
  75. linkOk = false;
  76. }
  77. }
  78. if (!linkOk) {
  79. Serial.println(F("!!SERVER NOT CONNECTED!!"));
  80. } else {
  81. }
  82. serverLinked = linkOk;
  83. return linkOk;
  84. }

实例

执行的业务逻辑是:每50秒为一个循环,在每个循环的第5秒上报传感器的温度和湿度值给云端。当用户按下wifi配网按钮时,wifi模组进入一键配网流程重新设置wifi的ssid和密码信息。

set up 函数参考上面的,这里直接给出loop函数

  1. void loop() {
  2. String info = "";
  3. // 定时上报给服务器 - TCP长连接
  4. if (millis() - lastTime == 5000) {
  5. // 判断wifi是否连接上
  6. if (!wifiLinked) {
  7. Serial.println(F("!!WIFI NOT CONNECTED!!"));
  8. } else {
  9. //连接TCP服务器
  10. if (!serverLinked) {
  11. connectTcp();//连接TCP服务器
  12. } else {
  13. // 上报传感器值 - 定时上报,可代替心跳包(1分钟内1次)
  14. String temp = String(random(10, 40));// 模拟温度
  15. String humi = String(random(40, 90));// 模拟湿度
  16. if (true) {
  17. String s1(F("{\"method\": \"upload\",\"data\":[{\"Name\":\"temp\",\"Value\":\""));// 字符串存入FLASH
  18. String s2(F("\"},{\"Name\":\"humi\",\"Value\":\""));// 字符串存入FLASH
  19. String s3(F("\"}]}&^!"));// 字符串存入FLASH
  20. info = s1 + temp + s2 + humi + s3;
  21. Serial.println(info);
  22. doCMD("AT+CIPSEND=" + String(info.length()), ">", 3000);
  23. if (!doCMD(info, SENDOK, 3000)) {
  24. serverLinked = false;
  25. } else {
  26. }
  27. }
  28. }
  29. }
  30. }
  31. // 恢复计时,云端限制提交频率不能低于20秒
  32. if (millis() - lastTime >= 50000) {
  33. lastTime = millis();
  34. }
  35. // 读取WIFI配网按钮是否接通
  36. boolean val = digitalRead(WIFIPIN);
  37. if (val && WIFIPINAvailable) {
  38. WIFIPINAvailable = false;
  39. Serial.println(F("WIFIPIN pressed"));
  40. smartConfig();// 启动一键配网
  41. WIFIPINAvailable = true;
  42. }
  43. // PC串口转发给wifi软串口
  44. while (Serial.available()) {
  45. WIFISerial.write(Serial.read());
  46. }
  47. // wifi软串口发送过来的信息
  48. String str = "";
  49. while (WIFISerial.available()) {
  50. str = str + (char)WIFISerial.read();
  51. }
  52. if (str != "") {
  53. Serial.println(str);
  54. }
  55. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/534931
推荐阅读
相关标签
  

闽ICP备14008679号