Модуль gsm, замена номера

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

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

Подскажите можно ли в скетче заменить номер телефона, на который отправляются SMS сообщения, без использования компилятора, например, с телефона отправили сообщение и номер отправителя стал использоваться для последующей отправки SMS, или номер на который будут в будущем отправляться SMS будет заложен в тексте SMS? Или можно ли задать номер при помощи кнопок? Подскажите как это лучше сделать, и как это осуществить?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Можно.

Чтобы подсказать, надо знать как Вы его сейчас задаёте (с использованием компилятора) :)

MacSim
Offline
Зарегистрирован: 28.11.2012

Novator пишет:

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

Подскажите можно ли в скетче заменить номер телефона, на который отправляются SMS сообщения, без использования компилятора, например, с телефона отправили сообщение и номер отправителя стал использоваться для последующей отправки SMS, или номер на который будут в будущем отправляться SMS будет заложен в тексте SMS? Или можно ли задать номер при помощи кнопок? Подскажите как это лучше сделать, и как это осуществить?

выбираю вариант ответа №4: Можно, любым из перечисленных способов.

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

Сейчас номер указывается в строке 43, вводится с клавиатуры комьютера. Ниже сам код. То что можно сменить номер любым способом, я предполагал, вопрос как это сделать? Помогите, если вас не затруднит, новичку дописать код, подскажите с чего начать.

#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(19200);  //скорость порта
  Serial.println("GSM tester v1.0");
  mySerial.begin(19200);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(100);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(100);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(100);
  mySerial.println("AT+CNMI=2,2");
  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("+CMT") > -1) {  //если SMS обнаружено
     Serial.println("--- MASTER SMS DETECTED ---");
     Serial.println(val);
     } 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);
}

 

Jatixo
Offline
Зарегистрирован: 13.01.2016

Также можно записать и изменять номер в тел. книге сим-карты, или Вам такой способ не подходит?

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

нет, нужно менять номер не из телефонной книги.

Jatixo
Offline
Зарегистрирован: 13.01.2016

Тогда Вам нужно читать про EEPROM (если хотите, чтобы при отключении питания ардуины номер сохранялся) и про разбор строки на части (чтобы в тексте смс найти номер телефона, а затем его сохранить можно было, а именно indexOf и substring, также есть и другие функции работы со строками).

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

Спасибо за помощь! Получилось извлекать номер отправителя SMS при помощи substring, а затем на него отправлять SMS при срабатывании датчика. Но действительно номер стирается из памяти при отключении питания. Есть вопрос как сохранить номер в EEPROM. Из той информации, что нашел в интернете получилось написать вот такой скетч:

#include <EEPROM.h> // подключаем библиотеку
int addr = 0; // адрес 

void setup() {
  char name[13] = "+79991112233"; // создаём массив символов
  EEPROM.put(addr, name); // записываем массив в EEPROM 
  Serial.begin(9600); // инициализация послед. порта
}

void loop() {
    char c[13]; // переменная для хранения массива из 20 символов
    EEPROM.get(addr, c); // считываем массив символов по адресу addr
    Serial.println(c); // выводим массив в порт
    delay(60000); // ждём 1 минуту
}

Скетч работает, номер сохраняется в переменную "с". Но, когда я отправляю SMS модулю gsm, номер сохраняется в переменную nomer типа данных String. Для записи номера в EEPROM используется массив типа char. Т.е. мне нужно перевести переменную String в массив char для сохранения? А затем при запуске ардуины, когда программа прочтет номер из EEPROM в переменную "с" ее нужно будет преобразовать в переменную String для отправки сообщений? Верно или ерунду написал? Вот заодно часть скетча, где сохраняется номер:

if (val.indexOf("+CMT") > -1) { 
     Serial.println("--- MASTER SMS DETECTED ---");
     Serial.println(val);
     String nomer = val.substring(9,21);
     Serial.println(nomer);

 

pasha413
Offline
Зарегистрирован: 27.11.2016

Так и не разобрались, сейчас тоже пытаюсь разобраться с сохранением номера в ЕЕПРОМ