Вложений: 1
Цитата:
Сообщение от Xellow
(Сообщение 382189)
Никто не делал что то подобное? Или может в интернете натыкался?
|
Модуль SIM800L очень надежный, простой и не требует сложных манипуляций. Единственное требование- это к питанию - от 3.7В до 4.2В. Пользуюсь такими-очень доволен.Ниже несколько скетчей - может пригодятся.
Один с запросом баланса на СИМ и триггером включения канала по звонку.
PHP код:
#include <SoftwareSerial.h> #include <Bounce.h> String currStr = ""; SoftwareSerial gprsSerial(2, 3); String nomber_Phone = "";//Строка содержит номер телефона Bounce bouncer = Bounce(5, 40); //создаем экземпляр класса Bounce для 5 вывода //String currStr1 = "";//Строка содержит текущую строку, полученую от сим модуля. char data;//Содержит символ полученый от сим модуля. String str_1 = "", number = ""; // str_1 - сообщение, number - телефонный номер звонившего
void setup() { pinMode(9, OUTPUT); //пин к которому подключен светодиод pinMode(5, INPUT_PULLUP); //переключаем 5 вывод в режим входа (от SIM модуля) Serial.begin(9600); gprsSerial.begin(9600); // Настраиваем приём сообщений // Между командами даём время на их обработку
gprsSerial.println("AT"); delay(500); Serial.println("AT+CMGD=4");//Удаляем всё SMS которые могут содержаться на сим карте. gprsSerial.println("ATE0"); // выключаем эхо
delay(100);
gprsSerial.println("AT+CLIP=1"); // Включаем АОН
delay(100);
gprsSerial.println("AT+CSCS=\"GSM\""); // Режим кодировки текста = GSM (только англ.)
delay(100);
gprsSerial.println("AT+CNMI=2,2"); // Текст смс выводится в com-порт
delay(100); gprsSerial.println("AT+CSQ");// Проверяем уровень сигнала delay(800);
gprsSerial.println("AT+CMGF=1"); //устанавливает текстовый режим смс-сообщения delay(300);
gprsSerial.println("AT+IFC=1,1"); //устанавливает программный контроль потоком передачи данных delay(300);
gprsSerial.print("AT+CPBS=");//открывает доступ к данным телефонной книги gprsSerial.print((char)34); gprsSerial.print("SM"); // SIM-карты gprsSerial.print((char)34); gprsSerial.println(""); // gprsSerial.print((char)13); delay(300);
gprsSerial.println("AT+CNMI=1,2,2,1,0");//включает оповещение о новых сообщениях, //новые сообщения приходят в следующем формате: // +CMT: "<номер телефона>", "", "<дата, время>", //а на следующей строчке с первого символа идёт содержимое сообщения delay(300); balance(); }
void loop() { { if (Serial.available()) gprsSerial.write(Serial.read()); // если поступил звонок if (bouncer.update()) { if (bouncer.read()==0) { digitalWrite(9, HIGH); //включить светодиод gprsSerial.println("ATD +7981*******;"); //показать номер номер телефона delay(15000); gprsSerial.println("ATH0"); digitalWrite(9, LOW); //выключить светодиод } } if (gprsSerial.available()) // если пришло что то от GSM модуля, то вызываем обработчик { response_on_dial(); } }
//++++Запрос баланса+++// { if (gprsSerial.available()){ char currSymb = gprsSerial.read(); if ('\r' == currSymb) { //если символ перевод каретки if (currStr.startsWith("+CUSD: 0,")) { int zzz = currStr.indexOf("UAH"); String balance=currStr.substring(10,zzz-3); //баланс на сим карте Serial.print(balance); smsSendAlarm( currStr); } currStr = ""; } else if ('\n' != currSymb) { //если символ НЕ новая строка currStr += String(currSymb); } } } } //процедура отправки СМС void smsSendAlarm(String text) { String NBoss = "7981*******"; // вместо звездочек вписать номер телефона gprsSerial.println("AT+CMGS=\"" + NBoss + "\""); //Отправляем на GSM комманду отправка смс-номер NBoss = ""; //Очищаем перемунную delay(300); //Делаем задержку на передачу комманды gprsSerial.print(text); //Отправляем на GSM комманду отправка смс-текст text = ""; //Очищаем перемунную delay(500); //Делаем задержку на передачу комманды gprsSerial.print((char)26); //Отправляем на GSM комманду отправка смс! delay(5000); //Делаем задержку отправку смс } void balance () {
gprsSerial.print("AT+CUSD=1,"); gprsSerial.print('"'); gprsSerial.print("#100#"); gprsSerial.println('"');
}
// Обработчик входящего вызова void response_on_dial() { delay(500); while (gprsSerial.available()) { char c = gprsSerial.read(); Serial.write(c); str_1 += c; // загоняем в str_1 сообщение от модуля } // Находим в строке "+7981" и выдёргиваем из строки номер телефона if (str_1.startsWith("RING", 2)) { int index_number = str_1.lastIndexOf("+7981"); if (index_number != -1) { number = str_1.substring(index_number, (index_number + 13)); // Пришел вызов в номера "number", далее пишем, что делаем String str_2 = "Ring!!!" + number; Serial.println(str_2); delay(3000); gprsSerial.println("ATH0"); // сбрасываем вызов АТ-командой "АТН" if(digitalRead(9) == LOW) {Serial.println("Led ON"); digitalWrite(9,HIGH); // инвертируем выход led } else { digitalWrite(9,LOW); Serial.println("Led OFF"); } } } str_1 = ""; }
Второй просто триггер.
PHP код:
#include <SoftwareSerial.h> //#include <EEPROM.h> #include <Bounce.h> String nomber_Phone = "";//Строка содержит номер телефона. далее Разрешенный номер. SoftwareSerial mySerial(2, 3); // RX, TX +,0,3,2,- (3-3, 2-2) Bounce bouncer = Bounce(5, 40); //создаем экземпляр класса Bounce для 5 вывода String currStr = "";//Строка содержит текущую строку, полученую от сим модуля. char data;//Содержит символ полученый от сим модуля. String str_1 = "", number = ""; // str_1 - сообщение, number - телефонный номер звонившего void setup() { pinMode(9, OUTPUT); pinMode(5, INPUT_PULLUP); //переключаем 5 вывод в режим входа //digitalWrite(5, HIGH); //включаем на нем подтягивающий резистор pinMode(13, OUTPUT); Serial.begin(19200); //Скорость порта для связи Arduino с компьютером //Serial.println("Goodnight moon!"); mySerial.begin(19200); //Скорость порта для связи Arduino с GSM модулем mySerial.println("AT"); delay(500); Serial.println("AT+CMGD=4");//Удаляем всё SMS которые могут содержаться на сим карте. mySerial.println("ATE0"); // выключаем эхо
delay(100);
mySerial.println("AT+CLIP=1"); // Включаем АОН
delay(100);
mySerial.println("AT+CMGF=1"); // Формат СМС = ASCII текст
delay(100);
mySerial.println("AT+CSCS=\"GSM\""); // Режим кодировки текста = GSM (только англ.)
delay(100);
mySerial.println("AT+CNMI=2,2"); // Текст смс выводится в com-порт
delay(100); mySerial.println("AT+CSQ");// Проверяем уровень сигнала delay(800); void loop() { if (Serial.available()) mySerial.write(Serial.read()); if (bouncer.update()) { if (bouncer.read()==0) { digitalWrite(9, HIGH); mySerial.println("ATD +7981*******;"); //т delay(15000); mySerial.println("ATH0"); digitalWrite(9, LOW); } } if (mySerial.available()) // если пришло что то от GSM модуля, то вызываем обработчик { response_on_dial(); } } // Обработчик входящего вызова void response_on_dial() { delay(500); while (mySerial.available()) { char c = mySerial.read(); Serial.write(c); str_1 += c; // загоняем в str_1 сообщение от модуля } // Находим в строке "+7981" и выдёргиваем из строки номер телефона if (str_1.startsWith("RING", 2)) { int index_number = str_1.lastIndexOf("+7981"); if (index_number != -1) { number = str_1.substring(index_number, (index_number + 13)); // Пришел вызов в номера "number", далее пишем, что делаем String str_2 = "Ring!!!" + number; Serial.println(str_2); delay(3000); mySerial.println("ATH0"); // сбрасываем вызов АТ-командой "АТН" if(digitalRead(9) == LOW) {Serial.println("Led ON"); digitalWrite(9,HIGH); // инвертируем выход led } else { digitalWrite(9,LOW); Serial.println("Led OFF"); } } } str_1 = ""; }
Программки давнишние - уже не помню, что у самого залито... Но точно рабочие. Вот несколько ссылок на соответствующие темы. Здесь, здесь, здесь, еще.
|