Sim900 и Arduino UNO

Тема в разделе "Arduino & Shields", создана пользователем motomac, 29 июн 2017.

Метки:
  1. motomac

    motomac Нуб

    Здравствуйте!

    Приобрел вот такой странный шилд с Алиэкспресса. Хэдеров нет. Пришлось искать такие длинные самостоятельно, но и они не помогли: USB-порт ардуины не дает вставить шилд до конца. Короче, пытаюсь соединить проводами вот по этой схеме:

    [​IMG]
    Загружаю скетч:

    Код (C++):
    #include <SoftwareSerial.h>

    //заводим Serial-соединение с GPRS-Shield на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);
    void setup()
    {
        // GPRS Shield общается по умолчанию на скорости 19200 бод
        gprsSerial.begin(19200);
    }
    //в строке 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")) {
                //кокетничаем 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;
        }
    }

    Ноль эмоций. Шилд вообще не подает каких-либо признаков жизни. Подорезваю, что ему нужно дополнительное питание. Можно ли его организовать с ардуины? Если да, то как?

    Если проблема не в этом, то в чем?
     
  2. Radius

    Radius Гик

    GSM-модуль в импульсе потребляет до 2 А, естественно Uno не может выдать такой ток. Ищите источник питания который выдает 2А и втыкайте его прямо в GSM-шилд в разъем питания.
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Что значит не вставляется?Не обязательно до упора у меня такой же.На USB порт наклеил скотч и ничего нигде не коротит.Питание от USB порта компа.Все прекрасно работает.И перемычки RX TX правильно поставьте на фотке стоят не правильно Вам надо в крайнее левое положение так как по скетчу у Вас програмный УСАРТ.
     
    motomac нравится это.
  4. motomac

    motomac Нуб

    Radius, спасибо, попробую!

    Airbus, вот такая порнография получается:
    IMG_4585.JPG
    Угол лотка сим-карты упирается в USB порт ардуины и порт питания. Хэдеры едва входят в пины.
     
  5. Alba

    Alba Нерд

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

    1. Внешнее питание 5-9 В

    2. Общая с Ардуино земля!!!

    3. Перемычки в левое положение (D7, D8).

    4. Соединить соответствующие порты 7 и 8 с Ардуино.

    5. Монитор порта SSCom v3.2. Галочка “Send New”, Тестовая строка: ATD + +7----------;

    6. Код для Ардуино:
    Код (C++):
    //Serial Relay - Arduino will patch a
    //serial link between the computer and the GPRS Shield
    //at 19200 bps 8-N-1
    //Computer is connected to Hardware UART
    //GPRS Shield is connected to the Software UART

    #include <SoftwareSerial.h>

    SoftwareSerial GPRS(7, 8);
    unsigned char buffer[64]; // buffer array for data recieve over serial port
    int count=0;     // counter for buffer array


    void clearBufferArray()              // function to clear buffer array
    {
        for (int i=0; i<count;i++)
        { buffer[i]=NULL;}                  // clear all index of array with command NULL
    }



    void setup()
    {
        GPRS.begin(19200);               // the GPRS baud rate
        Serial.begin(19200);             // the Serial port of Arduino baud rate.

    }

    void loop()
    {
        if (GPRS.available())              // if date is comming from softwareserial port ==> data is comming from gprs shield
        {
            while(GPRS.available())          // reading data into char array
            {
                buffer[count++]=GPRS.read();     // writing data into array
                if(count == 64)break;
            }
            Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
            clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
            count = 0;                       // set counter of while loop to zero


        }
        if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
        GPRS.write(Serial.read());       // write it to the GPRS shield


    }
     
    arkadyf нравится это.
  6. Airbus

    Airbus Радиохулиган Модератор

    Что этот код делает?Откуда скопипастили?
     
  7. Alba

    Alba Нерд

    Привет Airbus !
    Это на монитор порта на АТ команды я ему скинул у меня он робит
     
  8. Alba

    Alba Нерд

    ИСХОДНИК вот http://wiki.amperka.ru/projects:smart-power
    У меня просто сим 900 и уно хочу залить вот этот скетч
    но он не проходит,Мне понравилось что в этом скетче есть обртаная отправка смс о вкл или выкл питании.Если есть возможность подсказать что тут и как можно изменить?
    Код (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!");
      }
    }
    А вот и ошибка
    sketch_cmc_works:24: error: 'Serial1' was not declared in this scope

    GPRS gprs(Serial1);

    ^

    C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino: In function 'void setup()':

    sketch_cmc_works:40: error: 'Serial1' was not declared in this scope

    Serial1.begin(9600);

    ^

    C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino: In function 'void setRelay(char*, char*)':

    C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:86:40: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    gprs.sendSMS(f_phone, "Power is On");

    ^

    C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:96:41: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    gprs.sendSMS(f_phone, "Power is Off");

    ^

    C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:102:42: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    gprs.sendSMS(f_phone, "Power is On");

    ^

    C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:105:43: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    gprs.sendSMS(f_phone, "Power is Off");

    ^

    C:\Users\User\Downloads\sketch_cmc_works\sketch_cmc_works.ino:111:53: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

    gprs.sendSMS(f_phone, "Error...unknown command!");

    ^

    exit status 1
    'Serial1' was not declared in this scope
     
    Последнее редактирование: 3 июл 2017
  9. motomac

    motomac Нуб

    Таки спаял с грехом пополам. Боялся, что "глубины вхождения" не хватит, но его действительно хватило. Шилд ожил. Вроде все работает. Единственная проблема - программное включение шилда. Инструкция в конце этой статьи не помогает. При подаче питания на ардуино индикаторы сети то горят сами, то не горят, и приходится вручную нажимать на Power.
     
  10. Alba

    Alba Нерд

    Вот тебе мой пример включения программно на основе светодиодов

    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
    //для зелёного светодиода будем использовать второй цифровой вход,
    //а для жёлтого - третий
    int greenPin = 2;
    int yellowPin = 3;
    int power = 9 ;
    void setup()
    {
        gprsSerial.begin(19200);
        pinMode(greenPin, OUTPUT);
        pinMode(yellowPin, OUTPUT);
        pinMode(power, OUTPUT);
        digitalWrite(power,HIGH); //подали питание
    delay(3000); //на 3At сек
    digitalWrite(power,LOW); //сняли питание
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        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);
        }
    }
     
    arkadyf нравится это.
  11. motomac

    motomac Нуб

    Судя по соседней теме, этого недостаточно. Нужно еще закоротить R13. Нет ли способа обойтись без запаивания R13?
     
  12. Airbus

    Airbus Радиохулиган Модератор

    Для чего? Питание включаем через Пин 9 вот кусок кода
    Код (C++):
    // отправляем смс в текстовом режиме v2
    int buttonPin = 12; // номер входа, подключенный к кнопке
    int power = 9 ; // подача питания пин 9
    void setup (){
    // инициализируем пин, подключенный к кнопке, как вход
    // пин 9 для включения шилда
    pinMode(buttonPin, INPUT);
    pinMode(power, OUTPUT);
    digitalWrite(power,HIGH); //подали питание
    delay(1000); //на 1 сек
    digitalWrite(power,LOW); //сняли питание
    Serial.begin(9600);
    Serial.print("AT+CMGF=1\r");
    delay(500);
     
    Последнее редактирование: 4 июл 2017
  13. motomac

    motomac Нуб

    Аналогичный код:
    Код (C++):

    void setup()
    {
      pinMode(9, OUTPUT);
      digitalWrite(9, HIGH);
      delay(3000);
      digitalWrite(9, LOW);
      delay(1000);

      gprsSerial.begin(19200);
      delay(500);
    }
     
    Горит только лампочка питания. Сеть не ловит.
     
    Последнее редактирование: 4 июл 2017
  14. motomac

    motomac Нуб

    В общем, пришлось-таки запаять R13. Без этого шилд не включался.
     
  15. Alba

    Alba Нерд

    Может тебе и сгодиться это скетч я его неделю искал!!!!!!!!!!!!
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);

    int powerGSM = 9; // Пин включения GSM
    int unit1 = 5; // Пин включения реле №1

    void setup()
    {
        digitalWrite(powerGSM, HIGH); // Включаю GSM модуль
        delay(1000);
        digitalWrite(powerGSM, LOW);
        delay(5000);
        gprsSerial.begin(19200);
        delay(300);
        pinMode(unit1, 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("On")) {
                    digitalWrite(unit1, HIGH);
                    gprsSerial.println("AT + CMGS = \"+7xxxxxxxx\"");
                    delay(100);
                    gprsSerial.println("Relay is On");
                    delay(100);
                    gprsSerial.println((char)26);
                } else if (!currStr.compareTo("Off")) {
                    digitalWrite(unit1, LOW);
                    gprsSerial.println("AT + CMGS = \"+7xxxxxxxx\"");
                    delay(100);
                    gprsSerial.println("Relay is Off");
                    delay(100);
                    gprsSerial.println((char)26);
                }
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
    }
     
     
  16. Airbus

    Airbus Радиохулиган Модератор

    Это переделанный из управления светодиодами?
     
  17. Alba

    Alba Нерд

  18. MDV

    MDV Гик

    Обычный шилд. Запускается и отключается программное без особых проблем. Для работы по проводочкам необходимо было подкинуть Vin
    У меня с таким другой трабл не на всех диапазонах сети работает.
     
  19. zabigundi

    zabigundi Нуб

    Помогите получить номер входящего звонка для проверки и если верен то берём трубку:

    Код (C++):
    // ожидание звонка (поступил звонок)

      if (gprs.ifcallNow()) {

      delay(3000);


    // берем трубку

      gprs.answer();

    delay(500);

    // ждем пока не положит трубку

      while (!gprs.ifcallEnd()) {

      }


      // конец разговора

      }
     
  20. MDV

    MDV Гик

    На какой стадии программирования остановился? И что за библиотеку работы с модемом используешь?