Управление устройством через gsm

Novator
Offline
Зарегистрирован: 15.02.2016

Добрый день!

Разрабатываем робота на arduino UNO с gsm модулем m590. Нужно чтобы модуль отправлял сообщения на телефон при срабатываии датчика, а также принимал сообщения и в зависимости от содержания SMS выполнял заложенные в его памяти действия (в последующем будут два мотора вращаться вперед, назад, повороты).

В интернете нашли скетч для отправки SMS: http://2150692.ru/faq/36-otpravka-sms-cherez-arduino-i-gsm-modul-neoway-m590. В скетче изменили условие отправки SMS, теперь SMS отправляется при срабативании датчика подключенного к 4-му пину (скетч представлен ниже). Отправка SMS работает. Также arduino распознает номер звонящего и определяет свой или чужой.

Никак не можем научиться принимать SMS на gsm модуль. Нашли справочник по AT командам, пробывали использывать команду AT+CMGR=<index> с разными индексами. Ничего не вышло. Может не в том месте программы указывали эту команду? Хотя пробывали и в void setup {mySerial.println("AT+CMGR=1");} и void loop. 

Пробывали использовать команду AT+CMGF=1\r. Также ничего не получилось.

Возможно управление роботом получится проще через другие устройства, например, bluetooth, но нужно именно через gsm модуль. Помогите пожалуйста разобраться, и если возможно объясните как можно проще, поскольку в этом деле новички.

Скетч:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
int led = 13;
String val = "";

void setup() {
  delay(2000);  //время на инициализацию модуля
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(115200);  //скорость порта
  Serial.println("GSM tester v1.0");
  mySerial.begin(115200);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(100);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(100);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(100);
  mySerial.println("AT+CMGL=ALL");
  delay(100);
  pinMode(4, INPUT);
  }

void loop() {
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
    if (val.indexOf("RING") > -1) {  //если звонок обнаружен, то проверяем номер
      if (val.indexOf("7ХХХХХХХХХХ") > -1) {  //если номер звонящего наш. Укажите свой номер без "+"
        Serial.println("--- MASTER RING DETECTED ---");
        mySerial.println("ATH0");  //разрываем связь
        }
    } else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
         
    if (digitalRead(4)==1) {  //если увидели команду отправки СМС
      sms(String("hello world"), String("+7ХХХХХХХХХХ"));  //отправляем СМС на номер +71234567890
    }
    val = "";  //очищаем
 }

void sms(String text, String phone)  //процедура отправки СМС
{
  Serial.println("SMS send started");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send complete");
  delay(2000);
}
bad_user
Offline
Зарегистрирован: 13.11.2015

AT+CMGF — задаёт режим работы: 0-цифровой или 1-текстовый. Эта команда должна вызываться первой, от этого зависит формат последующих команд и ответов модема.

AT+CMGL — чтение сообщений с модема, в качестве параметра можно передать одно из пяти значений, стоит обратить внимание что в зависимости от режима (AT+CMGF) следует передавать цифровые или строковые значения:

входящие непрочитанные: "REC UNREAD" //строковый,   или   "0"  //цифровой

все сообщения: "ALL" //строковый,     или   "4" //цифровой

у Вас должно выглядеть примерно так: 

AT+CMGF=0

AT+CMGL=4

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

AT+CNMI=2,2 - отображение смс в терминале сразу после приема (без этого сообщения молча падают в память)

Novator
Offline
Зарегистрирован: 15.02.2016

Спасибо за ответы! В скетч добавил mySerial.println("AT+CNMI=2,2"); в void setup. В монитор порта стали приходить SMS. 

Правда почему-то коверкает номер отправителя +CMT: "+7940ХХХХХХХ",,#16/02/16,23:04:46+18" 123456789

940 вместо 950, а во втором случае

+CMT: "+7850ХХХХХХХ",,"16/02/16,32:05:42+18"privet

850 вместо 950

Это наверное не существенно, просто интересно почему. А как теперь использовать содержимое SMS для управления роботом? Нужно сохранить содержимое в переменную String и сравнить ее с заложенной в скетче? Или это как-то по другому делается? Подскажите пожалуйста.

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

снизьте скорость обмена данными модема до 19200, Software.serial плохо работает на скорости выше 38400

http://arduino.ru/forum/apparatnye-voprosy/ne-rabotaet-neoway-m590#comment-162776

Novator
Offline
Зарегистрирован: 15.02.2016

помогло, спасибо!

Elektron
Offline
Зарегистрирован: 12.02.2016

Так же мучился с этим модулем, пока скорость протокола не поменял, ничего не получалось, и кого сколько потребляет тока, читал у всех по-разному получается от 200мА до 2А? 

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

Elektron пишет:

Так же мучился с этим модулем, пока скорость протокола не поменял, ничего не получалось, и кого сколько потребляет тока, читал у всех по-разному получается от 200мА до 2А? 

потреблет столько, на сколько вы удалены от сотовой вышки, чем дальше, тем больше:)

Novator
Offline
Зарегистрирован: 15.02.2016

Проблема решена. Вместо "RING" нужно использовать "+CMT", тогда модуль регистрирует не входящий звонок, а входящее сообщение. А на следующей строке вместо номера телефона нужно сравнить кодовое слово, если оно совпадает - выполняется функция, в данном случае напишет "--- MASTER RING DETECTED ---". Разрывать связь уже не нужно.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Novator пишет:

Проблема решена. Вместо "RING" нужно использовать "+CMT", тогда модуль регистрирует не входящий звонок, а входящее сообщение. А на следующей строке вместо номера телефона нужно сравнить кодовое слово, если оно совпадает - выполняется функция, в данном случае напишет "--- MASTER RING DETECTED ---". Разрывать связь уже не нужно.

У меня этот модуль прекрасно работает и с RING, и с +CMT, кладёт трубку, принимает и отсылает сообщения (использую формат PDU, т.е. проблем с русскими SMS нет как класса). Там всё дело - во вдумчивом прочтении даташита на команды, плюс в реализации алгоритма управления - я использую конечный автомат.

Iron_lag
Offline
Зарегистрирован: 01.10.2016

Здравствуйте. Подскажите пожалуйста, как в скетче добавить еще один номер телефона который будет управлять устройством? Спасибо.

okta
Offline
Зарегистрирован: 10.01.2015

Наводящий вопрос: а где в коде ТС проверяется номер входящего звонка?

Второй вопрос: какие логические операторы вы знаете?

Итого: совместив ответы на эти два вопроса, вы получите требуемый результат.

Пожалуйста.