Управление устройством через gsm
- Войдите на сайт для отправки комментариев
Добрый день!
Разрабатываем робота на 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);
}
AT+CMGF — задаёт режим работы: 0-цифровой или 1-текстовый. Эта команда должна вызываться первой, от этого зависит формат последующих команд и ответов модема.
AT+CMGL — чтение сообщений с модема, в качестве параметра можно передать одно из пяти значений, стоит обратить внимание что в зависимости от режима (AT+CMGF) следует передавать цифровые или строковые значения:
входящие непрочитанные: "REC UNREAD" //строковый, или "0" //цифровой
все сообщения: "ALL" //строковый, или "4" //цифровой
у Вас должно выглядеть примерно так:
AT+CMGF=0
AT+CMGL=4
AT+CNMI=2,2 - отображение смс в терминале сразу после приема (без этого сообщения молча падают в память)
Спасибо за ответы! В скетч добавил 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 и сравнить ее с заложенной в скетче? Или это как-то по другому делается? Подскажите пожалуйста.
снизьте скорость обмена данными модема до 19200, Software.serial плохо работает на скорости выше 38400
http://arduino.ru/forum/apparatnye-voprosy/ne-rabotaet-neoway-m590#comment-162776
помогло, спасибо!
Так же мучился с этим модулем, пока скорость протокола не поменял, ничего не получалось, и кого сколько потребляет тока, читал у всех по-разному получается от 200мА до 2А?
у меня около 2А
Еще полезная инфа -
http://www.youtube.com/watch?v=atcGSFMxLCo&list=PLLKJAydOxTyC-J--pCkfatj...
http://arduinolab.pw/index.php/2016/01/20/primitivnaya-gsm-signalizaciya...
Так же мучился с этим модулем, пока скорость протокола не поменял, ничего не получалось, и кого сколько потребляет тока, читал у всех по-разному получается от 200мА до 2А?
потреблет столько, на сколько вы удалены от сотовой вышки, чем дальше, тем больше:)
Проблема решена. Вместо "RING" нужно использовать "+CMT", тогда модуль регистрирует не входящий звонок, а входящее сообщение. А на следующей строке вместо номера телефона нужно сравнить кодовое слово, если оно совпадает - выполняется функция, в данном случае напишет "--- MASTER RING DETECTED ---". Разрывать связь уже не нужно.
Проблема решена. Вместо "RING" нужно использовать "+CMT", тогда модуль регистрирует не входящий звонок, а входящее сообщение. А на следующей строке вместо номера телефона нужно сравнить кодовое слово, если оно совпадает - выполняется функция, в данном случае напишет "--- MASTER RING DETECTED ---". Разрывать связь уже не нужно.
У меня этот модуль прекрасно работает и с RING, и с +CMT, кладёт трубку, принимает и отсылает сообщения (использую формат PDU, т.е. проблем с русскими SMS нет как класса). Там всё дело - во вдумчивом прочтении даташита на команды, плюс в реализации алгоритма управления - я использую конечный автомат.
Здравствуйте. Подскажите пожалуйста, как в скетче добавить еще один номер телефона который будет управлять устройством? Спасибо.
Наводящий вопрос: а где в коде ТС проверяется номер входящего звонка?
Второй вопрос: какие логические операторы вы знаете?
Итого: совместив ответы на эти два вопроса, вы получите требуемый результат.
Пожалуйста.