Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.31 KB | None | 0 0
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial SIM800(8, 9);
  3.  
  4. int a = 3;
  5. int onepower = 2;
  6. int duopower = 3;
  7. int sw1 = 1;
  8. int sw2 = 1;
  9. int sch = 0;
  10. int scho = 0;
  11. long updatePeriod = 30000;
  12. long lastUpdate = millis();
  13. long zvmil = 120000;
  14. String _response = "";
  15.  
  16. void setup()
  17. {
  18. pinMode(onepower, INPUT);
  19. pinMode(duopower, INPUT);
  20. Serial.begin(9600); // Скорость обмена данными с компьютером
  21. SIM800.begin(9600);
  22. }
  23.  
  24.  
  25. String sendATCommand(String cmd, bool waiting) {
  26. String _resp = ""; // Переменная для хранения результата
  27. Serial.println(cmd); // Дублируем команду в монитор порта
  28. SIM800.println(cmd); // Отправляем команду модулю
  29. if (waiting) { // Если необходимо дождаться ответа...
  30. _resp = waitResponse(); // ... ждем, когда будет передан ответ
  31. // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
  32. if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
  33. _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
  34. }
  35. Serial.println(_resp); // Дублируем ответ в монитор порта
  36. }
  37. return _resp; // Возвращаем результат. Пусто, если проблема
  38. }
  39.  
  40.  
  41. String waitResponse() { // Функция ожидания ответа и возврата полученного результата
  42. String _resp = ""; // Переменная для хранения результата
  43. long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
  44. while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  45. if (SIM800.available()) { // Если есть, что считывать...
  46. _resp = SIM800.readString(); // ... считываем и запоминаем
  47. }
  48. else { // Если пришел таймаут, то...
  49. Serial.println("Timeout..."); // ... оповещаем об этом и...
  50. }
  51. return _resp; // ... возвращаем результат. Пусто, если проблема
  52. }
  53.  
  54.  
  55.  
  56.  
  57. void sendSMS(String phone, String message)
  58. {
  59. sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения
  60. sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z
  61. }
  62.  
  63.  
  64. void parseSMS(String msg) { // Парсим SMS
  65. String msgheader = "";
  66. String msgbody = "";
  67. String msgphone = "";
  68.  
  69. msg = msg.substring(msg.indexOf("+CMGR: "));
  70. msgheader = msg.substring(0, msg.indexOf("\r")); // Выдергиваем телефон
  71.  
  72. msgbody = msg.substring(msgheader.length() + 2);
  73. msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK")); // Выдергиваем текст SMS
  74. msgbody.trim();
  75.  
  76. int firstIndex = msgheader.indexOf("\",\"") + 3;
  77. int secondIndex = msgheader.indexOf("\",\"", firstIndex);
  78. msgphone = msgheader.substring(firstIndex, secondIndex);
  79.  
  80. Serial.println("Phone: " + msgphone); // Выводим номер телефона
  81. Serial.println("Message: " + msgbody); // Выводим текст SMS
  82. //if(msgbody == "1")
  83. //{
  84. //sw3 = 2;
  85. //}
  86. }
  87.  
  88.  
  89. void loop() {
  90.  
  91. if(duopower == HIGH && sw1 == 2)
  92. {
  93. sw1 = 1;
  94. sendSMS("+79538533436", "Reserved voltage is appeared");
  95. }
  96. if (duopower == LOW && sw1 == 1)
  97. {
  98. sw1 = 2;
  99. sendSMS("+79538533436", "Reserved voltage is lost");
  100. }
  101.  
  102.  
  103. if(onepower == HIGH && sw2 == 2)
  104. {
  105. sw2 = 1;
  106. sendSMS("+79538533436", "Main voltage is appeared");
  107. }
  108. if (onepower == LOW && sw2 == 1)
  109. {
  110. sw2 = 2;
  111. sendSMS("+79538533436", "Main voltage is lost");
  112. }
  113.  
  114.  
  115. bool hasmsg = false;
  116. lastUpdate = millis();
  117. if ((lastUpdate) + updatePeriod < millis() ) { // Пора проверить наличие новых сообщений
  118. do {
  119. _response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true);// Отправляем запрос чтения непрочитанных сообщений
  120. if (_response.indexOf("+CMGL: ") > -1) { // Если есть хоть одно, получаем его индекс
  121. int msgIndex = _response.substring(_response.indexOf("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: ")) - 1).toInt();
  122. char i = 0; // Объявляем счетчик попыток
  123. do {
  124. i++; // Увеличиваем счетчик
  125. _response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true); // Пробуем получить текст SMS по индексу
  126. _response.trim(); // Убираем пробелы в начале/конце
  127. if (_response.endsWith("OK")) { // Если ответ заканчивается на "ОК"
  128. if (!hasmsg) hasmsg = true; // Ставим флаг наличия сообщений для удаления
  129. sendATCommand("AT+CMGR=" + (String)msgIndex, true); // Делаем сообщение прочитанным
  130. sendATCommand("\n", true); // Перестраховка - вывод новой строки
  131. parseSMS(_response); // Отправляем текст сообщения на обработку
  132. break; // Выход из do{}
  133. }
  134. else { // Если сообщение не заканчивается на OK
  135. Serial.println ("Error answer"); // Какая-то ошибка
  136. sendATCommand("\n", true); // Отправляем новую строку и повторяем попытку
  137. }
  138. } while (i < 10);
  139. break;
  140. }
  141. else {
  142. lastUpdate = millis(); // Обнуляем таймер
  143. if (hasmsg) {
  144. sendATCommand("AT+CMGDA=\"DEL READ\"", true); // Удаляем все прочитанные сообщения
  145. hasmsg = false;
  146. }
  147. break;
  148. }
  149. } while (1);
  150. if (SIM800.available()) { // Если модем, что-то отправил...
  151. _response = waitResponse(); // Получаем ответ от модема для анализа
  152. Serial.println(_response); // Если нужно выводим в монитор порта
  153. // ... здесь можно анализировать данные полученные от GSM-модуля
  154. }
  155. if (Serial.available()) { // Ожидаем команды по Serial...
  156. SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
  157. };
  158. sendATCommand("AT", true);
  159. // Minonepower();
  160. // Minduopower();
  161. if (_response.startsWith("RING")) // Есть входящий вызов
  162. {
  163. sendATCommand("ATH", true); // Отклоняем вызов
  164. }
  165. }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement