Advertisement
Guest User

Untitled

a guest
May 20th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.85 KB | None | 0 0
  1. #include <SoftwareSerial.h> // Библиотека програмной реализации обмена по UART-протоколу
  2. SoftwareSerial SIM800(9, 8); // RX, TX
  3.  
  4. String _response = ""; // Переменная для хранения ответа модуля
  5. long lastUpdate = millis(); // Время последнего обновления
  6. long updatePeriod = 60000; // Проверять каждую минуту
  7.  
  8.  
  9. void setup() {
  10. Serial.begin(9600); // Скорость обмена данными с компьютером
  11. SIM800.begin(9600); // Скорость обмена данными с модемом
  12. sendATCommand("AT", true); // Отправили AT для настройки скорости обмена данными
  13. sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)!
  14. lastUpdate = millis(); // Обнуляем таймер
  15. }
  16.  
  17. String sendATCommand(String cmd, bool waiting) {
  18. String _resp = ""; // Переменная для хранения результата
  19. Serial.println(cmd); // Дублируем команду в монитор порта
  20. SIM800.println(cmd); // Отправляем команду модулю
  21. if (waiting) { // Если необходимо дождаться ответа...
  22. _resp = waitResponse(); // ... ждем, когда будет передан ответ
  23. // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
  24. if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
  25. _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
  26. }
  27. Serial.println(_resp); // Дублируем ответ в монитор порта
  28. }
  29. return _resp; // Возвращаем результат. Пусто, если проблема
  30. }
  31.  
  32. String waitResponse() { // Функция ожидания ответа и возврата полученного результата
  33. String _resp = ""; // Переменная для хранения результата
  34. long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
  35. while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  36. if (SIM800.available()) { // Если есть, что считывать...
  37. _resp = SIM800.readString(); // ... считываем и запоминаем
  38. }
  39. else { // Если пришел таймаут, то...
  40. Serial.println("Timeout..."); // ... оповещаем об этом и...
  41. }
  42. return _resp; // ... возвращаем результат. Пусто, если проблема
  43. }
  44.  
  45. bool hasmsg = false; // Флаг наличия сообщений к удалению
  46. void loop() {
  47. if (lastUpdate + updatePeriod < millis() ) { // Пора проверить наличие новых сообщений
  48. do {
  49. _response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true);// Отправляем запрос чтения непрочитанных сообщений
  50. if (_response.indexOf("+CMGL: ") > -1) { // Если есть хоть одно, получаем его индекс
  51. int msgIndex = _response.substring(_response.indexOf("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: ")) - 1).toInt();
  52. char i = 0; // Объявляем счетчик попыток
  53. do {
  54. i++; // Увеличиваем счетчик
  55. _response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true); // Пробуем получить текст SMS по индексу
  56. _response.trim(); // Убираем пробелы в начале/конце
  57. if (_response.endsWith("OK")) { // Если ответ заканчивается на "ОК"
  58. if (!hasmsg) hasmsg = true; // Ставим флаг наличия сообщений для удаления
  59. sendATCommand("AT+CMGR=" + (String)msgIndex, true); // Делаем сообщение прочитанным
  60. sendATCommand("\n", true); // Перестраховка - вывод новой строки
  61. parseSMS(_response); // Отправляем текст сообщения на обработку
  62. break; // Выход из do{}
  63. }
  64. else { // Если сообщение не заканчивается на OK
  65. Serial.println ("Error answer"); // Какая-то ошибка
  66. sendATCommand("\n", true); // Отправляем новую строку и повторяем попытку
  67. }
  68. } while (i < 10);
  69. break;
  70. }
  71. else {
  72. lastUpdate = millis(); // Обнуляем таймер
  73. if (hasmsg) {
  74. sendATCommand("AT+CMGDA=\"DEL READ\"", true); // Удаляем все прочитанные сообщения
  75. hasmsg = false;
  76. }
  77. break;
  78. }
  79. } while (1);
  80. }
  81.  
  82. if (SIM800.available()) { // Если модем, что-то отправил...
  83. _response = waitResponse(); // Получаем ответ от модема для анализа
  84. _response.trim(); // Убираем лишние пробелы в начале и конце
  85. Serial.println(_response); // Если нужно выводим в монитор порта
  86. if (_response.indexOf("+CMTI:")>-1) { // Пришло сообщение об отправке SMS
  87. lastUpdate = millis() - updatePeriod; // Теперь нет необходимости обрабатываеть SMS здесь, достаточно просто
  88. // сбросить счетчик автопроверки и в следующем цикле все будет обработано
  89. }
  90. }
  91. if (Serial.available()) { // Ожидаем команды по Serial...
  92. SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
  93. };
  94. }
  95.  
  96. void parseSMS(String msg) { // Парсим SMS
  97. String msgheader = "";
  98. String msgbody = "";
  99. String msgphone = "";
  100.  
  101. msg = msg.substring(msg.indexOf("+CMGR: "));
  102. msgheader = msg.substring(0, msg.indexOf("\r")); // Выдергиваем телефон
  103.  
  104. msgbody = msg.substring(msgheader.length() + 2);
  105. msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK")); // Выдергиваем текст SMS
  106. msgbody.trim();
  107.  
  108. int firstIndex = msgheader.indexOf("\",\"") + 3;
  109. int secondIndex = msgheader.indexOf("\",\"", firstIndex);
  110. msgphone = msgheader.substring(firstIndex, secondIndex);
  111.  
  112. Serial.println("Phone: " + msgphone); // Выводим номер телефона
  113. Serial.println("Message: " + msgbody); // Выводим текст SMS
  114.  
  115. if(msgbody == "Test") {
  116. sendSMS("+79538533436","OKKK!");
  117. msgbody = "";
  118. }
  119. /*if (msgphone.length() > 6 && phones.indexOf(msgphone) > -1) { // Если телефон в белом списке, то...
  120. setLedState(msgbody, msgphone); // ...выполняем команду
  121. }
  122. else {
  123. Serial.println("Unknown phonenumber");
  124. }*/
  125. }
  126.  
  127. void setLedState (String result, String phone) {
  128. bool correct = false; // Для оптимизации кода, переменная корректности команды
  129. String msgToSend = "";
  130. if (result.length() == 2) {
  131. int ledIndex = ((String)result[0]).toInt(); // Получаем первую цифру команды - адрес устройства (1-3)
  132. int ledState = ((String)result[1]).toInt(); // Получаем вторую цифру команды - состояние (0 - выкл, 1 - вкл)
  133. if (ledIndex >= 1 && ledIndex <= 3 && (ledState == 0 or ledState == 1)) { // Если все нормально, исполняем команду
  134. msgToSend = "LED:" + (String)ledIndex + " set to " + (ledState == 0 ? "OFF" : "ON"); // Статус исполнения
  135. //digitalWrite(pins[ledIndex - 1], ledState); // Исполняем команду
  136. correct = true; // Флаг корректности команды
  137. }
  138. }
  139. if (!correct) {
  140. msgToSend = "Incorrect command: " + result; // Статус исполнения
  141. }
  142. Serial.println(msgToSend); // Выводим результат в терминал
  143. }
  144.  
  145.  
  146. void sendSMS(String phone, String message)
  147. {
  148. sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения
  149. sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement