LoRaWAN868.ino 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. uint16_t ypos = 55;
  28. void drawLineStr(String str, uint16_t color) {
  29. M5.Lcd.setTextColor(color);
  30. M5.Lcd.drawString(str, 10, ypos, 4);
  31. ypos += 32;
  32. }
  33. void sendATCMD(String cmdStr) {
  34. Serial2.print(cmdStr);
  35. delay(100);
  36. }
  37. int sendATCMDAndRevice(String cmdStr) {
  38. Serial2.print(cmdStr);
  39. delay(10);
  40. waitRevice();
  41. String recvStr = waitRevice();
  42. if (recvStr.indexOf("OK") != -1) {
  43. return 0;
  44. } else {
  45. return -1;
  46. }
  47. }
  48. void setup() {
  49. M5.begin();
  50. Serial2.begin(115200, SERIAL_8N1, 16, 17);
  51. Serial2.flush();
  52. delay(100);
  53. display.begin();
  54. display.setTextSize(2);
  55. display.println("LoRaWAN868");
  56. canvas.setColorDepth(1); // mono color
  57. canvas.createSprite(display.width(), display.height());
  58. canvas.setTextSize((float)canvas.width() / 160);
  59. canvas.setTextScroll(true);
  60. sendATCMD("AT?\r");
  61. delay(100);
  62. Serial2.flush();
  63. sendATCMDAndRevice("AT+ILOGLVL=0\r");
  64. sendATCMDAndRevice("AT+CSAVE\r");
  65. sendATCMDAndRevice("AT+IREBOOT=0\r");
  66. display.println("LoraWan Rebooting");
  67. delay(2000);
  68. display.println("LoraWan config");
  69. sendATCMDAndRevice("AT+CJOINMODE=0\r");
  70. sendATCMDAndRevice("AT+CDEVEUI=00bb9da5b97addf1\r");
  71. sendATCMDAndRevice("AT+CAPPEUI=70B3D57ED004247E\r"); // 70B3D57ED003B699
  72. sendATCMDAndRevice("AT+CAPPKEY=27DFE264CA33AC1957C005EB48BA4721\r");
  73. sendATCMDAndRevice("AT+CULDLMODE=2\r");
  74. sendATCMDAndRevice("AT+CCLASS=2\r");
  75. sendATCMDAndRevice("AT+CWORKMODE=2\r");
  76. sendATCMDAndRevice("AT+CNBTRIALS=0,5\r");
  77. sendATCMDAndRevice("AT+CNBTRIALS=1,5\r");
  78. // TX Freq
  79. // 868.1 - SF7BW125 to SF12BW125
  80. // 868.3 - SF7BW125 to SF12BW125 and SF7BW250
  81. // 868.5 - SF7BW125 to SF12BW125
  82. // 867.1 - SF7BW125 to SF12BW125
  83. // 867.3 - SF7BW125 to SF12BW125
  84. // 867.5 - SF7BW125 to SF12BW125
  85. // 867.7 - SF7BW125 to SF12BW125
  86. // 867.9 - SF7BW125 to SF12BW125
  87. // 868.8 - FSK
  88. sendATCMDAndRevice("AT+CFREQBANDMASK=0001\r");
  89. // 869.525 - SF9BW125 (RX2) | 869525000
  90. // sendATCMDAndRevice("AT+CRXP=0,0,869525000\r");
  91. sendATCMDAndRevice("AT+CSAVE\r");
  92. sendATCMDAndRevice("AT+CJOIN=1,0,10,8\r");
  93. }
  94. enum systemstate {
  95. kIdel = 0,
  96. kJoined,
  97. kSending,
  98. kWaitSend,
  99. kEnd,
  100. };
  101. int system_fsm = kIdel;
  102. int loraWanSendNUM = -1;
  103. int loraWanSendCNT = -1;
  104. int loraWanupLinkCNT = 0;
  105. int loraWanupLinkReviceCNT = 0;
  106. void loop() {
  107. String recvStr = waitRevice();
  108. if (recvStr.indexOf("+CJOIN:") != -1) {
  109. if (recvStr.indexOf("OK") != -1) {
  110. canvas.println("[ INFO ] JOIN IN SUCCESSFUL");
  111. system_fsm = kJoined;
  112. } else {
  113. canvas.println("[ INFO ] JOIN IN FAIL");
  114. system_fsm = kIdel;
  115. }
  116. } else if (recvStr.indexOf("OK+RECV") != -1) {
  117. if (system_fsm == kJoined) {
  118. system_fsm = kSending;
  119. } else if (system_fsm == kWaitSend) {
  120. system_fsm = kEnd;
  121. char strbuff[128];
  122. loraWanupLinkReviceCNT++;
  123. // if(( loraWanSendCNT < 5 )&&( loraWanSendNUM == 8 ))
  124. //{
  125. // loraWanupLinkReviceCNT ++;
  126. // sprintf(strbuff,"SEND CNT: %d
  127. // (%d/%d)",loraWanSendCNT,loraWanupLinkReviceCNT,loraWanupLinkCNT);
  128. // M5.Lcd.fillRect(0,183,320,32,TFT_BLACK);
  129. // M5.Lcd.setTextColor(TFT_GREEN);
  130. // M5.Lcd.drawString(strbuff, 10, 183, 4);
  131. // //drawLineStr(strbuff, TFT_GREEN);
  132. //
  133. //}
  134. // else
  135. //{
  136. // sprintf(strbuff,"FAILD NUM:%d CNT:%d
  137. // (%d/%d)",loraWanSendNUM,loraWanSendCNT,loraWanupLinkReviceCNT,loraWanupLinkCNT);
  138. // M5.Lcd.fillRect(0,183,320,32,TFT_BLACK);
  139. // M5.Lcd.setTextColor(TFT_RED);
  140. // M5.Lcd.drawString(strbuff, 10, 183, 4);
  141. // drawLineStr(strbuff, TFT_RED);
  142. //}
  143. delay(500);
  144. system_fsm = kSending;
  145. }
  146. } else if (recvStr.indexOf("OK+SEND") != -1) {
  147. String snednum = recvStr.substring(8);
  148. canvas.printf(" [ INFO ] SEND NUM %s \r\n", snednum.c_str());
  149. loraWanSendNUM = snednum.toInt();
  150. } else if (recvStr.indexOf("OK+SENT") != -1) {
  151. String snedcnt = recvStr.substring(8);
  152. canvas.printf(" [ INFO ] SEND CNT %s \r\n", snedcnt.c_str());
  153. loraWanSendCNT = snedcnt.toInt();
  154. } else if (recvStr.indexOf("ERR+SENT") != -1) {
  155. char strbuff[128];
  156. String ErrorCodeStr = recvStr.substring(9);
  157. sprintf(strbuff, "ERROR Code:%d (%d/%d)", ErrorCodeStr.toInt(),
  158. loraWanupLinkReviceCNT, loraWanupLinkCNT);
  159. canvas.println(strbuff);
  160. delay(500);
  161. system_fsm = kSending;
  162. } else if (recvStr.indexOf("+CLINKCHECK:") != -1) {
  163. String checkStr = recvStr.substring(String("+CLINKCHECK:").length());
  164. char strbuff[128];
  165. sprintf(strbuff, "%s (%d/%d)", checkStr.c_str(), loraWanupLinkReviceCNT,
  166. loraWanupLinkCNT);
  167. canvas.println(strbuff);
  168. }
  169. if (system_fsm == kSending) {
  170. canvas.println("LoraWan Sending");
  171. sendATCMD("AT+CLINKCHECK=1\r");
  172. loraWanupLinkCNT++;
  173. system_fsm = kWaitSend;
  174. }
  175. canvas.pushSprite(0, 0);
  176. delay(10);
  177. }