Добрый день, не могу понять причину, Есть модуль sim800l, при получении команд все работает, но не корректно. Приходит команда смс, отправляет ответ по смс, так проходит две команды и все позже модуль обрабатывает команды пытается отправить смс ардуино, но сим модуль не отправляет как будто память заполняется. После перезагрузки все так же происходит.
И к чему это вопрос? Вы думаете, кто-то сможет угадать, какие ошибки вы налепили в скетче? Код выкладывайте, если хотите, чтобы вам помогли.
Код (C++): #include <Servo.h> #include <Keypad.h> // Подключаем библиотеки #include <Password.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); Servo servo1; Servo servo2; String strTest1 = "test 1 test 1 test 1 test 1"; String strTest2 = "test 2 test 2 test 2 test 2"; String strTest3 = "test 3 test 3 test 3 test 3"; String strTest4 = "Test4 Test4 Test4 Test4 Test4"; String strTest5 = "Test5 Test5 Test5 Test5 Test5 Test5"; String strTest6 = "Test6 Test6 Test6 Test6 Test6 Test6 Test6 Test6"; String strTest7 = "Test7 Test7 Test7 Test7 Test7 Test7 Test7 Test7 Test7 "; String strTest8 = "Test8 Test8 Test8 Test8 Test8 Test8 Test8 Test8 Test8 Test8 "; Password password = Password( "111" ); const byte ROWS = 4; // 4 строки const byte COLS = 4; // 4 столбца char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; //устанавливаем пины столбцов и рядов byte rowPins[ROWS] = {12,11, 10, 9}; byte colPins[COLS] = {8, 7, 6, 5}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); byte ledPin = A1; void setup(){ servo1.attach(A4); servo1.write(5); //Поворачиваем сервопривод в положение 0 servo2.attach(A5); servo2.write(5); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); Serial.begin(9600); keypad.addEventListener(keypadEvent); //добавляем событие keypad.setDebounceTime(250); //--------------------------Настройка gsm модуля--------------------------------------— delay(2000); Serial.begin(9600); mySerial.begin(9600); Serial.println(); Serial.println("Turn on AOH:"); mySerial.println("AT+CLIP=1"); // включить АОН delay(100); Serial.println("Text format sms:"); mySerial.println("AT+CMGF=1"); // текстовый формат SMS delay(100); Serial.println("Mode GSM:"); mySerial.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM delay(100); // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК //--------------------------Настройка gsm модуля--------------------------------------— } void loop(){ //-------------------------Приём звонка и отправка смс на заданный номер------------------------------------— if(mySerial.available()) //если модуль что-то послал { char ch = ' '; String val = ""; while(mySerial.available()) { ch = mySerial.read(); val += char(ch); //собираем принятые символы в строку delay(5); } if (val.indexOf("Off") > -1) { servo1.attach(A4); servo1.write(5); //Поворачиваем сервопривод в положение 0 servo2.attach(A5); servo2.write(5); } else if (val.indexOf("On") > -1) { servo1.attach(A4); servo1.write(150); //Поворачиваем сервопривод в положение 0 servo2.attach(A5); servo2.write(150); } else if (val.indexOf("Test1") > -1) { //если увидели команду отправки СМС sms(String(strTest1), String("+79123456789")); //отправляем СМС на номер +71234567890 servo1.attach(A4); servo1.write(170); //Поворачиваем сервопривод в положение 0 } else if (val.indexOf("Test2") > -1) { //если увидели команду отправки СМС sms(String(strTest2), String("+79123456789")); //отправляем СМС на номер +71234567890 } else if (val.indexOf("Test3") > -1) { //если увидели команду отправки СМС sms(String(strTest3), String("+79123456789")); //отправляем СМС на номер +71234567890 } else if (val.indexOf("Test4") > -1) { //если увидели команду отправки СМС sms(String(strTest4), String("+79123456789")); //отправляем СМС на номер +71234567890 } else if (val.indexOf("Test5") > -1) { //если увидели команду отправки СМС sms(String(strTest5), String("+79123456789")); //отправляем СМС на номер +71234567890 } else if (val.indexOf("Test6") > -1) { //если увидели команду отправки СМС sms(String(strTest6), String("+79123456789")); //отправляем СМС на номер +71234567890 } else if (val.indexOf("Test7") > -1) { //если увидели команду отправки СМС sms(String(strTest7), String("+79123456789")); //отправляем СМС на номер +71234567890 } else if (val.indexOf("+CMT") > -1) { //если увидели команду отправки СМС sms(String(strTest8), String("+79123456789")); //отправляем СМС на номер +71234567890 } } keypad.getKey(); } void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ case PRESSED: Serial.print("Pressed: "); Serial.println(eKey); digitalWrite(ledPin,LOW); //включение светодиода для поддтверждения ввода с клавиатуры delay(300); digitalWrite(ledPin,HIGH); //отключение светодиода switch (eKey){ case '#': guessPassword(); break; default: password.append(eKey); } }} void guessPassword(){ Serial.print("Guessing password... "); if (password.evaluate()){ servo2.attach(A5); servo2.write(170); Serial.println("VALID PASSWORD "); // password.reset(); //сброс переменной пароля после корректного ввода }else{ Serial.println("INVALID PASSWORD "); digitalWrite(ledPin,LOW); //активация светодиода красного при неверном коде delay(3000); digitalWrite(ledPin,HIGH); //отключение красного светодиода. password.reset(); //сброс переменной пароля после некорректного ввода } } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void sms(String text, String phone) // отправка СМС { Serial.println("Start SMS send"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send OK"); delay(2000); }
после 5 смс не важно в каком порядке, в терминале начинается постоянная отправка сообщений пока не сбросишь ардуино. Start SMS send SMS send OK Start SMS send SMS send OK Start SMS send SMS send OK Start SMS send SMS send OK И так каждую секунду
Да... Дикий, необузданный, вольный код. Ему бы уздечку, да седло, да наездника хорошего - тогда бы и заработало. Проблема не в SIM800L, а в вашем коде.
Хорошо что вы понимаете, может у вас есть предложение что поправить, вместо тысячи слов о вольности кода
Править там нужно ВСЁ, от слова - ВСЁ, ибо вот такая дичь совсем ни в какие ворота: Код (C++): sms(String(strTest5), String("+79123456789")); У вас strTest5 и так уже объявлен как String, зачем ещё в String оборачивать? Все строки - в оперативке: Код (C++): Serial.println("Turn on AOH:"); не жалко вам её, от слова "совсем". Надо во флеш загнать, хотя бы так: Код (C++): Serial.println(F("Turn on AOH:")); Ждать ответа от модема при помощи delay, при этом НИКАК не анализируя, что там модем сделал - суксь и дичь: Код (C++): mySerial.println("AT+CMGF=1"); // текстовый формат SMS delay(100); В этом блоке delay(5) - в топку, он там как кобыле пятая нога: Код (C++): while(mySerial.available()) { ch = mySerial.read(); val += char(ch); //собираем принятые символы в строку delay(5); } Функция отсылки SMS - опять же, дикая - никак не анализируется, что отвечает модем, не ждётся приглашения ввода текста от модема, короче - выкинуть и забыть: Код (C++): void sms(String text, String phone) // отправка СМС { Serial.println("Start SMS send"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send OK"); delay(2000); } Параметры типа String передаются в функции по значению - опять оперативки не жалко, она так и кончится может в самый интересный момент. Код (C++): void sms(String text, String phone) Надо хотя бы так: Код (C++): void sms(const String& text, const String& phone) И вы хотите, чтобы этот код нормально и надёжно работал? Скажу честно - этому не бывать с таким подходом, можете обижаться, но это правда. Для начала вам стоит уяснить, что с модемом надо ОБЩАТЬСЯ, а не просто посылать ему команды. Раз послали команду - будьте добры убедиться, что она отработала, как надо, а не просто - влупить delay на побольше и потом удивляться, почему не работает. GSM-модем - делеями не регулируется, от слова "совсем": в момент, когда вы посылаете SMS, может пропасть регистрация в сети, например. Или - модем немного протупит (буквально пару секунд) перед выводом вам приглашения на ввод текста, или (что ОЧЕНЬ часто бывает - ответ от модема об отсылке СМС приходит с запозданием, которое всяко больше чем ваши две с половиной секунды. Вердикт: резать, не дожидаясь перитонитов. Всё имхо, наверняка найдётся кто-то, кто поддержит вас, и скажет "не слушай его, сделай delay на побольше и всё будет ок" - ну и ладушки, я лишь высказал своё мнение, не более того. Как вы с ним поступите - решать вам.
По поводу удаления всех SMS из памяти модема - читайте описание команды AT+CMGD, а именно - чтобы удалить все СМС - надо послать команду AT+CMGD=1,4
Из всего выше сказанного вы меня не обидели. Код я сам не писал так как мало знаком с языком ардуино. Пожалуй это впервые на форуме этом я читаю что-то действительно относящееся к теме, вместо тысячи слов пустых рассуждений о том какие все "умные". Спасибо за направлении и ошибки есть куда развиваться и изучать ошибки.