Подключение sim 900 и arduino uno

steve37
Offline
Зарегистрирован: 08.05.2017

Имеется:
- Arduino Uno (ATmega328P-PU)
- GPRS Shield SIM900 (s2-1040s-z1k0c)
- Однокональное реле

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

Не смог найти информации по подключение конкретных устройств, каким образом подключается сие чудо?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Shield надевается сверху на Uno, а реле подключается к любому свободному контакту.

steve37
Offline
Зарегистрирован: 08.05.2017

физически не получится шилд свеху посадить на адруинку, компоненты не позволяют и ножки обрезаны.

читал что для программироания подключается как-то иначе

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это как?

Вы хотите сказать, что существуют препятствия для штатного способа соединения?

Может, Вы что не так делаете? (у Вас на фото щит и Уно сориентированы с поворотом на 180 градусов).

Alba
Offline
Зарегистрирован: 03.06.2017

Ноги припоять надо на шилд

b707
Offline
Зарегистрирован: 26.05.2017

Alba пишет:
Ноги припоять надо на шилд

проще подключить проводами - надо-то всего - RX, TX, питание и GND

b707
Offline
Зарегистрирован: 26.05.2017

steve37 пишет:

Задумка сдедующая. Автоматические ворота, при звонке определенных номеров, ворота должны открываться, при повторном звонке должны закрываться.

Пользовался такой системой - очень неудобно. Пока не начали делать, советую  поменять средство управления с GSM-шилда на пару приемник 433 или 315 МГц и передатчик в виде брелка

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Здравствуйте уважаемые.

Вот-вот придёт данный модуль, решила подготовить "почву" заранее, т.е. изучить работу.

Буду читать и отправлять СМС.

// библиотека для работы с 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);
  }
}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Как я понимаю, смс остается в памяти на сим карте? Как удалять сообщение после прочтения?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

А если можно, подскажите где почитать описание библиотеки, желательно на русском

b707
Offline
Зарегистрирован: 26.05.2017

Irinka пишет:

Как я понимаю, смс остается в памяти на сим карте? Как удалять сообщение после прочтения?

Для этого есть соответствующая AT-команда. Где найти описание на русском - не знаю, может оказаться. что его вообще не существует. Но английский там несложный, не Шекспиром писано, а скорее всего китайцами :)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

АТ команды видела, только смысл тогда от библиотеки?

b707
Offline
Зарегистрирован: 26.05.2017

Irinka пишет:

АТ команды видела, только смысл тогда от библиотеки?

Вы откройте файл GPRS_Shield_Arduino.h - там должно быть краткое перечисление всех функций библиотеки с параметрами вызова. Возможно там и функция для стирания СМС есть. Но может и не быть, библиотеки ведь каждый под свои нужды пишет. Если автору не было нужно стирать СМс с карты - он это в библиотеку не вставил...

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

модуль не реагирует на ат команы. что я не так сделала?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Код

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(7,8); 
 
void setup()
{
  Serial.begin(9600);
  //Serial.println(“Begin”);
  mySerial.begin(9600);
 
}
 
void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Заработал

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
// библиотека для работы с GPRS устройством
#include <GPRS_Shield_Arduino.h>
 
// создаём объект класса 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 устройства
    Serial.print("GPRS Init error\r\n");
    delay(3000);
  }
  // выводим сообщение об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");
}
 
void loop()
{
  // считываем данные с компьютера и записываем их в GPRS Shield
  serialPCread();
  // считываем данные с GPRS Shield и выводим их в Serial-порт
  serialGPRSread();
}
 
void serialPCread()
{
  if (Serial.available() > 0) {
    // если приходят данные по USB
    while (Serial.available() > 0) {
      // записываем их в GPRS Shield
      Serial1.write(Serial.read());
    }
  }
}
 
void serialGPRSread()
{
    if (Serial1.available() > 0) {
      // если приходят данные с GPRS Shield
      while (Serial1.available() > 0) {
        // передаём их в USB
        Serial.write(Serial1.read());
    }
  }
}

 

Что не так в этой строке?

sketch_jan17a:57: error: 'Serial1' was not declared in this scope

     if (Serial1.available() > 0) {

         ^

exit status 1
'Serial1' was not declared in this scope

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Наверное на Uno нет Serial1?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Ардуино nano

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Как быть?

sadman41
Offline
Зарегистрирован: 19.10.2016

Наверное на Nano нет Serial1

Hint: МК на них одинаковый. И на Mini Pro тоже, можете не пробовать.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
// библиотека для работы с 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);
  }
}

Вроде код написа для уно

GPRSReadSMS:33: error: 'Serial1' was not declared in this scope

   Serial1.begin(9600);

   ^

exit status 1
'Serial1' was not declared in this scope

Как это исправить?

sadman41
Offline
Зарегистрирован: 19.10.2016

Никак не исправить. Serial1 (а так же Serial2) - это глобальный объект и создается он для определенных платформ, на которых более одного хардварного (тут вам подсказка) UART. Это, например, Mega2560.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Разобралась. Спасибо.

// библиотека для работы с GPRS устройством
#include <GPRS_Shield_Arduino.h>
 #include <SoftwareSerial.h>
// длина сообщения
#define MESSAGE_LENGTH 160
 
// номер сообщения в памяти сим-карты
int messageIndex = 0;
 
// текст сообщения
char message[MESSAGE_LENGTH];
// номер, с которого пришло сообщение
char phone[16];
// дата отправки сообщения
char datetime[24];
 
// создаём объект класса GPRS и передаём в него объект Serial1 

 
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
SoftwareSerial mySerial(7, 8);
GPRS gprs(mySerial);
// можно указать дополнительные параметры — пины 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
 mySerial.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);
  }
}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
// можно указать дополнительные параметры — пины PK и ST
// по умолчанию: PK = 2, ST = 3
// GPRS gprs(Serial1, 2, 3);

Для чего это нужно?

И еще вопрос, как включать модуль програмно, а не нажатием на кнопку питания?

 

sadman41
Offline
Зарегистрирован: 19.10.2016
В исходной библиотеке от Амперки существовала обратная связь через сигнал ST. Через него в процессе включения проверялось состояние: включен ли чип. Увы, в отсутствии этого сигнала методы включения и выключения чипа похожи как братья близнецы... 
 
Про PK там же.
 
Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Нашла вот что

void powerUpOrDown()
{
    pinMode(9, OUTPUT);
    digitalWrite(9,LOW);
    delay(1000);
    digitalWrite(9,HIGH);
    delay(2000);
    digitalWrite(9,LOW);
    delay(3000);
}

НЕ ПОЙМУ КАКОЙ ЭТО КОНТАКТ ШИЛДА НА МОЕЙ КАРТИНКЕ

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

  gprs.powerOn();

Соединила 9 пин ардуино с 9 пином шилда, не включается

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

читайте до просветления :)

http://arduino.ru/forum/obshchii/ne-vklyuchaetsya-shild-sim900

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Спасибо. Продолжу по ссылке

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017


Подскажите как исправить ситуацию.

#include <GPRSk_Shield_Arduino.h>
#include <SoftwareSerial.h>
#define MESSAGE_LENGTH 160
SoftwareSerial mySerial(7, 8);
int messageIndex = 0;
char message[MESSAGE_LENGTH];
char phone[16];
char datetime[24];
GPRSk gprs(mySerial);

void(* resetFunc) (void) = 0;

void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
while (!Serial) {
}
Serial.print("Serial init OK\r\n");
gprs.powerOn();
while (!gprs.init()) {
delay(1000);
Serial.print("GPRS Init error\r\n");
resetFunc();
}
Serial.println("GPRS init success");
Serial.println("Please send SMS message to me!");
}

void loop()
{
if (gprs.ifSMSNow()) {
gprs.readSMS(message, phone, datetime);
//Проверка на номер
if (strstr(phone, "+79603333333")){
Serial.println("Верный номер");
if (strstr(message, "zapusk5"));{
Serial.println("Запуск 5 минут");}

if (strstr(message, "zapusk10"));{
Serial.println("Запуск 10 минут");}
}else{
Serial.println("НЕверный номер");
Serial.println(phone);
}
}
}




В мониторе порта я получаю

Верный номер

Запуск 5 минут

Запуск 10 минут

Хотя в сообщении я посылала zapusk5

Т.е. слово zapusk сравнивается два раза.

Как сделать чтобы strstr сравнивала точные символы?

b707
Offline
Зарегистрирован: 26.05.2017

Irinka, функция strstr - это не сравнение двух строк, это поиск одной строки в другой.  Прочитайте внимательно синтаксис вызова и что эта функция возвращает. Вы неправильно ее используете. В том числе и "верный номер" будет выдавать такой ответ при любом входящем СМС с любого номера.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

какой функцией пользоваться?

Просто условием сравнить нельзя,потому что могут быть левые символы

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

можно так

if (smsstr.compareTo("status") == 0) {
// бла  бла бла
}
smsstr входящая строка (String) и вот так
if (smsstr.substring(passwstrlen, (passwstrlen + 7)) == "kick on") {
}

это вам не искуственый разум, и не тем более разум человека, который автоматом отбрасывает лишнее

b707
Offline
Зарегистрирован: 26.05.2017

Irinka пишет:

какой функцией пользоваться?

да этой же strstr. только правильно!

RTFM

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
if (message.compareTo("stop")==0)
{
digitalWrite(zazhiganie, LOW); 
digitalWrite(star, LOW);
}
exit status 1
request for member 'compareTo' in 'message', which is of non-class type 'char [160]'
b707
Offline
Зарегистрирован: 26.05.2017

Valera19701 пишет:

можно так

if (smsstr.compareTo("status") == 0) {
// бла  бла бла
}

да ну, зачем String когда strstr идеально подходит для этого случая? Я просто хочу. чтобы человек, БЛИН, хоть чуть чуть сам научился. неужели трудно открыть гугль и посмотреть, как правильно пользоваться функцией?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

ок, пусть читает:)

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
if (strstr(*message, "stop"));{
//,kf,kf
}

if (strstr(*message, "stop1"));{
блабла
}

Так?)

b707
Offline
Зарегистрирован: 26.05.2017

Irinka пишет:

if (strstr(*message, "stop"));{
//,kf,kf
}

if (strstr(*message, "stop1"));{
блабла
}

Так?)

Блин, надоели, честное слово. Неужели трудно посмотреть пример в инете? Не так, а вот так:

if (strstr(message, "stop") != NULL) {
//,kf,kf
}

Во-вторых, если у вас одна строка будет "stop", а другая  "stop1" - первая будет совпадать с обоими. Чтобы строки работали корректно, они должны быть УНИКАЛЬНЫ.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Суть вопроса и была в том, что у меня сравнивались zapusk5 и zapusk10, в обоих есть слово zapusk

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
b707
Offline
Зарегистрирован: 26.05.2017

Irinka пишет:

Суть вопроса и была в том, что у меня сравнивались zapusk5 и zapusk10, в обоих есть слово zapusk

и что ?  zapusk5 и zapusk10 - разные строки и будут сравниваться отдельно, не мешая друг другу, если сравнивать правильно.

Это вы думали, что суть в этом, а она совсем в другом,...

Иван Щербин
Offline
Зарегистрирован: 02.04.2020

Доброго времени суток. По вашему коду пишет в диалоговом окне GPRS Init error

Получается нет связи-как это лечится?