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