GSM Shield SIM 900R от амперки -все вопросы сюда!

Тема в разделе "Arduino & Shields", создана пользователем НКВД, 30 янв 2016.

  1. AlexAl77

    AlexAl77 Нуб

    Спасибо за ответ. а ReadGSM() это что за функция ?
     
  2. Игорь_

    Игорь_ Нуб

    Здравствуйте, имеется mega2560 с сайта амперки + данный gprs шилд, шилд бутербродом воткнут в мегу, перемычки убраны, провода на физический Serial1 подключены, пока задержки нет, все входящие смс отображаются верно, но стоит включить задержку и время от времени мега с шилда не получает или все тело смски т.е. приходит вот такой ответ в терминал:
    Serial init OK
    GPRS init success
    Please send SMS message to me!
    From number:
    Datetime:
    Recieved Message:

    или
    Получает но не весь пакет данных, может потерять само сообщение и тогда ответ приходит вида:
    From number: +79123456789
    Datetime: 17/04/13,17:30:13+20
    Recieved Message:

    или
    Может в тело смс засунуть чатсь данных к ней не относящиеся например:
    From number: +79123456789
    Datetime: 17/04/13,17:49:10+20
    Recieved Message: 17:50:36+20"
    Ehtvrheg

    происходит проблема такая при использовании стандартного скетча, но с задержкой по функции delay(10000)
    Код (C++):
        // библиотека для работы с GPRS устройством
        #include <GPRS_Shield_Arduino.h>
     
        // длина сообщения
        #define MESSAGE_LENGTH 160
     
        // номер сообщения в памяти сим-карты
        int messageIndex = 0;
     
        // текст сообщения
        char message[MESSAGE_LENGTH];
        // номер, с которого пришло сообщение
        char phone[16];
        // дата отправки сообщения
        char datetime[24];
     
        // создаём объект класса GPRS и передаём в него объект Serial1
        GPRS gprs(Serial1);
        // можно указать дополнительные параметры — пины PK и ST
        // по умолчанию: PK = 2, ST = 3
        // GPRS gprs(Serial1, 2, 3);
     
        void setup()
        {
          // открываем последовательный порт для мониторинга действий в программе
          Serial.begin(9600);
          // ждём пока не откроется монитор последовательного порта
          // для того, чтобы отследить все события в программе
          while (!Serial) {
          }
          Serial.print("Serial init OK\r\n");
          // открываем Serial-соединение с GPRS Shield
          Serial1.begin(9600);
          // включаем GPRS-шилд
          gprs.powerOn();
          // проверяем, есть ли связь с GPRS-устройством
          while (!gprs.init()) {
            // если связи нет, ждём 1 секунду
            // и выводим сообщение об ошибке;
            // процесс повторяется в цикле,
            // пока не появится ответ от GPRS-устройства
            delay(1000);
            Serial.print("GPRS Init error\r\n");
          }
          // выводим сообщение об удачной инициализации GPRS Shield
          Serial.println("GPRS init success");
          Serial.println("Please send SMS message to me!");
        }
     
        void loop()
        {
          // если пришло новое сообщение
          if (gprs.ifSMSNow()) {
            // читаем его
            gprs.readSMS(message, phone, datetime);
     
            // выводим номер, с которого пришло смс
            Serial.print("From number: ");
            Serial.println(phone);
     
            // выводим дату, когда пришло смс
            Serial.print("Datetime: ");
            Serial.println(datetime);
     
            // выводим текст сообщения
            Serial.print("Recieved Message: ");
            Serial.println(message);
          }
          delay(10000); //моя задержка
        }
     
     
  3. artem_

    artem_ Нуб

    Спасибо, но это все же GET запрос. Есть аналогичный пример для POST?
     
  4. alexander88

    alexander88 Нуб

  5. alexander88

    alexander88 Нуб

    Код (C++):
    //Подключаем необходимые библиотеки
    //Для GPRG Shield
    #include <GPRS_Shield_Arduino.h>
    #include <SoftwareSerial.h>
    //Для радиоприемника
    #include <VirtualWire.h>
    //Определяем пин, к которому подключено реле
    #define RELAY 8
    //Текущее состояние реле
     
    bool stateRelay = false;
    //Переменная для определения режима работы
    int mode = 0;
    //Переменная для ручного управления обогревателем
    int m_temp = 0;
    //Переменные для температуры
    //Температура в данный момент
    int curr_temp = 0;
    //Температура срабатывания
    int trig_temp = 0;
    //Нежелательная температура
    int danger_temp = 36;
    // создаём объект класса GPRS
    GPRS gprs;-----вот эта проблема сыплет ошибками изменял текст и
    никак не выходит. помогите пожалуйста.
    //Определяем номер, на который будем посылать сообщения
    //Нужно ввести свой номер
    #define PHONE_NUMBER "+79991236120"
    //Описываем сообщения для отправки
    #define HELLO_MESSAGE "Hello from GPRS Shield! Please, set trigger temperature."
    #define MODE_MESSAGE "Send mode's name."
    #define READY_MESSAGE "I'm ready!"
    #define INC_TRIG "Incorrect trigger value! You only can set - 20, 25 and 28."
    #define INC_MODE "Incorrect mode value! You can only set - Auto and Manual"
    #define DANGER_MESSAGE "Current temperature is bigger than 38C. Relay is off."
    #define ERROR_SMS "Incorrect command. You can only ask for state, set trigger temperature or set mode"
    #define HEATERON "OK, heater is on."
    #define HEATEROFF "OK, heater is off."
    #define AUTOMODE "OK, auto mode."
    #define MANUALMODE "OK, manual mode."
    #define OKTEMP "OK, trigger temperature changed"
    String helloText = "Hello from GPRS Shield!";
    String tempText = "Tempreature is ";
    String termValue = String(curr_temp);
    String degree = " C.";
    String heaterOn = "Heater is On.";
    String heaterOff = "Heater is Off.";
    String message_to_send;
    char char_message_to_send[60];
    // текст сообщения
    char message[160];
    // номер, с которого пришло сообщение
    char phone[16];
    // дата отправки сообщения
    char datetime[24];
    void setup()
    {
      //Определяем пины реле, светодиода, приемника
     
      pinMode(RELAY, OUTPUT);
      pinMode(13, OUTPUT);
      digitalWrite(RELAY, LOW);
      vw_set_ptt_inverted(true);
      vw_set_rx_pin(12);
      //Устанавливаем связь
      Serial.begin(9600);
      vw_setup(4000);
      vw_rx_start();
      Serial.println("Start");
      gprs.powerUpDown();
     
      while (!gprs.init())
       {
        delay(1000);
        Serial.println("Connecting");
       }
       
    //Отправляем запрос температуры
    Serial.println("Connected");
    gprs.sendSMS(PHONE_NUMBER, HELLO_MESSAGE);
    Serial.println("Hello message sent");
     
    while(trig_temp == 0)
    {
      Serial.println("Waiting for trigger temperature");
        if (gprs.ifSMSNow())
       {
        gprs.readSMS(message, phone, datetime);
        sms_temp(message);
       }
       delay(1000);
    }
     
    Serial.println("Trigger temperature assigned. Ask for mode name.");
    //Отправляем запрос режима
     
      gprs.sendSMS(PHONE_NUMBER, MODE_MESSAGE);
     
    while(mode == 0)
    {
       Serial.println("Waiting for mode");
       if (gprs.ifSMSNow())
       {
        gprs.readSMS(message, phone, datetime);
        sms_mode(message);  
       }
       delay(1000);
    }
      Serial.println("Mode assigned");
      gprs.sendSMS(PHONE_NUMBER, READY_MESSAGE);
    }
    void loop()
    {
        //Ждем сообщения
       
        if (gprs.ifSMSNow())
       {
        gprs.readSMS(message, phone, datetime);
        Serial.println("Message");
        inc_sms(message);
       }
       //Получаем текущую температуру с термостата
       
       inc_temp();
       
       //Проверяем надобность включения реле
       
       relay();
    }
    //Включаем или выключаем реле
    void relay()
    {
      if(curr_temp < trig_temp && mode == 1)
      {
        digitalWrite(RELAY, HIGH);
        stateRelay = true;
        delay(3000);
      }
       if(curr_temp >= trig_temp && mode == 1)
      {
        digitalWrite(RELAY, LOW);
        stateRelay = false;
        delay(3000);
      }
      if(m_temp == 1 &&  mode == 2 && curr_temp < danger_temp)
      {
         digitalWrite(RELAY, HIGH);
         stateRelay = true;
      }
      if(m_temp == 0 &&  mode == 2 || curr_temp >= danger_temp)
      {
         digitalWrite(RELAY, LOW);
         stateRelay = false;
         if(curr_temp >= danger_temp)
         {
          Serial.println("DANGER!");
          gprs.sendSMS(PHONE_NUMBER, DANGER_MESSAGE);
          delay(60000);
         }
      }
    }
    //Проверяем входящее SMS
    void inc_sms(char f_message[])
    {
      if(strcmp(f_message, "State") == 0)
      {
        Serial.println("Calling for state function");
        state();
      }
      else if(strcmp(f_message, "HeaterOn") == 0)
      {
        m_temp = 1;
        gprs.sendSMS(PHONE_NUMBER, HEATERON);
      }
      else if(strcmp(f_message, "HeaterOff") == 0)
      {
        m_temp = 0;
        gprs.sendSMS(PHONE_NUMBER, HEATEROFF);
      }
      else if(strcmp(f_message, "Auto") == 0)
      {
        mode = 1;
        gprs.sendSMS(PHONE_NUMBER,AUTOMODE);
      }
      else if(strcmp(f_message, "Manual") == 0)
      {
        mode = 2;
        gprs.sendSMS(PHONE_NUMBER, MANUALMODE);
      }
      else if(strcmp(f_message, "20") == 0)
    {
      trig_temp = 20;
      gprs.sendSMS(PHONE_NUMBER, OKTEMP);
    }
    else if(strcmp(f_message, "25") == 0)
    {
      trig_temp = 25;
      gprs.sendSMS(PHONE_NUMBER, OKTEMP);
    }
    else if(strcmp(f_message, "28") == 0)
    {
      trig_temp = 28;
      gprs.sendSMS(PHONE_NUMBER, OKTEMP);
    }
      else
      {
        Serial.println("Error");
        gprs.sendSMS(PHONE_NUMBER, ERROR_SMS);
       
      }
    }
     
    //Устанавливаем режим
    void sms_mode(char f_message[])
    {
      if(strcmp(f_message, "Auto") == 0)
      {
        mode = 1;
      }
       else if(strcmp(f_message, "Manual") == 0)
      {
        mode = 2;
      }
      else
      {
        gprs.sendSMS(PHONE_NUMBER,INC_MODE);
      }
    }
     
      /*
        Температура, которую нужно поддерживать.
        Я не буду делать так, чтобы можно было установить
        любую температуру срабатывания.
        Я выберу три - 20, 25 и 28.
        Вы можете выбирать режим на свое усмотрение.
      */

      void sms_temp(char f_message[])
    {
    if(strcmp(f_message, "20") == 0)
    {
      trig_temp = 20;
    }
    else if(strcmp(f_message, "25") == 0)
    {
      trig_temp = 25;
    }
    else if(strcmp(f_message, "28") == 0)
    {
      trig_temp = 28;
    }
    else
    {
      gprs.sendSMS(PHONE_NUMBER,INC_TRIG);
    }
    }
    //Считываем температуру
    void inc_temp()
    {
      uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
      uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера
      char temp[3];
     
      if (vw_get_message(buf, &buflen)) // Если принято сообщение
      {
      Serial.println("Received:");
      digitalWrite(13, HIGH);
      for(int i = 0; i < buflen; i++)
      {
         temp[i] = buf[i];
      }
      curr_temp = atoi(temp);
      Serial.print("Temperature is ");
      Serial.print(temp);
      Serial.println(" C");
      digitalWrite(13, LOW);
    }
    }
    //Готовим и отправляем SMS со статусом
    void state()
    {
      if(stateRelay)
      {
        message_to_send = String(helloText + tempText + termValue + degree + heaterOn);
        message_to_send.toCharArray(char_message_to_send, 100);
        Serial.println("Sending");
        gprs.sendSMS(PHONE_NUMBER, char_message_to_send);
        Serial.println("Sent");
      }
      else if(!stateRelay)
      {
        message_to_send = String(helloText + tempText + termValue + degree + heaterOff);
        message_to_send.toCharArray(char_message_to_send, 100);
        Serial.println("Sending");
        gprs.sendSMS(PHONE_NUMBER, char_message_to_send);
        Serial.println("Sent");
      }
    }
     
  6. alexander88

    alexander88 Нуб

    Код (C++):
    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>
    // библиотека для эмуляции Serial порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>
    // длина сообщения
    #define MESSAGE_LENGTH 160
    // текст сообщения о включении розетки
    #define MESSAGE_ON  "On"
    // текст сообщения о выключении розетки
    #define MESSAGE_OFF  "Off"
    // текст сообщения о состоянии розетки
    #define MESSAGE_STATE  "State"
    // пин, к которому подключено реле
    #define RELAY 5
    // текст сообщения
    char message[MESSAGE_LENGTH];
    // номер, с которого пришло сообщение
    char phone[16];
    // дата отправки сообщения
    char datetime[24];
    bool stateRelay = false;
    // создаём объект класса GPRS и передаём в него объект Serial1
    GPRS gprs(Serial1);----вот это тоже самое я даже не знаю как
    что дальше изменить
    void setup()
    {
      // настраиваем пин реле в режим выхода,
      pinMode(RELAY, OUTPUT);
      // подаём на пин реле «низкий уровень» (размыкаем реле)
      digitalWrite(RELAY, LOW);
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      // включаем GPRS шилд
      gprs.powerOn();
      // ждём, пока не откроется монитор последовательного порта
      // для того, чтобы отследить все события в программе
      while (!Serial) {
      }
      // открываем Serial-соединение с GPRS Shield
      Serial1.begin(9600);
      // проверяем есть ли связь с GPRS устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке
        // процесс повторяется в цикле
        // пока не появится ответ от GPRS устройства
        delay(1000);
        Serial.print("GPRS Init error\r\n");
      }
      // вывод об удачной инициализации GPRS Shield
      Serial.println("GPRS init success");
    }
    void loop()
    {
      // если пришло новое сообщение
      if (gprs.ifSMSNow()) {
        // читаем его
        // если есть хотя бы одно непрочитанное сообщение,
        // читаем его
        gprs.readSMS(message, phone, datetime);
        // выводим номер, с которого пришло смс
        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, MESSAGE_ON) == 0) {
        // если сообщение — с текстом «On»,
        // выводим сообщение в Serial
        // и подаём на замыкаем реле
        Serial.println("OK! Power is On");
        digitalWrite(RELAY, HIGH);
        stateRelay = true;
        // на номер, с которого пришёл запрос,
        // отправляем смс с текстом о включении питания
        gprs.sendSMS(f_phone, "Power is On");
      } else if (strcmp(f_message, MESSAGE_OFF) == 0) {
        // если пришло сообщение с текстом «Off»,
        // выводим сообщение в Serial
        // и размыкаем реле
        Serial.println("OK! Power is Off");
        digitalWrite(RELAY, LOW);
        stateRelay = false;
        // на номер, с которого пришёл запрос
        // отправляем смс с текстом о выключении питания
        gprs.sendSMS(f_phone, "Power is Off");
      } else if (strcmp(f_message, MESSAGE_STATE) == 0) {
        // если пришло сообщение с текстом «State»,
        // отправляем сообщение с состоянием реле
        if (stateRelay) {
          Serial.println("State: Power is On");
          gprs.sendSMS(f_phone, "Power is On");
        } else {
          Serial.println("State: Power is Off");
          gprs.sendSMS(f_phone, "Power is Off");
        }
      } else {
        // если сообщение содержит неизвестный текст,
        // отправляем сообщение с текстом об ошибке
        Serial.println("Error... unknown command!");
        gprs.sendSMS(f_phone, "Error...unknown command!");
      }
    }
     
  7. alexander88

    alexander88 Нуб

    прошу ардуинщиков я только начал вникать в них но не знаю как исправить ошибки компиляции. два верхних файла прикрепил. там увидите ошибочку. заранее спасибо.
     
  8. s1984i

    s1984i Нерд

    как проверить sim 900? что то она замолчала у меня. не отзаывается на At команды
     
  9. Small

    Small Нуб

    У себя сделал так
    Код (C++):
     if (millis() - previousGprs > intervalGprs) {
                           
                                 previousGprs = millis();
                                  if (!gprs.init()) {
                                                          // если связи нет, ждём 1 секунду
                                                         // и выводим сообщение об ошибке;
                                                     
                                                        delay(1000);
                                                        // включаем GPRS-шилд
                                                        gprs.powerOff();
                                                         delay(1000);
                                                       
                                                 
                                                 
                                                        Serial.print("Init error\r\n");
                                                         gprs.powerOn();
    }
    }
     
  10. s1984i

    s1984i Нерд

    помогите, не могу разобраться. перестал gprs shield откликаться уже попробывал новый shield и арудуино. всё равно молчит не отвечает. на AT. не возвращает ок.
    Получается этот скечь работает. Как буто не даёт обратной информации.

    Код (C++):

    [code=cpp]    #include <SoftwareSerial.h>
     
        //заводим Serial-соединение с GPRS-Shield на 7 и 8 цифровых входах
        SoftwareSerial gprsSerial(0, 1);
     
        void setup()
        {
            // GPRS Shield общается по умолчанию на скорости 19200 бод
            gprsSerial.begin(9600);
        }
     
        //в строке curStr будем хранить текущую строку, которую передает нам плата
        String currStr = "";
        int updateTime = 0;
     
        void loop()
        {
            touch();
     
            if (!gprsSerial.available())
                return;
     
            // Считываем очередной символ с платы
            char currSymb = gprsSerial.read();
     
            if ('\r' == currSymb) {
                // Получен символ перевода строки, это значит, что текущее
                // сообщение от платы завершено и мы можем на него отреагировать.
                // Если текущая строка - это RING, то значит, нам кто-то звонит
                if (!currStr.compareTo("RING")) {
             
                  gprsSerial.println("AT+CLCC");
                    //кокетничаем 3 секунды, чтобы дать услышать звонящему гудок
                    delay(3000);
                    //посылаем команду на поднятие трубки
                    gprsSerial.println("ATA");
                }
                currStr = "";
            } else if (currSymb != '\n') {
                // Дополняем текущую команду новым сиволом
                // При этом игнорируем второй символ в последовательности переноса
                // строки: \r\n
                currStr += String(currSymb);
            }
        }
     
        /*
         * Функция провоцирует поддержание коммуникации с платой даже если
         * та была перезагружена без перезагрузки Arduino
         */

        void touch()
        {
            if (millis() >= updateTime) {
                gprsSerial.println("AT");
                updateTime += 5000;
            }
        }

     
     
    Последнее редактирование: 28 авг 2017
  11. serzh

    serzh Нуб

    как подключить шилд к юсб преобразователю к компу? в связке с мегой все работает нормально, но через преобразователь и терминальную программу тишина на АТ команды. есть точно такой же китайский шилд. с этим же преобразователем и этой программой все работает хорошо