Цитата:
Сообщение от Xellow
Никто не делал что то подобное? Или может в интернете натыкался?
|
Модуль 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 = "";
}
Программки давнишние - уже не помню, что у самого залито... Но точно рабочие. Вот несколько ссылок на соответствующие темы.
Здесь,
здесь,
здесь,
еще.