SIM800 не отвечает на АТ команды

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

andycat пишет:

 ну заехали вы в мертвую зону, ну скажет МК что работать не буду - дальше что? полезете на березу с антеной как партизаны во время войны?

Да я всё переживаю что в машине от вибрации может отойти сим-карта в разъёме.

При работе модуля вынимаю сим-карту и всталвяю обратно, сеть автоматически не ловится, только после перезагрузки.

кого оповестит? и как?

Я имела ввиду ответит +CCALR: 0?

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

Irinka пишет:

andycat пишет:

 ну заехали вы в мертвую зону, ну скажет МК что работать не буду - дальше что? полезете на березу с антеной как партизаны во время войны?

Да я всё переживаю что в машине от вибрации может отойти сим-карта в разъёме.

При работе модуля вынимаю сим-карту и всталвяю обратно, сеть автоматически не ловится, только после перезагрузки.

Скажите пожалуйста: зачем вытаскивать симку на ходу? вы убьете тупо разъем, подразумевается что симка навечно стоит в устройстве и никто туда не лазит. Как то же работают китайские (да и наши полукитайские) трекеры в машинах, я почти уверен что там такие же коннекторы....и ничего не отваливается....

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Спасибо.

Votmax
Offline
Зарегистрирован: 18.06.2016

Irinka пишет:

Да я всё переживаю что в машине от вибрации может отойти сим-карта в разъёме.

 

Протестировано на 3000 км. Все держится )).

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Irinka пишет:
Если нет ответа OK от АТ команды - это однозначно перезагрузка модуля.
SIM800 не всегда с первого раза отвечает. Логичнее повторить команду.

Votmax пишет:
Подрасти для начала
Расти надо тебе. Ардуино это дно.

andycat пишет:
если от АТ команды (любой) нет ответа в течении 30 секунд - перезагрузка.
Документацию не пробовал читать? Max Response Time для некоторых комманд 60, 75, 160 сек.

andycat пишет:
если я правильно помню, в МСК нет 2G сети (может быть не прав)
В МСК все операторы кроме Теле2 поддерживают 2G.

Irinka пишет:
Да я всё переживаю что в машине от вибрации может отойти сим-карта в разъёме.
Проверь наличие СИМки командой AT+CSMINS

А вообще, что бы не страдать фигней, типа "отбил у памяти 300 Бт" или "90% памяти кушает, уже ничего не впихнешь", купи нормальную плату, например такую, благо стоит дешевле, чем ардуино, поставь нормальную среду разработки, например эту, и забудь про ардуино - это шлак.

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

Да....крутые советы от супер профессионала (
Так прям и вижу: приходит директор и говорит - че-то сервер тормозит, надо исправить, а я ему говорю - а нахрена? Давай щас купим другой за десяток тыщь баксов а этот выкинем

Votmax
Offline
Зарегистрирован: 18.06.2016

Да че уж, можно и это использовать: https://www.top500.org/system/178764

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Друзья, подскажите где я совершила ошибку:

Хочу проверить успешность работы модуля после перезагрузки, когда перестал отвечать на AT команды.

Чтобы это проверить, я подаю питание на ардуино (SIM800 выключен), жду когда модуль не ответит несколько раз и включаю питание SIM800

//Отладка
#define DEBUG
#ifdef DEBUG
#define DEBUG_PRINT(x)       Serial.print (x)
#define DEBUG_PRINTLN(x)     Serial.println (x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif

#include <avr/wdt.h>
#include <SoftwareSerial.h>
SoftwareSerial SIM800(6, 7);//RX, TX
#define _pinreset A3//Пин ресета SIM800
long vrstat = 0;
bool FlagSeti=true;
bool ResSim=false;
int i=0;


//Старт
void setup() {
wdt_disable();
Serial.begin(19200);
SIM800.begin(19200);
pinMode(_pinreset, OUTPUT);
digitalWrite(_pinreset, HIGH);   
DEBUG_PRINTLN("Zagrugaem"); 
restartSIM800();
wdt_enable (WDTO_8S);
}



//Обработка команд---------------------------------------------------------------
String sendATCommand(String cmd, bool waiting) {
wdt_reset(); 
String _response = "";
//DEBUG_PRINTLN(cmd);
SIM800.println(cmd);
if (waiting) {
_response = waitResponse();
if (_response.startsWith(cmd)) {
_response = _response.substring(_response.indexOf("\r\n", cmd.length()) + 2);
}
//DEBUG_PRINTLN(_response);
return _response;
}
return "";
}

String waitResponse() {
wdt_reset(); 
String _buffer;
long _timeout = millis() + 10000;
while (!SIM800.available() && millis() < _timeout)  {};
if (SIM800.available()) {
_buffer = SIM800.readString();
return _buffer;
}else {
DEBUG_PRINTLN("Timeout...");
restartSIM800();
}
return "";
}


//Перезапуск SIM800
void restartSIM800() {
wdt_reset();   
DEBUG_PRINTLN("restartSIM800");
digitalWrite(_pinreset, LOW); 
delay(1000);          
digitalWrite(_pinreset, HIGH);  
wdt_reset(); 
delay(5000); 
setting();
}


//Настройка модуля
void setting() {
wdt_reset(); 
do{
if (statusSim800().indexOf("YES") > -1){
FlagSeti=false;
DEBUG_PRINTLN("Status-Ok");
if (sendATCommand("AT+CLIP=1", true).indexOf("OK") > -1) DEBUG_PRINTLN("Ustanovlen AON");
if (sendATCommand("AT+CMGF=1", true).indexOf("OK") > -1) DEBUG_PRINTLN("Text mode");
if (sendATCommand("AT+CMGDA=\"DEL ALL\"", true).indexOf("OK") > -1) DEBUG_PRINTLN("Sms udaleny");
i=0;
break;
}else{
FlagSeti=true;
i++;
if (i>5){
i=0;
restartSIM800();
}
DEBUG_PRINTLN("SettingStatus-Error");
}
delay(2000);
}while (FlagSeti); 
DEBUG_PRINTLN("Rabotaem");
}


//Проверка готовности модуля совершать звонки
String statusSim800(){
wdt_reset(); 
String _buffer=""; 
_buffer = sendATCommand("AT+CCALR?", true);
_buffer.trim();
if (_buffer.indexOf("+CCALR: 1") > -1) {  
return "YES"; 
}else{
return ""; 
}
}



void loop() {
wdt_reset(); 
}




Вот что получаю:

Если питание включено одновременно, всё работает.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Потому что у тебя рекурсия. В restartSIM800() вызываешь setting(), а в setting() вызываешь restartSIM800().

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Del