При старте, на каждую команду должно быть подтверждение — ОК.
При звонке со вписанного номера, будет на 5 секунд зажигаться D13, а связь обрываться. Если это будет другой номер, то ничего не произойдёт. Все действия отображаются в терминале.
Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
byte led = 13;
void setup() {
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); //включить АОН
delay(100);
// ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(3);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf("79111111111") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
Serial.println("On D13");
digitalWrite(led, HIGH); //включаем светодиод на 5 сек
Serial.println("5 sec pause");
delay(5000);
digitalWrite(led, LOW); //выключаем
Serial.println("Off D13");
}
}
}
}
Следующий скетч будет посылать SMS в ответ на наш звонок:
Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
byte led = 13;
void setup()
{
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); // включить АОН
delay(100);
Serial.println("Text format sms:");
mySerial.println("AT+CMGF=1"); // текстовый формат SMS
delay(100);
Serial.println("Mode GSM:");
mySerial.println("AT+CSCS="GSM""); // кодировка текста - GSM
delay(100);
// ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(5);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf("79111111111") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
delay(3000);
sms(String("Hello"), String("+79111111111")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
}
}
}
}
void sms(String text, String phone) // отправка СМС
{
Serial.println("Start SMS send");
mySerial.println("AT+CMGS="" + phone + """);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send OK");
delay(2000);
}
Вместо строки «Hello» можно вписать какую-либо переменную, например температуру с датчика, а звонок заменить каким-либо событием, например, нажатием на кнопку (дописав обработчик нажатия кнопки).
С помощью этого скетча можно отправлять в модуль через терминал какие-то свои команды или АТ-команды. Ответ будет выводится в терминал.
Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
byte led = 13;
void setup()
{
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY");
Serial.println();
}
void loop()
{
if(Serial.available()) //если в мониторе порта ввели что-то
{
char ch = ' ';
String val = "";
while (Serial.available())
{
ch = Serial.read();
val += char(ch); //собираем принятые символы в строку
delay(5);
}
if(val.indexOf("callmy") > -1) // своя команда
{
mySerial.println("ATD89111111111;"); // ВПИШИТЕ номер, на который нужно позвонить
}
else mySerial.println(val); // передача всего, что набрано в терминале в GSM модуль
}
while(mySerial.available())
{
Serial.print((char)mySerial.read());
delay(3);
}
}
Если ввести в терминале ат-команду — AT+CLIP=1, то включится АОН, а если ввести свою команду — callmy, тогда модуль перезвонит на вписанный в скетче телефон.
Скетч для отправки SMS-команд:
Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
byte led = 13;
void setup() {
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); //включить АОН
delay(300);
Serial.println("Text format sms:");
mySerial.println("AT+CMGF=1"); // текстовый формат SMS
delay(300);
Serial.println("Mode GSM:");
mySerial.println("AT+CSCS="GSM""); // кодировка текста - GSM
delay(300);
Serial.println("SMS to terminal:");
mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
delay(300);
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(3);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("+CMT") > -1) //если есть входящее sms
{
if(val.indexOf("led13on") > -1) // смотрим, что за команда
{
Serial.println("On D13");
digitalWrite(led, HIGH); //включаем светодиод
}
if(val.indexOf("led13off") > -1) // смотрим, что за команда
{
digitalWrite(led, LOW); //выключаем
Serial.println("Off D13");
}
}
}
}
Если отправить модулю смску с текстом — led13on, то светодиод зажжётся, а если отправить текст — led13off, то погаснет.
И последний скетч, который позволяет отправив в модуль смс со специальным словом, получить в ответ смс с балансом денег на симке, которая стоит в NEOWAY
Не забудьте вписать нужный номер.
Код: Выделить всё
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
byte led = 13;
void setup() {
delay(2000);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("GSM NEOWAY");
Serial.println();
Serial.println("Turn on AOH:");
mySerial.println("AT+CLIP=1"); //включить АОН
delay(300);
Serial.println("Text format sms:");
mySerial.println("AT+CMGF=1"); // текстовый формат SMS
delay(300);
Serial.println("Mode GSM:");
mySerial.println("AT+CSCS="GSM""); // кодировка текста - GSM
delay(300);
Serial.println("SMS to terminal:");
mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
delay(300);
}
void loop()
{
if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(3);
}
Serial.print("Neo send> ");
Serial.println(val);
if(val.indexOf("+CMT") > -1) //если есть входящее sms
{
if(val.indexOf("money") > -1) // смотрим, что за команда
{
delay(3000);
mySerial.println("ATD#100#;");
}
}
if(val.indexOf("+CUSD") > -1) //если есть входящее sms
{
if(val.indexOf("Balance") > -1) // смотрим, что за команда
{
delay(3000);
val = val.substring(val.indexOf("Balance"),val.indexOf("r"));
sms(String(val), String("+79111111111")); // ВПИШИТЕ ВАШ НОМЕР
}
}
}
}
void sms(String text, String phone) //отправка СМС с балансом модема
{
Serial.println("Start SMS send");
mySerial.println("AT+CMGS="" + phone + """);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println("SMS send OK");
delay(2000);
}
Отправьте модулю смску с текстом — money и через несколько секунд придёт ответная смс с количеством денег на балансе симки NEOWAY.
Для управления модулем с нескольких номеров нужно добавить их в скетч так:
Код: Выделить всё
if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf("79111111111") > -1 || val.indexOf("79111111112") > -1 || val.indexOf("79111111113") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
Serial.println("On D13");
digitalWrite(led, HIGH); //включаем светодиод на 5 сек
Serial.println("5 sec pause");
delay(5000);
digitalWrite(led, LOW); //выключаем
Serial.println("Off D13");
}
}
Или так, с ответом на номер, с которого звонили.
Код: Выделить всё
if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf("79111111111") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
delay(3000);
sms(String("Hello"), String("+79111111111")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
}
else if(val.indexOf("79111111112") > -1) // ВПИШИТЕ ВТОРОЙ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
delay(3000);
sms(String("Hello"), String("+79111111112")); // ВПИШИТЕ ВТОРОЙ НОМЕР, с которого Вы будете звонить на модуль
}
else if(val.indexOf("79111111113") > -1) // ВПИШИТЕ ТРЕТИЙ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println("Call my phone");
mySerial.println("ATH"); //разрываем связь
Serial.println("Disconnection");
delay(3000);
sms(String("Hello"), String("+79111111113")); // ВПИШИТЕ ТРЕТИЙ НОМЕР, с которого Вы будете звонить на модуль
}
else mySerial.println("ATH"); //разрываем связь
}
Все эксперименты проводились с оператором МТС.