не могу запустить GSM модуль

Тема в разделе "Arduino & Shields", создана пользователем Артур_Кун, 6 авг 2015.

  1. +CPIN: NOT READY и вот это, о чем это он?
     
  2. MDV

    MDV Гик

    На снимке пин стоит
     
  3. MDV

    MDV Гик

    Вставь сумку в телефон и отключи блокировку
     
  4. MDV

    MDV Гик

    Результаты то есть?
     
  5. MAXKIT

    MAXKIT Нуб

    Вопрос к знатокам. Имеется Ардуина и GSM модуль на SIM900.

    Связь с модулем есть, вот этот скейтч работает:

    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
    //для зелёного светодиода будем использовать второй цифровой вход,
    //а для жёлтого - третий
    int greenPin = 2;
    int yellowPin = 3;
    void setup()
    {
        gprsSerial.begin(19200);
        pinMode(greenPin, OUTPUT);
        pinMode(yellowPin, OUTPUT);
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
    }
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void loop()
    {
        if (!gprsSerial.available())
            return;
        char currSymb = gprsSerial.read();  
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("Green on")) {
                    digitalWrite(greenPin, HIGH);
                } else if (!currStr.compareTo("Green off")) {
                    digitalWrite(greenPin, LOW);
                } else if (!currStr.compareTo("Yellow on")) {
                    digitalWrite(yellowPin, HIGH);
                } else if (!currStr.compareTo("Yellow off")) {
                    digitalWrite(yellowPin, LOW);
                }
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
    }
    Но при попытке использовать другой скейтч, ничего не работает

    Код (Text):
    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>
    // библиотека для эмуляции Serial порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>
    // длина сообщения
    #define MESSAGE_LENGTH 160
    // текст сообщения о включении розетки
    #define MESSAGE_ON  "Power is On"
    // текст сообщения о выключении розетки
    #define MESSAGE_OFF  "Power is Off"
    // текст сообщения об ошибке распознавания команды
    #define MESSAGE_ERROR  "Error...unknown command!"
    // пин, к которому подключено реле
    #define RELAY 5
    // номер сообщения в памяти сим-карты
    int messageIndex = 0;
    // текст сообщения
    char message[MESSAGE_LENGTH];
    // номер, с которого пришло сообщение
    char phone[16];
    // дата отправки сообщения
    char datetime[24];
    bool stateRelay = false;
    // создаём объект класса GPRS и передаём ему скорость 9600 бод;
    // с помощью него будем давать команды GPRS шилду
    GPRS gprs(9600);
    void setup()
    {
      // настраиваем пин реле в режим выхода,
      pinMode(RELAY, OUTPUT);
      // подаём на пин реле «низкий уровень» (размыкаем реле)
      digitalWrite(RELAY, LOW);
      // включаем GPRS-шилд
      gprs.powerUpDown();
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      while (!Serial) {
        // ждём, пока не откроется монитор последовательного порта
        // для того, чтобы отследить все события в программе
      }
      // проверяем, есть ли связь с GPRS-устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке;
        // процесс повторяется в цикле,
        // пока не появится ответ от GPRS устройства
        delay(1000);
        Serial.print("Init error\r\n");
      }
      // вывод об удачной инициализации GPRS Shield
      Serial.println("GPRS init success");
    }
    void loop()
    {
      // проверяем наличие непрочитанных сообщений
      // и находим их номер в памяти сим-карты
      messageIndex = gprs.isSMSunread();
      if (messageIndex > 0) {
        // если есть хотя бы одно непрочитанное сообщение,
        // читаем его
        gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
        // Удаляем прочитанное сообщение из памяти Сим-карты
        gprs.deleteSMS(messageIndex);
        // выводим номер, с которого пришло смс
        Serial.print("From number: ");
        Serial.println(phone);
        // выводим дату, когда пришло смс
        Serial.print("Datetime: ");
        Serial.println(datetime);
        // выводим текст сообщения
        Serial.print("Recieved Message: ");
        Serial.println(message);
        // вызываем функцию изменения состояния реле
        // в зависимости от текста сообщения
        setRelay(phone, message);
      }
    }
    void setRelay(char f_phone[], char f_message[])
    {
      if (strcmp(f_message, "On") == 0) {
        // если сообщение — с текстом «On»,
        // выводим сообщение в Serial
        // и подаём на замыкаем реле
        Serial.println("OK! Power On");
        digitalWrite(RELAY, HIGH);
        stateRelay = true;
        // на номер, с которого пришёл запрос,
        // отправляем смс с текстом о включении питания
        gprs.sendSMS(f_phone, MESSAGE_ON);
      } else if (strcmp(f_message, "Off") == 0) {
        // если пришло сообщение с текстом «Off»,
        // выводим сообщение в Serial
        // и размыкаем реле
        Serial.println("OK! Power Off");
        digitalWrite(RELAY, LOW);
        stateRelay = false;
        // на номер, с которого пришёл запрос
        // отправляем смс с текстом о выключении питания
        gprs.sendSMS(f_phone, MESSAGE_OFF);
      } else if (strcmp(f_message, "State") == 0) {
        // если пришло сообщение с текстом «State»,
        // отправляем сообщение с состоянием реле
        if (stateRelay) {
          Serial.println("State: Power On");
          gprs.sendSMS(f_phone, MESSAGE_ON);
        } else {
          Serial.println("State: Power Off");
          gprs.sendSMS(f_phone, MESSAGE_OFF);
        }
      } else {
        // если сообщение содержит неизвестный текст,
        // отправляем сообщение с текстом об ошибке
        Serial.println("Error... unknown command!");
        gprs.sendSMS(f_phone, MESSAGE_ERROR);
      }
    }
    Ссылки на статьи http://wiki.amperka.ru/продукты:gprs-shield?s[]=gprs&s[]=shield&s[]=arduino и http://wiki.amperka.ru/Беспроводная-связь:gprs-shield

    Удалось выяснить что во втором случае на симке не сохраняются СМС, из за этого скейтч не работает. Как перенастроить GSM модуль на сохранения СМС на симке?
     
  6. MDV

    MDV Гик

    Пример с амперки сто процентов рабочий. Проверь на какие ноги посажен
     
  7. MDV

    MDV Гик

    RX TX
     
  8. MAXKIT

    MAXKIT Нуб

    Причём тут ноги? Связь с модулем есть, скетч включает GSM, проверяет что он включился. Переходит в режим чтения СМС из симки. Когда приходит СМС на модуль, она НЕ сохраняется на симке, а сразу через сериал порт скидывается. В виде:
    Такое впечатление что после первого скетча настройки поменялись в модуле.
     
  9. MDV

    MDV Гик

    Уважаемый к чему такой негатив. Из вашего поста "ничего не работает" на деле работает, но нет как вы ожидаете. Пришлите лог из монитора порта. Сам по себе модем смски не удаляет
     
  10. geher

    geher Гуру

    Возможно, так оно и есть.
    Команда AT+CNMI=1,2,2,1,0, скармливаемая модулю, задает режим работы с СМС, при котором сообщения не складируются, а направляются сразу в последовательный порт.
    Можно во втором скетче попробовать режим по умолчанию, поместив в setup в конец строку:
    Код (Text):

    sim900_check_with_cmd("AT+CNMI=2,1,0,0,0\r\n","OK\r\n",CMD);
     
     
  11. MAXKIT

    MAXKIT Нуб

    geher, спасибо, так и было. Всё заработало
     
  12. Результаты есть, но не положительные, сначала он работал как и положено, писал мне READY, светодиод моргал по другому, т.е. был в режиме ожидания, ждал мои команды, отвечал на них, выключался как положено с надписью NORMAL POWER DOWN. Я был рад что наконец то заработал. Рано радовался, включаю его, пишет READY, и всё, опять глухо, не отвечает, индикация такая, как будто я его и не включал. Дергаю PWRON, опять мне READY, молчит. При этом я ничего не изменял, работал работал, и тут же перестал.
     
  13. MDV

    MDV Гик

    проверь питание и контакты сим карты
     
  14. DrProg

    DrProg Вечный нерд

    Блин, как тут интересно всё. Жду не дождусь вот такой кастированный модуль, хочу его освоить ваще сильно. Тем более, что он действительно нужен чуть ли не в каждом проекте. Все сказанное здесь может быть использовано за меня! ;)
     
  15. MAXKIT

    MAXKIT Нуб

    Расскажите, почему в этом светче, при добавлении в loop, действие не выполняется постоянно?
    Тоесть должен идти таймер, но экран не обновляется. Если Ардуина получит смс, то после получения смс экран обновляется.

    Код (Text):
    #include <SoftwareSerial.h>
    #include <LiquidCrystal.h>
    SoftwareSerial gprsSerial(2,3);
    LiquidCrystal lcd(4, 5, 8, 9, 10, 11);
    //для зелёного светодиода будем использовать второй цифровой вход,
    //а для жёлтого - третий
    int greenPin = 11;
    int yellowPin = 12;
    unsigned long memTime = 0;
    unsigned long timer = 0;
    int zeroing = 0;
    void setup()
    {
        gprsSerial.begin(19200);
        pinMode(greenPin, OUTPUT);
        pinMode(yellowPin, OUTPUT);
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
    }
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void loop()
    {
        if (!gprsSerial.available())
            return;
        char currSymb = gprsSerial.read();
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("Green on")) {
                    digitalWrite(greenPin, HIGH);
                } else if (!currStr.compareTo("Green off")) {
                    digitalWrite(greenPin, LOW);
                } else if (!currStr.compareTo("Yellow on")) {
                    digitalWrite(yellowPin, HIGH);
                } else if (!currStr.compareTo("Yellow off")) {
                    digitalWrite(yellowPin, LOW);
                }
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }

    if (zeroing==0)
      {
        memTime = millis();
        timer=0;
        zeroing=1;
      }

    if (zeroing==1)
        {
              timer = (millis() - memTime)/1000;
              if (timer==60)
              {
                zeroing=0;
              }
       }
         lcd.setCursor(0,0);
         lcd.print("t");
         lcd.setCursor(2,0);
         lcd.print(timer);
    }
     
  16. geher

    geher Гуру

    Код (Text):

    if (!gprsSerial.available())
            return;
     
    Т.е. если с шилда ничего не приходит (а оно само, без команды, появится только в случае каких-либо событий вроде звонка или приема СМС), loop сразу завершается.
    Нужно перестроить логику работы loop.
    Вариант 1.
    Код (Text):
    if (!gprsSerial.available())
            return;
     
    выкинуть.
    Весь фрагмент получения СМС обернуть в
    Код (Text):
    if (gprsSerial.available()) {
      код получения СМС.
    }
    Вариант 2.
    Вывод таймера размещать до проверки
    Код (Text):
    if (!gprsSerial.available())
            return;