Скетчи команды для NEOWAY M590E

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1607
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 29 июля 2017, 14:51

Реанимировав NEOWAY M590E, решил попробовать его работоспособность по отправке/приёму смс и звонкам. Схему подключения смотрите в той статье.
При старте, на каждую команду должно быть подтверждение — ОК.

При звонке со вписанного номера, будет на 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") > -|| val.indexOf("79111111112") > -|| 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");  //разрываем связь 
       
     

Все эксперименты проводились с оператором МТС.
[center]i love you [s]mxIni[/s] Mysql[/center]


Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1607
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

AT Команды

#2 Дим » 29 июля 2017, 15:11

Управление портом.
Вначале работы необходимо задать режимы работы com порта. Для этого есть несколько основных команд:
AT+IPR=9600 — скорость порта.
Можно выбрать: 0, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
0 — автовыбор. Стоит по умолчанию и для правильной работы первый посылаемый символ должен быть прописной буквой 'A'.
AT+IFC=0,0 — режим управления потоком в обе стороны.
0, Без контроля.
1, Программный режим (XON/XOFF). Имеются проблемы в использовании, лучше не использовать
2, Аппаратный. Управление через CTS, DTR и т.д.
AT+ICF=3,3 — устанавливает режим передачи.
Первое число — биты данных/четность/стоп биты

8/0/2
8/1/1
8/0/1, стоит по умолчанию.
7/0/2
7/1/1
7/0/1

Второе число — четность

0, нечетный
1, четный
3, нет
Все настройки этих команд сохраняются в энергонезависимой памяти. Так что их можно делать только один раз.

Команды получающие текущее состояние.
AT+CSQ — информация о качестве сигнала.
Вернет два числа +CSQ: 21,0
21, — уровень сигнала. Может быть в диапазоне 0..31 или 99. Чем больше тем лучше, но 99 значит его отсутствие. После прошивки значение почему то изменилось до 27.
0, — так называемый RXQUAL. Изменяется от 0 до 7, чем число меньше тем лучше.
AT+CREG=1 — разрешить выдачу сообщения о смене регистрации в сети.
Может принимать значения 0..2, где

0, — запрет выдачи сообщений.
1, — разрешить сообщение о смене статуса регистрации.
2, — разрешает выдачу сообщений, плюс выдает еще немного невнятной информации

AT+CREG? — получить тип регистрации в сети.
Вернется что-то вроде +CREG: 0,1
Где:
0, — нет сообщения о смене регистрации в сети.
1, — текущее состояние.

0 — не зарегистрирован, поиск сети не ведется,
1 — зарегистрирован в своей домашней сети,
2 — не зарегистрирован, идет поиск сети,
3 — регистрация отклонена,
4 — модуль сам не знает что происходит
5 — зарегистрирован в роуминге.

Разрешив выдачу этих сообщений можно отслеживать когда модуль находит/теряет сеть или попадает в роуминг.
AT+CSPN? — информация об операторе из сим-карты. Может пригодится для автоматической настройки GPRS. Команда только для чтения.
+CSPN: «Beeline», 0
AT+COPS? — информация об операторе, в сети которого зарегистрирован модуль. Мне выдало в ответ +COPS: 0,0,«Beeline»", что значит 0 — автоматический выбор сети (первый 0), 0 — длинный тестовый формат имени (второй 0), и само названия оператора.
Еще можно сделать запрос в виде AT+COPS=? После достаточно долгого обдумывания вам выдадут список найденных сетей. У меня нашлось следующее:
+COPS: (2,«MegaFon RUS»,«MegaFon»,«25002»),(1,«MTS-RUS»,«MTS»,«25001»),(1,«Beeline»,«Beeline»,«25099»),,(0,1,4),(0,1,2)
AT+CPAS — информация о текущем состоянии телефона.
Может вернуть +CPAS: 0

0, — готов к труду и обороне
2, — не известно что делает. Ответ и выполнение команд не гарантируется.
3, — идет входящий звонок.
4, — есть голосовое соединение.

Тоже команда только для чтения.
AT+CCLK? — получить текущее время. Вернет текущее время в виде: +CCLK: «11/04/11,01:46:33+00»
AT+CCLK="17/08/08,17:23:33+03" — установить время. Обязательно в таком формате и с ведущими нулями.
Самостоятельно время не устанавливается, нужно делать все ручками.

Команды набора номера.
Все они пришли еще от модемов и ничего нового в них нет.
ATD1234567; — позвонить по номеру
ATD>1; — позвонить по 1 номеру из сим карты
ATDL — позвонить по последнему набранному номеру
В ответ можем получить:
BUSY
NO DIALTONE
NO CARRIER
NA ANSWER
CONNECT
AT+CLIP=1 — архи полезный параметр. Включает режим CLI (Calling Line Identification) или то, что по русски зовется АОН. После его включения при входящем вызове выдает не просто сообщение RING, а еще добавляет строку типа
+CLIP: "+7XXXXXXXXXX",145,"",,"",0 или
+CLIP: "+7XXXXXXXXXX",145,"",,«main»,0
Где

"+7XXXXXXXXXX", номер абонента
145, формат номера в сообщении. 145 — интернациональный формат, 129 — неизвестный (например при русских символах)
0, — данные верны, 1, — данные не дает оператор 2, — данные недоступны из за ограничений сети.
«main», — имя записи в записной книжке

ATA — ответить на входной звонок.
ATH0 — разорвать все соединения. Может принимать значения 0..5, указывающие какие виды связи нужно разорвать.
ATS0=0 — количество звонков до авто поднятия трубки. 0 — только вручную.
AT+GSMBUSY=1 — запрет всех входящих звонков.

1, — запретить все входящие звонки
0, — разрешить входящие

Результат данной команды не сохраняется в памяти и его надо повторять при каждом включении.
[center]i love you [s]mxIni[/s] Mysql[/center]

max80
Аватара
max80
Сообщения: 2
Зарегистрирован: 2 февраля 2019
С нами: 5 лет 1 месяц

Спасибо!

#3 max80 » 2 февраля 2019, 3:19

Большое спасибо за скетчи! Всё работает. Только не пойму как добавить 2 номер, пытался вставить через запятую и перестал работать.

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1607
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#4 Дим » 2 февраля 2019, 17:35

max80 писал(а):Большое спасибо за скетчи! Всё работает. Только не пойму как добавить 2 номер, пытался вставить через запятую и перестал работать.
Скинь код - что куда дописывал
[center]i love you [s]mxIni[/s] Mysql[/center]

max80
Аватара
max80
Сообщения: 2
Зарегистрирован: 2 февраля 2019
С нами: 5 лет 1 месяц

#5 max80 » 4 февраля 2019, 0:37

Все. Разобрался. Спасибо что ответили!


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя