GSM_Звонки
Outgoing_Call
6cb1a186-2914-4c90-add6-c291cf038ccd
Исходящий вызов
b5a58d66-f801-4941-a03e-b707c4ae51a9
Take_Call
6a2f762a-84a0-43e9-9b73-530ab91ef591
Поднять трубку
c995f6e4-12eb-4c74-8b6b-41bdfd153fea
GSM_Connect
7dbaffb6-70bb-4454-a7c6-86aead50b2c5
e0dbbe64-ddcd-4462-afa1-a6c3d964c5a1
052e4005-225e-41e1-964f-da5cf0972e64
GSM_Звонки
#define
GSM_CALLS
past_Outgoing_Call
=0;
bool
command_Outgoing_Call
=0;
bool
if ( Outgoing_Call && !past_Outgoing_Call ) command_Outgoing_Call =1;
past_Outgoing_Call = Outgoing_Call ;
if ( command_Outgoing_Call && (_team_room==0) ) { command_Outgoing_Call =0; return 5; } // начинать запрос времени
return _team_room;
260
byte
causeProcessingCall
byte
_team_room
if ( Take_Call && !past_Take_Call ) command_ Take_Call =1;
past_Take_Call = Take_Call;
if ( command_Take_Call && (_team_room==1) ) { command_Take_Call =0; return 10; }
return _team_room;
208
byte
causeProcessingTake
byte
_team_room
GSM_Outgoing_Call
GSM_Take_Call
07e42393-792b-4897-af90-b11504cb49d2
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Входы
GSM_Outgoing_Call - исходящий вызов, Позвонить на номер указанный GSM_Phone основного блока
GSM_Take_Call - поднять трубку, ответить на входящий вызов. !!! В М590 не работает.
Выходы
GSM_Connect - Статус Установлено голосовое соединение
Все входы срабатывают по переднему фронту сигнала, т.е. при переходе из 0 (false) в 1 (true)
406
#define
GSM_INCLUSION_CALLS
static bool past_Outgoing_Call=0;
static bool command_Outgoing_Call=0;
if ( GSM_Outgoing_Call && !past_Outgoing_Call ) command_Outgoing_Call =1;
past_Outgoing_Call = GSM_Outgoing_Call ;
if ( command_Outgoing_Call && (GSM_team_room==0) ) { command_Outgoing_Call =0; return 1;} // начинать запрос времени
return 0;
330
bool
GSM_causeProcessingCall
static bool past_Take_Call;
static bool command_Take_Call;
if ( GSM_Take_Call && !past_Take_Call ) { command_Take_Call=1; }
past_Take_Call = GSM_Take_Call;
if ( command_Take_Call ) {
switch ( GSM_count ) {
case 0:
GSM_count++;
break;
case 1:
GSM_Command(F("ATA"), 5); // Поднять трубку
#ifdef GSM_DEBUG // отладка
Serial.println("Command: ATA" );
#endif
break;
case 2:
GSM_count=0;
command_Take_Call =0;
return 1;
break;
}
}
return 0;
491
bool
GSM_causeProcessingTake
GSM Время Оператор
T_O_Read
8e94e677-c868-4b8f-a214-b78cf0daafd0
Считать данные о времени и операторе
4d620759-e1d4-44d5-823e-09646139b9ed
GSM_Operator
c8add574-9c6f-49d7-8845-923bd0c5773f
Оператор связи
fee681f1-205e-4247-a0db-be91511a9b77
GSM_Data_Time
36259fa4-46ba-423d-a1d6-1547a53c4104
Дата время
c4cc1ee0-2d45-4075-a0f2-85acc3b164db
a9fe8a5e-b514-413b-b1ff-84d5af81bf5c
GSM Время Оператор
#define
GSM_DataTime
past_T_O_Read
=0;
bool
command_T_O_Read
=0;
bool
Начать запрос веремени
if ( T_O_Read && !past_T_O_Read ) command_T_O_Read =1;
if ( command_T_O_Read && (_team_room==0) ) { command_T_O_Read =0; return 6;} // начинать запрос времени
else return _team_room;
215
byte
causeProcessingDataTime
byte
_team_room
GSM_T_O_Read
b6e48468-5fe1-4475-8a06-440117acbba4
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Входы
GSM_T_O_Read - Запрос имени оператора и текущего времени модуля.
Выходы
GSM_Operator - Название оператора сотовой связи
GSM_Data_Time - текущая дата время, в том виде что выдает модуль. Содержит актуальные данные если оператор поддерживает эту функцию. (Не знаю почему, но работает не у всех).
Все входы срабатывают по переднему фронту сигнала, т.е. при переходе из 0 (false) в 1 (true)
Вообще со временем там такая история, считывает время с самого модуля (там часы есть), а вот при регистрации в сети, он его получает с соты. Так что обновлять его можно хоть раз в минуту, но вот для синхронизации придется перезагрузить модуль.
710
#define
GSM_INCLUSION_DATA_TIME
static bool GSM_past_T_O_Read=0;
static bool GSM_command_T_O_Read=0;
//Начать запрос веремени
if ( GSM_T_O_Read && ! GSM_past_T_O_Read ) GSM_command_T_O_Read =1;
GSM_past_T_O_Read = GSM_T_O_Read;
if ( GSM_command_T_O_Read && ( GSM_team_room==0) ) { GSM_command_T_O_Read =0; GSM_team_room=6;} // начинать запрос времени
335
void
GSM_causeProcessingDataTime
bool st=0;
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_AT_Command(F("COPS?"), 3 ) ;
break;
case 2:
if ( GSM_analysisResponse(F("+COPS") ) ) GSM_Operator = GSM_substring_commas( GSM_reply,5);
break;
case 3:
GSM_AT_Command(F("CCLK?"),2 ) ;
break;
case 4:
if (GSM_analysisResponse(F("+CCLK") ) ) GSM_Data_Time = GSM_substring_commas( GSM_reply, 5) ;
break;
case 5:
GSM_count=0;
st=1;
GSM_Error_Code =0; //Сброc ошибки
break;
}
return st;
484
bool
GSM_DataTime
GSM_USSD
USSD_CODE
dfa966b1-659d-4f8b-afd7-b6e7882198dd
5f58ed01-46ce-4404-8b3e-553768e13e2b
USSD_Get
6afa7838-b260-48de-8aca-c73fdbbbd8f8
9ff308dc-09ab-4009-a23c-ec89d9c3cc09
USSD_return
a6882191-0f5f-4452-89d7-aa44b029ead0
34252623-c450-434a-850d-9a22ddebfb32
91f05b2d-689d-46b8-a505-423a34db6ef7
GSM_USSD
#define
GSM_USSD
past_USSD_Get
=0;
bool
command_USSD_Get
=0;
bool
//Запрос баланса
if ( USSD_Get && !past_USSD_Get ) command_USSD_Get=1;
if ( command_USSD_Get && (team_room==0) ) { command_USSD_Get =0; team_room=4;} // начинать запрос баланса
180
void
causeProcessingUSSD
GSM_USSD_Get
GSM_USSD_CODE
GSM_USSD_return
8ab912a8-aa9d-4ebd-ac2e-6cb83d3d187e
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Параметры
Time_USSD -время предельного ожидание ответа (в мс), т.е. по истечении которого выполнение запроса прекращается
Входы
GSM_USSD_Get - Отправить USSD запрос
GSM_USSD_CODE - код USSD запроса, пример *100# (для запроса баланса лучше использовать #100#, но работает не со всеми операторами )
Выходы
GSM_USSD_return - ответ на USSD запрос (есть ограничение максимально длинны ответа в 160 символов)
Все входы срабатывают по переднему фронту сигнала, т.е. при переходе из 0 (false) в 1 (true)
574
Time_USSD
30000
Время ожидания ответа на USSD запрос, мс
6cc36228-6c3a-4a12-a771-be5877a869ef
917ac17a-f7c9-4188-a112-b305b82135a7
#define
GSM_INCLUSION_USSD
static bool GSM_past_USSD_Get=0;
static bool GSM_command_USSD_Get=0;
//Запрос баланса
if ( GSM_USSD_Get && !GSM_past_USSD_Get ) GSM_command_USSD_Get=1;
GSM_past_USSD_Get=GSM_USSD_Get;
if ( GSM_command_USSD_Get && (GSM_team_room==0) ) { GSM_command_USSD_Get =0; GSM_team_room=7;} // начинать запрос баланса
313
void
GSM_causeProcessingUSSD
#ifdef GSM_TYPE_SIM800
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_AT_Command(F("CUSD=1,\""), GSM_USSD_CODE , 2 ) ;
break;
case 2:
GSM_wait=1; // ожитать
GSM_time =millis() +Time_USSD; // время ожидания
break;
case 3:
GSM_count=0;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
#else
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_AT_Command(F("CUSD=1,\""), GSM_USSD_CODE , 2 ) ;
GSM_time =millis() +Time_USSD; // время ожидания
break;
case 2:
if ( GSM_analysisResponse(F("+CUSD") ) ) GSM_USSD_return = GSM_substring_commas(GSM_reply,5) ;
break;
case 3:
GSM_count=0;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
#endif
732
bool
GSM_USSD
GSM_SIM900
8d31ddbd-96cc-404d-a0b6-7242e6403de8
GSM_SIM900
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Предназначен для переключения блоков на работу с модулем Sim900
Уникальные для модуля функции прописываются в этом блоке.
Коды стандартных ошибок описаны в блоке GSM_Основной, специфические здесь:
Первичная инициализация модуля, после старта:
1 - Ошибка команды – Отключить эхо ответ
2 - Ошибка команды - Проверка готовности модуля к работе
4 - Ошибка команды - Проверка регистрации в сети
6 - Ошибка команды - Отключение приема широковещательных сообщений
7 - Ошибка команды - Настройка автоматического определения номера
8 - Ошибка команды – Настройки текстового формата SMS сообщений
9 - Ошибка команды – Выбора кодировки текста, кодировка ASCII
10 - Ошибка команды – Выдавать СМС в терминал и не сохранять в память
11 - Ошибка команды - Включение работы с DTMF
12 - Ошибка команды – Проверка наличия контактов в телефонной книге SIM карты
14 - Ошибка команды – Запрос контактов начинающихся на Name_Contaсt, см. блок Телефонная книга
1004
#define
Module_Start
"+CPIN: READY"
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_Command(F("ATE0") ,2 ) ; //отключение эхо ответа
break;
case 2:
GSM_AT_Command(F("CPAS"),4); // проверка готовности модуля к работе
break;
case 3:
GSM_analysisResponse(F("+CPAS: 0") );
break;
case 4:
GSM_AT_Command(F("CREG?"),10); //Проверка регистрации в сети
break;
case 5:
if ( GSM_analysisResponse(F("+CREG") )){
if( ( GSM_reply.endsWith("1")) || ( GSM_reply.endsWith("5"))) { GSM_Net =1;} // 1-В домашней сети, 5- в роуминге
else { GSM_err(0,1); GSM_count--; }
}
break;
case 6:
GSM_AT_Command(F("CSCB=1") ,2 ) ; // Отключение приема широковещательных сообщений
break;
case 7:
GSM_AT_Command(F("CLIP=1") ,2 ) ; // настройки автоматического определения номера
break;
case 8:
GSM_AT_Command(F("CMGF=1") ,2 ) ; //настройки формата SMS сообщений, текстовый
break;
case 9:
GSM_AT_Command(F("CSCS=\"GSM\"") ,2 ) ; // выбора кодировки текста, кодировка ASCII
break;
case 10:
GSM_AT_Command(F("CNMI=2,2,0,0,0") ,2 ) ; //выдовать смс в терминал и не сохранять в память
break;
case 11:
#ifdef GSM_INCLUSION_DTMF // Если добвален блок DTMF
GSM_AT_Command(F("DDET=1") ,5 ) // Включение работы с DTMF
#else
GSM_count ++;
#endif
break;
#ifdef TELEFONNAYA_BOOK // Если использовать телефонну книгу
case 12:
GSM_AT_Command(F("CPBS?"),2);
break;
case 13:
GSM_analysisResponse(F("+CPBS: \"SM\"") );
break;
case 14:
GSM_AT_Command(F("CPBF=\""), GSM_Name_Contact , 2 ) ;
GSM_index_array =0;
break;
case 15:
#else //Если не использовать телефонную книгу
case 12:
#endif //Окнчание выбора по телефонной книге
GSM_count=0;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
1732
bool
GSM_setup_comand
GSM_SoftwareSerial
265e34be-0250-4ced-adfe-dc7ded9b1dc8
GSM_SoftwareSerial
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Предназначен для перевода работы модуля GSM на порт SoftwareSerial
Кроме добавления этого блока необходимо в блоке GSM_Основной в параметре SERIAL_M прописать Serial_S
Параметры
RX, TX - номера пинов для подключения модуля при варианте SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Ограничения при использовании SoftwareSerial
На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. В силу этого, на данных платах в качестве вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
На Arduino Leonardo некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. Поэтому, на этой плате в качестве вывода RX могут использоваться только следующие выводы: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
1006
RX
11
f55b25c3-4009-4624-b781-3402fd6f79e7
c5840656-6b2d-46f0-ae27-ac6a937eb8e8
TX
10
790ba25a-2b70-47ba-83e5-9472fb5438d6
989fc788-fdf9-48c4-b2bd-3dea4d4707b3
#include
<SoftwareSerial.h>
Serial_S
( RX , TX );
SoftwareSerial
GSM Отладка
b779cd2c-c9d2-4f13-98a5-b0b3f2cb3d3a
GSM Отладка
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Необходим для поиска неисправностей. Для включения выдачи отладочных сообщений достаточно просто добавить этот блок в проект.
Условие работы. Модуль должен быть подключен не к пинам 0 и 1. Так как отладочную информацию он будет присылать в порт Serial (USB).
321
Serial.begin(9600);//Тест
Serial.println("Test");
50
#define
GSM_DEBUG
GSM_M590
17c02ba4-3260-4eeb-9bfa-7911b5085029
GSM_M590
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Предназначен для переключения блоков на работу с модулем М590
Уникальные для модуля функции прописываются здесь.
Band - Часто работы с сотовой вышкой. Возможные значения 0 - авто, 900, 1800
Коды стандартных ошибок описаны в блоке GSM_Основной, специфические здесь:
Первичная инициализация модуля, после старта:
1 - Ошибка команды – Отключить эхо ответ
2 - Ошибка команды – Получение времени с соты
3 - Ошибка команды - Отключение от сети, необходимо для получения времени
4 - Ошибка команды – Выбор частоты сети
5 - Ошибка команды - Перерегистрация в сети
6 - Ошибка команды - Проверка готовности модуля к работе
8 - Ошибка команды - Проверка регистрации в сети
10 - Ошибка команды - Настройка автоматического определения номера
11 - Ошибка команды – Настройки текстового формата SMS сообщений
12 - Ошибка команды – Выбора кодировки текста, кодировка ASCII
13 - Ошибка команды – Выдавать СМС в терминал и не сохранять в память
14 - Ошибка команды – Проверка наличия контактов в телефонной книге SIM карты
16 - Ошибка команды – Запрос контактов начинающихся на Name_Contaсt, см. блок Телефонная книга
1168
Band
0
Частота работы с сетью
89d0d114-0d4f-42b3-8357-f613cd35b062
2ccf7021-6db8-4fb0-a8ae-57664201f228
#define
GSM_TYPE_M590
Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"+PBREADY"
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_Command(F("ATE0") ,2 ) ; //отключение эхо ответа
break;
#ifdef GSM_INCLUSION_DATA_TIME
case 2:
GSM_AT_Command(F("CTZU=1"),2); //на синхронизацию времени с сотой
break;
case 3:
GSM_AT_Command(F("COPS=2"),2); //отключение от соты, необходимо для получения времени
break;
#else
case 2:
GSM_count+=2;
break;
#endif
case 4:
if (Band >0) GSM_AT_Command(F("XBANDSEL=Band") ,1 ) ;
else GSM_count++; //Смена частоты сети
break;
case 5:
GSM_AT_Command(F("COPS=0,0"),2); //перерегистрация в сети
break;
case 6:
GSM_AT_Command(F("CPAS"),4); // проверка готовности модуля к работе
break;
case 7:
GSM_analysisResponse(F("+CPAS: 0") );
break;
case 8:
GSM_AT_Command(F("CREG?"),10); //Проверка регистрации в сети
break;
case 9:
if ( GSM_analysisResponse(F("+CREG") )){
if( ( GSM_reply.endsWith("1")) || ( GSM_reply.endsWith("5"))) { GSM_Net =1;} // 1-В домашней сети, 5- в роуминге
else { GSM_err(0,1); GSM_count--; }
}
break;
case 10:
GSM_AT_Command(F("CLIP=1") ,2 ) ; // настройки автоматического определения номера
break;
case 11:
GSM_AT_Command(F("CMGF=1") ,2 ) ; //настройки формата SMS сообщений, текстовый
break;
case 12:
GSM_AT_Command(F("CSCS=\"GSM\"") ,2 ) ; // выбора кодировки текста, кодировка ASCII
break;
case 13:
GSM_AT_Command(F("CNMI=2,2,0,0,0") ,2 ) ; //выдовать смс в терминал и не сохранять в память
break;
#ifdef TELEFONNAYA_BOOK // Если использовать телефонну книгу
case 14:
GSM_AT_Command(F("CPBS?"),2);
break;
case 15:
GSM_analysisResponse(F("+CPBS: \"SM\"") );
break;
case 16:
GSM_AT_Command(F("CPBF=\""), GSM_Name_Contact , 2 ) ;
GSM_index_array =0;
break;
case 17:
#else //Если не использовать телефонную книгу
case 14:
#endif //Окнчание выбора по телефонной книге
GSM_count=0;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
1934
bool
GSM_setup_comand
GSM_DTMF
GSM_DTMF
df065260-2ad1-4a0e-8026-dcac6978b4d0
55f0a893-eb9c-4885-badc-3c9f43c0ca20
cd25b7dc-a4a7-4899-97ae-ea2c8c5416ce
GSM_DTMF
DTMF – Выдает коды символов переданных по время установленного соединения в виде тоновых сигналов
Коды символов 0-9 A-10,B-11,C-12,D-13,#-14,*-15
147
#define
GSM_INCLUSION_DTMF
int www=(int(st.charAt(7)));
switch ( www ) {
case 35:
GSM_DTMF =14;
break;
case 42:
GSM_DTMF =15;
break;
case 65:
GSM_DTMF =10;
break;
case 66:
GSM_DTMF =11;
break;
case 67:
GSM_DTMF =12;
break;
case 68:
GSM_DTMF =13;
break;
default:
if (www>47 && www<58) GSM_DTMF =www-48;
}
306
void
GSM_ID_DTMF
String
st
20ef1099-c100-4236-b66a-ff79ce068609
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Работает на SIM800, Возможно на SIM900.
На М590 такой функции нет.
Вывода
GSM_DTMF – Выдает коды символов переданных по время установленного соединения в виде тоновых сигналов
Коды символов 0-9 A-10,B-11,C-12,D-13,#-14,*-15
290
GSM_SIM800
2769bb6f-3998-4be8-a8cc-56c33cec585b
GSM_SIM800
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Предназначен для переключения блоков на работу с модулем Sim800
Уникальные для модуля функции прописываются в этом блоке.
Коды стандартных ошибок описаны в блоке GSM_Основной, специфические здесь:
Первичная инициализация модуля, после старта:
1 - Ошибка команды – Отключить эхо ответ
2 - Ошибка команды - Проверка готовности модуля к работе
4 - Ошибка команды - Проверка регистрации в сети
6 - Ошибка команды - Отключение приема широковещательных сообщений
7 - Ошибка команды - Настройка автоматического определения номера
8 - Ошибка команды – Настройки текстового формата SMS сообщений
9 - Ошибка команды – Выбора кодировки текста, кодировка ASCII
10 - Ошибка команды – Выдавать СМС в терминал и не сохранять в память
11 - Ошибка команды - Включение работы с DTMF
12 - Ошибка команды – Проверка наличия контактов в телефонной книге SIM карты
14 - Ошибка команды – Запрос контактов начинающихся на Name_Contaсt, см. блок Телефонная книга
1005
#define
Module_Start
"Call Ready"
#define
GSM_TYPE_SIM800
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_Command(F("ATE0") ,2 ) ; //отключение эхо ответа
break;
case 2:
GSM_AT_Command(F("CPAS"),4); // проверка готовности модуля к работе
break;
case 3:
GSM_analysisResponse(F("+CPAS: 0") );
break;
case 4:
GSM_AT_Command(F("CREG?"),10); //Проверка регистрации в сети
break;
case 5:
if ( GSM_analysisResponse(F("+CREG") )){
if( ( GSM_reply.endsWith("1")) || ( GSM_reply.endsWith("5"))) { GSM_Net =1;} // 1-В домашней сети, 5- в роуминге
else { GSM_err(0,1); GSM_count--; }
}
break;
case 6:
GSM_AT_Command(F("CSCB=1") ,2 ) ; // Отключение приема широковещательных сообщений
break;
case 7:
GSM_AT_Command(F("CLIP=1") ,2 ) ; // настройки автоматического определения номера
break;
case 8:
GSM_AT_Command(F("CMGF=1") ,2 ) ; //настройки формата SMS сообщений, текстовый
break;
case 9:
GSM_AT_Command(F("CSCS=\"GSM\"") ,2 ) ; // выбора кодировки текста, кодировка ASCII
break;
case 10:
GSM_AT_Command(F("CNMI=2,2,0,0,0") ,2 ) ; //выдовать смс в терминал и не сохранять в память
break;
case 11:
#ifdef GSM_INCLUSION_DTMF // Если добвален блок DTMF
GSM_AT_Command(F("DDET=1") ,5 ); // Включение работы с DTMF
#else
GSM_count ++;
#endif
break;
#ifdef TELEFONNAYA_BOOK // Если использовать телефонну книгу
case 12:
GSM_AT_Command(F("CPBS?"),2);
break;
case 13:
GSM_analysisResponse(F("+CPBS: \"SM\"") );
break;
case 14:
GSM_AT_Command(F("CPBF=\""), GSM_Name_Contact , 2 ) ;
GSM_index_array =0;
break;
case 15:
#else //Если не использовать телефонную книгу
case 12:
#endif //Окнчание выбора по телефонной книге
GSM_count=0;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
1733
GSM_Телефонная книга
e72ff09e-913d-491a-8f45-ed646bd08096
GSM_Телефонная книга
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Name_Contaсt - Префикс имени контакта, по этой части осуществляется поиск в телефонной книге, подробнее см ниже
Number_Contacts - Максимальное число рабочих контактов, подробнее см ниже
White_list - отправлять смс: 1- только на номера из телефонной книге, 0 - на любой номер поданный на вход Phone
Подробнее о работе с телефонной книгой SIM-карты.
Предназначено для возможности задачи рабочих номеров не в проекте, а на сим карте, и главное возможности смены рабочих номеров, без перепрограммирования контроллера.
Система такая. В телефонной книге SIM-карты создаются несколько контактов, согласно требованиям:
1. В имени контакта только латинские символы и цифры, символы (_-+=*).
2. Все имена должны начинаться на один префикс (например Test) .
3. Имена должны быть уникальны (Test1, Test2, Test_master).
В настройках блока надо настроить следующие пункты:
Name_Contaсt – здесь надо указать Префикс (приставку), что бала описана в пункте 2 (например Test)
Number_Contacts – задать максимально возможное количество контактов, если в записной книге окажется большее число контактов с префиксом Name_Contaсt, то остальные будет отброшены.
Ограничение введено, так как каждый контакт занимает значимое количество память контроллера.
White_list = 1, для отправки смс только на те номера, что удовлетворяют требованиям, описаны выше.
В этом случаи на вход Phone можно подавать, только имена контактов.
Если контакт есть в телефонной книге то на выходе T_Nomer, при звонке и входящей СМС будет выдано имя контакта (например Test1), в противном случаи сам номер.
Имя контакта чувствительно к регистру, т.е Test не равно TEST.
1694
Name_Contaсt
Test
Префикс имени контакта
ce17e368-6985-4f40-a5ee-91c494322762
73b43200-5e22-4107-a260-32e6ef300d26
Number_Contacts
4
Максимальное число рабочих кантакотов
42f0efbc-5b97-4267-9dc6-18b58f05fd47
f4a50a98-3bc3-489e-9369-c3af7c0fc0b7
White_list
только разрешенные номера
51ceb54a-2631-4792-8ede-6d602f799034
f8a94d22-f51b-4e73-a29a-a15cacf5f6aa
#define
TELEFONNAYA_BOOK
GSM_Number_Contacts
= Number_Contacts ;
const byte
GSM_White_list
= White_list;
const bool
GSM_Name_Contact
[] = Name_Contaсt ;
const char
Массив телефоных номеров
GSM_Telefon
[Number_Contacts];
String
Массив имен номеров
GSM_Contact
[Number_Contacts];
String
Индекс массива телефонной книге
GSM_index_array
=0;
byte
for (int i = 0; i < Number_Contacts ; i = i + 1)
{if(array[i].equals(value)){return i;}}
return -1;
102
int
GSM_StringArray
String
array[]
String
value
GSM_Основной
In
733dcb6e-5b41-4cff-a699-c4c746c81d4c
25470667-0e8f-4848-9ae5-899d155b1a91
173dd596-248e-436d-8841-20975237a0db
if ( In == true)
{ // ключ нажат - вывод подтянут к высокому уровню сигнала
delay(100); // задержка для устранения дребезга контактов ключа
runnin = !runnin; // инвертирование переменной running
digitalWrite(LEDpin, runnin) ; // индикация светодиодом
}
314
pinMode(LEDpin, OUTPUT);
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // включить подтягивающий резистор
127
светодиод подключен к выводу 5
LEDpin
= 13;
int
ключ подключен к выводу 13, другой вывод подключен к земле
switchPin
= 2;
int
runnin
= false;
boolean
runnin1
= false;
boolean
GSM_In_sms
e28b2991-30d8-41e9-87dd-641dccb0757a
Phone
adc49d19-4ee9-4037-9446-147f6c73ae10
2a0a1b31-924c-4588-b575-eeb9a9e99cf9
55e0ac92-10eb-433c-90d9-23f4b60c9a5e
Последняя разработка
if ( In == true)
{
digitalWrite(LED, HIGH) ;
Serial.print("AT+CMGS=\"");
Serial.print( Phone );
Serial.println("\"");
}
else {
digitalWrite(LED, LOW) ;
}
169
Serial.begin(9600);
pinMode(LED, OUTPUT);
44
LED
= 13;
int
GSM_Phone
ae3d23c4-4c67-497d-8c24-175c9c4f37af
SIM 900
text
f0527995-7b55-4ee5-b390-efa6adaba935
08bc550c-64e3-4e3a-b14a-1e378cb3e358
a6ea1548-470b-4d48-bbd1-1e8cb1b2c223
SIM 900 Serial1
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
// Serial1.println( Text sms );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
digitalWrite(LED, LOW) ; // контрольный светодиод убрать
}
328
Serial1.begin(9600);
pinMode(LED, OUTPUT); //контрольный светодиод убрать
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
672
контрольный светодиод убрать
LED
= 13;
int
GSM_text
fae71e77-4801-4518-a803-bb358809b408
m590 mega2560
In_sms
Reject_call
a131b89a-32b1-43b7-abc8-c9d1701fd391
Сброс звонка
7760b87d-d2b8-4192-a97f-ac059fd205a2
Net
a2d42309-5a06-48f2-a27d-221976f445c9
Подключен к сети
6875df1a-317b-40a9-ba3b-0920a48b80a1
dBm
87a64b62-2488-4116-b3c6-2229454e6d59
Уровень сигнала
375cee25-509e-4be0-882b-7192829c4f30
m590 mega2560 115200
отправка смс из строк 1-2-3
Намер телефона клиента
строка смс 1
text 1
394e2336-a382-47e0-bf1b-a826009b105f
строка смс 2
154f7805-6f31-49e3-b0a5-5185f3a7442e
text2
66a95e0d-5da0-4709-bb47-63019c1c9f0c
строка смс 3
578b7f00-0b31-4f34-b0b8-6950a45ed8ee
out
985669be-77bd-4edb-b9e4-5f276bb35f47
a9235eff-09cd-457f-b991-5f1e731f173e
9bc60d94-25b8-4547-afc9-f1e77fc816cf
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
digitalWrite(LED, LOW) ; // контрольный светодиод убрать
}
// Отправляем смс
// Принимаем смс
// if (Serial1.available() > 0)
// {
//
// out = Serial.read();
// }
470
контрольный светодиод убрать
LED
= 13;
int
3ce7ef08-920f-4bca-bde6-b62a8aca2d77
получено из смс
test
ea76600c-405e-417c-840d-75e17db13ddf
e8c13239-ab3d-4370-ab0e-600a2f38547a
22a40700-ca43-4380-9aca-cc7d793d3c10
SIM 900 Serial1 v1
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
}
// Отправляем смс
// Принимаем смс
if (!Serial1.available())
return;
char currSymb = Serial1.read();
test = currStr;
if ('\r' == currSymb) {
if (isStringMessage) {
// если текущая строка – сообщение, то…
out = currStr;
isStringMessage = false;
}
else {
if (currStr.startsWith("+CMT")) {
// если текущая строка начинается с "+CMT", то следующая сообщение
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
810
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
Serial1.begin(9600);
delay(3000);
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("AT+IFC=1, 1\r"); //установка программного контроля потоком передачи данных
delay(300);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
813
для зеленого
greenPin
= 13;
int
для желтого светодиода
yellowPin
= 3;
int
если эта строка сообщение, то переменная примет значение True
currStr
= "";
String
isStringMessage
= false;
boolean
af20e311-815a-4313-ae83-81277007e616
SIM 900 Serial1 v2 test
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
// Принимаем смс
if (!Serial1.available())
return;
char currSymb = Serial1.read();
if ('\r' == currSymb) {
if (isStringMessage) {
// если текущая строка – сообщение, то…
out = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
// если текущая строка начинается с "+CMT", то следующая сообщение
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
754
Serial1.begin(9600);
delay(3000);
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("AT+IFC=1, 1\r"); //установка программного контроля потоком передачи данных
delay(300);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
755
currStr
= "";
String
если эта строка сообщение, то переменная примет значение True
isStringMessage
= false;
boolean
text1
text2
text3
f2dcb62c-36ba-43e9-a876-19b570640a37
7d7b74cf-5c22-43e5-9aa9-be63b7eb8dc8
text4
f83142ba-6044-4479-a24d-2af24eb3d911
8dc3e42d-ca04-4258-a7ec-6fc6426a1bfe
text5
d2fa00a5-3627-4623-9df4-349bbf8ce582
7e75afa8-3398-4753-94f0-06f29a691a0f
text6
86a0d736-b9be-4159-8362-a2a3981e0e8e
5839b677-8b33-49cd-a54c-d33b1665fa34
text7
781f5089-d490-4569-ab92-98e80f51cbd9
7162c89a-e215-4e58-9bf5-4db5b9161900
Call
out_sms
300f1901-b539-4081-8262-df47b88dd60b
m590 mega2560 115200
скорость 115200
RX3 (15) в TX модема
TX3 (14) в RX модема
инфо http://flprog.ru/forum/18-642-2
94
if ( In_sms == true)
{
Serial3.print("AT + CMGS = \"");
delay(300);
Serial3.print( Phone );
delay(300);
Serial3.println("\"");
delay(300);
Serial3.println( text );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text1 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text2 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text3 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text4 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text5 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text6 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text7 );
delay(1000);
Serial3.println((char)26);
delay(300);
Serial3.println();
delay(300);
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
1206
Serial3.begin(115200);
delay(20000);
Serial3.println("AT+CMGF=1\r");
delay(200);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(200);
Serial3.println("AT+CNMI=2,2\r");
delay(200);
Serial3.println("AT+CLIP=1\r");
delay(200);
220
currStr
= "";
String
isStringMessage
= false;
boolean
726d0829-22b4-4a18-ab02-10747e6080ea
84e909e3-5164-4e1f-bf01-5944fef622ee
b669819f-f009-4898-af17-a684f491f9ab
c7beb266-fe66-4df8-8a9a-85cc88f49dfa
1e18c0e3-6ef3-4dfb-803f-7ca7306262e0
text8
d6e7d474-7b13-47dd-9c76-8c5331d9b584
cdfecbcb-d30e-4b2a-a99a-b0901c5e5737
b414533e-70e8-440b-861f-5f82caf80eef
if ( In_sms == true)
{
Serial3.print("AT+CMGS=\"+");
delay(50);
Serial3.print(Phone);
delay(50);
Serial3.println("\"");
delay(50);
Serial3.println();
delay(50);
Serial3.println(text);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text1);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text2);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text3);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text4);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text5);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text6);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text7);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text8);
delay(50);
Serial3.println((char)26);
delay(50);
Serial3.println();
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
1156
Serial3.begin(115200);
delay(3000);
Serial3.println("AT+CMGF=1\r");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0\r");
delay(50);
Serial3.println("AT+CLIP=1\r");
210
5a439fd2-7f2c-4639-b0e0-ffabbd6ea9c6
sms
78a799b0-71f7-4661-9d8a-d80ade578c5b
2b6a3685-b885-4e3a-9883-9a011aa7c5c3
ce94cb6c-3b56-40eb-bcf2-b1d9c2acf222
if ( In_sms == true)
{
Serial3.print("AT+CMGS=\"");
delay(50);
Serial3.print(Phone);
delay(50);
Serial3.println("\"");
delay(50);
Serial3.println();
delay(50);
Serial3.println(text);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text1);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text2);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text3);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text4);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text5);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text6);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text7);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text8);
delay(50);
Serial3.println((char)26);
delay(50);
Serial3.println();
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false;
sms =true; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
sms = false;
}
1142
delay(2000);
Serial3.begin(115200);
delay(50);
Serial3.println("AT+CMGF=1\r");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0\r");
delay(50);
Serial3.println("AT+CLIP=1\r");
delay(50);
232
Received_SMS
18039b27-cb01-4ce5-bd77-e8455fb0e496
Получена СМС
Текст СМС
T_Nomer
Номер с которого пришло СМС
Sent_SMS
1174c3e1-c5ae-46ca-bc4e-f32953816209
Отправлена СМС
d535058c-83fc-4da3-ae1a-7c562d9e8eae
ERROR
90a1f2ef-7628-4a3b-9476-873b328f1edf
Ошибка отправка СМС
2575f78c-25fc-401a-9ceb-eade206ea0e7
5534ccac-65c1-4b31-8bb9-483c15f3bd04
скорость 115200
RX3 (15) в TX модема
TX3 (14) в RX модема
инфо http://flprog.ru/forum/18-642-2
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
ERROR :
0- норма;
1- неверный номер отправления;
2 - Ошибка при отрпвлении
3- Нет ответа от модуля при отправки сообщения
302
speed
115200
Скорость порта, см описание
f32f9e34-ce80-45b3-9050-077e33f7d03a
689d6ab0-dd41-41ef-920f-f8dd0336a9f8
DELL_SMS
Отчистка СМС
07cee270-f81f-488c-8574-bd5b26a650b5
b4aada34-d9f0-46b3-81af-c42ebc3b551d
Received_SMS =0;
Sent_SMS =0;
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if ( _trgrt1 && !Triger_)
{
if ( Phone.length() > 4) { Triger_=1; count_=0;}
else { ERROR =1; Triger_=0;}
}
if(Triger_)
{
if (return==1) {Triger_=0; ERROR =0; return=0; Sent_SMS =1;}
else if (return==2){Triger_=0; ERROR =2; return=0;}
if( millis() >=time1) {
time1 =millis() + 100;
switch ( count_ ) {
case 0:
Serial3.print("AT+CMGF=1\r");
break;
case 1:
Serial3.println("AT+CMGS=\"+ Phone +\"");
break;
case 2:
Serial3.println(text);
break;
case 3:
Serial3.println(text1);
break;
case 4:
Serial3.println(text2);
break;
case 5:
Serial3.println(text3);
break;
case 6:
Serial3.println(text4);
break;
case 7:
Serial3.println(text5);
break;
case 8:
Serial3.println(text6);
break;
case 9:
Serial3.println(text7);
break;
case 10:
Serial3.println(text8);
break;
case 11:
Serial3.println((char)26);
break;
case 12:
time1 =time1 + 4900;
break;
default:
Triger_=0;
ERROR =3;
}
count_++;
}
}
while(Serial3.available())
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(line); line = ""; }
else
line += ch;
}
1364
delay(2000);
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
225
isStringMessage
= false;
boolean
Ответ модема на команду 1-OK 2-ERROR
return
=0;
byte
line
;
String
ch
;
char
time1
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
ошибки 0-норма 1- неверный номер
err
=0;
byte
if (isStringMessage)
{
out_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
T_Nomer=line.substring(t1+1,t1+13);
isStringMessage = true;
}
if (line == F("ERROR")) // ошибка
return=2;
if(line == F("OK")) // всё ок
return=1;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
589
void
GotLineFromNeoway
const String&
line
Text_sms
Ошибка
Call
1bddc233-0f62-460d-8695-120adebe04e8
Входящий вызов
bae63d59-68bd-4419-acb3-1c4808c819e6
51d90042-7a76-4e4d-aff5-88f543961e95
m590 mega2560_Т2
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Выходы
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС
ERROR : Код ошибки, появляется только на 1 програмный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - недопустимый номер для отправки СМС
796
16e12fff-4256-4d68-b8a2-5a4d17930a64
Time_wait
2000
Время ожидание ответа модуля, мс
b83e41f8-5061-49f7-8ae0-d3fa683da2b0
1236d93b-73c6-4e26-a38c-fca5f3630a9d
Time_Net
Период проверки связи с сетью, мс
19320255-4a11-446a-8be1-c2e745fb9fb1
03376554-1469-40d2-af28-6c264ae6c7e2
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
ERROR =0; //Сбром ошибки
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(line); line = ""; }
else line += ch;
}
//---Отправка СМС--
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if (_trgrt1 ) s_sms=1;
if ( s_sms && !busy) //можно ли отправлять СМС
{
s_sms=0;
if ( Phone.length() > 4) { Triger_=1; busy=1;} //проверка корректности номера
else(ERROR =3;)
}
if(Triger_)
{
if (sms_sent()){ Triger_=0; busy=0; }
}
//Авто проверка связи
if( (Time_Net >0)&&!busy)
{
if((millis()-time_n)> Time_Net){time_n=millis(); busy=1; Net_T=1;}
}
if(Net_T)
{
if (net_status()){ Net_T=0; busy=0; }
}
//Обработка входящего вызова
if (isRing) {busy=1; Call =1;}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;};
if(Call) {if (incoming_call()){ Call =0; busy=0; }}
if(Call&&_trgrt2) {AT("ATH");}
1134
delay(2000); //пауза на включение модуля
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
254
isStringMessage
= false;
bool
final
=0;
bool
ожидание ответа от модуля
wait
=0;
bool
Ответ модема на команду 1-OK 2-ERROR
M_return
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
Net_T
=0;
bool
isRing
=0;
bool
s_sms
=0;
bool
идет запрос, запрет других операций.
busy
=0;
bool
M_return=3;
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
if (line == F("RING")) isRing=1; //Всходящий звонок
if (line == F("ERROR")) // ошибка
M_return=2;
if(line == F("OK")) // всё ок
M_return=1;
if(M_return==3)reply=line;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
bool st=0;
byte ret;
switch ( count_ ) {
case 0:
ret=AT("AT+CMGF=1\r",1);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
case 1:
ret=AT("AT+CMGS=\""+ Phone +"\"\r" + text + (char)26, 2);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
default:
Sent_SMS =1;
st=1;
}
if (st)count_=0;
return st;
315
bool
sms_sent
byte ret=0;
if(wait)
{
switch (M_return) {
case 1:
M_return=0;
ret=1;
break;
case 2:
M_return=0;
ERROR =1;
ret=2;
break;
case 3:
M_return=0;
ret=3;
break;
}
if(millis()>time1){ERROR=2; ret=2;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text);
else if(tip==2) Serial3.println(text);
}
}
return ret;
368
byte
AT
String
text
byte
tip
bool st=0;
byte ret;
switch ( count_ ) {
case 0:
ret=AT("AT+CREG?",2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
}
break;
case 1:
ret=AT("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:"))
{
int t1=line.indexOf(":");
if(t1>-1) dBm =( ( (line.substring(t1+1,t1+3) ).toInt())*(2) );
if(dBm>0) dBm=-120; //нет сети
}
break;
default:
st=1;
}
if (st)count_=0;
return st;
544
bool
net_status
bool st=0;
switch (M_return) {
case 1:
M_return=0;
st=1;
break;
case 2:
M_return=0;
ERROR =1;
st=1;
break;
case 3:
M_return=0;
if (reply.startsWith(F("+CLIP:"))
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (reply == F("NO CARRIER")) st=1;
}
if(ret==1) count_++;
else if(ret==2)
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
}
break;
case 1:
ret=AT("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:"))
{
int t1=line.indexOf(":");
if(t1>-1) dBm =( ( (line.substring(t1+1,t1+3) ).toInt())*(2) );
if(dBm>0) dBm=-120; //нет сети
}
break;
default:
st=1;
}
return st;
if(millis()>time1){ERROR=2; ret=2;}
}
else
884
bool
incoming_call
GSM_Reject_call
4429c943-1cc9-4540-bda4-c520defcda3d
Get_Balance
933e1a73-f90e-4922-a024-e7f8ae08cff2
Запрос баланса
0e66f15d-c493-46f9-9441-ebf06db3217a
Error_Code
bc84d102-ca7a-4b18-9805-5166f55a9107
Number_calls
bb5716b0-2334-4309-9215-72ead220c33b
Номер текущего гудка
213e77f7-84ed-4fe6-899e-b01d1d0eb571
202aced0-0626-4389-b3d2-41e2fc6408a1
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - недопустимый номер для отправки СМС
1245
69fc39f5-2c9b-4937-8e5b-fdf42810d8a1
20000
89378369-f9fc-4a14-816f-f17193042731
60000
delay(5000);//тест удалить
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
Error_Code =0; //Сбром ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;
}
if (Call&&(team_room!=1) )
{
team_room==1;
count_=0; wait=0; //Сброс состояний обработки других функций
Number_calls=0; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли оптраву смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =3;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((millis()-time_n)> Time_Net){time_n=millis(); team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
switch ( team_room ) {
case 1:
if(_trgrt2) Call_T=1;
if(Call_T&&AT_Command("ATH0",2)){Call_T=0; final =1; Call=0; }
break;
case 2:
if (sms_sent()){ final =1; } // отправка сообщения
break;
case 3:
if (net_status()){ final =1;}// проверка связи с сетью
break;
if (final)team_room=0; //должно быть последним
1482
delay(2000); //пауза на включение модуля
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
Serial3.println("ATE0");
delay(50);
isStringMessage
= false;
bool
final
=0;
bool
ожидание ответа от модуля
wait
=0;
bool
Ответ модема на команду 1-OK 2-ERROR
M_return
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
isRing
=0;
bool
s_sms
=0;
bool
идет запрос, запрет других операций.
busy
=0;
bool
Serial.println(line); //!!!!!!! Убрать
//Обработка СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (line == F("RING")){ Call =1; Number_calls ++;}//Всходящий звонок
if (Call==1)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (line == F("NO CARRIER")) { Call=0;}
}
//____
reply=line;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
1086
void
GotLineFromNeoway
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
ret=AT_Command("AT+CMGF=1\r",1);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
case 1:
ret=AT_Command("AT+CMGS=\""+ Phone +"\"\r" + text + (char)26, 2);
if(ret==1) {Sent_SMS =1; st=1;}
else if(ret==2) st=1;
break;
}
if (st){count_=0; }
return st;
317
// tip 1- без \r и \n
// tip 2- с \r и \n
byte ret=0;
if(wait)
{
if(reply == F("OK"))
{ ret=1; wait=0; }
else if(reply == F("ERROR"))
{ Error_Code =1; ret=2; wait=0; }
if(millis()>time1)
{Error_Code=2; ret=2; wait=0;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
}
return ret;
380
byte
AT_Command
String
text_com
byte
tip
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
ret=AT_Command("AT+CREG?",2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
reply=""; wait=0;
}
break;
case 1:
ret=AT_Command("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:")))
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if(dBm>0) dBm=-120; //нет сети
reply=""; wait=0;
}
}
break;
case 2:
st=1;
break;
}
if (st)count_=0;
return st;
642
// tip 1- без \r и \n
// tip 2- с \r и \n
byte ret=0;
if(wait)
{
if(reply.startsWith(response_com))
{ret=3;}
else if(reply == F("ERROR"))
{ Error_Code =1; ret=2; wait=0; }
else if(reply == F("OK"))
{ ret=1; wait=0; }
if(millis()>time1)
{Error_Code=2; ret=2; wait=0;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
}
return ret;
434
byte
AT_Command
String
text_com
byte
tip
String
response_com
Balance
0a59f7bd-e80f-4fab-863f-b25df021e23a
Баланс на Sim
bb2c1ffd-ef1d-4a59-90f6-ca709fa9e70a
f2a4bf19-ff62-4760-8e07-c9e05d8fc91c
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_Balance - по переднему фронту отправляется запрос на балланс
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Balance - остаток средств м
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
10 - недопустимый номер для отправки СМС
1360
delay(500);//Тест удалить
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
Error_Code =0; //Сбром ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;
}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=0; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((millis()-time_n)> Time_Net){time_n=millis(); team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_Balance ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& (AT_Answer("")==1) ){Call=0; }
if (!Call) {Call_T=0; final =1;}
break;
case 2:
if (sms_sent()){ final =1; } // отправка сообщения
break;
case 3:
if (net_status()){ final =1;}// проверка связи с сетью
break;
case 4:
if ( balance_S() ){ final =1;}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
1837
Buffer
[5] ;
String
index_buffer
=0;
byte
isStringMessage
= false;
bool
final
=0;
bool
Номер исполняемой команды
team_room
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
bool isRing=0;
bool busy=0; //идет запрос, запрет других операций.
bool wait=0; //ожидание ответа от модуля
byte M_return=0; // Ответ модема на команду 1-OK 2-ERROR
if (line.length()>0)
{
Buffer[index_buffer]=line;
if(index_buffer<3) index_buffer++;
}
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (line == F("RING")){ Call =1; Number_calls ++;}//Всходящий звонок
if (Call==1)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (line == F("NO CARRIER")) { Call=0; }
}
//____
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
1135
// tip 1- без \r и \n
// tip 2- с \r и \n
time1 =millis() + Time_wait;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
154
void
AT_Command
String
text_com
byte
tip
byte ret=0;
bool ok_=0;
bool ok_2=0;
if (index_buffer>0)
{
for (int i =(index_buffer-1); i >=0 ; i--)
{
if(Buffer[i] == F("ERROR")){ret=2; Error_Code =1; break;}
if(Buffer[i] == F("OK")){ ok_=1; continue; }
if (response_com.length()>0)
{ if(Buffer[i].startsWith(response_com)){ok_2=1; reply=Buffer[i];} }
}
}
if(ok_)ret=1;
if (response_com.length()>0 && !ok_2 ) {ret=2; Error_Code =3;}
if(millis()>time1)
{Error_Code=2; ret=2; }
return ret;
463
byte
AT_Answer
String
response_com
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
count_++;
break;
case 1:
ret=AT_Answer("+CREG");
if(ret==1)
{
count_++;
if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
}
else if(ret==2) st=1;
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
count_++;
break;
case 3:
ret=AT_Answer("+CSQ");
if(ret==1)
{
st=1;
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBmt >0) dBm =-120; //нет сети
}
else if(ret==2) st=1;
break;
}
if (st)count_=0;
return st;
592
bool
net_status
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
count_++;
break;
case 1:
ret=AT_Answer("");
if(ret==1) {count_++;}
else if(ret==2) st=1;
break;
case 2:
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
AT_Command( text+(char)26 ,2 );
count_++;
break;
case 3:
ret=AT_Answer("");
if(ret==1) {Sent_SMS =1; st=1;}
else if(ret==2) st=1;
break;
}
if (st){count_=0; }
return st;
424
bool
sms_sent
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("ATD#100#",2 ) ;
count_++;
break;
case 1:
ret=AT_Answer("+CUSD");
if(ret==1)
{
st=1;
int t1=reply.indexOf(":",reply.indexOf("\""));
iif(t1>-1)nt t2=reply.indexOf(",",t1);
if(t1>-1&&t2>-1) Balance = (reply.substring(t2+1,t3+3)).toFloat();
}
else if(ret==2) st=1;
break;
}
if (st)count_=0;
return st;
400
bool
balance_S
Get_USSD
USSD_CODE
38590813-5522-4717-89bf-668832b33791
b8c6eec4-ddb3-416b-a9f6-6735425c4160
Operator
24231129-7540-4a4c-b6e4-3dc2fb895ab3
Оператор связи
5cc973ee-0b24-4273-8534-db222aa743e3
09e5b079-047f-4218-b4e0-5b53c5622692
m590 mega2560_ТN4
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_Balance - по переднему фронту отправляется запрос на балланс номера
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
Balance - остаток средств на номере
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
1526
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
//Error_Code =0; //Сброc ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
T_millis =millis();
if (Serial3.available()||wait_Serial){
if (!wait_Serial){wait_Serial=1; time_Serial=T_millis+200;}
if (T_millis >time_Serial)//ожидаем полного получения команды
{wait_Serial=0;
while(Serial3.available()) //Получаем данные с модема
{ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
}
}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0; response_com="";}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; response_com="";}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_Balance ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
2482
ttttt
=1;
bool
isStringMessage
= false;
bool
final
=0;
bool
wait
=0;
bool
err
=0;
bool
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
1129
// tip 1- без \r и \n
// tip 2- с \r и \n
wait=1;
count_++;
time1 =T_millis + Time_wait;
if(tip==1) Serial3.print(text_com);
else if(tip==2){ Serial3.println(text_com); }
else if(tip==3){
Serial3.print(text_com);
Serial3.println((char)26);
}
251
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply) ;
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
}
break;
}
return st;
694
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( text ,3 );
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
299
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATD#100#",2 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
Balance = substring_commas(reply) ;
count_=0;
st=1;
}
break;
}
return st;
String test_res;
int t1=text_analyze.indexOf("\"");
int t2=text_analyze.indexOf("\"",(t1+1));
if((t1>-1)&&(t2>-1)) test_res=text_analyze.substring(t1+1,t2);
else test_res="";
return test_res;
192
String
substring_commas
String
text_analyze
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 1:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 2:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 3:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 4:
AT_Command("ATE0" ,2 ) ;
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
count_++;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
count_++;
break;
case 9:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool
setup_comand
USSD_return
Ответ на запрос
20a0dbb2-d85e-4f1a-9a08-4e6a52f5fc92
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы сCOM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы сCOM порт 3
// #define SERIAL_M Serial_S // для работы сCOM Software
// #include <SoftwareSerial.h> // для работы сCOM Software
// SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
2201
9600
RX
Номер пина, см описание
2442ead9-2f53-4a6d-8299-db1be1540ae1
6fe9eca6-8a6e-4b35-9b52-c72d1faadca0
TX
Номер пина, см описание
24d51b0e-0678-46ce-9885-8f84bb6984b4
c4f394bd-ed86-4487-bd48-4f4dadef276b
Time_USSD
Время ожидания ответа на USSD запрос, мс
4d316b51-aa14-428b-b843-eee5c7f3fb95
9db05ae9-68f2-4374-8ecb-481091b7e4d7
delay(1000);//!!!!Тест удалить!!!!
Serial.print("Start_"); //Тест
Serial.print(start); //Тест
Serial.print("_Nah_P_");// !!! ТЕст
Serial.print(team_room); //!!! ТЕст
Serial.print("_O_");// !!! ТЕст
Serial.print(wait);// !!! ТЕст
Serial.print("_S_");// !!! ТЕст
Serial.print(count_);// !!! ТЕст
Serial.print("_AT2_");// !!! ТЕст
Serial.println(return_AT_2);// !!! ТЕст
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
//Error_Code =0; //Сброc ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
T_millis =millis();
if (SERIAL_M.available()||wait_Serial){
if (!wait_Serial){wait_Serial=1; time_Serial=T_millis+200;}
if (T_millis >time_Serial)//ожидаем полного получения команды
{wait_Serial=0;
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
Serial.print(ch);// !!! ТЕст
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
}
}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0; response_com="";}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; response_com="";}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
3046
//delay(2000); //пауза на включение модуля
SERIAL_M.begin( speed );
/*
delay(50);
SERIAL_M.println("AT+CMGF=1");
delay(50);
SERIAL_M.println("AT+CSCS=\"GSM\"");
delay(50);
SERIAL_M.println("AT+CNMI=2,2,0,0,0");
delay(50);
SERIAL_M.println("AT+CLIP=1");
delay(50);
SERIAL_M.println("ATE0");
delay(50);
*/
304
Разкоментировать нужное (Убрать перед нужной строкой символы "//")
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы сCOM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
для работы сCOM порт 3
#define
SERIAL_M
Serial3
#define SERIAL_M Serial_S // для работы сCOM Software
#include <SoftwareSerial.h> // для работы сCOM Software
SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
Флаг того, что модуль инициализирован
start
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Serial.print("OTVET_");//Тест
Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (line == F("+PBREADY")){ start_N=1; start=0; err=1;}//Сообщение от модуля о том что он стартовал
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
1292
// tip 1- без \r и \n
// tip 2- с \r и \n
Serial.print("Sapros_");//Тест
Serial.println(text_com); //Тест
wait=1;
count_++;
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
SERIAL_M.print(text_com);
SERIAL_M.println((char)26);
}
else if(tip==4){time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
395
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
count_++;
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply) ;
count_++;
}
break;
case 6:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
733
bool st=0;
switch ( count_ ) {
case 0:
AT_Command(("AT+CUSD=1,\""+ USSD_CODE +"\",15"),4 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
USSD_return = substring_commas(reply) ;
count_=0;
st=1;
}
break;
}
return st;
250
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 2:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 3:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
count_++;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 9:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
802
start
92ccc762-3d54-464a-8301-20848c7b9d4a
Флаг того, что модуль инициализирован
3d82746c-c501-4351-b51a-019a18253b6b
fce13b85-48cc-49c4-b122-75d2ba233b44
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы сCOM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы сCOM порт 3
// #define SERIAL_M Serial_S // для работы сCOM Software
// #include <SoftwareSerial.h> // для работы сCOM Software
// SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
start- статус того что модуль стартовал и успешно прошел инициализацию AT командами.
Error_Code :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
2235
ba343838-5e80-48f7-a398-2d132942cbc1
#define
Module_Start
"+PBREADY"
Разкоментировать нужное (Убрать перед нужной строкой символы "//")
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы сCOM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
для работы сCOM порт 3
#define
SERIAL_M
Serial3
#define SERIAL_M Serial_S // для работы сCOM Software
#include <SoftwareSerial.h> // для работы сCOM Software
SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Serial.print("OTVET_");//Тест
Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том что он стартовал
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
1294
GSM_start
a95512ac-60f8-446a-87a3-63d7cc38b1c9
GSM_Net
GSM_dBm
GSM_Received_SMS
GSM_Text_sms
GSM_T_Nomer
GSM_Sent_SMS
GSM_Call
GSM_Number_calls
GSM_Error_Code
488f20c3-fd6c-4b80-8117-b241d2d0d084
GSM_Основной
инфо http://flprog.ru/forum/18-642-2
Автор Слимпер
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек (при использовании Software могут быть проблемы при скоростях больше 9600, 19200)
Time_wait - время предельного ожидание ответа (в мс), т.е. по истечении которого выполнение запроса прекращается
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
SERIAL_M - выбор порта к которому подключен модуль. Варианты Serial, Serial1, Serial2, Serial3, Serial_S - для перевода на SoftwareSerial (еще необходимо добавить блок GSM_SoftwareSerial)
Срос выходов - По завершению процедуры приема и обработки, сбрасывает выхода GSM_Text_sms, GSM_T_Nomer , GSM_Number_calls
Входы
GSM_In_sms - отправляет СМС
GSM_Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
GSM_text - данные которые будут отправлены в СМС
GSM_Reject_call - сбрасывает входящий вызов (отбой), разрывает установлено голосовое соединение
!!!Все входы срабатывают по переднему фронту сигнала, т.е. при переходе из 0 (false) в 1 (true)
Выходы
GSM_start - статус того, что модуль стартовал и успешно прошел инициализацию AT командами.
GSM_Net – регистрация в сети : 1 - модуль зарегистрирован в домашней сети, 0-нет
GSM_dBm - уровень сигнал (-120 уровень не известен)
GSM_Received_SMS - импульс в один программный цикл, при получении СМС
GSM_Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
GSM_Text_sms - Строка содержащая текст принятой СМС
GSM_T_Nomer - Строка содержащая номер отправителя СМС/звонящего или имя контакта из телефонной книги (подробнее см ниже)
GSM_Call – Входящий звонок, пока идет входящий вызов 1 на выходе
GSM_Number_calls - номер текущего гудка, сбрасывается поле поступления нового звонка.
Error_Code – Код ошибки в работе модуля, появляется после возникновение ошибки, и сбрасывается после следующей удачной операции
Часть ошибок, описаны в блоках, настройки на конкретный модуль, так как они уникальны для него
Перечень общих ошибок:
201 – Отправки СМС. Ошибка перевода формат сообщений в текстовый режим
202 - Отправки СМС. Ошибка начального этап отправки СМС
203 - Отправки СМС. Ошибка конечного этап отправки СМС
301 - Проверка связи с сетью. Ошибка команды - Проверка регистрации в сети
303 - Проверка связи с сетью. Ошибка команды - Проверка уровня сигнала
501- Исходящем вызове. Ошибка команды поднять трубку
505 - Исходящем вызове. Занят другим сеансом связи
506 - Исходящем вызове. Нет ответа
507 - Исходящем вызове. Вызов сброшен
601 - Ошибка команды - Получение имени оператора
603 - Ошибка команды - Получить текущее время
701 - Ошибка команды - Отправить USSD запрос
10005 – При исходящем вызове, или отправки СМС. Некорректный номер
10006 – При исходящем вызове, или отправки СМС. Нет в списке разрешённых номеров. При использовании телефонной книге и включении функции White_list
10100 - превышен допустимый лимит длинны ответа модуля
3085
SERIAL_M
Serial3
Выбор COM порта
6e740e32-4275-4075-a1f4-1136b9aad202
cd44aec4-9e95-4f84-be65-61792f4d0a55
Time_wait
Время ожидание ответа модуля, мс
22016e8b-8d2b-4fcb-85f5-5f68ed96a606
221e94a5-09ac-40a4-8cbf-1c8f417182b3
0
Ограничение длинны сообщений
160
Сброс при привышении, символы
b3bca61d-629f-4ece-b5f5-05b658ef9e8d
a2c907a6-9a71-4a77-965e-90d9a57b1dda
Срос выходов
Сбрасывате выхода
99b9629a-6606-4ea9-925a-359b95dd7184
a7e04f2b-3051-46e0-9db7-39c0adefeb6c
GSM_Received_SMS =0; //Сброс статутса СМС Принята
GSM_Sent_SMS =0; //Сброс статуса СМС Отправлена
if ( Срос выходов ){
if ( GSM_team_room==3 ){
GSM_Number_calls =0;
GSM_Text_sms="";
GSM_T_Nomer ="";
}
}
GSM_T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{GSM_ch = SERIAL_M.read();
if(GSM_ch == '\r') continue;
if(GSM_ch == '\n') { GSM_GotLineFromNeoway(); GSM_line = ""; }
else GSM_line += GSM_ch;}
if (GSM_wait)//ожиание ответа на команду
{
if(GSM_line.length()>0){
if(GSM_line==F("> ")) {GSM_count++; GSM_wait=0;GSM_line = "";} }
if(GSM_T_millis>GSM_time) {GSM_err (2,0);}
}
if (GSM_Call&&(GSM_team_room!=1) )
{
GSM_team_room=1;
GSM_Number_calls=1; //сброс числа гудков
// GSM_resetExpectations() ;
}
if (GSM_start_N){if (!GSM_wait){if ( GSM_setup_comand() ){GSM_start_N=0; GSM_start =1; }}}// Инициализация
if (GSM_start)//Не работать пока не старт
{
//______Проверка статуса сети
if ((Time_Net >0)&&(GSM_team_room==0)) //проверять ли статутс сети
{
if((GSM_T_millis-GSM_time_n) > Time_Net){ GSM_team_room=3;}
}
//______Конец Проверка статуса сети
//______Отправка СМС
if ( GSM_In_sms && !GSM_past_SMS ) { if ( GSM_number_search()) GSM_command_SMS =1; } // поступление команды на отправу СМС. Проверка корректности номера
GSM_past_SMS= GSM_In_sms;
if ( GSM_command_SMS && (GSM_team_room==0) ) {GSM_team_room=2; GSM_command_SMS =0;} // начинать отправу СМС
//______Конец Отправка СМС
//______Команда сброс вызова или разрыв разговора
if ( GSM_Reject_call && !GSM_past_Reject_call ) { GSM_command_Reject_call =1; }
GSM_past_Reject_call=GSM_Reject_call;
//______Конец Команда сброс вызова или разрыв разговора
#ifdef GSM_INCLUSION_USSD // Обработка вызова USSD запросов
GSM_causeProcessingUSSD();
#endif
#ifdef GSM_INCLUSION_DATA_TIME //Обработка времени, даты, оператора
GSM_causeProcessingDataTime();
#endif
#ifdef GSM_INCLUSION_CALLS // исходящий вызов
if (GSM_causeProcessingCall()) {
if( GSM_number_search()){
GSM_wait=1; // ожитать
GSM_time =millis() + Time_wait; // время ожидания
SERIAL_M.println( "ATD"+ GSM_Phone_T+";" );
GSM_team_room=5;
#ifdef GSM_DEBUG // отладка
Serial.println("Command: ATD"+ GSM_Phone_T+";" );
#endif
}
}
#endif
//________ Обработка разных процессов
switch ( GSM_team_room ) {
case 0:
break;
case 1: //Обработка входящих вызовов
if (!GSM_wait){
if ( GSM_command_Reject_call ) {
if ( GSM_singleCommand(F("ATH0"), 10) ) {GSM_command_Reject_call=0; GSM_Call=0; GSM_count=0; GSM_final=1;}
}
#ifdef GSM_INCLUSION_CALLS
#ifndef GSM_TYPE_M590
if (GSM_causeProcessingTake()){ GSM_Connect=1; GSM_team_room=5;}
#endif
#endif
}
if (!GSM_Call){ GSM_final =1; GSM_T_Nomer ="";}
break;
case 2:
if (!GSM_wait){ GSM_final=GSM_sms_sent();} // отправка сообщения
break;
case 3:
if (!GSM_wait){ GSM_final=GSM_net_status();}// проверка связи с сетью
break;
case 4: //приход смс
//if (!GSM_wait){ GSM_final=1; GSM_count=0; GSM_Error_Code =0; }//
break;
#ifdef GSM_INCLUSION_CALLS
case 5: //разговор
if (!GSM_wait) {
if ( GSM_command_Reject_call ) {
if ( GSM_singleCommand(F("ATH0"), 10)) {GSM_command_Reject_call=0; GSM_Call=0; GSM_count=0; GSM_Connect=0; GSM_final=1;}
}
GSM_count=0;
}
break;
#endif
#ifdef GSM_INCLUSION_DATA_TIME
case 6: // дата время
if (!GSM_wait){if ( GSM_DataTime() ){ GSM_final =1;}}// запрос баланса
break;
#endif
#ifdef GSM_INCLUSION_USSD
case 7: // USSD
if (!GSM_wait){ GSM_final=GSM_USSD();}// запрос баланса
break;
#endif
}
//________ Конец Обработка разных процессов
if (GSM_final){GSM_team_room=0; GSM_final=0;} //должно быть последним
}
3735
SERIAL_M.begin( speed );
28
Модем прислал сообщение о том, что он стартовал
GSM_start_N
;
bool
закончена обработка запроса
GSM_final
;
bool
идет ожидание ответа на команду
GSM_wait
;
bool
GSM_past_SMS
;
bool
GSM_command_SMS
;
bool
GSM_past_Reject_call
;
bool
GSM_command_Reject_call
;
bool
bool GSM_Call_P1;
символ пришетший в ком порт
GSM_ch
;
char
счетчик ошибок
GSM_errorCounter
;
byte
GSM_numberRepeats
;
byte
byte GSM_Dial_response_code;
номер текущей функции
GSM_team_room
;
byte
счетчик последовальности команд
GSM_count
;
byte
Время посылки команды
GSM_time
;
unsigned long
Время посылки команды
GSM_T_millis
;
unsigned long
Время последнего опроса связи с сетью.
GSM_time_n
;
unsigned long
сообщение от модуля
GSM_line
;
String
Ответ модуля на команду
GSM_reply
;
String
Телефон во время подачи команд на звонок или отправку смс
GSM_Phone_T
="";
String
bool flag_=0; //Анализ телефонной книги
static bool isStringMessage;
#ifdef GSM_DEBUG
Serial.print("Message module: ");//Тест
Serial.println(GSM_line); //Тест
Serial.print("GSM_team_room: ");//Тест
Serial.println(GSM_team_room); //Тест
#endif
if (GSM_line.length()>0)
{
//Обработка входящих СМС
if (isStringMessage){
GSM_Text_sms = GSM_line ; //выводим текст сообщения
GSM_Received_SMS =true; // Импульс приход сообщения
isStringMessage=0;
return;
}
if (GSM_line.startsWith("+CMT")) // пришло СМС
{
flag_=1;
GSM_resetExpectations();
isStringMessage=1;
GSM_reply="";
}
//Конец Обработка входящих СМС
// Обработка входящих вызовов
if (GSM_Call)
{
if (GSM_line.startsWith(F("+CLIP"))) {flag_=1;GSM_reply="";}
else if (GSM_line == F("NO CARRIER")) { GSM_Call=0; }
}
if (GSM_line == F("RING")){ //Входящий звонок
if(!GSM_Call)GSM_resetExpectations();
GSM_Call=1;
GSM_Number_calls ++;
}
// ____ Обработка USSD sim800
#ifdef GSM_TYPE_SIM800
#ifdef GSM_INCLUSION_USSD
if (GSM_line.startsWith("+CUSD")) // пришел ответ по USSD
{
GSM_wait=0;
GSM_count++;
GSM_USSD_return = GSM_substring_commas(GSM_line,5) ;
}
#endif
#endif
//_______Конец обработки USSD SIM800
#ifdef GSM_INCLUSION_CALLS //Если добавлен блок работы со звонками
#ifdef GSM_INCLUSION_DTMF // Если добвален блок DTMF
if ( GSM_Connect ){ if (GSM_line.startsWith(F("+DTMF"))) {GSM_ID_DTMF(GSM_line);} }
#endif
if (GSM_team_room==5)
{
if (GSM_line == F("CONNECT"))GSM_Connect=1;
else if (GSM_line == F("BUSY")) GSM_err (505,2);
else if (GSM_line == F("NO ANSWER")) GSM_err (506,2);
else if (GSM_line == F("NO CARRIER")) {
if (GSM_Connect){GSM_Connect=0; GSM_team_room=0;}
else GSM_err (507,2);
}
}
#endif
// Конец Обработка входящих вызовов
if(GSM_line == F("ERROR")) GSM_err (1, 0);
else if(GSM_line == F("OK")){ GSM_wait=0; GSM_count++; GSM_errorCounter=0; }
else {
GSM_reply+=GSM_line;
}
if (GSM_reply.length()> Ограничение длинны сообщений ){GSM_reply=""; GSM_err (10100,2);}//Защита от переполнения строки
if (GSM_line == Module_Start){ GSM_start_N=1; GSM_start=0; GSM_err (0 , 2); }//Сообщение от модуля о том, закончил загрузку
if (flag_) //Получение номер телефона отправителя/звонящего
{
GSM_T_Nomer = GSM_substring_commas( GSM_line, 4) ;
if( GSM_T_Nomer.indexOf("+")==-1) GSM_T_Nomer=(String( "+" ))+ GSM_T_Nomer;
#ifdef TELEFONNAYA_BOOK // если используется телефооная книга
int GSM_ind_arr= GSM_StringArray( GSM_Telefon, GSM_T_Nomer );
if ( GSM_ind_arr>-1) GSM_T_Nomer = GSM_Contact [ GSM_ind_arr ];
#endif
flag_=0;
}
#ifdef TELEFONNAYA_BOOK // если используется телефооная книга
if (!GSM_start){
if ( GSM_line.startsWith("+CPBF")) // пришла запись телефонной книги
{if( GSM_index_array< GSM_Number_Contacts ){
GSM_Telefon[ GSM_index_array ] = GSM_substring_commas( GSM_line, 5);
GSM_Contact[ GSM_index_array ]= GSM_substring_commas( GSM_line, ( GSM_line.lastIndexOf(","))) ;
GSM_index_array ++;}
}
}
#endif
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
3288
void
GSM_GotLineFromNeoway
GSM_numberRepeats=_numRep;
GSM_reply="";//Сброс содержимого прошлого ответа модуля
GSM_wait=1; // ожитать
GSM_time =millis() + Time_wait; // время ожидания
SERIAL_M.write("AT+");
SERIAL_M.print(str);
SERIAL_M.print(str2);
SERIAL_M.write("\"\r\n");
#ifdef GSM_DEBUG // отладка
Serial.write("Command: AT+");
Serial.print(str);
Serial.print(str2);
Serial.write("\"\r\n");
#endif
391
void
GSM_AT_Command
const __FlashStringHelper*
str
String
str2
byte
_numRep
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_AT_Command(F("CREG?") , 5); //Проверка регистрации в сети
break;
case 2:
if ( GSM_analysisResponse(F("+CREG") )){
if( ( GSM_reply.endsWith("1")) || ( GSM_reply.endsWith("5"))) { GSM_Net =1;} // 1-В домашней сети, 5- в роуминге
else { GSM_Net =0;}
}
break;
case 3: // Проверка уровня сигнала
GSM_AT_Command(F("CSQ") , 5 ) ;
break;
case 4:
if ( GSM_analysisResponse(F("+CSQ") )){ //
int t1= GSM_reply.indexOf(": ");
if(t1>-1) GSM_dBm =(( ( ( GSM_reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( GSM_dBm >0) GSM_dBm =-120; //нет сети
}
break;
case 5:
GSM_count=0;
GSM_time_n=millis();// время последнего опроса
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
811
bool
GSM_net_status
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_AT_Command(F("CMGF=1"),1); // Перевод сообщенй в текстовый режим
break;
case 2:
GSM_AT_Command(F("CMGS=\""), GSM_Phone_T ,1 ); // Отправка команды на начальный этап отправки СМС
break;
case 3: // передача текста СМС и отправка сообщения
if ( GSM_errorCounter ){ GSM_err( (200+ GSM_count) , 2); break; }// выход из посылки команд если достигнуто придельное колличество ошибок
SERIAL_M.println( GSM_text +String( (char)26 ));
GSM_wait=1; // ожитать
GSM_time =millis() + Time_wait; // время ожидания
#ifdef GSM_DEBUG // отладка
Serial.println( GSM_text +String( (char)26 ));
#endif
break;
case 4:
GSM_count=0;
GSM_Sent_SMS =1;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
795
bool
GSM_sms_sent
int t1=text_analyze.indexOf("\"", position);
int t2=text_analyze.indexOf("\"",(t1+1));
if(t1>-1){
if(t2>-1) return text_analyze.substring(t1+1,t2);
else return text_analyze.substring(t1+1);}
return "";
205
String
GSM_substring_commas
String
text_analyze
int
position
if ( GSM_Phone.length() <4) {GSM_Error_Code =10005; return 0;}
GSM_Phone_T = GSM_Phone ;
#ifdef TELEFONNAYA_BOOK
int ind_arr;
ind_arr= GSM_StringArray( GSM_Contact , GSM_Phone );
if (ind_arr>-1) GSM_Phone_T = GSM_Telefon [ ind_arr ];
else if(GSM_White_list ) {GSM_Error_Code =10006; return 0;}
#endif
return 1;
bool
GSM_number_search
//сброс текущей операции
GSM_wait=0; //сброс ожидания ответа
GSM_count=0; //Сброс состояний обработки других функций
GSM_time_n=GSM_T_millis;//отсрочка проверки статуса сети
GSM_team_room=0;
193
void
GSM_resetExpectations
GSM_errorCounter++ ;
GSM_reply=""; //Сброс содержимого прошлого ответа модуля
GSM_wait =0;
if (_ret==0){
if ( GSM_errorCounter >GSM_numberRepeats){
error = GSM_team_room*100+ GSM_count;
_ret=2;}
else return;
}
if ( _ret==1) GSM_count--;
else if (_ret==2 ){
GSM_errorCounter=0;
GSM_Error_Code =error;
if (GSM_team_room==3){GSM_Net =0;GSM_dBm =-120;}
GSM_resetExpectations();
}
389
void
GSM_err
int
error
byte
_ret
#ifdef GSM_DEBUG // отладка
Serial.write("AT+ _ ");
#endif
SERIAL_M.write("AT+");
GSM_Command( str,_numRep ) ;
117
void
GSM_AT_Command
const __FlashStringHelper*
str
byte
_numRep
#ifdef GSM_DEBUG
Serial.print("Expected Answer: ");//Тест
Serial.println(response); //Тест
Serial.print("Real Answer: ");//Тест
Serial.println(GSM_reply); //Тест
#endif
if (GSM_reply.startsWith(response)){GSM_count++; return 1; }
GSM_err(0,1);
return 0;
256
bool
GSM_analysisResponse
const __FlashStringHelper*
response
switch ( GSM_count ) {
case 0:
GSM_Command(str, _numRep) ;
break;
case 1:
GSM_count=0;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
159
bool
GSM_singleCommand
const __FlashStringHelper*
str
byte
_numRep
GSM_reply=""; //Сброс содержимого прошлого ответа модуля
GSM_numberRepeats=_numRep;
GSM_wait=1; // ожитать
GSM_time =millis() + Time_wait; // время ожидания
SERIAL_M.println(str);
#ifdef GSM_DEBUG // отладка
Serial.write("Command: ");
Serial.println(str);
#endif
268
void
GSM_Command
const __FlashStringHelper*
str
byte
_numRep
GSM_NEW 0.6.1b
985f98da-0ef2-4e62-858b-80b7a2982169
GSM_SIM800
d0866a45-fee6-450a-bc96-b618201c2a76
GSM_SIM800
Автор Слимпер
Работает только вместе с блоком GSM_Основной
Предназначен для переключения блоков на работу с модулем Sim800
Уникальные для модуля функции прописываются в этом блоке.
Коды стандартных ошибок описаны в блоке GSM_Основной, специфические здесь:
Первичная инициализация модуля, после старта:
1 - Ошибка команды – Отключить эхо ответ
2 - Ошибка команды - Проверка готовности модуля к работе
4 - Ошибка команды - Проверка регистрации в сети
6 - Ошибка команды - Отключение приема широковещательных сообщений
7 - Ошибка команды - Настройка автоматического определения номера
8 - Ошибка команды – Настройки текстового формата SMS сообщений
9 - Ошибка команды – Выбора кодировки текста, кодировка ASCII
10 - Ошибка команды – Выдавать СМС в терминал и не сохранять в память
11 - Ошибка команды - Включение работы с DTMF
12 - Ошибка команды – Проверка наличия контактов в телефонной книге SIM карты
14 - Ошибка команды – Запрос контактов начинающихся на Name_Contaсt, см. блок Телефонная книга
#define
Module_Start
"Call Ready"
switch ( GSM_count ) {
case 0:
GSM_count ++;
break;
case 1:
GSM_Command(F("ATE0") ,2 ) ; //отключение эхо ответа
break;
case 2:
GSM_AT_Command(F("CPAS"),4); // проверка готовности модуля к работе
break;
case 3:
GSM_analysisResponse(F("+CPAS: 0") );
break;
case 4:
GSM_AT_Command(F("CREG?"),10); //Проверка регистрации в сети
break;
case 5:
if ( GSM_analysisResponse(F("+CREG") )){
if( ( GSM_reply.endsWith("1")) || ( GSM_reply.endsWith("5"))) { GSM_Net =1;} // 1-В домашней сети, 5- в роуминге
else { GSM_err(0,1); GSM_count--; }
}
break;
case 6:
GSM_AT_Command(F("CSCB=1") ,2 ) ; // Отключение приема широковещательных сообщений
break;
case 7:
GSM_AT_Command(F("CLIP=1") ,2 ) ; // настройки автоматического определения номера
break;
case 8:
GSM_AT_Command(F("CMGF=1") ,2 ) ; //настройки формата SMS сообщений, текстовый
break;
case 9:
GSM_AT_Command(F("CSCS=\"GSM\"") ,2 ) ; // выбора кодировки текста, кодировка ASCII
break;
case 10:
GSM_AT_Command(F("CNMI=2,2,0,0,0") ,2 ) ; //выдовать смс в терминал и не сохранять в память
break;
case 11:
#ifdef GSM_INCLUSION_DTMF // Если добвален блок DTMF
GSM_AT_Command(F("DDET=1") ,5 ); // Включение работы с DTMF
#else
GSM_count ++;
#endif
break;
#ifdef TELEFONNAYA_BOOK // Если использовать телефонну книгу
case 12:
GSM_AT_Command(F("CPBS?"),2);
break;
case 13:
GSM_analysisResponse(F("+CPBS: \"SM\"") );
break;
case 14:
GSM_AT_Command(F("CPBF=\""), GSM_Name_Contact , 2 ) ;
GSM_index_array =0;
break;
case 15:
#else //Если не использовать телефонную книгу
case 12:
#endif //Окнчание выбора по телефонной книге
GSM_count=0;
GSM_Error_Code =0; //Сброc ошибки
return 1;
break;
}
return 0;
bool
GSM_setup_comand
m590
In
733dcb6e-5b41-4cff-a699-c4c746c81d4c
25470667-0e8f-4848-9ae5-899d155b1a91
173dd596-248e-436d-8841-20975237a0db
if ( In == true)
{ // ключ нажат - вывод подтянут к высокому уровню сигнала
delay(100); // задержка для устранения дребезга контактов ключа
runnin = !runnin; // инвертирование переменной running
digitalWrite(LEDpin, runnin) ; // индикация светодиодом
}
pinMode(LEDpin, OUTPUT);
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // включить подтягивающий резистор
светодиод подключен к выводу 5
LEDpin
= 13;
int
ключ подключен к выводу 13, другой вывод подключен к земле
switchPin
= 2;
int
runnin
= false;
boolean
runnin1
= false;
boolean
In_sms
e28b2991-30d8-41e9-87dd-641dccb0757a
Phone
adc49d19-4ee9-4037-9446-147f6c73ae10
2a0a1b31-924c-4588-b575-eeb9a9e99cf9
55e0ac92-10eb-433c-90d9-23f4b60c9a5e
Последняя разработка
if ( In == true)
{
digitalWrite(LED, HIGH) ;
Serial.print("AT+CMGS=\"");
Serial.print( Phone );
Serial.println("\"");
}
else {
digitalWrite(LED, LOW) ;
}
Serial.begin(9600);
pinMode(LED, OUTPUT);
LED
= 13;
int
ae3d23c4-4c67-497d-8c24-175c9c4f37af
SIM 900
text
f0527995-7b55-4ee5-b390-efa6adaba935
08bc550c-64e3-4e3a-b14a-1e378cb3e358
a6ea1548-470b-4d48-bbd1-1e8cb1b2c223
SIM 900 Serial1
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
// Serial1.println( Text sms );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
digitalWrite(LED, LOW) ; // контрольный светодиод убрать
}
Serial1.begin(9600);
pinMode(LED, OUTPUT); //контрольный светодиод убрать
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
контрольный светодиод убрать
LED
= 13;
int
fae71e77-4801-4518-a803-bb358809b408
m590 mega2560
Reject_call
a131b89a-32b1-43b7-abc8-c9d1701fd391
Сброс звонка
7760b87d-d2b8-4192-a97f-ac059fd205a2
Net
a2d42309-5a06-48f2-a27d-221976f445c9
Подключен к сети
6875df1a-317b-40a9-ba3b-0920a48b80a1
dBm
87a64b62-2488-4116-b3c6-2229454e6d59
Уровень сигнала
375cee25-509e-4be0-882b-7192829c4f30
m590 mega2560 115200
отправка смс из строк 1-2-3
Намер телефона клиента
строка смс 1
text 1
394e2336-a382-47e0-bf1b-a826009b105f
строка смс 2
154f7805-6f31-49e3-b0a5-5185f3a7442e
text2
66a95e0d-5da0-4709-bb47-63019c1c9f0c
строка смс 3
578b7f00-0b31-4f34-b0b8-6950a45ed8ee
out
985669be-77bd-4edb-b9e4-5f276bb35f47
a9235eff-09cd-457f-b991-5f1e731f173e
9bc60d94-25b8-4547-afc9-f1e77fc816cf
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
digitalWrite(LED, LOW) ; // контрольный светодиод убрать
}
// Отправляем смс
// Принимаем смс
// if (Serial1.available() > 0)
// {
//
// out = Serial.read();
// }
контрольный светодиод убрать
LED
= 13;
int
3ce7ef08-920f-4bca-bde6-b62a8aca2d77
получено из смс
test
ea76600c-405e-417c-840d-75e17db13ddf
e8c13239-ab3d-4370-ab0e-600a2f38547a
22a40700-ca43-4380-9aca-cc7d793d3c10
SIM 900 Serial1 v1
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
}
// Отправляем смс
// Принимаем смс
if (!Serial1.available())
return;
char currSymb = Serial1.read();
test = currStr;
if ('\r' == currSymb) {
if (isStringMessage) {
// если текущая строка – сообщение, то…
out = currStr;
isStringMessage = false;
}
else {
if (currStr.startsWith("+CMT")) {
// если текущая строка начинается с "+CMT", то следующая сообщение
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
Serial1.begin(9600);
delay(3000);
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("AT+IFC=1, 1\r"); //установка программного контроля потоком передачи данных
delay(300);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
для зеленого
greenPin
= 13;
int
для желтого светодиода
yellowPin
= 3;
int
если эта строка сообщение, то переменная примет значение True
currStr
= "";
String
isStringMessage
= false;
boolean
af20e311-815a-4313-ae83-81277007e616
SIM 900 Serial1 v2 test
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
// Принимаем смс
if (!Serial1.available())
return;
char currSymb = Serial1.read();
if ('\r' == currSymb) {
if (isStringMessage) {
// если текущая строка – сообщение, то…
out = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
// если текущая строка начинается с "+CMT", то следующая сообщение
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
Serial1.begin(9600);
delay(3000);
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("AT+IFC=1, 1\r"); //установка программного контроля потоком передачи данных
delay(300);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
currStr
= "";
String
если эта строка сообщение, то переменная примет значение True
isStringMessage
= false;
boolean
text1
text2
text3
f2dcb62c-36ba-43e9-a876-19b570640a37
7d7b74cf-5c22-43e5-9aa9-be63b7eb8dc8
text4
f83142ba-6044-4479-a24d-2af24eb3d911
8dc3e42d-ca04-4258-a7ec-6fc6426a1bfe
text5
d2fa00a5-3627-4623-9df4-349bbf8ce582
7e75afa8-3398-4753-94f0-06f29a691a0f
text6
86a0d736-b9be-4159-8362-a2a3981e0e8e
5839b677-8b33-49cd-a54c-d33b1665fa34
text7
781f5089-d490-4569-ab92-98e80f51cbd9
7162c89a-e215-4e58-9bf5-4db5b9161900
Call
out_sms
300f1901-b539-4081-8262-df47b88dd60b
m590 mega2560 115200
скорость 115200
RX3 (15) в TX модема
TX3 (14) в RX модема
инфо http://flprog.ru/forum/18-642-2
if ( In_sms == true)
{
Serial3.print("AT + CMGS = \"");
delay(300);
Serial3.print( Phone );
delay(300);
Serial3.println("\"");
delay(300);
Serial3.println( text );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text1 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text2 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text3 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text4 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text5 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text6 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text7 );
delay(1000);
Serial3.println((char)26);
delay(300);
Serial3.println();
delay(300);
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
Serial3.begin(115200);
delay(20000);
Serial3.println("AT+CMGF=1\r");
delay(200);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(200);
Serial3.println("AT+CNMI=2,2\r");
delay(200);
Serial3.println("AT+CLIP=1\r");
delay(200);
currStr
= "";
String
isStringMessage
= false;
boolean
726d0829-22b4-4a18-ab02-10747e6080ea
84e909e3-5164-4e1f-bf01-5944fef622ee
b669819f-f009-4898-af17-a684f491f9ab
c7beb266-fe66-4df8-8a9a-85cc88f49dfa
1e18c0e3-6ef3-4dfb-803f-7ca7306262e0
text8
d6e7d474-7b13-47dd-9c76-8c5331d9b584
cdfecbcb-d30e-4b2a-a99a-b0901c5e5737
b414533e-70e8-440b-861f-5f82caf80eef
if ( In_sms == true)
{
Serial3.print("AT+CMGS=\"+");
delay(50);
Serial3.print(Phone);
delay(50);
Serial3.println("\"");
delay(50);
Serial3.println();
delay(50);
Serial3.println(text);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text1);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text2);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text3);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text4);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text5);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text6);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text7);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text8);
delay(50);
Serial3.println((char)26);
delay(50);
Serial3.println();
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
Serial3.begin(115200);
delay(3000);
Serial3.println("AT+CMGF=1\r");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0\r");
delay(50);
Serial3.println("AT+CLIP=1\r");
5a439fd2-7f2c-4639-b0e0-ffabbd6ea9c6
sms
78a799b0-71f7-4661-9d8a-d80ade578c5b
2b6a3685-b885-4e3a-9883-9a011aa7c5c3
ce94cb6c-3b56-40eb-bcf2-b1d9c2acf222
if ( In_sms == true)
{
Serial3.print("AT+CMGS=\"");
delay(50);
Serial3.print(Phone);
delay(50);
Serial3.println("\"");
delay(50);
Serial3.println();
delay(50);
Serial3.println(text);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text1);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text2);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text3);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text4);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text5);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text6);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text7);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text8);
delay(50);
Serial3.println((char)26);
delay(50);
Serial3.println();
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false;
sms =true; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
sms = false;
}
delay(2000);
Serial3.begin(115200);
delay(50);
Serial3.println("AT+CMGF=1\r");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0\r");
delay(50);
Serial3.println("AT+CLIP=1\r");
delay(50);
Received_SMS
18039b27-cb01-4ce5-bd77-e8455fb0e496
Получена СМС
Текст СМС
T_Nomer
Номер с которого пришло СМС
Sent_SMS
1174c3e1-c5ae-46ca-bc4e-f32953816209
Отправлена СМС
d535058c-83fc-4da3-ae1a-7c562d9e8eae
ERROR
90a1f2ef-7628-4a3b-9476-873b328f1edf
Ошибка отправка СМС
2575f78c-25fc-401a-9ceb-eade206ea0e7
5534ccac-65c1-4b31-8bb9-483c15f3bd04
скорость 115200
RX3 (15) в TX модема
TX3 (14) в RX модема
инфо http://flprog.ru/forum/18-642-2
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
ERROR :
0- норма;
1- неверный номер отправления;
2 - Ошибка при отрпвлении
3- Нет ответа от модуля при отправки сообщения
speed
Скорость порта, см описание
f32f9e34-ce80-45b3-9050-077e33f7d03a
689d6ab0-dd41-41ef-920f-f8dd0336a9f8
DELL_SMS
Отчистка СМС
07cee270-f81f-488c-8574-bd5b26a650b5
b4aada34-d9f0-46b3-81af-c42ebc3b551d
Received_SMS =0;
Sent_SMS =0;
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if ( _trgrt1 && !Triger_)
{
if ( Phone.length() > 4) { Triger_=1; count_=0;}
else { ERROR =1; Triger_=0;}
}
if(Triger_)
{
if (return==1) {Triger_=0; ERROR =0; return=0; Sent_SMS =1;}
else if (return==2){Triger_=0; ERROR =2; return=0;}
if( millis() >=time1) {
time1 =millis() + 100;
switch ( count_ ) {
case 0:
Serial3.print("AT+CMGF=1\r");
break;
case 1:
Serial3.println("AT+CMGS=\"+ Phone +\"");
break;
case 2:
Serial3.println(text);
break;
case 3:
Serial3.println(text1);
break;
case 4:
Serial3.println(text2);
break;
case 5:
Serial3.println(text3);
break;
case 6:
Serial3.println(text4);
break;
case 7:
Serial3.println(text5);
break;
case 8:
Serial3.println(text6);
break;
case 9:
Serial3.println(text7);
break;
case 10:
Serial3.println(text8);
break;
case 11:
Serial3.println((char)26);
break;
case 12:
time1 =time1 + 4900;
break;
default:
Triger_=0;
ERROR =3;
}
count_++;
}
}
while(Serial3.available())
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(line); line = ""; }
else
line += ch;
}
delay(2000);
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
isStringMessage
= false;
boolean
Ответ модема на команду 1-OK 2-ERROR
return
=0;
byte
line
;
String
ch
;
char
time1
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
ошибки 0-норма 1- неверный номер
err
=0;
byte
if (isStringMessage)
{
out_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
T_Nomer=line.substring(t1+1,t1+13);
isStringMessage = true;
}
if (line == F("ERROR")) // ошибка
return=2;
if(line == F("OK")) // всё ок
return=1;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
void
GotLineFromNeoway
const String&
line
Text_sms
Ошибка
Call
1bddc233-0f62-460d-8695-120adebe04e8
Входящий вызов
bae63d59-68bd-4419-acb3-1c4808c819e6
51d90042-7a76-4e4d-aff5-88f543961e95
m590 mega2560_Т2
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Выходы
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС
ERROR : Код ошибки, появляется только на 1 програмный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - недопустимый номер для отправки СМС
16e12fff-4256-4d68-b8a2-5a4d17930a64
Time_wait
Время ожидание ответа модуля, мс
b83e41f8-5061-49f7-8ae0-d3fa683da2b0
1236d93b-73c6-4e26-a38c-fca5f3630a9d
Time_Net
Период проверки связи с сетью, мс
19320255-4a11-446a-8be1-c2e745fb9fb1
03376554-1469-40d2-af28-6c264ae6c7e2
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
ERROR =0; //Сбром ошибки
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(line); line = ""; }
else line += ch;
}
//---Отправка СМС--
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if (_trgrt1 ) s_sms=1;
if ( s_sms && !busy) //можно ли отправлять СМС
{
s_sms=0;
if ( Phone.length() > 4) { Triger_=1; busy=1;} //проверка корректности номера
else(ERROR =3;)
}
if(Triger_)
{
if (sms_sent()){ Triger_=0; busy=0; }
}
//Авто проверка связи
if( (Time_Net >0)&&!busy)
{
if((millis()-time_n)> Time_Net){time_n=millis(); busy=1; Net_T=1;}
}
if(Net_T)
{
if (net_status()){ Net_T=0; busy=0; }
}
//Обработка входящего вызова
if (isRing) {busy=1; Call =1;}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;};
if(Call) {if (incoming_call()){ Call =0; busy=0; }}
if(Call&&_trgrt2) {AT("ATH");}
delay(2000); //пауза на включение модуля
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
isStringMessage
= false;
bool
final
=0;
bool
ожидание ответа от модуля
wait
=0;
bool
Ответ модема на команду 1-OK 2-ERROR
M_return
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
Net_T
=0;
bool
isRing
=0;
bool
s_sms
=0;
bool
идет запрос, запрет других операций.
busy
=0;
bool
M_return=3;
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
if (line == F("RING")) isRing=1; //Всходящий звонок
if (line == F("ERROR")) // ошибка
M_return=2;
if(line == F("OK")) // всё ок
M_return=1;
if(M_return==3)reply=line;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
bool st=0;
byte ret;
switch ( count_ ) {
case 0:
ret=AT("AT+CMGF=1\r",1);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
case 1:
ret=AT("AT+CMGS=\""+ Phone +"\"\r" + text + (char)26, 2);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
default:
Sent_SMS =1;
st=1;
}
if (st)count_=0;
return st;
bool
sms_sent
byte ret=0;
if(wait)
{
switch (M_return) {
case 1:
M_return=0;
ret=1;
break;
case 2:
M_return=0;
ERROR =1;
ret=2;
break;
case 3:
M_return=0;
ret=3;
break;
}
if(millis()>time1){ERROR=2; ret=2;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text);
else if(tip==2) Serial3.println(text);
}
}
return ret;
byte
AT
String
text
byte
tip
bool st=0;
byte ret;
switch ( count_ ) {
case 0:
ret=AT("AT+CREG?",2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
}
break;
case 1:
ret=AT("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:"))
{
int t1=line.indexOf(":");
if(t1>-1) dBm =( ( (line.substring(t1+1,t1+3) ).toInt())*(2) );
if(dBm>0) dBm=-120; //нет сети
}
break;
default:
st=1;
}
if (st)count_=0;
return st;
bool
net_status
bool st=0;
switch (M_return) {
case 1:
M_return=0;
st=1;
break;
case 2:
M_return=0;
ERROR =1;
st=1;
break;
case 3:
M_return=0;
if (reply.startsWith(F("+CLIP:"))
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (reply == F("NO CARRIER")) st=1;
}
if(ret==1) count_++;
else if(ret==2)
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
}
break;
case 1:
ret=AT("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:"))
{
int t1=line.indexOf(":");
if(t1>-1) dBm =( ( (line.substring(t1+1,t1+3) ).toInt())*(2) );
if(dBm>0) dBm=-120; //нет сети
}
break;
default:
st=1;
}
return st;
if(millis()>time1){ERROR=2; ret=2;}
}
else
bool
incoming_call
4429c943-1cc9-4540-bda4-c520defcda3d
Get_Balance
933e1a73-f90e-4922-a024-e7f8ae08cff2
Запрос баланса
0e66f15d-c493-46f9-9441-ebf06db3217a
Error_Code
bc84d102-ca7a-4b18-9805-5166f55a9107
Number_calls
bb5716b0-2334-4309-9215-72ead220c33b
Номер текущего гудка
213e77f7-84ed-4fe6-899e-b01d1d0eb571
202aced0-0626-4389-b3d2-41e2fc6408a1
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - недопустимый номер для отправки СМС
69fc39f5-2c9b-4937-8e5b-fdf42810d8a1
89378369-f9fc-4a14-816f-f17193042731
delay(5000);//тест удалить
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
Error_Code =0; //Сбром ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;
}
if (Call&&(team_room!=1) )
{
team_room==1;
count_=0; wait=0; //Сброс состояний обработки других функций
Number_calls=0; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли оптраву смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =3;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((millis()-time_n)> Time_Net){time_n=millis(); team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
switch ( team_room ) {
case 1:
if(_trgrt2) Call_T=1;
if(Call_T&&AT_Command("ATH0",2)){Call_T=0; final =1; Call=0; }
break;
case 2:
if (sms_sent()){ final =1; } // отправка сообщения
break;
case 3:
if (net_status()){ final =1;}// проверка связи с сетью
break;
if (final)team_room=0; //должно быть последним
delay(2000); //пауза на включение модуля
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
Serial3.println("ATE0");
delay(50);
isStringMessage
= false;
bool
final
=0;
bool
ожидание ответа от модуля
wait
=0;
bool
Ответ модема на команду 1-OK 2-ERROR
M_return
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
isRing
=0;
bool
s_sms
=0;
bool
идет запрос, запрет других операций.
busy
=0;
bool
Serial.println(line); //!!!!!!! Убрать
//Обработка СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (line == F("RING")){ Call =1; Number_calls ++;}//Всходящий звонок
if (Call==1)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (line == F("NO CARRIER")) { Call=0;}
}
//____
reply=line;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
void
GotLineFromNeoway
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
ret=AT_Command("AT+CMGF=1\r",1);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
case 1:
ret=AT_Command("AT+CMGS=\""+ Phone +"\"\r" + text + (char)26, 2);
if(ret==1) {Sent_SMS =1; st=1;}
else if(ret==2) st=1;
break;
}
if (st){count_=0; }
return st;
// tip 1- без \r и \n
// tip 2- с \r и \n
byte ret=0;
if(wait)
{
if(reply == F("OK"))
{ ret=1; wait=0; }
else if(reply == F("ERROR"))
{ Error_Code =1; ret=2; wait=0; }
if(millis()>time1)
{Error_Code=2; ret=2; wait=0;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
}
return ret;
byte
AT_Command
String
text_com
byte
tip
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
ret=AT_Command("AT+CREG?",2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
reply=""; wait=0;
}
break;
case 1:
ret=AT_Command("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:")))
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if(dBm>0) dBm=-120; //нет сети
reply=""; wait=0;
}
}
break;
case 2:
st=1;
break;
}
if (st)count_=0;
return st;
// tip 1- без \r и \n
// tip 2- с \r и \n
byte ret=0;
if(wait)
{
if(reply.startsWith(response_com))
{ret=3;}
else if(reply == F("ERROR"))
{ Error_Code =1; ret=2; wait=0; }
else if(reply == F("OK"))
{ ret=1; wait=0; }
if(millis()>time1)
{Error_Code=2; ret=2; wait=0;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
}
return ret;
byte
AT_Command
String
text_com
byte
tip
String
response_com
Balance
0a59f7bd-e80f-4fab-863f-b25df021e23a
Баланс на Sim
bb2c1ffd-ef1d-4a59-90f6-ca709fa9e70a
f2a4bf19-ff62-4760-8e07-c9e05d8fc91c
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_Balance - по переднему фронту отправляется запрос на балланс
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Balance - остаток средств м
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
10 - недопустимый номер для отправки СМС
delay(500);//Тест удалить
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
Error_Code =0; //Сбром ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;
}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=0; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((millis()-time_n)> Time_Net){time_n=millis(); team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_Balance ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& (AT_Answer("")==1) ){Call=0; }
if (!Call) {Call_T=0; final =1;}
break;
case 2:
if (sms_sent()){ final =1; } // отправка сообщения
break;
case 3:
if (net_status()){ final =1;}// проверка связи с сетью
break;
case 4:
if ( balance_S() ){ final =1;}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
Buffer
[5] ;
String
index_buffer
=0;
byte
isStringMessage
= false;
bool
final
=0;
bool
Номер исполняемой команды
team_room
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
bool isRing=0;
bool busy=0; //идет запрос, запрет других операций.
bool wait=0; //ожидание ответа от модуля
byte M_return=0; // Ответ модема на команду 1-OK 2-ERROR
if (line.length()>0)
{
Buffer[index_buffer]=line;
if(index_buffer<3) index_buffer++;
}
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (line == F("RING")){ Call =1; Number_calls ++;}//Всходящий звонок
if (Call==1)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (line == F("NO CARRIER")) { Call=0; }
}
//____
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
// tip 1- без \r и \n
// tip 2- с \r и \n
time1 =millis() + Time_wait;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
void
AT_Command
String
text_com
byte
tip
byte ret=0;
bool ok_=0;
bool ok_2=0;
if (index_buffer>0)
{
for (int i =(index_buffer-1); i >=0 ; i--)
{
if(Buffer[i] == F("ERROR")){ret=2; Error_Code =1; break;}
if(Buffer[i] == F("OK")){ ok_=1; continue; }
if (response_com.length()>0)
{ if(Buffer[i].startsWith(response_com)){ok_2=1; reply=Buffer[i];} }
}
}
if(ok_)ret=1;
if (response_com.length()>0 && !ok_2 ) {ret=2; Error_Code =3;}
if(millis()>time1)
{Error_Code=2; ret=2; }
return ret;
byte
AT_Answer
String
response_com
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
count_++;
break;
case 1:
ret=AT_Answer("+CREG");
if(ret==1)
{
count_++;
if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
}
else if(ret==2) st=1;
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
count_++;
break;
case 3:
ret=AT_Answer("+CSQ");
if(ret==1)
{
st=1;
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBmt >0) dBm =-120; //нет сети
}
else if(ret==2) st=1;
break;
}
if (st)count_=0;
return st;
bool
net_status
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
count_++;
break;
case 1:
ret=AT_Answer("");
if(ret==1) {count_++;}
else if(ret==2) st=1;
break;
case 2:
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
AT_Command( text+(char)26 ,2 );
count_++;
break;
case 3:
ret=AT_Answer("");
if(ret==1) {Sent_SMS =1; st=1;}
else if(ret==2) st=1;
break;
}
if (st){count_=0; }
return st;
bool
sms_sent
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("ATD#100#",2 ) ;
count_++;
break;
case 1:
ret=AT_Answer("+CUSD");
if(ret==1)
{
st=1;
int t1=reply.indexOf(":",reply.indexOf("\""));
iif(t1>-1)nt t2=reply.indexOf(",",t1);
if(t1>-1&&t2>-1) Balance = (reply.substring(t2+1,t3+3)).toFloat();
}
else if(ret==2) st=1;
break;
}
if (st)count_=0;
return st;
bool
balance_S
Get_USSD
USSD_CODE
38590813-5522-4717-89bf-668832b33791
b8c6eec4-ddb3-416b-a9f6-6735425c4160
Operator
24231129-7540-4a4c-b6e4-3dc2fb895ab3
Оператор связи
5cc973ee-0b24-4273-8534-db222aa743e3
09e5b079-047f-4218-b4e0-5b53c5622692
m590 mega2560_ТN4
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_Balance - по переднему фронту отправляется запрос на балланс номера
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
Balance - остаток средств на номере
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
//Error_Code =0; //Сброc ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
T_millis =millis();
if (Serial3.available()||wait_Serial){
if (!wait_Serial){wait_Serial=1; time_Serial=T_millis+200;}
if (T_millis >time_Serial)//ожидаем полного получения команды
{wait_Serial=0;
while(Serial3.available()) //Получаем данные с модема
{ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
}
}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0; response_com="";}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; response_com="";}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_Balance ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
ttttt
=1;
bool
isStringMessage
= false;
bool
final
=0;
bool
wait
=0;
bool
err
=0;
bool
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
// tip 1- без \r и \n
// tip 2- с \r и \n
wait=1;
count_++;
time1 =T_millis + Time_wait;
if(tip==1) Serial3.print(text_com);
else if(tip==2){ Serial3.println(text_com); }
else if(tip==3){
Serial3.print(text_com);
Serial3.println((char)26);
}
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply) ;
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
}
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( text ,3 );
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATD#100#",2 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
Balance = substring_commas(reply) ;
count_=0;
st=1;
}
break;
}
return st;
String test_res;
int t1=text_analyze.indexOf("\"");
int t2=text_analyze.indexOf("\"",(t1+1));
if((t1>-1)&&(t2>-1)) test_res=text_analyze.substring(t1+1,t2);
else test_res="";
return test_res;
String
substring_commas
String
text_analyze
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 1:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 2:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 3:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 4:
AT_Command("ATE0" ,2 ) ;
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
count_++;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
count_++;
break;
case 9:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool
setup_comand
USSD_return
Ответ на запрос
20a0dbb2-d85e-4f1a-9a08-4e6a52f5fc92
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы сCOM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы сCOM порт 3
// #define SERIAL_M Serial_S // для работы сCOM Software
// #include <SoftwareSerial.h> // для работы сCOM Software
// SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
RX
Номер пина, см описание
2442ead9-2f53-4a6d-8299-db1be1540ae1
6fe9eca6-8a6e-4b35-9b52-c72d1faadca0
TX
Номер пина, см описание
24d51b0e-0678-46ce-9885-8f84bb6984b4
c4f394bd-ed86-4487-bd48-4f4dadef276b
Time_USSD
Время ожидания ответа на USSD запрос, мс
4d316b51-aa14-428b-b843-eee5c7f3fb95
9db05ae9-68f2-4374-8ecb-481091b7e4d7
delay(1000);//!!!!Тест удалить!!!!
Serial.print("Start_"); //Тест
Serial.print(start); //Тест
Serial.print("_Nah_P_");// !!! ТЕст
Serial.print(team_room); //!!! ТЕст
Serial.print("_O_");// !!! ТЕст
Serial.print(wait);// !!! ТЕст
Serial.print("_S_");// !!! ТЕст
Serial.print(count_);// !!! ТЕст
Serial.print("_AT2_");// !!! ТЕст
Serial.println(return_AT_2);// !!! ТЕст
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
//Error_Code =0; //Сброc ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
T_millis =millis();
if (SERIAL_M.available()||wait_Serial){
if (!wait_Serial){wait_Serial=1; time_Serial=T_millis+200;}
if (T_millis >time_Serial)//ожидаем полного получения команды
{wait_Serial=0;
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
Serial.print(ch);// !!! ТЕст
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
}
}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0; response_com="";}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; response_com="";}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
//delay(2000); //пауза на включение модуля
SERIAL_M.begin( speed );
/*
delay(50);
SERIAL_M.println("AT+CMGF=1");
delay(50);
SERIAL_M.println("AT+CSCS=\"GSM\"");
delay(50);
SERIAL_M.println("AT+CNMI=2,2,0,0,0");
delay(50);
SERIAL_M.println("AT+CLIP=1");
delay(50);
SERIAL_M.println("ATE0");
delay(50);
*/
Разкоментировать нужное (Убрать перед нужной строкой символы "//")
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы сCOM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
для работы сCOM порт 3
#define
SERIAL_M
Serial3
#define SERIAL_M Serial_S // для работы сCOM Software
#include <SoftwareSerial.h> // для работы сCOM Software
SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
Флаг того, что модуль инициализирован
start
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Serial.print("OTVET_");//Тест
Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (line == F("+PBREADY")){ start_N=1; start=0; err=1;}//Сообщение от модуля о том что он стартовал
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
// tip 1- без \r и \n
// tip 2- с \r и \n
Serial.print("Sapros_");//Тест
Serial.println(text_com); //Тест
wait=1;
count_++;
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
SERIAL_M.print(text_com);
SERIAL_M.println((char)26);
}
else if(tip==4){time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
count_++;
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply) ;
count_++;
}
break;
case 6:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command(("AT+CUSD=1,\""+ USSD_CODE +"\",15"),4 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
USSD_return = substring_commas(reply) ;
count_=0;
st=1;
}
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 2:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 3:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
count_++;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 9:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
Dial_call
c1cae560-6933-4c02-8937-5476e169d1f7
Позвонить на номер
9026149b-f276-469a-ad79-4b7ac83a36a5
start
92ccc762-3d54-464a-8301-20848c7b9d4a
Флаг того, что модуль инициализирован
3d82746c-c501-4351-b51a-019a18253b6b
fce13b85-48cc-49c4-b122-75d2ba233b44
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы сCOM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы сCOM порт 3
// #define SERIAL_M Serial_S // для работы сCOM Software
// #include <SoftwareSerial.h> // для работы сCOM Software
// SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
start- статус того что модуль стартовал и успешно прошел инициализацию AT командами.
Error_Code :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
ba343838-5e80-48f7-a398-2d132942cbc1
#define
Module_Start
"+PBREADY"
Разкоментировать нужное (Убрать перед нужной строкой символы "//")
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы сCOM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
для работы сCOM порт 3
#define
SERIAL_M
Serial3
#define SERIAL_M Serial_S // для работы сCOM Software
#include <SoftwareSerial.h> // для работы сCOM Software
SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Serial.print("OTVET_");//Тест
Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том что он стартовал
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
a95512ac-60f8-446a-87a3-63d7cc38b1c9
Data_Time
996e20e4-4cc0-4acc-bbce-f6c4ac39e168
Текущие дата и время
2b01d1c6-a5e1-470e-a6b6-dbc8758e3269
4805ff1a-e1d2-4de1-87a9-9850f238ec86
m590_ТN5
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
//Раcкоментировать нужное
//
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы с COM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
//#define SERIAL_M Serial3 // для работы с COM порт 3
//Для работы сCOM Software следующие две строки
#include <SoftwareSerial.h>
SoftwareSerial SERIAL_M( RX , TX );
//Конец блока настройки Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Name_Contaсt - Префикс имени контакта, по этой части осуществляется поиск в телефонной книге
Number_Contacts - Максимальное число рабочих кантакотов
ON_OFF_Time - синхронизация времени с оператором связи, 1-вкл 0-выкл
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Operator - имя оператора сотовой связи
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС/звонящего или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
start- статус того, что модуль стартовал и успешно прошел инициализацию AT командами.
Error_Code :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
6 - ошибка работы с телефонной книгой
7- привышен допустимый лимит длинны ответа
10 - недопустимый номер для отправки СМС
2693
Name_Contaсt
Test
Префикс имени контакта
890b2a3c-413e-4c4a-b130-935d7b65cfd9
55b895de-3777-4653-9954-2f812afabd85
Number_Contacts
Максимальное число рабочих кантакотов
b55733e8-d0c6-4866-8142-c19f844ab720
05a2a1f3-c3e5-47c9-a64f-3e720a8edf29
ON_OFF_Time
Синхронизация времени 1- включена
7dddcca2-4804-4723-be17-12d66143792e
cdcd5376-57c5-46db-83e6-da84013cd42e
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; }
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; Call_P1=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
2349
SERIAL_M.begin( speed );
25
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для M590 Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"+PBREADY"
для M590 Сообщение от модуля после которого с ним можно работать
#define
For_Start_time
"MODEM:STARTUP"
#define Module_Start "Call Ready" // для SIM800/SIM900 Сообщение от модуля после которого с ним можно работать
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_P1
=0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
ch
;
char
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1){
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else {Error_Code =3; err=1;}}
}
if (reply.length()>180){reply=""; Error_Code =7; err=1;}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;}
// Обработка входящих вызовов
if (Call_P1){Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; Call_P1=0;}
}
if (line == F("RING")){ Call_P1=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том, закончил загрузку
if( ON_OFF_Time ) { //Включение синхронизации времени
if (line == F(For_Start_time)){ AT_Command("AT+CTZU=1",2);}//Сообщение от модуля о том, что он стартовал, отправка команды на синхронизацию времени.
}
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
2280
// tip 1- без \r и \n
// tip 2- с \r и \n
//Serial.print("Sapros_");//Тест
//Serial.println(text_com); //Тест
wait=1;
count_++;
flag_start_line=0;
reply=""; //Сброс содержимого прошлого ответа модуля
response_com=""; //Сброс содержимого ожидаемого ответа модуля
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
458
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
count_++;
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply, 5) ;
count_++;
}
break;
case 6:
if (ON_OFF_Time) {
AT_Command("AT+CCLK?" ,2 ) ;
response_com=F("+CCLK");
}
else count_+=2;
break;
case 7:
if(return_AT_2)
{
Data_Time = substring_commas(reply, 5) ;
count_++;
}
break;
case 8:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
952
bool st=0;
int ind_arr;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
ind_arr= _StringArray( Contact , Number_Contacts , Phone );
if (ind_arr>-1) Phone = Telefon [ ind_arr ];
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( (text+(String( (char)26 ))) , 2);
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
444
bool st=0;
switch ( count_ ) {
case 0:
AT_Command(("AT+CUSD=1,\""+ USSD_CODE +"\""), 3 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
USSD_return = substring_commas(reply,5) ;
count_=0;
st=1;
}
break;
}
return st;
String test_res;
int t1=text_analyze.indexOf("\"", position);
int t2=text_analyze.indexOf("\"",(t1+1));
if(t1>-1){
if(t2>-1) test_res=text_analyze.substring(t1+1,t2);
else test_res=text_analyze.substring(t1+1);}
else test_res="";
return test_res;
249
String
substring_commas
String
text_analyze
int
position
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 2:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 3:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 9:
AT_Command("AT+CPBS?",2);
response_com=F("+CPBS");
break;
case 10:
if(return_AT_2)
{
if (reply.startsWith(F("+CPBS: \"SM\""))){count_++;}
else {Error_Code =6; count_=0; st=1; }
}
break;
case 11:
AT_Command("AT+CPBF=\"" +(String( Name_Contaсt ))+"\"" ,2 ) ;
index_array =0;
break;
case 12:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
1106
for (int i = 0; i < arraySize; i = i + 1)
{if(array[i].equals(value)){return i;}}
return -1;
int
_StringArray
String
array[]
int
arraySize
String
value
Connect_
eb27a80f-cb38-4152-bec7-55bd21cb0247
Установлено голосовое соединение
a3ea2f2a-2958-4d0f-9fd7-7207cc8be606
80cce6ce-b925-467f-807a-08ed5e0cd75d
m590_v1.1
инфо http://flprog.ru/forum/18-642-2
Настройка модуля под себя
В секции DeclareSection убрать знак комментария только в нужны строках (Убрать перед нужной строкой символы "//")
//
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы с COM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
//#define SERIAL_M Serial3 // для работы с COM порт 3
//Для работы с COM Software следующие две строки
#include <SoftwareSerial.h>
SoftwareSerial SERIAL_M( RX , TX );
//Конец блока настройки Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек (при использовании Software могут быть проблемы при скоростях больше 9600, 19200)
RX, TX - номера пинов для подключения модуля при варианте SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Time_wait - время предельного ожидание ответа (в мс), т.е. по истечении которого выполнение запроса прекращается, и на выходе блока Error_Code выдается ошибка 2.
При использовании USSD запросов, ответ приходит долга, по этому значении надо выставлять большое, 20000 – 40000.
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Name_Contaсt - Префикс имени контакта, по этой части осуществляется поиск в телефонной книге, подробнее см ниже
Number_Contacts - Максимальное число рабочих контактов, подробнее см ниже
ON_OFF_Time - синхронизация времени с оператором связи, 1-вкл 0-выкл.Синхронизации времени идет только при запуске модуля, для повторной, его необходимо перезагрузить
White_list - отправлять смс: 1- только на номера из телефонной книге, 0 - на любой номер поданный на вход Phone
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100# (для запроса баланса лучше использовать #100#, но работает не со всеми операторами )
Dial_call - Позвонить на номер указанный Phone
Выходы
Net – регистрация в сети : 1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Operator - имя оператора сотовой связи
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст принятой СМС
T_Nomer - Строка содержащая номер отправителя СМС/звонящего или имя контакта из телефонной книги (подробнее см ниже)
Call – Входящий звонок ,пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле поступления нового звонка.
USSD_return - ответ на USSD запрос (есть ограничение максимально длинны ответа в 160 символов)
start- статус того, что модуль стартовал и успешно прошел инициализацию AT командами.
Data_Time – текущая дата время, в том виде что выдает модуль. Содержит актуальные данные если ON_OFF_Time=1 и оператор поддерживает эту функцию. (Не знаю почему, но работает не у всех).
Connect_ - Установлено голосовое соединение.
Error_Code – Код ошибки в работе модуля, появляется после возникновение ошибки, и сбрасывается после следующей удачной операции
Перечень всех ошибок :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
6 - ошибка работы с телефонной книгой
7- превышен допустимый лимит длинны ответа
10 - недопустимый номер для отправки СМС
11 - Занят другим сеансом связи
12 - Нет ответа
13 - Вызов сброшен
Подробнее о работе с телефонной книгой SIM-карты.
Предназначено для возможности задачи рабочих номеров не в проекте, а на сим карте, и главное возможности смены рабочих номеров, без перепрограммирования контроллера.
Система такая. В телефонной книге SIM-карты создаются несколько контактов, согласно требованиям:
1. В имени контакта только латинские символы и цифры, символы (_-+=*).
2. Все имена должны начинаться на один префикс (например Test) .
3. Имена должны быть уникальны (Test1, Test2, Test_master).
В настройках блока надо настроить следующие пункты:
Name_Contaсt – здесь надо указать Префикс (приставку), что бала описана в пункте 2 (например Test)
Number_Contacts – задать максимально возможное количество контактов, если в записной книге окажется большее число контактов с префиксом Name_Contaсt, то остальные будет отброшены.
Ограничение введено, так как каждый контакт занимает значимое количество память контроллера.
White_list = 1, для отправки смс только на те номера, что удовлетворяют требованиям, описаны выше.
В этом случаи на вход Phone можно подавать, только имена контактов.
Если контакт есть в телефонной книге то на выходе T_Nomer, при звонке и входящей СМС будет выдано имя контакта (например Test1), в противном случаи сам номер.
Имя контакта чувствительно к регистру, т.е Test не равно TEST.
5151
Time_wait
Время ожидание ответа модуля, мс
22016e8b-8d2b-4fcb-85f5-5f68ed96a606
221e94a5-09ac-40a4-8cbf-1c8f417182b3
7722d945-60b2-40cf-a079-d7dad6060631
White_list
только разрешенные номера
e19909f8-8cf9-480c-b4ed-ec3421a6f908
12c4af27-5f40-40d2-89f6-33b8744c417b
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {Error_Code=2; err=1;}}
if (start_T ){ if((T_millis- time1) >2000 ){AT_Command("AT+CTZU=1",2); start_T=0;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; }
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( number_search()) {team_room=2;} //проверка корректности номера
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
if ( Dial_call ){ if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;};//импульс наисходящий вызов
if (_trgrt5 ) Dial_T =1;
if ( Dial_T && (team_room==0) ) // начинать исходящий вызов
{Dial_T=0;
if ( number_search()) { AT_Command("ATD"+ Phone+";" ,2);} team_room=5; Dial_response_code=0;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; Call_P1=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
case 5:
if (!wait&& !Connect_ ){
if(Dial_response_code==1) Connect_=1;
else if(Dial_response_code==2) {Error_Code =11; err=1;}
else if(Dial_response_code==3) {Error_Code =12; err=1;}
else if(Dial_response_code==4) {Error_Code =13; err=1;}}
if (return_AT_2&&Call_T){ Connect_=0; final =1; count_=0; Call_T=0;}
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
3108
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для M590 Сообщение от модуля после которого нужно отправлять команду на синхронизацию времени.
#define
For_Start_time
"MODEM:STARTUP"
для M590 Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"+PBREADY"
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
start_T
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
_trgrt5
= 0;
bool
_trgrt5I
= 0;
bool
Call_P1
=0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
Dial_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
ch
;
char
Dial_response_code
=0;
byte
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Phone_T
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1){
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else {Error_Code =3; err=1;}}
}
if (reply.length()>180){reply=""; Error_Code =7; err=1;}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;}
// Обработка входящих вызовов
if (Call_P1){Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; Call_P1=0;}
}
if (line == F("RING")){ Call_P1=1; Number_calls ++; wait=0;}//Всходящий звонок
if (team_room==5)
{
if (line == F("CONNECT"))Dial_response_code=1;
if (line == F("BUSY"))Dial_response_code=2;
if (line == F("NO ANSWER"))Dial_response_code=3;
if (line == F("NO CARRIER"))Dial_response_code=4;
}
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том, закончил загрузку
if( ON_OFF_Time ) { //Включение синхронизации времени
if (line == F(For_Start_time)){start_T=1; time1 = T_millis ;}}
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
2411
// tip 1- без \r и \n
// tip 2- с \r и \n
//Serial.print("Sapros_");//Тест
//Serial.println(text_com); //Тест
wait=1;
count_++;
flag_start_line=0;
reply=""; //Сброс содержимого прошлого ответа модуля
response_com=""; //Сброс содержимого ожидаемого ответа модуля
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
bool st=0;
int ind_arr;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
AT_Command("AT+CMGS=\""+ Phone_T +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( (text+(String( (char)26 ))) , 2);
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
337
int ind_arr;
Phone_T = Phone ;
if ( Phone.length() <4) {Error_Code =10; return 0;}
ind_arr= _StringArray( Contact , Number_Contacts , Phone );
if (ind_arr>-1) Phone_T = Telefon [ ind_arr ];
else if( White_list ) {Error_Code =10; return 0;}
return 1;
bool
number_search
e8032566-9328-421c-af0b-f80198fb431b
m590_v1.1.3
инфо http://flprog.ru/forum/18-642-2
Настройка модуля под себя
В секции DeclareSection убрать знак комментария только в нужны строках (Убрать перед нужной строкой символы "//")
//
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы с COM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
//#define SERIAL_M Serial3 // для работы с COM порт 3
//Для работы с COM Software следующие две строки
#include <SoftwareSerial.h>
SoftwareSerial SERIAL_M( RX , TX );
//Конец блока настройки Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек (при использовании Software могут быть проблемы при скоростях больше 9600, 19200)
RX, TX - номера пинов для подключения модуля при варианте SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Time_wait - время предельного ожидание ответа (в мс), т.е. по истечении которого выполнение запроса прекращается, и на выходе блока Error_Code выдается ошибка 2.
При использовании USSD запросов, ответ приходит долга, по этому значении надо выставлять большое, 20000 – 40000.
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Name_Contaсt - Префикс имени контакта, по этой части осуществляется поиск в телефонной книге, подробнее см ниже
Number_Contacts - Максимальное число рабочих контактов, подробнее см ниже
ON_OFF_Time - синхронизация времени с оператором связи, 1-вкл 0-выкл.Синхронизации времени идет только при запуске модуля, для повторной, его необходимо перезагрузить
White_list - отправлять смс: 1- только на номера из телефонной книге, 0 - на любой номер поданный на вход Phone
Band - Часто работы с сотовой вышкой. Возможные значения 0 - авто, 900, 1800
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой), разрывает установлено голосовое соединение
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100# (для запроса баланса лучше использовать #100#, но работает не со всеми операторами )
Dial_call - Позвонить на номер указанный Phone
Выходы
Net – регистрация в сети : 1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Operator - имя оператора сотовой связи
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст принятой СМС
T_Nomer - Строка содержащая номер отправителя СМС/звонящего или имя контакта из телефонной книги (подробнее см ниже)
Call – Входящий звонок ,пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле поступления нового звонка.
USSD_return - ответ на USSD запрос (есть ограничение максимально длинны ответа в 160 символов)
start- статус того, что модуль стартовал и успешно прошел инициализацию AT командами.
Data_Time – текущая дата время, в том виде что выдает модуль. Содержит актуальные данные если ON_OFF_Time=1 и оператор поддерживает эту функцию. (Не знаю почему, но работает не у всех).
Connect_ - Установлено голосовое соединение.
Error_Code – Код ошибки в работе модуля, появляется после возникновение ошибки, и сбрасывается после следующей удачной операции
Перечень всех ошибок :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
6 - ошибка работы с телефонной книгой
7- превышен допустимый лимит длинны ответа
10 - недопустимый номер для отправки СМС
11 - Занят другим сеансом связи
12 - Нет ответа
13 - Вызов сброшен
Подробнее о работе с телефонной книгой SIM-карты.
Предназначено для возможности задачи рабочих номеров не в проекте, а на сим карте, и главное возможности смены рабочих номеров, без перепрограммирования контроллера.
Система такая. В телефонной книге SIM-карты создаются несколько контактов, согласно требованиям:
1. В имени контакта только латинские символы и цифры, символы (_-+=*).
2. Все имена должны начинаться на один префикс (например Test) .
3. Имена должны быть уникальны (Test1, Test2, Test_master).
В настройках блока надо настроить следующие пункты:
Name_Contaсt – здесь надо указать Префикс (приставку), что бала описана в пункте 2 (например Test)
Number_Contacts – задать максимально возможное количество контактов, если в записной книге окажется большее число контактов с префиксом Name_Contaсt, то остальные будет отброшены.
Ограничение введено, так как каждый контакт занимает значимое количество память контроллера.
White_list = 1, для отправки смс только на те номера, что удовлетворяют требованиям, описаны выше.
В этом случаи на вход Phone можно подавать, только имена контактов.
Если контакт есть в телефонной книге то на выходе T_Nomer, при звонке и входящей СМС будет выдано имя контакта (например Test1), в противном случаи сам номер.
Имя контакта чувствительно к регистру, т.е Test не равно TEST.
5274
Band
Частота работы сети
8a25aad3-6bcc-413a-873c-6695f4eae5ce
48db1d76-0916-4fb0-b6b7-bf65c85874ae
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {err_ (2);}}
if (start_T ){ if((T_millis- time1) >2000 ){AT_Command("AT+CTZU=1",2); start_T=0;}}
if (Call&&(team_room!=1) )
{
team_room=1;
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( number_search()) {team_room=2;} //проверка корректности номера
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
if ( Dial_call ){ if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;};//импульс наисходящий вызов
if (_trgrt5 ) Dial_T =1;
if ( Dial_T && (team_room==0) ) // начинать исходящий вызов
{Dial_T=0;
if ( number_search()) { AT_Command("ATD"+ Phone+";" ,2);} team_room=5; Dial_response_code=0;}
switch ( team_room ) {
case 1:
if(Call_T&& return_AT_2 ){Call=0; Call_P1=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
case 5:
if (!wait&& !Connect_ ){
if(Dial_response_code==1) Connect_=1;
else if(Dial_response_code==2) err_ (11);
else if(Dial_response_code==3) err_ (12);
else if(Dial_response_code==4) err_ (13);
}
if (return_AT_2&&Call_T){ Connect_=0; final =1; count_=0; Call_T=0;}
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
2791
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для M590 Сообщение от модуля после которого нужно отправлять команду на синхронизацию времени.
#define
For_Start_time
"MODEM:STARTUP"
для M590 Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"+PBREADY"
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
start_T
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
_trgrt5
= 0;
bool
_trgrt5I
= 0;
bool
Call_P1
=0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
Dial_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
Выбор частоты совершен
TrigBand
= 0;
bool
ch
;
char
Dial_response_code
=0;
byte
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Phone_T
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;
resetExpectations();
}
//Конец Обработка входящих СМС
// Обработка входящих вызовов
if (Call_P1){Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; Call_P1=0;}
}
if (line == F("RING")){ //Входящий звонок
Call_P1=1;
Number_calls ++;
resetExpectations();
}
if (team_room==5)
{
if (line == F("CONNECT"))Dial_response_code=1;
if (line == F("BUSY"))Dial_response_code=2;
if (line == F("NO ANSWER"))Dial_response_code=3;
if (line == F("NO CARRIER"))Dial_response_code=4;
}
// Конец Обработка входящих вызовов
if(line == F("ERROR")) err_ (1);
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1)
{
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else err_ (3);
}
}
if (reply.length()>180){reply=""; err_ (7);}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err_ (0); TrigBand=0;}//Сообщение от модуля о том, закончил загрузку
if( ON_OFF_Time ) { //Включение синхронизации времени
if (line == F(For_Start_time)){start_T=1; time1 = T_millis ; }}
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
2532
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
if ( (Band >0)&&!TrigBand ) {
AT_Command("AT+XBANDSEL="+String( Band ) ,2 ) ; //Смена частоты сети
TrigBand=1;
}
else count_+=2;
break;
case 2:
AT_Command("AT+COPS=0,0",2);
break;
case 3:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 6:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 7:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 8:
AT_Command("AT+CMGF=1" ,2 ) ;
break;
case 9:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 10:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 11:
AT_Command("AT+CPBS?",2);
response_com=F("+CPBS");
break;
case 12:
if(return_AT_2)
{
if (reply.startsWith(F("+CPBS: \"SM\""))){count_++;}
else {Error_Code =6; count_=0; st=1; }
}
break;
case 13:
AT_Command("AT+CPBF=\"" +(String( Name_Contaсt ))+"\"" ,2 ) ;
index_array =0;
break;
case 14:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
1308
//сброс текущей операции
wait=0; //сброс ожидания ответа
count_=0; //Сброс состояний обработки других функций
time_n=T_millis;//отсрочка проверки статуса сети
response_com=""; //Сброс содержимого ожидаемого ответа модуля
222
void
resetExpectations
Error_Code =error;
if (team_room==3)
{
switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;
}
}
resetExpectations();
team_room=0;
217
void
err_
byte
error
Data_time_String
Data_time
Data_Time
c31d73bd-15b7-463b-9ce2-12b15457af53
880b303b-aa70-44a1-8084-eedec6a0356a
year
638ff03e-f9a0-477a-8492-30147681ef90
f648262e-03cc-4b28-95f8-7c8bc8e76756
month
c72a4646-3494-48b3-a827-01c0bfe1f1f0
f86a5997-86db-441f-b514-95e95c1b2b9f
date
83a77a0e-e69a-4dd3-b865-683932ac9476
2c7bed85-1955-4f3b-8dd1-2057e187ae38
hour
baa9be6c-a79a-4af2-b5e0-d2df5c48b7f0
701d2cfa-f6d4-41e7-97a5-e3ad0149374f
minute
561c916c-2e46-4029-aa02-2322d8461103
38a0557f-47f5-4431-8885-566c67b6d9b7
second
1fa52ff5-d539-46ed-b323-be2b6da9ef9a
f824a215-99b0-469a-9b91-ecb6a4a2153d
d8a6b5b7-9caa-4bd6-93c6-aa47c3e05535
Data_time
year =string_to_number(0,3);
month =string_to_number(4,6);
date =string_to_number(7,9);
hour =string_to_number(10,13);
minute =string_to_number(14,16);
second =string_to_number(17,19);
190
int temp;
temp =(Data_Time.substring(t1,t2) ).toInt();
return temp;
67
int
string_to_number
int
t1
int
t2
fda0b218-973b-4c2a-a61a-8bd73b8403d4
time_correction
cf5e167f-3f94-49b4-ad24-bc26c06f2f6d
Коррекция времени включена
dc16d7da-8b2d-444e-8a86-0afbcf4251a2
64bd47e7-e93d-4108-a5ba-b9e8dba74fc2
971afeaf-e3a1-4f00-a7cf-3ca22b0cb00c
295affd3-a789-4573-b86b-3107e2b53a90
d7ac8ead-2b50-4f6c-a4de-a662cf2de8be
6e1a8191-12b2-46b2-b267-8f1fc3ba39e9
b142f5c5-a3a5-40e5-a21f-33be91061f88
5828ae9e-3d62-4aa5-b79d-6c9d02e5aae7
year =string_to_number(0,2);
month =string_to_number(3,5);
date =string_to_number(6,8);
hour =string_to_number(9,11);
minute =string_to_number(12,14);
second =string_to_number(15,17);
if ( time_correction ){
hour +=((string_to_number(18,20))/4);
if (hour>23) hour-=24;}
272
Data_time_2
Data
c0bf7309-5ec0-4580-8d71-dc433aa1ddb8
c89e7203-b929-4646-bc90-55d3331c984c
Time
742c2657-e3a2-4684-8c86-0e266ad32205
6dbb5af6-d71f-4879-a1de-0dbe0a8a6183
6e41aa8a-bfb7-4a1e-9249-9d74b4389a92
Data_time_2
Data= Data_Time.substring(6,8)+"." +Data_Time.substring(3,5)+".20"+ Data_Time.substring(0,2) ;
hour =string_to_number(9,11);
minute =string_to_number(12,14);
if ( time_correction ){
hour +=((string_to_number(18,20))/4);
if (hour>23) hour-=24;}
Time=String(hour)+":"+String(minute);
285
18d6b63b-0d0a-44ec-96be-413126c3b072
Data_time_Строки
Блок предназначен для совместного использования с блоками M590 и SIM800
Входа
Data_Time - надо подать значение которое было выдано, одноименным выходом блоков M590 и SIM800
time_correction - коррекция времени по часовому поясу, который передает оператор связи, 1- включена 0- отключена
288
Data= Data_Time.substring(6,8)+"." +Data_Time.substring(3,5)+".20"+ Data_Time.substring(0,2) ;
int hour =string_to_number(9,11);
if ( time_correction ){
hour +=((string_to_number(18,20))/4);
if (hour>23) hour-=24;}
String h;
if (hour<10) h="0"+String(hour);
else h=String(hour);
Time=h+":"+Data_Time.substring(12,14);
320
Data_time
Data_Time
c31d73bd-15b7-463b-9ce2-12b15457af53
880b303b-aa70-44a1-8084-eedec6a0356a
year
638ff03e-f9a0-477a-8492-30147681ef90
f648262e-03cc-4b28-95f8-7c8bc8e76756
month
c72a4646-3494-48b3-a827-01c0bfe1f1f0
f86a5997-86db-441f-b514-95e95c1b2b9f
date
83a77a0e-e69a-4dd3-b865-683932ac9476
2c7bed85-1955-4f3b-8dd1-2057e187ae38
hour
baa9be6c-a79a-4af2-b5e0-d2df5c48b7f0
701d2cfa-f6d4-41e7-97a5-e3ad0149374f
minute
561c916c-2e46-4029-aa02-2322d8461103
38a0557f-47f5-4431-8885-566c67b6d9b7
second
1fa52ff5-d539-46ed-b323-be2b6da9ef9a
f824a215-99b0-469a-9b91-ecb6a4a2153d
d8a6b5b7-9caa-4bd6-93c6-aa47c3e05535
Data_time
year =string_to_number(0,3);
month =string_to_number(4,6);
date =string_to_number(7,9);
hour =string_to_number(10,13);
minute =string_to_number(14,16);
second =string_to_number(17,19);
int temp;
temp =(Data_Time.substring(t1,t2) ).toInt();
return temp;
int
string_to_number
int
t1
int
t2
fda0b218-973b-4c2a-a61a-8bd73b8403d4
time_correction
cf5e167f-3f94-49b4-ad24-bc26c06f2f6d
Коррекция времени включена
dc16d7da-8b2d-444e-8a86-0afbcf4251a2
64bd47e7-e93d-4108-a5ba-b9e8dba74fc2
971afeaf-e3a1-4f00-a7cf-3ca22b0cb00c
295affd3-a789-4573-b86b-3107e2b53a90
d7ac8ead-2b50-4f6c-a4de-a662cf2de8be
6e1a8191-12b2-46b2-b267-8f1fc3ba39e9
b142f5c5-a3a5-40e5-a21f-33be91061f88
5828ae9e-3d62-4aa5-b79d-6c9d02e5aae7
year =string_to_number(0,2);
month =string_to_number(3,5);
date =string_to_number(6,8);
hour =string_to_number(9,11);
minute =string_to_number(12,14);
second =string_to_number(15,17);
if ( time_correction ){
hour +=((string_to_number(18,20))/4);
if (hour>23) hour-=24;}
758b9f5f-f4d1-4d1a-ae6a-a51d770cbf45
Data_time_Числа
Блок предназначен для совместного использования с блоками M590 и SIM800
Входа
Data_Time - надо подать значение которое было выдано, одноименным выходом блоков M590 и SIM800
time_correction - коррекция времени по часовому поясу, который передает оператор связи, 1- включена 0- отключена
Sim800
In
733dcb6e-5b41-4cff-a699-c4c746c81d4c
25470667-0e8f-4848-9ae5-899d155b1a91
173dd596-248e-436d-8841-20975237a0db
if ( In == true)
{ // ключ нажат - вывод подтянут к высокому уровню сигнала
delay(100); // задержка для устранения дребезга контактов ключа
runnin = !runnin; // инвертирование переменной running
digitalWrite(LEDpin, runnin) ; // индикация светодиодом
}
pinMode(LEDpin, OUTPUT);
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // включить подтягивающий резистор
светодиод подключен к выводу 5
LEDpin
= 13;
int
ключ подключен к выводу 13, другой вывод подключен к земле
switchPin
= 2;
int
runnin
= false;
boolean
runnin1
= false;
boolean
In_sms
e28b2991-30d8-41e9-87dd-641dccb0757a
Phone
adc49d19-4ee9-4037-9446-147f6c73ae10
2a0a1b31-924c-4588-b575-eeb9a9e99cf9
55e0ac92-10eb-433c-90d9-23f4b60c9a5e
Последняя разработка
if ( In == true)
{
digitalWrite(LED, HIGH) ;
Serial.print("AT+CMGS=\"");
Serial.print( Phone );
Serial.println("\"");
}
else {
digitalWrite(LED, LOW) ;
}
Serial.begin(9600);
pinMode(LED, OUTPUT);
LED
= 13;
int
ae3d23c4-4c67-497d-8c24-175c9c4f37af
SIM 900
text
f0527995-7b55-4ee5-b390-efa6adaba935
08bc550c-64e3-4e3a-b14a-1e378cb3e358
a6ea1548-470b-4d48-bbd1-1e8cb1b2c223
SIM 900 Serial1
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
// Serial1.println( Text sms );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
digitalWrite(LED, LOW) ; // контрольный светодиод убрать
}
Serial1.begin(9600);
pinMode(LED, OUTPUT); //контрольный светодиод убрать
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
контрольный светодиод убрать
LED
= 13;
int
fae71e77-4801-4518-a803-bb358809b408
m590 mega2560
Reject_call
a131b89a-32b1-43b7-abc8-c9d1701fd391
Сброс звонка
7760b87d-d2b8-4192-a97f-ac059fd205a2
Net
a2d42309-5a06-48f2-a27d-221976f445c9
Подключен к сети
6875df1a-317b-40a9-ba3b-0920a48b80a1
dBm
87a64b62-2488-4116-b3c6-2229454e6d59
Уровень сигнала
375cee25-509e-4be0-882b-7192829c4f30
m590 mega2560 115200
отправка смс из строк 1-2-3
Намер телефона клиента
строка смс 1
text 1
394e2336-a382-47e0-bf1b-a826009b105f
строка смс 2
154f7805-6f31-49e3-b0a5-5185f3a7442e
text2
66a95e0d-5da0-4709-bb47-63019c1c9f0c
строка смс 3
578b7f00-0b31-4f34-b0b8-6950a45ed8ee
out
985669be-77bd-4edb-b9e4-5f276bb35f47
a9235eff-09cd-457f-b991-5f1e731f173e
9bc60d94-25b8-4547-afc9-f1e77fc816cf
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
digitalWrite(LED, LOW) ; // контрольный светодиод убрать
}
// Отправляем смс
// Принимаем смс
// if (Serial1.available() > 0)
// {
//
// out = Serial.read();
// }
контрольный светодиод убрать
LED
= 13;
int
3ce7ef08-920f-4bca-bde6-b62a8aca2d77
получено из смс
test
ea76600c-405e-417c-840d-75e17db13ddf
e8c13239-ab3d-4370-ab0e-600a2f38547a
22a40700-ca43-4380-9aca-cc7d793d3c10
SIM 900 Serial1 v1
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
else {
}
// Отправляем смс
// Принимаем смс
if (!Serial1.available())
return;
char currSymb = Serial1.read();
test = currStr;
if ('\r' == currSymb) {
if (isStringMessage) {
// если текущая строка – сообщение, то…
out = currStr;
isStringMessage = false;
}
else {
if (currStr.startsWith("+CMT")) {
// если текущая строка начинается с "+CMT", то следующая сообщение
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
Serial1.begin(9600);
delay(3000);
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("AT+IFC=1, 1\r"); //установка программного контроля потоком передачи данных
delay(300);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
для зеленого
greenPin
= 13;
int
для желтого светодиода
yellowPin
= 3;
int
если эта строка сообщение, то переменная примет значение True
currStr
= "";
String
isStringMessage
= false;
boolean
af20e311-815a-4313-ae83-81277007e616
SIM 900 Serial1 v2 test
// Отправляем смс
if ( In == true)
{
Serial1.print("AT + CMGS = \"");
delay(300);
Serial1.print( Phone );
delay(300);
Serial1.println("\"");
delay(300);
Serial1.println( text );
delay(300);
Serial1.println((char)26);
delay(300);
Serial1.println();
delay(300);
}
// Принимаем смс
if (!Serial1.available())
return;
char currSymb = Serial1.read();
if ('\r' == currSymb) {
if (isStringMessage) {
// если текущая строка – сообщение, то…
out = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
// если текущая строка начинается с "+CMT", то следующая сообщение
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
Serial1.begin(9600);
delay(3000);
// настройка шилда
Serial1.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
delay(300);
Serial1.print("AT+CLIP=1\r"); // устанавливает программный контроль потоком передачи данных
delay(300);
Serial1.print("AT+CSCS=\"GSM\"\r");
delay(300);
Serial1.println("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль.
delay(500);
Serial1.print("AT+IFC=1, 1\r"); //установка программного контроля потоком передачи данных
delay(300);
Serial1.print("ATS0=2\r"); // поднимать трубку после второго звонка
delay(500);
Serial1.print("AT+CMGD=1,4\r"); // Стираем Смс
delay(500);
// настройка шилда
currStr
= "";
String
если эта строка сообщение, то переменная примет значение True
isStringMessage
= false;
boolean
text1
text2
text3
f2dcb62c-36ba-43e9-a876-19b570640a37
7d7b74cf-5c22-43e5-9aa9-be63b7eb8dc8
text4
f83142ba-6044-4479-a24d-2af24eb3d911
8dc3e42d-ca04-4258-a7ec-6fc6426a1bfe
text5
d2fa00a5-3627-4623-9df4-349bbf8ce582
7e75afa8-3398-4753-94f0-06f29a691a0f
text6
86a0d736-b9be-4159-8362-a2a3981e0e8e
5839b677-8b33-49cd-a54c-d33b1665fa34
text7
781f5089-d490-4569-ab92-98e80f51cbd9
7162c89a-e215-4e58-9bf5-4db5b9161900
Call
out_sms
300f1901-b539-4081-8262-df47b88dd60b
m590 mega2560 115200
скорость 115200
RX3 (15) в TX модема
TX3 (14) в RX модема
инфо http://flprog.ru/forum/18-642-2
if ( In_sms == true)
{
Serial3.print("AT + CMGS = \"");
delay(300);
Serial3.print( Phone );
delay(300);
Serial3.println("\"");
delay(300);
Serial3.println( text );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text1 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text2 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text3 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text4 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text5 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text6 );
delay(1000);
Serial3.println( "\n" );
delay(300);
Serial3.println( text7 );
delay(1000);
Serial3.println((char)26);
delay(300);
Serial3.println();
delay(300);
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
Serial3.begin(115200);
delay(20000);
Serial3.println("AT+CMGF=1\r");
delay(200);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(200);
Serial3.println("AT+CNMI=2,2\r");
delay(200);
Serial3.println("AT+CLIP=1\r");
delay(200);
currStr
= "";
String
isStringMessage
= false;
boolean
726d0829-22b4-4a18-ab02-10747e6080ea
84e909e3-5164-4e1f-bf01-5944fef622ee
b669819f-f009-4898-af17-a684f491f9ab
c7beb266-fe66-4df8-8a9a-85cc88f49dfa
1e18c0e3-6ef3-4dfb-803f-7ca7306262e0
text8
d6e7d474-7b13-47dd-9c76-8c5331d9b584
cdfecbcb-d30e-4b2a-a99a-b0901c5e5737
b414533e-70e8-440b-861f-5f82caf80eef
if ( In_sms == true)
{
Serial3.print("AT+CMGS=\"+");
delay(50);
Serial3.print(Phone);
delay(50);
Serial3.println("\"");
delay(50);
Serial3.println();
delay(50);
Serial3.println(text);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text1);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text2);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text3);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text4);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text5);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text6);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text7);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text8);
delay(50);
Serial3.println((char)26);
delay(50);
Serial3.println();
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
Serial3.begin(115200);
delay(3000);
Serial3.println("AT+CMGF=1\r");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0\r");
delay(50);
Serial3.println("AT+CLIP=1\r");
5a439fd2-7f2c-4639-b0e0-ffabbd6ea9c6
sms
78a799b0-71f7-4661-9d8a-d80ade578c5b
2b6a3685-b885-4e3a-9883-9a011aa7c5c3
ce94cb6c-3b56-40eb-bcf2-b1d9c2acf222
if ( In_sms == true)
{
Serial3.print("AT+CMGS=\"");
delay(50);
Serial3.print(Phone);
delay(50);
Serial3.println("\"");
delay(50);
Serial3.println();
delay(50);
Serial3.println(text);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text1);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text2);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text3);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text4);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text5);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text6);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text7);
delay(50);
Serial3.println("\n");
delay(50);
Serial3.println(text8);
delay(50);
Serial3.println((char)26);
delay(50);
Serial3.println();
}
if (!Serial3.available());
char currSymb = Serial3.read();
if ('\r' == currSymb) {
Call = currStr;
if (isStringMessage) {
out_sms = currStr;
isStringMessage = false;
sms =true; }
else {
if (currStr.startsWith("+CMT")) {
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
sms = false;
}
delay(2000);
Serial3.begin(115200);
delay(50);
Serial3.println("AT+CMGF=1\r");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"\r");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0\r");
delay(50);
Serial3.println("AT+CLIP=1\r");
delay(50);
Received_SMS
18039b27-cb01-4ce5-bd77-e8455fb0e496
Получена СМС
Текст СМС
T_Nomer
Номер с которого пришло СМС
Sent_SMS
1174c3e1-c5ae-46ca-bc4e-f32953816209
Отправлена СМС
d535058c-83fc-4da3-ae1a-7c562d9e8eae
ERROR
90a1f2ef-7628-4a3b-9476-873b328f1edf
Ошибка отправка СМС
2575f78c-25fc-401a-9ceb-eade206ea0e7
5534ccac-65c1-4b31-8bb9-483c15f3bd04
скорость 115200
RX3 (15) в TX модема
TX3 (14) в RX модема
инфо http://flprog.ru/forum/18-642-2
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
ERROR :
0- норма;
1- неверный номер отправления;
2 - Ошибка при отрпвлении
3- Нет ответа от модуля при отправки сообщения
speed
Скорость порта, см описание
f32f9e34-ce80-45b3-9050-077e33f7d03a
689d6ab0-dd41-41ef-920f-f8dd0336a9f8
DELL_SMS
Отчистка СМС
07cee270-f81f-488c-8574-bd5b26a650b5
b4aada34-d9f0-46b3-81af-c42ebc3b551d
Received_SMS =0;
Sent_SMS =0;
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if ( _trgrt1 && !Triger_)
{
if ( Phone.length() > 4) { Triger_=1; count_=0;}
else { ERROR =1; Triger_=0;}
}
if(Triger_)
{
if (return==1) {Triger_=0; ERROR =0; return=0; Sent_SMS =1;}
else if (return==2){Triger_=0; ERROR =2; return=0;}
if( millis() >=time1) {
time1 =millis() + 100;
switch ( count_ ) {
case 0:
Serial3.print("AT+CMGF=1\r");
break;
case 1:
Serial3.println("AT+CMGS=\"+ Phone +\"");
break;
case 2:
Serial3.println(text);
break;
case 3:
Serial3.println(text1);
break;
case 4:
Serial3.println(text2);
break;
case 5:
Serial3.println(text3);
break;
case 6:
Serial3.println(text4);
break;
case 7:
Serial3.println(text5);
break;
case 8:
Serial3.println(text6);
break;
case 9:
Serial3.println(text7);
break;
case 10:
Serial3.println(text8);
break;
case 11:
Serial3.println((char)26);
break;
case 12:
time1 =time1 + 4900;
break;
default:
Triger_=0;
ERROR =3;
}
count_++;
}
}
while(Serial3.available())
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(line); line = ""; }
else
line += ch;
}
delay(2000);
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
isStringMessage
= false;
boolean
Ответ модема на команду 1-OK 2-ERROR
return
=0;
byte
line
;
String
ch
;
char
time1
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
ошибки 0-норма 1- неверный номер
err
=0;
byte
if (isStringMessage)
{
out_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
T_Nomer=line.substring(t1+1,t1+13);
isStringMessage = true;
}
if (line == F("ERROR")) // ошибка
return=2;
if(line == F("OK")) // всё ок
return=1;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
void
GotLineFromNeoway
const String&
line
Text_sms
Ошибка
Call
1bddc233-0f62-460d-8695-120adebe04e8
Входящий вызов
bae63d59-68bd-4419-acb3-1c4808c819e6
51d90042-7a76-4e4d-aff5-88f543961e95
m590 mega2560_Т2
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Выходы
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС
ERROR : Код ошибки, появляется только на 1 програмный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - недопустимый номер для отправки СМС
16e12fff-4256-4d68-b8a2-5a4d17930a64
Time_wait
Время ожидание ответа модуля, мс
b83e41f8-5061-49f7-8ae0-d3fa683da2b0
1236d93b-73c6-4e26-a38c-fca5f3630a9d
Time_Net
Период проверки связи с сетью, мс
19320255-4a11-446a-8be1-c2e745fb9fb1
03376554-1469-40d2-af28-6c264ae6c7e2
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
ERROR =0; //Сбром ошибки
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(line); line = ""; }
else line += ch;
}
//---Отправка СМС--
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if (_trgrt1 ) s_sms=1;
if ( s_sms && !busy) //можно ли отправлять СМС
{
s_sms=0;
if ( Phone.length() > 4) { Triger_=1; busy=1;} //проверка корректности номера
else(ERROR =3;)
}
if(Triger_)
{
if (sms_sent()){ Triger_=0; busy=0; }
}
//Авто проверка связи
if( (Time_Net >0)&&!busy)
{
if((millis()-time_n)> Time_Net){time_n=millis(); busy=1; Net_T=1;}
}
if(Net_T)
{
if (net_status()){ Net_T=0; busy=0; }
}
//Обработка входящего вызова
if (isRing) {busy=1; Call =1;}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;};
if(Call) {if (incoming_call()){ Call =0; busy=0; }}
if(Call&&_trgrt2) {AT("ATH");}
delay(2000); //пауза на включение модуля
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
isStringMessage
= false;
bool
final
=0;
bool
ожидание ответа от модуля
wait
=0;
bool
Ответ модема на команду 1-OK 2-ERROR
M_return
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
Net_T
=0;
bool
isRing
=0;
bool
s_sms
=0;
bool
идет запрос, запрет других операций.
busy
=0;
bool
M_return=3;
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
if (line == F("RING")) isRing=1; //Всходящий звонок
if (line == F("ERROR")) // ошибка
M_return=2;
if(line == F("OK")) // всё ок
M_return=1;
if(M_return==3)reply=line;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
bool st=0;
byte ret;
switch ( count_ ) {
case 0:
ret=AT("AT+CMGF=1\r",1);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
case 1:
ret=AT("AT+CMGS=\""+ Phone +"\"\r" + text + (char)26, 2);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
default:
Sent_SMS =1;
st=1;
}
if (st)count_=0;
return st;
bool
sms_sent
byte ret=0;
if(wait)
{
switch (M_return) {
case 1:
M_return=0;
ret=1;
break;
case 2:
M_return=0;
ERROR =1;
ret=2;
break;
case 3:
M_return=0;
ret=3;
break;
}
if(millis()>time1){ERROR=2; ret=2;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text);
else if(tip==2) Serial3.println(text);
}
}
return ret;
byte
AT
String
text
byte
tip
bool st=0;
byte ret;
switch ( count_ ) {
case 0:
ret=AT("AT+CREG?",2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
}
break;
case 1:
ret=AT("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:"))
{
int t1=line.indexOf(":");
if(t1>-1) dBm =( ( (line.substring(t1+1,t1+3) ).toInt())*(2) );
if(dBm>0) dBm=-120; //нет сети
}
break;
default:
st=1;
}
if (st)count_=0;
return st;
bool
net_status
bool st=0;
switch (M_return) {
case 1:
M_return=0;
st=1;
break;
case 2:
M_return=0;
ERROR =1;
st=1;
break;
case 3:
M_return=0;
if (reply.startsWith(F("+CLIP:"))
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (reply == F("NO CARRIER")) st=1;
}
if(ret==1) count_++;
else if(ret==2)
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
}
break;
case 1:
ret=AT("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:"))
{
int t1=line.indexOf(":");
if(t1>-1) dBm =( ( (line.substring(t1+1,t1+3) ).toInt())*(2) );
if(dBm>0) dBm=-120; //нет сети
}
break;
default:
st=1;
}
return st;
if(millis()>time1){ERROR=2; ret=2;}
}
else
bool
incoming_call
4429c943-1cc9-4540-bda4-c520defcda3d
Get_Balance
933e1a73-f90e-4922-a024-e7f8ae08cff2
Запрос баланса
0e66f15d-c493-46f9-9441-ebf06db3217a
Error_Code
bc84d102-ca7a-4b18-9805-5166f55a9107
Number_calls
bb5716b0-2334-4309-9215-72ead220c33b
Номер текущего гудка
213e77f7-84ed-4fe6-899e-b01d1d0eb571
202aced0-0626-4389-b3d2-41e2fc6408a1
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - недопустимый номер для отправки СМС
69fc39f5-2c9b-4937-8e5b-fdf42810d8a1
89378369-f9fc-4a14-816f-f17193042731
delay(5000);//тест удалить
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
Error_Code =0; //Сбром ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;
}
if (Call&&(team_room!=1) )
{
team_room==1;
count_=0; wait=0; //Сброс состояний обработки других функций
Number_calls=0; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли оптраву смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =3;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((millis()-time_n)> Time_Net){time_n=millis(); team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
switch ( team_room ) {
case 1:
if(_trgrt2) Call_T=1;
if(Call_T&&AT_Command("ATH0",2)){Call_T=0; final =1; Call=0; }
break;
case 2:
if (sms_sent()){ final =1; } // отправка сообщения
break;
case 3:
if (net_status()){ final =1;}// проверка связи с сетью
break;
if (final)team_room=0; //должно быть последним
delay(2000); //пауза на включение модуля
Serial3.begin( speed );
delay(50);
Serial3.println("AT+CMGF=1");
delay(50);
Serial3.println("AT+CSCS=\"GSM\"");
delay(50);
Serial3.println("AT+CNMI=2,2,0,0,0");
delay(50);
Serial3.println("AT+CLIP=1");
delay(50);
Serial3.println("ATE0");
delay(50);
isStringMessage
= false;
bool
final
=0;
bool
ожидание ответа от модуля
wait
=0;
bool
Ответ модема на команду 1-OK 2-ERROR
M_return
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
isRing
=0;
bool
s_sms
=0;
bool
идет запрос, запрет других операций.
busy
=0;
bool
Serial.println(line); //!!!!!!! Убрать
//Обработка СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (line == F("RING")){ Call =1; Number_calls ++;}//Всходящий звонок
if (Call==1)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (line == F("NO CARRIER")) { Call=0;}
}
//____
reply=line;
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
void
GotLineFromNeoway
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
ret=AT_Command("AT+CMGF=1\r",1);
if(ret==1) count_++;
else if(ret==2) st=1;
break;
case 1:
ret=AT_Command("AT+CMGS=\""+ Phone +"\"\r" + text + (char)26, 2);
if(ret==1) {Sent_SMS =1; st=1;}
else if(ret==2) st=1;
break;
}
if (st){count_=0; }
return st;
// tip 1- без \r и \n
// tip 2- с \r и \n
byte ret=0;
if(wait)
{
if(reply == F("OK"))
{ ret=1; wait=0; }
else if(reply == F("ERROR"))
{ Error_Code =1; ret=2; wait=0; }
if(millis()>time1)
{Error_Code=2; ret=2; wait=0;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
}
return ret;
byte
AT_Command
String
text_com
byte
tip
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
ret=AT_Command("AT+CREG?",2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply == F("+CREG: 0,1")) Net =1;
else Net =0;
reply=""; wait=0;
}
break;
case 1:
ret=AT_Command("AT+CSQ", 2);
if(ret==1) count_++;
else if(ret==2) st=1;
else if(ret==3)
{
if (reply.startsWith(F("+CSQ:")))
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if(dBm>0) dBm=-120; //нет сети
reply=""; wait=0;
}
}
break;
case 2:
st=1;
break;
}
if (st)count_=0;
return st;
// tip 1- без \r и \n
// tip 2- с \r и \n
byte ret=0;
if(wait)
{
if(reply.startsWith(response_com))
{ret=3;}
else if(reply == F("ERROR"))
{ Error_Code =1; ret=2; wait=0; }
else if(reply == F("OK"))
{ ret=1; wait=0; }
if(millis()>time1)
{Error_Code=2; ret=2; wait=0;}
}
else
{
time1 =millis() + Time_wait;
wait=1;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
}
return ret;
byte
AT_Command
String
text_com
byte
tip
String
response_com
Balance
0a59f7bd-e80f-4fab-863f-b25df021e23a
Баланс на Sim
bb2c1ffd-ef1d-4a59-90f6-ca709fa9e70a
f2a4bf19-ff62-4760-8e07-c9e05d8fc91c
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_Balance - по переднему фронту отправляется запрос на балланс
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Balance - остаток средств м
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
10 - недопустимый номер для отправки СМС
delay(500);//Тест удалить
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
Error_Code =0; //Сбром ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
while(Serial3.available()) //Получаем данные с модема
{
ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;
}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=0; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((millis()-time_n)> Time_Net){time_n=millis(); team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_Balance ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& (AT_Answer("")==1) ){Call=0; }
if (!Call) {Call_T=0; final =1;}
break;
case 2:
if (sms_sent()){ final =1; } // отправка сообщения
break;
case 3:
if (net_status()){ final =1;}// проверка связи с сетью
break;
case 4:
if ( balance_S() ){ final =1;}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
Buffer
[5] ;
String
index_buffer
=0;
byte
isStringMessage
= false;
bool
final
=0;
bool
Номер исполняемой команды
team_room
=0;
byte
line
;
String
Ответ модуля на команду
reply
;
String
ch
;
char
Время посылки команды
time1
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
Triger_
= 0;
bool
count_
=0;
int
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
bool isRing=0;
bool busy=0; //идет запрос, запрет других операций.
bool wait=0; //ожидание ответа от модуля
byte M_return=0; // Ответ модема на команду 1-OK 2-ERROR
if (line.length()>0)
{
Buffer[index_buffer]=line;
if(index_buffer<3) index_buffer++;
}
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
int t1=line.indexOf("\"+");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (line == F("RING")){ Call =1; Number_calls ++;}//Всходящий звонок
if (Call==1)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
int t1=line.indexOf("\"7");
int t2=line.indexOf("\"",(t1+1));
if((t1>0)&&(t2>0)) T_Nomer=line.substring(t1+1,t2);
else T_Nomer="";
}
if (line == F("NO CARRIER")) { Call=0; }
}
//____
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
// tip 1- без \r и \n
// tip 2- с \r и \n
time1 =millis() + Time_wait;
if(tip==1) Serial3.print(text_com);
else if(tip==2) Serial3.println(text_com);
void
AT_Command
String
text_com
byte
tip
byte ret=0;
bool ok_=0;
bool ok_2=0;
if (index_buffer>0)
{
for (int i =(index_buffer-1); i >=0 ; i--)
{
if(Buffer[i] == F("ERROR")){ret=2; Error_Code =1; break;}
if(Buffer[i] == F("OK")){ ok_=1; continue; }
if (response_com.length()>0)
{ if(Buffer[i].startsWith(response_com)){ok_2=1; reply=Buffer[i];} }
}
}
if(ok_)ret=1;
if (response_com.length()>0 && !ok_2 ) {ret=2; Error_Code =3;}
if(millis()>time1)
{Error_Code=2; ret=2; }
return ret;
byte
AT_Answer
String
response_com
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
count_++;
break;
case 1:
ret=AT_Answer("+CREG");
if(ret==1)
{
count_++;
if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
}
else if(ret==2) st=1;
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
count_++;
break;
case 3:
ret=AT_Answer("+CSQ");
if(ret==1)
{
st=1;
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBmt >0) dBm =-120; //нет сети
}
else if(ret==2) st=1;
break;
}
if (st)count_=0;
return st;
bool
net_status
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
count_++;
break;
case 1:
ret=AT_Answer("");
if(ret==1) {count_++;}
else if(ret==2) st=1;
break;
case 2:
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
AT_Command( text+(char)26 ,2 );
count_++;
break;
case 3:
ret=AT_Answer("");
if(ret==1) {Sent_SMS =1; st=1;}
else if(ret==2) st=1;
break;
}
if (st){count_=0; }
return st;
bool
sms_sent
bool st=0;
byte ret=0;
switch ( count_ ) {
case 0:
AT_Command("ATD#100#",2 ) ;
count_++;
break;
case 1:
ret=AT_Answer("+CUSD");
if(ret==1)
{
st=1;
int t1=reply.indexOf(":",reply.indexOf("\""));
iif(t1>-1)nt t2=reply.indexOf(",",t1);
if(t1>-1&&t2>-1) Balance = (reply.substring(t2+1,t3+3)).toFloat();
}
else if(ret==2) st=1;
break;
}
if (st)count_=0;
return st;
bool
balance_S
Get_USSD
USSD_CODE
38590813-5522-4717-89bf-668832b33791
b8c6eec4-ddb3-416b-a9f6-6735425c4160
Operator
24231129-7540-4a4c-b6e4-3dc2fb895ab3
Оператор связи
5cc973ee-0b24-4273-8534-db222aa743e3
09e5b079-047f-4218-b4e0-5b53c5622692
m590 mega2560_ТN4
инфо http://flprog.ru/forum/18-642-2
RX3 (15) в TX модема
TX3 (14) в RX модема
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_Balance - по переднему фронту отправляется запрос на балланс номера
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
Balance - остаток средств на номере
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
//Error_Code =0; //Сброc ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
T_millis =millis();
if (Serial3.available()||wait_Serial){
if (!wait_Serial){wait_Serial=1; time_Serial=T_millis+200;}
if (T_millis >time_Serial)//ожидаем полного получения команды
{wait_Serial=0;
while(Serial3.available()) //Получаем данные с модема
{ch = Serial3.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
}
}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0; response_com="";}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; response_com="";}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_Balance ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
ttttt
=1;
bool
isStringMessage
= false;
bool
final
=0;
bool
wait
=0;
bool
err
=0;
bool
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
// tip 1- без \r и \n
// tip 2- с \r и \n
wait=1;
count_++;
time1 =T_millis + Time_wait;
if(tip==1) Serial3.print(text_com);
else if(tip==2){ Serial3.println(text_com); }
else if(tip==3){
Serial3.print(text_com);
Serial3.println((char)26);
}
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply) ;
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
}
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( text ,3 );
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATD#100#",2 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
Balance = substring_commas(reply) ;
count_=0;
st=1;
}
break;
}
return st;
String test_res;
int t1=text_analyze.indexOf("\"");
int t2=text_analyze.indexOf("\"",(t1+1));
if((t1>-1)&&(t2>-1)) test_res=text_analyze.substring(t1+1,t2);
else test_res="";
return test_res;
String
substring_commas
String
text_analyze
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 1:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 2:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 3:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 4:
AT_Command("ATE0" ,2 ) ;
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
count_++;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
count_++;
break;
case 9:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool
setup_comand
USSD_return
Ответ на запрос
20a0dbb2-d85e-4f1a-9a08-4e6a52f5fc92
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы сCOM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы сCOM порт 3
// #define SERIAL_M Serial_S // для работы сCOM Software
// #include <SoftwareSerial.h> // для работы сCOM Software
// SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
Error_Code : Код ошибки, появляется только на 1 программный цикл
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
RX
Номер пина, см описание
2442ead9-2f53-4a6d-8299-db1be1540ae1
6fe9eca6-8a6e-4b35-9b52-c72d1faadca0
TX
Номер пина, см описание
24d51b0e-0678-46ce-9885-8f84bb6984b4
c4f394bd-ed86-4487-bd48-4f4dadef276b
Time_USSD
Время ожидания ответа на USSD запрос, мс
4d316b51-aa14-428b-b843-eee5c7f3fb95
9db05ae9-68f2-4374-8ecb-481091b7e4d7
delay(1000);//!!!!Тест удалить!!!!
Serial.print("Start_"); //Тест
Serial.print(start); //Тест
Serial.print("_Nah_P_");// !!! ТЕст
Serial.print(team_room); //!!! ТЕст
Serial.print("_O_");// !!! ТЕст
Serial.print(wait);// !!! ТЕст
Serial.print("_S_");// !!! ТЕст
Serial.print(count_);// !!! ТЕст
Serial.print("_AT2_");// !!! ТЕст
Serial.println(return_AT_2);// !!! ТЕст
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
//Error_Code =0; //Сброc ошибки
reply=""; //Сброс содержимого прошлого ответа модуля
T_millis =millis();
if (SERIAL_M.available()||wait_Serial){
if (!wait_Serial){wait_Serial=1; time_Serial=T_millis+200;}
if (T_millis >time_Serial)//ожидаем полного получения команды
{wait_Serial=0;
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
Serial.print(ch);// !!! ТЕст
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
}
}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0; response_com="";}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; response_com="";}
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
//delay(2000); //пауза на включение модуля
SERIAL_M.begin( speed );
/*
delay(50);
SERIAL_M.println("AT+CMGF=1");
delay(50);
SERIAL_M.println("AT+CSCS=\"GSM\"");
delay(50);
SERIAL_M.println("AT+CNMI=2,2,0,0,0");
delay(50);
SERIAL_M.println("AT+CLIP=1");
delay(50);
SERIAL_M.println("ATE0");
delay(50);
*/
Разкоментировать нужное (Убрать перед нужной строкой символы "//")
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы сCOM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
для работы сCOM порт 3
#define
SERIAL_M
Serial3
#define SERIAL_M Serial_S // для работы сCOM Software
#include <SoftwareSerial.h> // для работы сCOM Software
SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
Флаг того, что модуль инициализирован
start
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Serial.print("OTVET_");//Тест
Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (line == F("+PBREADY")){ start_N=1; start=0; err=1;}//Сообщение от модуля о том что он стартовал
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
// tip 1- без \r и \n
// tip 2- с \r и \n
Serial.print("Sapros_");//Тест
Serial.println(text_com); //Тест
wait=1;
count_++;
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
SERIAL_M.print(text_com);
SERIAL_M.println((char)26);
}
else if(tip==4){time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
count_++;
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply) ;
count_++;
}
break;
case 6:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command(("AT+CUSD=1,\""+ USSD_CODE +"\",15"),4 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
USSD_return = substring_commas(reply) ;
count_=0;
st=1;
}
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 2:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 3:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
count_++;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 9:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
m590
Answer_call
3bdec9f3-23d8-46d8-a55d-c5b7e6c28cf7
Ответить на звонок
faa3a312-3e35-480f-bee5-01c9300f7e81
start
92ccc762-3d54-464a-8301-20848c7b9d4a
Флаг того, что модуль инициализирован
3d82746c-c501-4351-b51a-019a18253b6b
fce13b85-48cc-49c4-b122-75d2ba233b44
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы сCOM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы сCOM порт 3
// #define SERIAL_M Serial_S // для работы сCOM Software
// #include <SoftwareSerial.h> // для работы сCOM Software
// SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС (входящего вызова, при входящем вызове номер без +)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
start- статус того что модуль стартовал и успешно прошел инициализацию AT командами.
Error_Code :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
10 - недопустимый номер для отправки СМС
ba343838-5e80-48f7-a398-2d132942cbc1
#define
Module_Start
"+PBREADY"
Разкоментировать нужное (Убрать перед нужной строкой символы "//")
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы сCOM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
для работы сCOM порт 3
#define
SERIAL_M
Serial3
#define SERIAL_M Serial_S // для работы сCOM Software
#include <SoftwareSerial.h> // для работы сCOM Software
SoftwareSerial Serial_S( RX , TX ); // для работы сCOM Software
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
wait_Serial
=0;
bool
ch
;
char
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Serial.print("OTVET_");//Тест
Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>0){
if(line.startsWith(response_com)){reply=line;}
else {Error_Code =3; err=1;} }
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{
//Получение номер телефона отправителя
T_Nomer = substring_commas(line) ;
isStringMessage = true;
}
//______
// Обработка входящих вызовов
if (Call)
{
if (line.startsWith(F("+CLIP"))) //Определение номера звонящего
{
T_Nomer = substring_commas(line) ;
}
if (line == F("NO CARRIER")) { Call=0; }
}
if (line == F("RING")){ Call=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том что он стартовал
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
a95512ac-60f8-446a-87a3-63d7cc38b1c9
Data_Time
996e20e4-4cc0-4acc-bbce-f6c4ac39e168
Текущие дата и время
2b01d1c6-a5e1-470e-a6b6-dbc8758e3269
4805ff1a-e1d2-4de1-87a9-9850f238ec86
m590_ТN5
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
//Раcкоментировать нужное
//
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы с COM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
//#define SERIAL_M Serial3 // для работы с COM порт 3
//Для работы сCOM Software следующие две строки
#include <SoftwareSerial.h>
SoftwareSerial SERIAL_M( RX , TX );
//Конец блока настройки Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Name_Contaсt - Префикс имени контакта, по этой части осуществляется поиск в телефонной книге
Number_Contacts - Максимальное число рабочих кантакотов
ON_OFF_Time - синхронизация времени с оператором связи, 1-вкл 0-выкл
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Operator - имя оператора сотовой связи
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС/звонящего или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
start- статус того, что модуль стартовал и успешно прошел инициализацию AT командами.
Error_Code :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
6 - ошибка работы с телефонной книгой
7- привышен допустимый лимит длинны ответа
10 - недопустимый номер для отправки СМС
Name_Contaсt
Test
Префикс имени контакта
890b2a3c-413e-4c4a-b130-935d7b65cfd9
55b895de-3777-4653-9954-2f812afabd85
Number_Contacts
Максимальное число рабочих кантакотов
b55733e8-d0c6-4866-8142-c19f844ab720
05a2a1f3-c3e5-47c9-a64f-3e720a8edf29
ON_OFF_Time
Синхронизация времени 1- включена
7dddcca2-4804-4723-be17-12d66143792e
cdcd5376-57c5-46db-83e6-da84013cd42e
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; }
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; Call_P1=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
SERIAL_M.begin( speed );
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для M590 Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"+PBREADY"
для M590 Сообщение от модуля после которого с ним можно работать
#define
For_Start_time
"MODEM:STARTUP"
#define Module_Start "Call Ready" // для SIM800/SIM900 Сообщение от модуля после которого с ним можно работать
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
bool _trgrt4= 0;
bool _trgrt4I= 0;
Call_P1
=0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
ch
;
char
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1){
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else {Error_Code =3; err=1;}}
}
if (reply.length()>180){reply=""; Error_Code =7; err=1;}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;}
// Обработка входящих вызовов
if (Call_P1){Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; Call_P1=0;}
}
if (line == F("RING")){ Call_P1=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том, закончил загрузку
if( ON_OFF_Time ) { //Включение синхронизации времени
if (line == F(For_Start_time)){ AT_Command("AT+CTZU=1",2);}//Сообщение от модуля о том, что он стартовал, отправка команды на синхронизацию времени.
}
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
// tip 1- без \r и \n
// tip 2- с \r и \n
//Serial.print("Sapros_");//Тест
//Serial.println(text_com); //Тест
wait=1;
count_++;
flag_start_line=0;
reply=""; //Сброс содержимого прошлого ответа модуля
response_com=""; //Сброс содержимого ожидаемого ответа модуля
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 1:
if(return_AT_2)
{if (reply == F("+CREG: 0,1"))Net =1;
else Net =0;
count_++;}
break;
case 2:
AT_Command("AT+CSQ" ,2 ) ;
response_com=F("+CSQ");
break;
case 3:
if(return_AT_2)
{
int t1=reply.indexOf(": ");
if(t1>-1) dBm =(( ( (reply.substring(t1+2,t1+4) ).toInt())*(2) )-(113));
if( dBm >0) dBm =-120; //нет сети
count_++;
}
break;
case 4:
AT_Command("AT+COPS?" ,2 ) ;
response_com=F("+COPS");
break;
case 5:
if(return_AT_2)
{
Operator = substring_commas(reply, 5) ;
count_++;
}
break;
case 6:
if (ON_OFF_Time) {
AT_Command("AT+CCLK?" ,2 ) ;
response_com=F("+CCLK");
}
else count_+=2;
break;
case 7:
if(return_AT_2)
{
Data_Time = substring_commas(reply, 5) ;
count_++;
}
break;
case 8:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool st=0;
int ind_arr;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
ind_arr= _StringArray( Contact , Number_Contacts , Phone );
if (ind_arr>-1) Phone = Telefon [ ind_arr ];
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( (text+(String( (char)26 ))) , 2);
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command(("AT+CUSD=1,\""+ USSD_CODE +"\""), 3 ) ;
response_com=F("+CUSD");
break;
case 1:
if(return_AT_2)
{
USSD_return = substring_commas(reply,5) ;
count_=0;
st=1;
}
break;
}
return st;
String test_res;
int t1=text_analyze.indexOf("\"", position);
int t2=text_analyze.indexOf("\"",(t1+1));
if(t1>-1){
if(t2>-1) test_res=text_analyze.substring(t1+1,t2);
else test_res=text_analyze.substring(t1+1);}
else test_res="";
return test_res;
String
substring_commas
String
text_analyze
int
position
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 2:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 3:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 9:
AT_Command("AT+CPBS?",2);
response_com=F("+CPBS");
break;
case 10:
if(return_AT_2)
{
if (reply.startsWith(F("+CPBS: \"SM\""))){count_++;}
else {Error_Code =6; count_=0; st=1; }
}
break;
case 11:
AT_Command("AT+CPBF=\"" +(String( Name_Contaсt ))+"\"" ,2 ) ;
index_array =0;
break;
case 12:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
for (int i = 0; i < arraySize; i = i + 1)
{if(array[i].equals(value)){return i;}}
return -1;
int
_StringArray
String
array[]
int
arraySize
String
value
93cff0f4-4a6f-4a40-9dd8-23f5363aac2f
m590_Т6
7722d945-60b2-40cf-a079-d7dad6060631
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {Error_Code=2; err=1;}}
if (start_T ){ if((T_millis- time1) >2000 ){AT_Command("AT+CTZU=1",2); start_T=0;}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; }
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
if ( Answer_call ) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;}; //импульс на ответ вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt4) { AT_Command("ATA",2);}
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; Call_P1=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
2631
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для M590 Сообщение от модуля после которого нужно отправлять команду на синхронизацию времени.
#define
For_Start_time
"MODEM:STARTUP"
для M590 Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"+PBREADY"
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
start_T
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
_trgrt4
= 0;
bool
_trgrt4I
= 0;
bool
Call_P1
=0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
ch
;
char
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1){
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else {Error_Code =3; err=1;}}
}
if (reply.length()>180){reply=""; Error_Code =7; err=1;}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;}
// Обработка входящих вызовов
if (Call_P1){Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; Call_P1=0;}
}
if (line == F("RING")){ Call_P1=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том, закончил загрузку
if( ON_OFF_Time ) { //Включение синхронизации времени
if (line == F(For_Start_time)){start_T=1; time1 = T_millis ;}}
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
2192
// tip 1- без \r и \n
// tip 2- с \r и \n
//Serial.print("Sapros_");//Тест
//Serial.println(text_com); //Тест
wait=1;
count_++;
flag_start_line=0;
reply=""; //Сброс содержимого прошлого ответа модуля
response_com=""; //Сброс содержимого ожидаемого ответа модуля
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
1530b73d-b17e-43fe-a1f4-f61a7242781e
Dial_call
8531d876-16dd-4f80-adb7-607ce434f048
Позвонить на номер
5d666faf-e9e0-49c8-ba52-a2b40e496a94
DTMF_
e8cdb352-6164-4c70-bf55-e0b3e2601f85
8cb0ee06-e0f6-42c8-91e4-98cd108fc529
46a8df77-a970-4fc2-af8d-ab0e75db9f23
Sim800
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; }
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( Phone.length() > 4) {team_room=2;} //проверка корректности номера
else Error_Code =10;
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
if ( Answer_call ) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;}; //импульс на ответ вызова
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
if(_trgrt4) { AT_Command("ATA",2);}
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if(Call_T&& return_AT_2 ){Call=0; Call_P1=0; count_=0; }
if (!Call) {Call_T=0; final =1; T_Nomer ="";}
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
2544
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для SIM800/SIM900 Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"SMS Ready"
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
start_T
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
_trgrt4
= 0;
bool
_trgrt4I
= 0;
bool
Call_P1
=0;
bool
Call_T
=0;
bool
Net_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
ch
;
char
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1){
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else {Error_Code =3; err=1;}}
}
if (reply.length()>180){reply=""; Error_Code =7; err=1;}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;}
// Обработка входящих вызовов
if (Call_P1){ AT_Command("AT+DDET=1",2); Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; Call_P1=0;}
if (line.startsWith(F("+DTMF"))) { DTMF_ =line;}
}
if (line == F("RING")){ Call_P1=1; Number_calls ++; wait=0;}//Всходящий звонок
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том, закончил загрузку
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
2151
e1cd2f99-fc67-4f3a-a328-63077613bc65
Connect_
909ffebb-28ac-4f41-8310-ae73abe57eaa
38062d34-ba70-44f5-90ea-10526ee75cf6
93d4988a-c1a5-4c80-98cd-94e4cefa48a3
инфо http://flprog.ru/forum/18-642-2
Настрока модуля под себя
В секции DeclareSection убрать знак комметария только в нужны строках (Убрать перед нужной строкой символы "//")
//Раcкоментировать нужное
//
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы с COM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
//#define SERIAL_M Serial3 // для работы с COM порт 3
//Для работы сCOM Software следующие две строки
#include <SoftwareSerial.h>
SoftwareSerial SERIAL_M( RX , TX );
//Конец блока настройки Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек
RX, TX - номера пинов для подключения модуля при варинате SoftwareSerial, при использование аппаратных портов, значение роли не играет.
Time_wait - время ожидание ответа (в мс), в случаи его превышения Error_Code=2
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Name_Contaсt - Префикс имени контакта, по этой части осуществляется поиск в телефонной книге
Number_Contacts - Максимальное число рабочих кантакотов
ON_OFF_Time - синхронизация времени с оператором связи, 1-вкл 0-выкл
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой)
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100#
Answer_call - Ответить на звонок
Выходы
Net - регистрация :1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Operator - имя оператора сотовой связи
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст СМС
T_Nomer - Строка содержащая номер отправителя СМС/звонящего или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
Call - пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле заервшение текущего и постепления нового звонка.
USSD_return - ответ на USSD запрос
start- статус того, что модуль стартовал и успешно прошел инициализацию AT командами.
Error_Code :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
6 - ошибка работы с телефонной книгой
7- привышен допустимый лимит длинны ответа
10 - недопустимый номер для отправки СМС или звонка
11 - Занят другим сеансом связи
12 -Нет ответа
13 -Вызов сброшен
2804
ON_OFF_Time
ea47b39b-4155-41f5-a5d1-9a1019047a42
f089100d-dfe4-4a3f-b583-61c33f650b03
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; }
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( number_search()) {team_room=2;} //проверка корректности номера
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if ( Answer_call ) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;}; //импульс на ответ вызова
if ( Dial_call ){ if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;};//импульс наисходящий вызов
if (_trgrt5 ) Dial_T =1;
if ( Dial_T && (team_room==0) ) // начинать исходящий вызов
{Dial_T=0;
if ( number_search()) { AT_Command("ATD"+ Phone+";" ,2);} team_room=5; Dial_response_code=0;}
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
//Обратотка входящего вызова
if(_trgrt4) {Call_T2=1; AT_Command("ATA",2);}
if (return_AT_2){
if(Call_T ){Call=0; }
if(Call_T2 ){ Connect_ =1; }
}
if (!Call) {Call_T=0; final =1; Call_P1=0; count_=0; Connect_ =0; }
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
case 5:
if (!wait&& !Connect_ ){
if(Dial_response_code==1) Connect_=1;
else if(Dial_response_code==2) Error_Code =11; err=1;
else if(Dial_response_code==3) Error_Code =12; err=1;
else if(Dial_response_code==4) Error_Code =13; err=1;}
if (return_AT_2&&Call_T){ Connect_=0; final =1; count_=0; Call_T=0;}
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
3298
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для SIM800/SIM900 Сообщение от модуля после которого с ним можно работать
#define
Module_Start
"+PBREADY"
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
start_T
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
_trgrt4
= 0;
bool
_trgrt4I
= 0;
bool
_trgrt5
= 0;
bool
_trgrt5I
= 0;
bool
Call_P1
=0;
bool
Call_T
=0;
bool
Call_T2
=0;
bool
Net_T
=0;
bool
Dial_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
ch
;
char
Dial_response_code
=0;
byte
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1){
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else {Error_Code =3; err=1;}}
}
if (reply.length()>180){reply=""; Error_Code =7; err=1;}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;}
// Обработка входящих вызовов
if (Call_P1){ Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; }
}
if ( Connect_ ){ if (line.startsWith(F("+DTMF"))) { DTMF_ =line;} }
if (line == F("RING")){ Call_P1=1; Number_calls ++; wait=0;}//Всходящий звонок
if (team_room==5)
{
if (line == F("CONNECT"))Dial_response_code=1;
if (line == F("BUSY"))Dial_response_code=2;
if (line == F("NO ANSWER"))Dial_response_code=3;
if (line == F("NO CARRIER"))Dial_response_code=4;
}
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том, закончил загрузку
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
2348
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
AT_Command("AT+CMGS=\""+ Phone +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( (text+(String( (char)26 ))) , 2);
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
324
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 2:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 3:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 9:
AT_Command("AT+DDET=1",2);
break;
case 10:
AT_Command("AT+CPBS?",2);
response_com=F("+CPBS");
break;
case 11:
if(return_AT_2)
{
if (reply.startsWith(F("+CPBS: \"SM\""))){count_++;}
else {Error_Code =6; count_=0; st=1; }
}
break;
case 12:
AT_Command("AT+CPBF=\"" +(String( Name_Contaсt ))+"\"" ,2 ) ;
index_array =0;
break;
case 13:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
1151
int ind_arr;
if ( Phone.length() <4) Error_Code =10; return 0;
ind_arr= _StringArray( Contact , Number_Contacts , Phone );
if (ind_arr>-1) Phone = Telefon [ ind_arr ];
return 1;
179
bool
number_search
Connect_
Установлено голосовое соединение
20a47ce1-09d9-4b77-8ee1-28691e8fe5e9
Sim800_v1.0
инфо http://flprog.ru/forum/18-642-2
Настройка модуля под себя
В секции DeclareSection убрать знак комментария только в нужны строках (Убрать перед нужной строкой символы "//")
//
// #define SERIAL_M Serial // для работы с COM порт 0
// #define SERIAL_M Serial1 // для работы с COM порт 1
// #define SERIAL_M Serial2 // для работы с COM порт 2
//#define SERIAL_M Serial3 // для работы с COM порт 3
//Для работы с COM Software следующие две строки
#include <SoftwareSerial.h>
SoftwareSerial SERIAL_M( RX , TX );
//Конец блока настройки Software
Параметры
speed- скорость порта 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бит/сек (при использовании Software могут быть проблемы при скоростях больше 9600, 19200)
RX, TX - номера пинов для подключения модуля при варианте SoftwareSerial (На Mega и Leonardo есть ограничения, подробнее в низу). При использование аппаратных портов, значение роли не играет.
Time_wait - время предельного ожидание ответа (в мс), т.е. по истечении которого выполнение запроса прекращается, и на выходе блока Error_Code выдается ошибка 2.
При использовании USSD запросов, ответ приходит долга, по этому значении надо выставлять большое, 20000 – 40000.
Time_Net - Период опроса модуля на связь с сетью, мс 0-опрос отключен.
Name_Contaсt - Префикс имени контакта, по этой части осуществляется поиск в телефонной книге, подробнее см ниже
Number_Contacts - Максимальное число рабочих контактов, подробнее см ниже
ON_OFF_Time - синхронизация времени с оператором связи, 1-вкл 0-выкл
White_list - отправлять смс: 1- только на номера из телефонной книге, 0 - на любой номер поданный на вход Phone
Входы
In_sms- отправляет СМС по переднему фронту, если блок не занят предыдущей операцией
Phone - номер телефона на который будет отправляется СМС в формате +7хххххххххх или имя контакта из телефонной книги (только, если есть и содержит Name_Contaсt)
text - данные которые будут отправлены в СМС
Reject_call - по переднему фронту сбрасывает входящий вызов (отбой), разрывает установлено голосовое соединение
Get_USSD - по переднему фронту отправляется USSD запрос
USSD_CODE - код USSD запроса, пример *100# (для запроса баланса лучше использовать #100#, но работает не со всеми операторами )
Answer_call - Ответить на звонок
Dial_call - Позвонить на номер указанный Phone
Выходы
Net – регистрация в сети : 1 - модуль зарегистрирован в домашней сети, 0-нет
dBm - уровень сигнал (-120 уровень не известен)
Operator - имя оператора сотовой связи
Received_SMS - импульс в один программный цикл, при получении СМС
Sent_SMS - импульс в один программный цикл, при удачной оправки СМС
Text_sms - Строка содержащая текст принятой СМС
T_Nomer - Строка содержащая номер отправителя СМС/звонящего или имя контакта из телефонной книги (подробнее см ниже)
Call – Входящий звонок ,пока идет входящий вызов 1 на выходе
Number_calls - номер текущего гудка, сбрасывается поле поступления нового звонка.
USSD_return - ответ на USSD запрос (есть ограничение максимально длинны ответа в 160 символов)
start- статус того, что модуль стартовал и успешно прошел инициализацию AT командами.
Data_Time – текущая дата время, в том виде что выдает модуль. Содержит актуальные данные если ON_OFF_Time=1 и оператор поддерживает эту функцию. (Не знаю почему, но работает не у всех).
DTMF – Выдает коды символов переданных по время установленного соединения в виде тоновых сигналов
Коды символов 0-9 A-10,B-11,C-12,D-13,#-14,*-15
Connect_ - Установлено голосовое соединение.
Error_Code – Код ошибки в работе модуля, появляется после возникновение ошибки, и сбрасывается после следующей удачной операции
Перечень всех ошибок :
0- норма;
1 - Ошибка в ответ на команду
2 - Нет ответа от модуля при отправки команды
3 - Неверный ответ
4 - модуль не готов
5 - нет регистрации в сети
6 - ошибка работы с телефонной книгой
7- превышен допустимый лимит длинны ответа
10 - недопустимый номер для отправки СМС
11 - Занят другим сеансом связи
12 - Нет ответа
13 - Вызов сброшен
Подробнее о работе с телефонной книгой SIM-карты.
Предназначено для возможности задачи рабочих номеров не в проекте, а на сим карте, и главное возможности смены рабочих номеров, без перепрограммирования контроллера.
Система такая. В телефонной книге SIM-карты создаются несколько контактов, согласно требованиям:
1. В имени контакта только латинские символы и цифры, символы (_-+=*).
2. Все имена должны начинаться на один префикс (например Test) .
3. Имена должны быть уникальны (Test1, Test2, Test_master).
В настройках блока надо настроить следующие пункты:
Name_Contaсt – здесь надо указать Префикс (приставку), что бала описана в пункте 2 (например Test)
Number_Contacts – задать максимально возможное количество контактов, если в записной книге окажется большее число контактов с префиксом Name_Contaсt, то остальные будет отброшены.
Ограничение введено, так как каждый контакт занимает значимое количество память контроллера.
White_list = 1, для отправки смс только на те номера, что удовлетворяют требованиям, описаны выше.
В этом случаи на вход Phone можно подавать, только имена контактов.
Если контакт есть в телефонной книге то на выходе T_Nomer, при звонке и входящей СМС будет выдано имя контакта (например Test1), в противном случаи сам номер.
Имя контакта чувствительно к регистру, т.е Test не равно TEST.
Ограничения SoftwareSerial
На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. В силу этого, на данных платах в качестве вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
На Arduino Leonardo некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. Поэтому, на этой плате в качестве вывода RX могут использоваться только следующие выводы: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
5940
White_list
только разрешенные номера
46152eed-dcaf-473c-aa33-aafa30a96a95
4480d049-e126-4afe-96cd-e7af67074f51
return_AT_2=0;
Received_SMS =0; //Сброс статутса СМС Принята
Sent_SMS =0; //Сброс статуса СМС Отправлена
T_millis =millis();
while(SERIAL_M.available()) //Получаем данные с модема
{ch = SERIAL_M.read();
if(ch == '\r') continue;
if(ch == '\n') { GotLineFromNeoway(); line = ""; }
else line += ch;}
if (wait)//ожиание ответа на команду
{
if(line.length()>0){if(line ==response_com) wait=0;}
if(T_millis>time1) {Error_Code=2; err=1;}}
if(err){
err=0;
if (team_room==3)
{switch ( count_ ){
case 1:
Net =0;
break;
case 3:
dBm =-120; //нет сети
break;
case 5:
Operator="";
break;}
}
wait=0; count_=0; team_room=0; }
if (Call&&(team_room!=1) )
{
team_room=1;
count_=0; //Сброс состояний обработки других функций
Number_calls=1; //сброс числа гудков
}
if (start_N){if (!wait){if ( setup_comand() ){start_N=0; start =1;}}}// Инициализация
if (start)//Не работать пока не старт
{
if ( In_sms ) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; //импульс на отправку смс
if (_trgrt1 ) s_sms=1;
if ( s_sms && (team_room==0) ) // начинать ли отправу смс
{
s_sms=0;
if ( number_search()) {team_room=2;} //проверка корректности номера
}
if ((Time_Net >0)&&(team_room==0)) //проверять ли статутс сети
{
if((T_millis-time_n)> Time_Net){time_n=T_millis; team_room=3;}
}
if ( Reject_call ) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; //импульс на сброс вызова
if(_trgrt2) {Call_T=1; AT_Command("ATH0",2);}
if ( Answer_call ) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;}; //импульс на ответ вызова
if ( Dial_call ){ if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;};//импульс наисходящий вызов
if (_trgrt5 ) Dial_T =1;
if ( Dial_T && (team_room==0) ) // начинать исходящий вызов
{Dial_T=0;
if ( number_search()) { AT_Command("ATD"+ Phone+";" ,2);} team_room=5; Dial_response_code=0;}
//Запрос баланса
if ( Get_USSD ) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (_trgrt3 ) Bal_T=1;
if ( Bal_T && (team_room==0) ) // начинать запрос баланса
{Bal_T=0; team_room=4;}
switch ( team_room ) {
case 1:
//Обратотка входящего вызова
if(_trgrt4) {Call_T2=1; AT_Command("ATA",2);}
if (return_AT_2){
if(Call_T ){Call=0; }
if(Call_T2 ){ Connect_ =1; }
}
if (!Call) {Call_T=0; final =1; Call_P1=0; count_=0; Connect_ =0; }
break;
case 2:
if (!wait){ if (sms_sent()){ final =1; }} // отправка сообщения
break;
case 3:
if (!wait){if (net_status()){ final =1;}}// проверка связи с сетью
break;
case 4:
if (!wait){if ( balance_S() ){ final =1;}}// запрос баланса
break;
case 5:
if (!wait&& !Connect_ ){
if(Dial_response_code==1) Connect_=1;
else if(Dial_response_code==2) {Error_Code =11; err=1;}
else if(Dial_response_code==3) {Error_Code =12; err=1;}
else if(Dial_response_code==4) {Error_Code =13; err=1;}}
if (return_AT_2&&Call_T){ Connect_=0; final =1; count_=0; Call_T=0;}
break;
}
if (final){team_room=0; final=0;} //должно быть последним
}
3300
Раcкоментировать нужное (Убрать перед нужной строкой символы "//")
для SIM800/SIM900 Сообщение от модуля после которого с ним можно работать Call Ready (+PBREADY)
#define
Module_Start
"Call Ready"
Раcкоментировать нужное
#define SERIAL_M Serial // для работы с COM порт 0
#define SERIAL_M Serial1 // для работы с COM порт 1
#define SERIAL_M Serial2 // для работы с COM порт 2
#define SERIAL_M Serial3 // для работы с COM порт 3
Для работы сCOM Software следующие две строки
#include
<SoftwareSerial.h>
SERIAL_M
( RX , TX );
SoftwareSerial
Конец блока настройки Software
flag_start_line
=0;
bool
start_T
=0;
bool
Модем прислал сообщение о том, что он стартовал
start_N
=0;
bool
пришло сообщение
isStringMessage
= 0;
bool
закончена обработка запроса
final
=0;
bool
идет ожидание ответа на команду
wait
=0;
bool
ошибка или сброс
err
=0;
bool
пришло ожидаемый ответ на команду
return_AT_2
=0;
bool
_trgrt1
= 0;
bool
_trgrt1I
= 0;
bool
_trgrt2
= 0;
bool
_trgrt2I
= 0;
bool
_trgrt3
= 0;
bool
_trgrt3I
= 0;
bool
_trgrt4
= 0;
bool
_trgrt4I
= 0;
bool
_trgrt5
= 0;
bool
_trgrt5I
= 0;
bool
Call_P1
=0;
bool
Call_T
=0;
bool
Call_T2
=0;
bool
Net_T
=0;
bool
Dial_T
=0;
bool
s_sms
=0;
bool
Bal_T
=0;
bool
Triger_
= 0;
bool
ch
;
char
Dial_response_code
=0;
byte
Индекс массива телефонной книге
index_array
=0;
byte
Номер исполняемой команды
team_room
=0;
byte
счетчик последовальности команд
count_
=0;
int
Время посылки команды
time1
=0;
unsigned long
Время посылки команды
T_millis
=0;
unsigned long
Время ожидания приема команды
time_Serial
=0;
unsigned long
Время последнего опроса связи с сетью.
time_n
=0;
unsigned long
сообщение от модуля
line
;
String
Ответ модуля на команду
reply
;
String
ожидаемый ответ
response_com
="";
String
Phone_T
="";
String
Массив телефоных номеров
Telefon
[Number_Contacts];
String
Массив имен номеров
Contact
[Number_Contacts];
String
bool flag_=0;
//Serial.print("OO_");//Тест
//Serial.println(response_com); //Тест
//Serial.print("OTVET_");//Тест
//Serial.println(line); //Тест
if (line.length()>0)
{
if(line == F("ERROR")){ Error_Code =1; err=1; }
else if(line == F("OK")){ return_AT_2=1; wait=0; response_com=""; }
else if (response_com.length()>1){
if(flag_start_line) {reply+=line; }
else {
if(line.startsWith(response_com)){reply=line; flag_start_line=1; }
else {Error_Code =3; err=1;}}
}
if (reply.length()>180){reply=""; Error_Code =7; err=1;}//Защита от переполнения строки
//Serial.print("PO_");//Тест
//Serial.println(reply); //Тест
//Обработка входящих СМС
if (isStringMessage)
{
Text_sms = line; //выводим текст сообщения
Received_SMS =true; // Импульс приход сообщения
isStringMessage = false;
}
if (line.startsWith(F("+CMT"))) // пришло СМС
{flag_=1; isStringMessage = true;}
// Обработка входящих вызовов
if (Call_P1){ Call=1; Call_P1=0;}
if (Call)
{
if (line.startsWith(F("+CLIP"))) {flag_=1;}
if (line == F("NO CARRIER")) { Call=0; }
}
if ( Connect_ ){ if (line.startsWith(F("+DTMF"))) { DTMF_ = ID_DTFM(line);} }
if (line == F("RING")){ Call_P1=1; Number_calls ++; wait=0;}//Всходящий звонок
if (team_room==5)
{
if (line == F("CONNECT"))Dial_response_code=1;
if (line == F("BUSY"))Dial_response_code=2;
if (line == F("NO ANSWER"))Dial_response_code=3;
if (line == F("NO CARRIER"))Dial_response_code=4;
}
//____
if (flag_) //Получение номер телефона отправителя/звонящего
{
T_Nomer = substring_commas(line, 4) ;
if(T_Nomer.indexOf("+")==-1) T_Nomer=(String( "+" ))+T_Nomer;
int ind_arr= _StringArray( Telefon , Number_Contacts , T_Nomer );
if (ind_arr>-1) T_Nomer = Contact [ ind_arr ];
flag_=0;
}
if (line == F(Module_Start)){ start_N=1; start=0; err=1;}//Сообщение от модуля о том, закончил загрузку
if (line.startsWith(F("+CPBF"))) // пришла запись телефонной книги
{if(index_array< Number_Contacts ){
Telefon[ index_array ] = substring_commas( line, 5);
Contact[ index_array ]= substring_commas( line, (line.lastIndexOf(","))) ;
index_array ++;}
}
}
// Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
2358
// tip 1- без \r и \n
// tip 2- с \r и \n
//Serial.print("Sapros_");//Тест
//Serial.println(text_com); //Тест
wait=1;
count_++;
flag_start_line=0;
reply=""; //Сброс содержимого прошлого ответа модуля
response_com=""; //Сброс содержимого ожидаемого ответа модуля
time1 =T_millis + Time_wait;
if(tip==1) SERIAL_M.print(text_com);
else if(tip==2){ SERIAL_M.println(text_com); }
else if(tip==3){
time1 =T_millis + Time_USSD ;
SERIAL_M.println(text_com); }
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("AT+CMGF=1",2);
break;
case 1:
AT_Command("AT+CMGS=\""+ Phone_T +"\"\r",1 );
response_com=F("> ");
break;
case 2:
AT_Command( (text+(String( (char)26 ))) , 2);
break;
case 3:
count_=0;
st=1;
Sent_SMS =1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
bool st=0;
switch ( count_ ) {
case 0:
AT_Command("ATE0" ,2 ) ;
break;
case 1:
AT_Command("AT+CPAS",2);
response_com=F("+CPAS");
break;
case 2:
if(return_AT_2)
{
if (reply == F("+CPAS: 0"))count_++;
else {Error_Code =4; count_=0; team_room=0;}
}
break;
case 3:
AT_Command("AT+CREG?",2);
response_com=F("+CREG");
break;
case 4:
if(return_AT_2)
{
if (reply == F("+CREG: 0,1")){Net =1; count_++;}
else {Error_Code =5; Net =0; count_=0; team_room=0;}
}
break;
case 5:
AT_Command("AT+CLIP=1" ,2 ) ;
break;
case 6:
AT_Command("AT+CMGF=1" ,2 ) ;
break;
case 7:
AT_Command("AT+CSCS=\"GSM\"" ,2 ) ;
break;
case 8:
AT_Command("AT+CNMI=2,2,0,0,0" ,2 ) ;
break;
case 9:
AT_Command("AT+DDET=1",2);
//count_++;
break;
case 10:
AT_Command("AT+CPBS?",2);
response_com=F("+CPBS");
break;
case 11:
if(return_AT_2)
{
if (reply.startsWith(F("+CPBS: \"SM\""))){count_++;}
else {Error_Code =6; count_=0; st=1; }
}
break;
case 12:
AT_Command("AT+CPBF=\"" +(String( Name_Contaсt ))+"\"" ,2 ) ;
index_array =0;
break;
case 13:
count_=0;
st=1;
Error_Code =0; //Сброc ошибки
break;
}
return st;
1164
int ind_arr;
Phone_T = Phone ;
if ( Phone.length() <4) {Error_Code =10; return 0;}
ind_arr= _StringArray( Contact , Number_Contacts , Phone );
if (ind_arr>-1) Phone_T = Telefon [ ind_arr ];
else if( White_list ) {Error_Code =10; return 0;}
return 1;
int sss;
int www=(int(st.charAt(7)));
switch ( www ) {
case 35:
sss=14;
break;
case 42:
sss=15;
break;
case 65:
sss=10;
break;
case 66:
sss=11;
break;
case 67:
sss=12;
break;
case 68:
sss=13;
break;
default:
if (www>47 && www<58)sss=www-48;
}
return sss;
277
int
ID_DTFM
String
st
SIM800
3b9ccc11-f8c0-45a1-acf1-5c9d25d61edd