Ответное СМС

vanila
Offline
Зарегистрирован: 25.08.2015

Имеется Уно, gsm Shield sim900.

Необходимо отправить ответное смс.

Вот так я настраиваю модуль в setup:

    Serial.begin(19200);
    Serial.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения
    delay(300);
    Serial.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных
    delay(300);
    Serial.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты.!
    delay(300);
    Serial.print("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс.!
    delay(500);
    Serial.print("AT+CMGD=1,4\r");//удалить все смс
    delay(500);

Далее определяю номер входящего смс:

    if(currStr.startsWith("+CMT")) {  //если начинается с CMT то далее следует номер
    String num = currStr.substring(currStr.indexOf("\""),currStr.indexOf(",")); // выделяем номер
    //печатаем что получилось на лсд
    lcd.setCursor(0,0);
    lcd.print(num);
                                 }

на экране появляетя: "+7xxxxxxxxxxx" , тоеть номер приславшего смс в кавычках

А вот так отправляю смс:

Serial.print("AT+CMGF=1\r"); //текстовый режим
    delay(100); // даём время на усваивание команды
    // Устанавливаем адресата: телефонный номер в международном формате
Serial.println("AT + CMGS = \"+7xxxxxxxxxx\""); 
    delay(100);
    Serial.println((char)26);

 

Внимание вопрос!

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

Serial.println("AT + CMGS = \"+7xxxxxxxxxx\""); 

 

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
Serial.println("AT + CMGS = \""+num+"\"");

 

vanila
Offline
Зарегистрирован: 25.08.2015

Что то не получается, что не так делаю?

Вначале обявляю:

String num = "";

Отправляю смс:

    
Serial.print("AT+CMGF=1\r");// Устанавливает текстовый режим для SMS-сообщений
    delay(100); // даём время на усваивание команды
    
Serial.println("AT + CMGS = \""+num+"\"");// телефонный номер
    delay(100);
Serial.println("test");
 delay(100);
    Serial.println((char)26);

на экране все также номер появляется но смс ответное не приходит

vanila
Offline
Зарегистрирован: 25.08.2015

Вот что типа такого получается


String currStr = "";
boolean isStringMessage = false;// Переменная принимает значение True, если текущая строка является сообщением
String num = "";

void setup() {
Serial.begin(19200);
Serial.print("AT+GMM\r");// запрос индетификатора модуля
delay(500);
if (!Serial.available()) {  //если запрос неудался, значит модуль выключен
  //тады включаем модуль
    pinMode(8, OUTPUT);
    digitalWrite(8, HIGH);    // Подаем High на пин 8
    delay(3000);              // на 3 секунды
    digitalWrite(8, LOW);     // и отпускаем в Low. 
    delay(5000);              // Ждём 5 секунд для старта шилда
    pinMode(8, INPUT); //хз зачем но пусть будет       
   // Настраиваем Модуль
    Serial.begin(19200);
    Serial.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения
    delay(300);
    Serial.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных
    delay(300);
    Serial.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты.!
    delay(300);
    Serial.print("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс.!
    delay(500);
    Serial.print("AT+CMGD=1,4\r");//все удалить
    delay(500);
}

}//setup

void loop() {



if (!Serial.available()){ return;}
char currSymb = Serial.read();    
if ('\r' == currSymb) {
        if (isStringMessage) { //если текущая строка - SMS-сообщение,
             if (!currStr.compareTo("Status")) {sendTextMessage();} //если пришло слово статус - отправляем смс
        
             isStringMessage = false;
                              } 
        else  {
             if(currStr.startsWith("+CMT")) {  //если начинается с CMT то далее следует номер
             String num = currStr.substring(currStr.indexOf("\""),currStr.indexOf(",")); // выделяем номер
                                             }

             if (currStr.startsWith("+CMT")) {isStringMessage = true; }//если текущая строка начинается с "+CMT",то следующая строка является сообщением
           
              }//else 
        
        currStr = "";
                      }
 else if ('\n' != currSymb) {
        currStr += String(currSymb);
                            }

}//loop


void sendTextMessage() {
    // Устанавливает текстовый режим для SMS-сообщений
Serial.print("AT+CMGF=1\r");
    delay(100); // даём время на усваивание команды
    //  телефонный номер 
Serial.println("AT + CMGS = \""+num+"\"");
    delay(100);
    // Пишем текст сообщения
Serial.println("Test");
delay(100);
    // отправляем
    Serial.println((char)26);
}

 

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

а номер в кавычках появляется?

vanila
Offline
Зарегистрирован: 25.08.2015

всмысле когда на экран вывожу?

да на экране появляется

vanila
Offline
Зарегистрирован: 25.08.2015

и да он в кавычках появляется))

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
Serial.println("AT + CMGS = \"+num+\"");

 

vanila
Offline
Зарегистрирован: 25.08.2015

неа, и так не получается

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

после 74 строки добавить

delay(5000);

 

vanila
Offline
Зарегистрирован: 25.08.2015

загрузил вот этот скетч:


String currStr = "";
boolean isStringMessage = false;// Переменная принимает значение True, если текущая строка является сообщением
String num = "";

void setup() {
Serial.begin(19200);
Serial.print("AT+GMM\r");// запрос индетификатора модуля
delay(500);
if (!Serial.available()) {  //если запрос неудался, значит модуль выключен
  //тады включаем модуль
    pinMode(8, OUTPUT);
    digitalWrite(8, HIGH);    // Подаем High на пин 8
    delay(3000);              // на 3 секунды
    digitalWrite(8, LOW);     // и отпускаем в Low. 
    delay(5000);              // Ждём 5 секунд для старта шилда
    pinMode(8, INPUT); //хз зачем но пусть будет       
   // Настраиваем Модуль
    Serial.begin(19200);
    Serial.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения
    delay(300);
    Serial.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных
    delay(300);
    Serial.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты.!
    delay(300);
    Serial.print("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс.!
    delay(500);
    Serial.print("AT+CMGD=1,4\r");//все удалить
    delay(500);
}

}//setup

void loop() {



if (!Serial.available()){ return;}
char currSymb = Serial.read();    
if ('\r' == currSymb) {
        if (isStringMessage) { //если текущая строка - SMS-сообщение,
             if (!currStr.compareTo("Status")) {sendTextMessage();} //если пришло слово статус - отправляем смс
        
             isStringMessage = false;
                              } 
        else  {
             if(currStr.startsWith("+CMT")) {  //если начинается с CMT то далее следует номер
             String num = currStr.substring(currStr.indexOf("\""),currStr.indexOf(",")); // выделяем номер
                                             }

             if (currStr.startsWith("+CMT")) {isStringMessage = true; }//если текущая строка начинается с "+CMT",то следующая строка является сообщением
           
              }//else 
        
        currStr = "";
                      }
 else if ('\n' != currSymb) {
        currStr += String(currSymb);
                            }

}//loop


void sendTextMessage() {
    // Устанавливает текстовый режим для SMS-сообщений
Serial.print("AT+CMGF=1\r");
    delay(100); // даём время на усваивание команды
    //  телефонный номер 
  Serial.println("AT + CMGS = \"+num+\"");
    delay(100);
    // Пишем текст сообщения
Serial.print("Test");
delay(100);
    // отправляем
    Serial.println((char)26);
    delay(5000);
}

и чет ничего не приходит, меняю 68ю строку на

Serial.println("AT + CMGS = \"+7xxxxxxxxxx\"");

где хххх - мой номер  и сообщение приходит

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
а если так
Serial.println("AT + CMGS = \+String(num)+\");

 

vanila
Offline
Зарегистрирован: 25.08.2015

g:70: error: missing terminating " character
g.ino: In function 'void sendTextMessage()':
g:72: error: expected ')' before ';' token
missing terminating " character

vanila
Offline
Зарегистрирован: 25.08.2015

не компилится

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

верните обратно

vanila
Offline
Зарегистрирован: 25.08.2015

походу придется записать номера и сверяясь с ними отправлять на тот с которым совпал номер приславшего запрос.

пичалька конечно, кода шибко уж много на это уйдет.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

никак не плучиось?

тоже интересует запись звонящего...

vanila
Offline
Зарегистрирован: 25.08.2015

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

записал все номера в память и отправляю смс тому с кем совпал номер приславшего.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а писать номера на смкарту?

vanila
Offline
Зарегистрирован: 25.08.2015

нет этого я не умею

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

помоему это будет еще проще, ат команды хорошо везде описаны, даже здесь:

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

записывать номер в ячейку просто: 

AT+CPBW=1,"0121234567",129,"Jacky" 
ЗАПИСАТЬ В ПЕРВУЮ ЯЧЕЙКУ СИМКАРТЫ НОМЕР 0121234567
 
перед этим нужно выполнить:
AT+CSCS="GSM"
OK
 
AT+CSCS?
+CSCS: "GSM"
 
AT+CMGF=1
OK
 
считать с ячейки  и позвонить по ячейке - тоже просто.
а вот мне нужно сравнить номер звонящего с ячейкой - это для меня пока темный лес.
 
описание команд есть в интернете.

 

vanila
Offline
Зарегистрирован: 25.08.2015
if(currStr.startsWith("+CMT")) {                                            //если строка начинается с CMT то далее следует номер
String num = currStr.substring(currStr.indexOf("\""),currStr.indexOf(",")); // выделяем номер и запоминаем в переменную num
                               }                               

запоминаем номер звонящего, далее сравниваем его с имеющимся

if (!num.compareTo ("\"+7909xxxxxxx\""))  {     //если совпал то что то выполнили
                                          }

я примерно так делаю. 

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

а может тебе как и мне проще определить номера кто будет обращаться к устройству.

 
 
 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

описание многих смс можно посмотреть и здесь тоже:

http://we.easyelectronics.ru/part/gsm-gprs-modul-sim900-chast-vtoraya.html

я тестировал просто на модеме разные.

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

А у меня такой случай был - номер звонящего определялся на телефоне как 8(___)ххххххх, но на него смс-ки не отправлялись (но звонок проходил!!!). Поэтому приходилось в записной книжке держать два номера - +7(___)ххххххх и 8(___)ххххххх. Первый для смс, второй для идентификации ФИО звонящего.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

смс отпрааляются исключительно в формате!: +.........  и никак не иначе.

да и звонить тоже так нужно.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

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

а может тебе как и мне проще определить номера кто будет обращаться к устройству.

 
 
 

когда то попадалась инфа, что есть смс команда: если  номер занесен на симкарту с именем - то при вкл аоне и звонке этот номер отображается с именем!!

модем 590й. кто бы смс подсказал какая?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

vanila пишет:

if(currStr.startsWith("+CMT")) {                                            //если строка начинается с CMT то далее следует номер
String num = currStr.substring(currStr.indexOf("\""),currStr.indexOf(",")); // выделяем номер и запоминаем в переменную num
                               }                               

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

kasper007
Offline
Зарегистрирован: 23.05.2016

а почему num объявляется 2 раза: в строчке 3 как глобальная, а затем локально в 47. Разве в таком виде значение переменной уйдет в функцию отправки SMS?

Alipapa
Offline
Зарегистрирован: 26.05.2016

Совершенно верно. В 47-й строчке нужно убрать String перед num

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а если num в память запоминать, то как  считывать в начале?

 

String num = "EEPROM.read(1)";

и писать EEPROM.write(1, num);

 

знаю, что неверно написал, но суть вы поняли, так как правильно сделать?

kasper007
Offline
Зарегистрирован: 23.05.2016

прежде всего определись с типом переменной. Ты объявляешь num как string, а в память читается и пишется byte.

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015
// чтение
unsigned long EEPROM_ulong_read(1) {    
  byte raw[14];
  for(byte i = 0; i < 14; i++) raw[i] = EEPROM.read(addr+i);
  unsigned long &num = (unsigned long&)raw;
  return num;
}

// запись
void EEPROM_ulong_write(int addr, unsigned long num) {
  byte raw[14];
  (unsigned long&)raw = num;
  for(byte i = 0; i < 14; i++) EEPROM.write(addr+i, raw[i]);
}

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

нашел это, смотрю - http://arduino.ru/forum/programmirovanie/zapis-i-chtenie-eeprom-peremennykh-tipa-float-unsigned-long-long-unsigned-int

пример сверху - ближе к нужному? я так понимаю нужно записывать и считывать 14 знаков (текстовых?) с некоего адреса в ЕЕПРОМ например "1". но какправильно - пока е ясно.

или лучше использовать типа другую подобную библиотеку - http://www.freeduino.ru/arduino/files/EEPROM2.zip  ??

Alipapa
Offline
Зарегистрирован: 26.05.2016

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

vanila
Offline
Зарегистрирован: 25.08.2015

Если кому интересно, вот тут есть реализация ответного смс, правда с библиотеками.

http://www.ansealk.ru/wiki/doku.php?id=gsm-gprs_shield_tinysine_sim900#arduino_mega_2560

 

Может кто знает как в этой библиотеке на меге перенести тх и рх с 18 и 19 на 14 и 15 пины

В примерах есть строчка:

//To change pins for Software Serial, use the two lines in GSM.cpp.

в GSM.cpp есть такая строчка:

//De-comment this two lines below if you have the
//first version of GSM GPRS Shield
#define _GSM_TXPIN_ 1
#define _GSM_RXPIN_ 0

но что бы я там не писал ардуино всеравно использует 18 и 19 пины.

 

Или еще лучше, может кому удалось подружить мегу и жсм модуль от Tinysine  c мегой2560 без библиотек.

 

 

 

 

 

vanila
Offline
Зарегистрирован: 25.08.2015

vanila пишет:
как в этой библиотеке на меге перенести тх и рх с 18 и 19 на 14 и 15 пины

Методом научного тыка выяснил что нужно в файле HWSerial.cpp заменить все упоминания serial1 на serial3