0@0
LibraryRoot
LibraryGroup-Сравнение
0@0
475
0@-20
228
324
0@-48
root
output
globalVariable
1
0c719606-49f4-4f25-8b4b-7b3af4eafef4
0@-144
0
4
сим 800
5
220@60
240@60 corner: 438.0d@280
220@60 corner: 458.0d@280
299.0d@75.0d
GSM_In_sms
220@90
240@90
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
e28b2991-30d8-41e9-87dd-641dccb0757a
220@80 corner: 240@100
GSM_Phone
220@110
240@110
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
ae3d23c4-4c67-497d-8c24-175c9c4f37af
220@100 corner: 240@120
GSM_text
220@130
240@130
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
fae71e77-4801-4518-a803-bb358809b408
220@120 corner: 240@140
140@120
160@120 corner: 200@160
140@120 corner: 220@160
166.5d@134.5d
3
20@140
40@140 corner: 117.0d@160
20@140 corner: 137.0d@160
44@154.5d
20@150
40@150
20@140 corner: 40@160
117.0d@140 corner: 137.0d@160
137.0d@150
Сбросить сигнал если нет моих номеров в списке
сброс_звонка
2
69.0d
9.0d
0.0d
117.0d@150
137.0d@150 corner: 137.0d@150
I
140@150
160@150
220@150
Q
9.0d
200@150
220@150 corner: 220@150
GSM_Reject_call
220@150
240@150
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
30000
Период проверки связи с сетью, мс
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
4429c943-1cc9-4540-bda4-c520defcda3d
220@140 corner: 240@160
14
480@20
500@20 corner: 560@100
480@20 corner: 580@100
514.0d@33.5d
0
net
480@50
500@50
463.0d@53.5d
480@40 corner: 500@60
1
set
480@70
500@70
464.0d@73.5d
480@60 corner: 500@80
480@80 corner: 500@100
15
660@40
680@40 corner: 760@100
660@40 corner: 780@100
707.5d@53.5d
EN
660@70
680@70
640.0d@73.5d
660@60 corner: 680@80
660@80 corner: 680@100
660@90
16
27
D
680@90
580@90 corner: 580@90
Q
9.0d
560@90
580@90
560@80 corner: 580@100
480@90
S
500@90
458.0d@90 corner: 458.0d@90
GSM_start
51.0d
438.0d@90
458.0d@90
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);
290
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
10
Номер пина, см описание
2442ead9-2f53-4a6d-8299-db1be1540ae1
6fe9eca6-8a6e-4b35-9b52-c72d1faadca0
TX
11
Номер пина, см описание
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
a95512ac-60f8-446a-87a3-63d7cc38b1c9
438.0d@80 corner: 458.0d@100
13
560@100
580@100 corner: 651.0d@120
560@100 corner: 671.0d@120
584@113.5d
560@100 corner: 580@120
560@110
регистрация
396@286
200657154
63.0d
7.0d
580@110
458.0d@110 corner: 458.0d@110
GSM_Net
48.0d
438.0d@110
458.0d@110
438.0d@100 corner: 458.0d@120
GSM_dBm
53.0d
438.0d@130
458.0d@130
438.0d@120 corner: 458.0d@140
GSM_Received_SMS
104.0d
438.0d@150
458.0d@150
438.0d@140 corner: 458.0d@160
GSM_Text_sms
76.0d
438.0d@170
458.0d@170
438.0d@160 corner: 458.0d@180
12
660@120
680@120 corner: 760@180
660@120 corner: 780@180
707.5d@133.5d
660@150
680@150
640.0d@153.5d
660@140 corner: 680@160
660@160 corner: 680@180
660@170
680@170
6
500@200
520@200 corner: 600@260
500@200 corner: 620@260
524.5d@214.5d
500@220 corner: 520@240
670@200
690@200 corner: 750@260
670@200 corner: 770@260
701.5d@214.0d
670@220 corner: 690@240
I2
-1
670@250
690@250
660.0d@253.5d
670@240 corner: 690@260
790@240
810@240 corner: 887.0d@260
790@240 corner: 907.0d@260
814@254.5d
790@240 corner: 810@260
887.0d@250
907.0d@250
887.0d@240 corner: 907.0d@260
790@250
69.0d
9.0d
810@250
770@250 corner: 770@250
Q
9.0d
750@250
770@250
750@240 corner: 770@260
670@230
==
I1
690@230
620@230 corner: 620@230
Index
28.0d
600@230
620@230
600@220 corner: 620@240
7
660@280
680@280 corner: 861.0d@340
660@280 corner: 881.0d@340
738.0d@294.5d
GSM_Outgoing_Call
660@310
680@310
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
660@300 corner: 680@320
660@320 corner: 680@340
8
900@300
920@300 corner: 960@360
900@300 corner: 980@360
928.5d@313.5d
900@320 corner: 920@340
900@350
920@350
900@340 corner: 920@360
9
980@340
1000@340 corner: 1043.0d@360
980@340 corner: 1063.0d@360
1004@352.5d
980@340 corner: 1000@360
980@350
конект
398@418
197900210
35.0d
5.0d
1000@350
980@350 corner: 980@350
Q
9.0d
960@350
980@350
960@340 corner: 980@360
900@330
920@330
881.0d@330 corner: 881.0d@330
71.0d
861.0d@330
881.0d@330
861.0d@320 corner: 881.0d@340
660@330
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
181.0d
680@330
620@250 corner: 620@350
Exist
24.0d
600@250
620@250
600@240 corner: 620@260
500@230
moi
0
1
+79157777777
+79157777771
+79157777772
+79157777773
+79157777774
+79157777775
Value
520@230
458.0d@170 corner: 458.0d@230
GSM_T_Nomer
76.0d
438.0d@190
458.0d@190
438.0d@180 corner: 458.0d@200
GSM_Sent_SMS
82.0d
438.0d@210
458.0d@210
438.0d@200 corner: 458.0d@220
GSM_Call
50.0d
438.0d@230
458.0d@230
438.0d@220 corner: 458.0d@240
GSM_Number_calls
96.0d
438.0d@250
458.0d@250
438.0d@240 corner: 458.0d@260
GSM_Error_Code
84.0d
438.0d@270
458.0d@270
438.0d@260 corner: 458.0d@280
GSM_Основной
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
Serial_S
cd44aec4-9e95-4f84-be65-61792f4d0a55
Time_wait
Время ожидание ответа модуля, мс
22016e8b-8d2b-4fcb-85f5-5f68ed96a606
221e94a5-09ac-40a4-8cbf-1c8f417182b3
Ограничение длинны сообщений
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
198.0d
220@30
240@30 corner: 318.0d@50
220@30 corner: 338.0d@50
245.0d@44.5d
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
bool
GSM_setup_comand
78.0d
310@30
330@30 corner: 440.0d@50
310@30 corner: 460.0d@50
335.0d@44.5d
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
f55b25c3-4009-4624-b781-3402fd6f79e7
c5840656-6b2d-46f0-ae27-ac6a937eb8e8
TX
790ba25a-2b70-47ba-83e5-9472fb5438d6
989fc788-fdf9-48c4-b2bd-3dea4d4707b3
#include
<SoftwareSerial.h>
Serial_S
( RX , TX );
SoftwareSerial
110.0d
450
(0 to: 450)
nomer
cвои_номера
arduinoIDE
197
1024
Arduino Uno
142360727