Помогите!!! Sim800l после получения 2-х смс перестает отправлять ответные смс

Тема в разделе "Arduino & Shields", создана пользователем mixa_r, 8 дек 2017.

  1. mixa_r

    mixa_r Нуб

    Добрый день, не могу понять причину,
    Есть модуль sim800l, при получении команд все работает, но не корректно.
    Приходит команда смс, отправляет ответ по смс, так проходит две команды и все позже модуль обрабатывает команды пытается отправить смс ардуино, но сим модуль не отправляет как будто память заполняется. После перезагрузки все так же происходит.
     
  2. b707

    b707 Гуру

    И к чему это вопрос? Вы думаете, кто-то сможет угадать, какие ошибки вы налепили в скетче? Код выкладывайте, если хотите, чтобы вам помогли.
     
  3. mixa_r

    mixa_r Нуб

    Код (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);
    }
     
    Последнее редактирование: 8 дек 2017
  4. mixa_r

    mixa_r Нуб

    после 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
    И так каждую секунду
     
  5. mixa_r

    mixa_r Нуб

    Так я пока понимаю что необходимо удалить смс из модуля после прочтения
     
  6. DIYMan

    DIYMan Guest

    Да... Дикий, необузданный, вольный код. Ему бы уздечку, да седло, да наездника хорошего - тогда бы и заработало.

    Проблема не в SIM800L, а в вашем коде.
     
  7. mixa_r

    mixa_r Нуб

    Хорошо что вы понимаете, может у вас есть предложение что поправить, вместо тысячи слов о вольности кода
     
  8. DIYMan

    DIYMan Guest

    Править там нужно ВСЁ, от слова - ВСЁ, ибо вот такая дичь совсем ни в какие ворота:
    Код (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 на побольше и всё будет ок" - ну и ладушки, я лишь высказал своё мнение, не более того. Как вы с ним поступите - решать вам.
     
  9. DIYMan

    DIYMan Guest

    По поводу удаления всех SMS из памяти модема - читайте описание команды AT+CMGD, а именно - чтобы удалить все СМС - надо послать команду AT+CMGD=1,4
     
  10. mixa_r

    mixa_r Нуб

    Из всего выше сказанного вы меня не обидели. Код я сам не писал так как мало знаком с языком ардуино. Пожалуй это впервые на форуме этом я читаю что-то действительно относящееся к теме, вместо тысячи слов пустых рассуждений о том какие все "умные". Спасибо за направлении и ошибки есть куда развиваться и изучать ошибки.