Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SoftwareSerial.h>
- SoftwareSerial SIM800(8, 9);
- int a = 3;
- int onepower = 2;
- int duopower = 3;
- int sw1 = 1;
- int sw2 = 1;
- int sch = 0;
- int scho = 0;
- long updatePeriod = 30000;
- long lastUpdate = millis();
- long zvmil = 120000;
- String _response = "";
- void setup()
- {
- pinMode(onepower, INPUT);
- pinMode(duopower, INPUT);
- Serial.begin(9600); // Скорость обмена данными с компьютером
- SIM800.begin(9600);
- }
- String sendATCommand(String cmd, bool waiting) {
- String _resp = ""; // Переменная для хранения результата
- Serial.println(cmd); // Дублируем команду в монитор порта
- SIM800.println(cmd); // Отправляем команду модулю
- if (waiting) { // Если необходимо дождаться ответа...
- _resp = waitResponse(); // ... ждем, когда будет передан ответ
- // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
- if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
- _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
- }
- Serial.println(_resp); // Дублируем ответ в монитор порта
- }
- return _resp; // Возвращаем результат. Пусто, если проблема
- }
- String waitResponse() { // Функция ожидания ответа и возврата полученного результата
- String _resp = ""; // Переменная для хранения результата
- long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
- while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
- if (SIM800.available()) { // Если есть, что считывать...
- _resp = SIM800.readString(); // ... считываем и запоминаем
- }
- else { // Если пришел таймаут, то...
- Serial.println("Timeout..."); // ... оповещаем об этом и...
- }
- return _resp; // ... возвращаем результат. Пусто, если проблема
- }
- void sendSMS(String phone, String message)
- {
- sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения
- sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z
- }
- void parseSMS(String msg) { // Парсим SMS
- String msgheader = "";
- String msgbody = "";
- String msgphone = "";
- msg = msg.substring(msg.indexOf("+CMGR: "));
- msgheader = msg.substring(0, msg.indexOf("\r")); // Выдергиваем телефон
- msgbody = msg.substring(msgheader.length() + 2);
- msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK")); // Выдергиваем текст SMS
- msgbody.trim();
- int firstIndex = msgheader.indexOf("\",\"") + 3;
- int secondIndex = msgheader.indexOf("\",\"", firstIndex);
- msgphone = msgheader.substring(firstIndex, secondIndex);
- Serial.println("Phone: " + msgphone); // Выводим номер телефона
- Serial.println("Message: " + msgbody); // Выводим текст SMS
- //if(msgbody == "1")
- //{
- //sw3 = 2;
- //}
- }
- void loop() {
- if(duopower == HIGH && sw1 == 2)
- {
- sw1 = 1;
- sendSMS("+79538533436", "Reserved voltage is appeared");
- }
- if (duopower == LOW && sw1 == 1)
- {
- sw1 = 2;
- sendSMS("+79538533436", "Reserved voltage is lost");
- }
- if(onepower == HIGH && sw2 == 2)
- {
- sw2 = 1;
- sendSMS("+79538533436", "Main voltage is appeared");
- }
- if (onepower == LOW && sw2 == 1)
- {
- sw2 = 2;
- sendSMS("+79538533436", "Main voltage is lost");
- }
- bool hasmsg = false;
- lastUpdate = millis();
- if ((lastUpdate) + updatePeriod < millis() ) { // Пора проверить наличие новых сообщений
- do {
- _response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true);// Отправляем запрос чтения непрочитанных сообщений
- if (_response.indexOf("+CMGL: ") > -1) { // Если есть хоть одно, получаем его индекс
- int msgIndex = _response.substring(_response.indexOf("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: ")) - 1).toInt();
- char i = 0; // Объявляем счетчик попыток
- do {
- i++; // Увеличиваем счетчик
- _response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true); // Пробуем получить текст SMS по индексу
- _response.trim(); // Убираем пробелы в начале/конце
- if (_response.endsWith("OK")) { // Если ответ заканчивается на "ОК"
- if (!hasmsg) hasmsg = true; // Ставим флаг наличия сообщений для удаления
- sendATCommand("AT+CMGR=" + (String)msgIndex, true); // Делаем сообщение прочитанным
- sendATCommand("\n", true); // Перестраховка - вывод новой строки
- parseSMS(_response); // Отправляем текст сообщения на обработку
- break; // Выход из do{}
- }
- else { // Если сообщение не заканчивается на OK
- Serial.println ("Error answer"); // Какая-то ошибка
- sendATCommand("\n", true); // Отправляем новую строку и повторяем попытку
- }
- } while (i < 10);
- break;
- }
- else {
- lastUpdate = millis(); // Обнуляем таймер
- if (hasmsg) {
- sendATCommand("AT+CMGDA=\"DEL READ\"", true); // Удаляем все прочитанные сообщения
- hasmsg = false;
- }
- break;
- }
- } while (1);
- if (SIM800.available()) { // Если модем, что-то отправил...
- _response = waitResponse(); // Получаем ответ от модема для анализа
- Serial.println(_response); // Если нужно выводим в монитор порта
- // ... здесь можно анализировать данные полученные от GSM-модуля
- }
- if (Serial.available()) { // Ожидаем команды по Serial...
- SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
- };
- sendATCommand("AT", true);
- // Minonepower();
- // Minduopower();
- if (_response.startsWith("RING")) // Есть входящий вызов
- {
- sendATCommand("ATH", true); // Отклоняем вызов
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement