LoRaWAN470.ino 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. *******************************************************************************
  3. * Copyright (c) 2022 by M5Stack
  4. * Equipped with M5Core sample source code
  5. * 配套 M5Core 示例源代码
  6. * Visit for more information: https://docs.m5stack.com/en/unit/lorawan868
  7. * 获取更多资料请访问: https://docs.m5stack.com/zh_CN/unit/lorawan868
  8. *
  9. * Describe: LoRaWAN868.
  10. * Date: 2021/8/31
  11. *******************************************************************************
  12. Please connect to Port C,请连接端口C
  13. */
  14. #include <M5GFX.h>
  15. #include "M5Stack.h"
  16. #include "freertos/queue.h"
  17. M5GFX display;
  18. M5Canvas canvas(&display);
  19. String waitRevice() {
  20. String recvStr;
  21. do {
  22. recvStr = Serial2.readStringUntil('\n');
  23. } while (recvStr.length() == 0);
  24. canvas.println(recvStr);
  25. return recvStr;
  26. }
  27. void sendATCMD(String cmdStr) {
  28. Serial2.print(cmdStr);
  29. delay(100);
  30. }
  31. int sendATCMDAndRevice(String cmdStr) {
  32. Serial2.print(cmdStr);
  33. delay(100);
  34. waitRevice();
  35. String recvStr = waitRevice();
  36. if (recvStr.indexOf("OK") != -1) {
  37. return 0;
  38. } else {
  39. return -1;
  40. }
  41. }
  42. void setup() {
  43. M5.begin();
  44. Serial2.begin(115200, SERIAL_8N1, 16, 17);
  45. Serial2.flush();
  46. delay(100);
  47. display.begin();
  48. display.setTextSize(2);
  49. canvas.setColorDepth(1); // mono color
  50. canvas.createSprite(display.width(), display.height());
  51. canvas.setTextSize((float)canvas.width() / 160);
  52. canvas.setTextScroll(true);
  53. sendATCMD("AT?\r\n");
  54. delay(100);
  55. Serial2.flush();
  56. sendATCMDAndRevice("AT+ILOGLVL=0\r\n");
  57. sendATCMDAndRevice("AT+CSAVE\r\n");
  58. sendATCMDAndRevice("AT+IREBOOT=0\r\n");
  59. display.println("LoraWan Rebooting");
  60. delay(2000);
  61. display.println("LoraWan config");
  62. // Set Join Mode OTAA.
  63. sendATCMDAndRevice("AT+CJOINMODE=0\r\n");
  64. sendATCMDAndRevice("AT+CDEVEUI=0037CAE1FC3542B9\r\n");
  65. sendATCMDAndRevice("AT+CAPPEUI=70B3D57ED003E04E\r\n");
  66. sendATCMDAndRevice("AT+CAPPKEY=67FA4ED1075A20573BCDD7594C458698\r\n");
  67. sendATCMDAndRevice("AT+CULDLMODE=2\r\n");
  68. // Set ClassC mode
  69. sendATCMDAndRevice("AT+CCLASS=2\r\n");
  70. sendATCMDAndRevice("AT+CWORKMODE=2\r\n");
  71. sendATCMDAndRevice("AT+CRXP=0,0,505300000\r\n");
  72. // TX Freq
  73. // 486.3
  74. // 486.5
  75. // 486.7
  76. // 486.9
  77. // 487.1
  78. // 487.3
  79. // 487.5
  80. // 487.7
  81. // MARK 0000 0100 0000 0000 | 0x0400
  82. sendATCMDAndRevice("AT+CFREQBANDMASK=0400\r");
  83. // RX Freq
  84. // 506.7 (RX1)
  85. // 506.9 (RX1)
  86. // 507.1 (RX1)
  87. // 507.3 (RX1)
  88. // 507.5 (RX1)
  89. // 507.7 (RX1)
  90. // 507.9 (RX1)
  91. // 508.1 (RX1)
  92. // 505.3 (RX2)| 505300000
  93. sendATCMDAndRevice("AT+CJOIN=1,0,10,8\r\n");
  94. }
  95. enum systemstate {
  96. kIdel = 0,
  97. kJoined,
  98. kSending,
  99. kWaitSend,
  100. kEnd,
  101. };
  102. int system_fsm = kIdel;
  103. int loraWanSendNUM = -1;
  104. int loraWanSendCNT = -1;
  105. void loop() {
  106. String recvStr = waitRevice();
  107. if (recvStr.indexOf("+CJOIN:") != -1) {
  108. if (recvStr.indexOf("OK") != -1) {
  109. canvas.printf("LoraWan JOIN");
  110. system_fsm = kJoined;
  111. } else {
  112. canvas.printf("LoraWan JOIN FAIL");
  113. system_fsm = kIdel;
  114. }
  115. } else if (recvStr.indexOf("OK+RECV") != -1) {
  116. if (system_fsm == kJoined) {
  117. system_fsm = kSending;
  118. } else if (system_fsm == kWaitSend) {
  119. system_fsm = kSending;
  120. char strbuff[128];
  121. if ((loraWanSendCNT < 5) && (loraWanSendNUM == 8)) {
  122. sprintf(strbuff, "TSET OK CNT: %d", loraWanSendCNT);
  123. canvas.print(strbuff);
  124. } else {
  125. sprintf(strbuff, "FAILD NUM:%d CNT:%d", loraWanSendNUM,
  126. loraWanSendCNT);
  127. canvas.print(strbuff);
  128. }
  129. }
  130. } else if (recvStr.indexOf("OK+SEND") != -1) {
  131. String snednum = recvStr.substring(8);
  132. canvas.printf(" [ INFO ] SEND NUM %s \r\n", snednum.c_str());
  133. loraWanSendNUM = snednum.toInt();
  134. } else if (recvStr.indexOf("OK+SENT") != -1) {
  135. String snedcnt = recvStr.substring(8);
  136. canvas.printf(" [ INFO ] SEND CNT %s \r\n", snedcnt.c_str());
  137. loraWanSendCNT = snedcnt.toInt();
  138. }
  139. if (system_fsm == kSending) {
  140. canvas.println("LoraWan Sending");
  141. sendATCMD("AT+DTRX=1,8,8,4655434b20535443\r\n");
  142. system_fsm = kWaitSend;
  143. }
  144. canvas.pushSprite(0, 0);
  145. delay(10);
  146. }