проблема с SoftwareSerial и GSM модулем А6

Sergy1222
Offline
Зарегистрирован: 05.10.2016

okta пишет:

F для размещения строки во флэш-памяти (чтоб RAM не отжирать строками).

Спасибо :)

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Sergy1222

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

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

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

Я не парсил, мне не нужно, но выше был пример. По идее, ничем не отличается от парсинга любой другой строки в сериале- записываем каждый символ в переменную и ее сравниваем с необходимой. Собственно в твоем же коде, вроде как, все верно, но, как мне кажется, не хватает момента, когда выходить из чтения, а то такое впечатление, что str будет бесконечно читаться.. Но могу и ошибаться :)

str="";
while(mySerial.available())
  {
    char ch=mySerial.read();
    str+=ch;
    delay(10);
  } 
  if(str.indexOf(F("OK"))>-1){
    ok=true;
    Serial.println("IPR:9600 OK");}

Немного измененный первоначальный вариант моего примера:

while (Serial.available())
  {
    delay(10);
    if (Serial.available() >0) 
      {
        char c = Serial.read();  //gets one byte from serial buffer
        if (c == '"') 
          {
            break;
          }  //breaks out of capture loop to print readstring
        readString += c;
      } //makes the string readString
      
  }
  if (readString.length() >0) 
  {
    if(readString.indexOf("123")>=0||readString.indexOf("321")>=0) //если позвонили с этих номеров
    {
       delay(2000);
       Serial.println("ATH");
       delay(2000);
       digitalWrite(Relay, LOW); //включаем реле
       readString=""; //clears variable for new input
    }

По звонку с одного из двух номеров включает реле. Работает, но не уверен что именно так, как должен, т.к. кроме звонка больше ничего не могу сделать пока :) (смс, собака, не отправляется..)

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Разобрался, вы всё правильно делали, только там один делэй жизнь портит

  if(mySerial.available()){
    char ch=mySerial.read();
    //delay(10); // вот он злодей!
    val+=ch;
   Serial.write(ch);
  }

if(val.indexOf("t?")>-1){
    smsSend(MASTER, "Temperatura: " + String(celsius)+ "C");
    Serial.println("sms");
    val="";
}

функция отправки смс

void smsSend(char tel[], String text){
    mySerial.println(F("AT+CMGF=1"));//текстовый режим
    delay(100);
    mySerial.print("AT+CMGS=\"");//начало отправки смс
    mySerial.print(tel);
    mySerial.print(char(34));
    mySerial.write(0x0D);//без этой строки не работает,  что означает эта строка?
    delay(100);
    mySerial.print(text);
    delay(100);
    mySerial.println(char(26));
    delay(100);
    mySerial.flush();
}

Перенёс установку текстового режима сюда, т.к. он не устанавливается почему то в сетапе ERROR:304. Наверное не на своём месте.

а так всё работает как часики. Спасибо вам! :)

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

knack пишет:

Перенёс установку текстового режима сюда, т.к. он не устанавливается почему то в сетапе ERROR:304. Наверное не на своём месте.

а так всё работает как часики. Спасибо вам! :)

Нужно переключать режим после инициализации модема.

Как то так:

if(val.indexOf("+CREG: 1")>-1){
    delay(200);
    mySerial.println(F("AT+CMGF=1"));
    val="";
}

+CREG: 1 это последнее что он выплёвывает, вот после этого и можно включать текстовый режим.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012
#include <OneWire.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
OneWire  ds(2);
int chekPoint = 99;
float celsius = 0;
long dsDelay = 0;
char backNum[13];
char trueNum[] = "+7хххххххххх";
String val = "";
boolean shot = false;
boolean ok = false;
String str = "";

void setup() {
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);///включаем А6
  Serial.begin(9600);


  do {
    mySerial.begin(115200);
    delay(100);
    mySerial.println(F("ATZ+IPR=9600"));
    delay(500);
    mySerial.end();
    delay(100);
    mySerial.begin(9600);
    delay(100);
    mySerial.println(F("ATE 0"));//отключаем эхо
    delay(100);
    mySerial.println(F("AT+CNMI=2,2"));
    delay(100);
    mySerial.println(F("AT"));
    delay(100);
    str = "";
    while (mySerial.available())
    {
      char ch = mySerial.read();
      str += ch;
      delay(10);
    }
    if (str.indexOf(F("OK")) > -1) {
      ok = true;
      Serial.println("IPR:9600 OK");
    }
    else {
      mySerial.end(); delay(500); ok = false;
      Serial.println("IPR not 9600");
    }
  } while (!ok);

  delay(5000);/// без него плюётся мусором
}

void loop() {
///меряем температуру
  if (millis() == 0)dsDelay = 0;
  if (millis() - dsDelay > 10000) {
    dsDelay = millis();
    DS();
  }
///если что то пришло, читаем
  if (mySerial.available()) {
    char ch = mySerial.read();
    val += ch;
    Serial.write(ch);
  }

///ждём смс с запросом температуры"t?"
  if (val.indexOf("t?") > -1) {
///сравниваем номера и отправляем на входящий номер
    if(trueNum == backNum)smsSend(backNum, "Temperatura: " + String(celsius) + "C");
    val = "";
  } else if (val.indexOf("+CREG: 1") > -1) {
    delay(200);
    mySerial.println(F("AT+CMGF=1"));///устанавливаем текстовый режим
    val = "";
  }
///ищем +79 и запоминаем где
  if (val.indexOf("+79") > -1 && chekPoint == 99) {
    chekPoint = val.length();
    chekPoint -= 4;
  }

/// считываем номер телефона входящего смс
  if (val.length() == (chekPoint + 14)) {
    for (int i = 0; i < 14; i++) {
      backNum[i] = val.charAt(chekPoint + i);
    }
  }
}

скетч с отправкой на номер запроса и процедура отправки смс

void smsSend(char tel[], String text){
    mySerial.print("AT+CMGS=\"");//начало отправки смс
    mySerial.print(tel);
    mySerial.print(char(34));
    mySerial.write(0x0D);//без этой строки не работает,  что означает эта строка?
    delay(100);
    mySerial.print(text);
    delay(100);
    mySerial.println(char(26));
    delay(100);
    mySerial.flush();
}

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

Блин мне бы это день сэкономило :(

Большое всем спасибо участникам ветки!!!

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Кстати +CREG:<num> зависит от сети, у меня мегафон "1", лучше изменить кусок на:

 if (val.indexOf("+CREG:") > -1) {
    delay(200);
    mySerial.println(F("AT+CMGF=1"));///устанавливаем текстовый режим
    val = "";
  }

 

Sergy1222
Offline
Зарегистрирован: 05.10.2016

У меня выдает "1,1", по идее должен выдать именно так, вроде бы по мануалу просто "1" это готов, "1,1"- готов и подключен к сети. Хотя для установки текстового режима должно быть достаточно просто быть готовым..

В слюбом случае спасибо за скетч :)

rapidshe
Offline
Зарегистрирован: 31.12.2015

knack пишет:

Кстати +CREG:<num> зависит от сети, у меня мегафон "1", лучше изменить кусок на:

 if (val.indexOf("+CREG:") > -1) {
    delay(200);
    mySerial.println(F("AT+CMGF=1"));///устанавливаем текстовый режим
    val = "";
  }

 

"1" это  состояние

выдержка(правда сим900. формат выдачи отличается, но смысл тот же):

AT+CREG? — получить тип регистрации в сети.

Вернется что-то вроде +CREG: 0,1

Где:

0, — нет сообщения о смене регистрации в сети. 

1, — текущее состояние.

  • 0 — не зарегистрирован, поиск сети не ведется,
  • 1 — зарегистрирован в своей домашней сети,
  • 2 — не зарегистрирован, идет поиск сети,
  • 3 — регистрация отклонена,
  • 4 — модуль сам не знает что происходит
  • 5 — зарегистрирован в роуминге.
knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

У меня возвращает один параметр +CREG: 1 это в А6, это при инициализации модема при запросе:

AT+CREG? +CREG:0,1 OK <参考URC: +CREG> <Note :..> Query the register status of the local and network

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

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Столкнулся с какой то ерундой, не могу ее победить никак, вот в этом куске:

  if (val.length() == (chekPoint + 12)) {
    for (int i = 0; i < 12; i++) {
      backNum[i] = val.charAt(chekPoint + i);
    }
  }

в конец массива backNum попадает мусор, хотя массив заполнен на всю длину, но в софт терминал выплёвывает с мусором и модуль на него ругается CMS ERROR: 520 Invalid character in text то CMS ERROR: 500 Unknown error

char backNum[12];
void smsSend(char tel[12], String text){

при чём, вроде как работало до какого то момента, но я этот кусок не трогал.

Вот целеком

#include <OneWire.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
OneWire  ds(2);
int chekPoint = 99;
float celsius = 0;
long dsDelay = 0;
long pirDelay = 0;
char backNum[12];
char trueNum[] = "+79ххххххххх";
String val = "";
boolean ok = false;
boolean pir = true;
boolean sms = true;
String str = "";

void setup() {
  pinMode(8, OUTPUT);
  pinMode(4, INPUT);
  digitalWrite(8, HIGH);
  Serial.begin(9600);


  do {
    mySerial.begin(115200);
    delay(100);
    mySerial.println(F("ATZ+IPR=9600"));
    delay(500);
    mySerial.end();
    delay(100);
    mySerial.begin(9600);
    delay(100);
    mySerial.println(F("ATE 0"));//отключаем эхо
    delay(100);
    mySerial.println(F("AT+CNMI=2,2"));
    delay(100);
    mySerial.println(F("AT"));
    delay(100);
    str = "";
    while (mySerial.available())
    {
      char ch = mySerial.read();
      str += ch;
      delay(10);
    }
    if (str.indexOf(F("OK")) > -1) {
      ok = true;
      Serial.println("IPR:9600 OK");
    }
    else {
      mySerial.end(); delay(500); ok = false;
      Serial.println("IPR not 9600");
    }
  } while (!ok);

  delay(5000);
  smsSend(trueNum, "System started");
}

void loop() {

  if (millis() == 0)pirDelay = 0;
  if (millis() - pirDelay > 300000) {
    pirDelay = millis();
    pir = true;
  }

  
///меряем температуру
  if (millis() == 0)dsDelay = 0;
  if (millis() - dsDelay > 600000) {
    dsDelay = millis();
    DS();
  }
///если что то пришло, читаем
  if (mySerial.available()) {
    char ch = mySerial.read();
    val += ch;
    Serial.write(ch);
  }


if(pir == true){
  while(digitalRead(4) == HIGH && sms == true){
    pir = false;
    //smsSend(trueNum, "Proniknovenie v dom!!!");
    break;
  }
}


///ждём смс с запросом температуры"t?"
  if (val.indexOf("t?") > -1 && trueNum == backNum) {
 smsSend(backNum, "Temperatura: " + String(celsius) + "C");
 val="";
  }


  
  if (val.indexOf("pir off") > -1 && trueNum == backNum) {
  smsSend(backNum, "datchik dvigheniya otkluchen");  
  sms = false;
  
  }


  if (val.indexOf("pir on") > -1 && trueNum == backNum) {
  smsSend(backNum, "datchik dvigheniya vkluchen");  
  sms = true;
  }

  
  if (val.indexOf("+CREG:") > -1) {
    delay(200);
    mySerial.println(F("AT+CMGF=1"));///устанавливаем текстовый режим
    val = "";
  }
///ищем +79 и запоминаем где
  if (val.indexOf("+79") > -1 && chekPoint == 99) {
    chekPoint = val.length();
    chekPoint -= 3;
  }

/// считываем номер телефона входящего смс
  if (val.length() == (chekPoint + 12)) {
    for (int i = 0; i < 12; i++) {
      backNum[i] = val.charAt(chekPoint + i);
    }
    Serial.println(backNum);
  }
}
void smsSend(char tel[12], String text){
    mySerial.print("AT+CMGS=\"");//начало отправки смс
    mySerial.print(tel);
    //mySerial.print(char(34));
    mySerial.write(0x0D);//без этой строки не работает,  что означает эта строка?
    delay(100);
    mySerial.print(text);
    delay(100);
    mySerial.println(char(26));
    delay(100);
    mySerial.flush();
    
}

 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

По поводу этого поста, походу софт сериал имеет маленький буфер, если он вообще есть и туда не попадает текст сообщения если ставить задержку.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

Кстати, я правильно понимаю, что 8 пин ардуино соединен с пином PWR_KEY А6? Не очень понимаю, много ли жрет этот пин на старте (и жрет ли вообще)..

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Вряд ли он, что то жрёт, но логика подсказывает, что стоит воткнуть резюк иль оптопару, я не стал заморачиватся, вообще он у меня питается напрямую от +5, стабилизатор вроде не греется, всё отсылает и присылает.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

Вряд ли он, что то жрёт, но логика подсказывает, что стоит воткнуть резюк иль оптопару, я не стал заморачиватся, вообще он у меня питается напрямую от +5, стабилизатор вроде не греется, всё отсылает и присылает.

Сам модуль у меня тоже питается от внешнего БП совместно с ардуиной. По сути, ничего не должно случиться :) так-то включение происходит замыканием пина кнопки на пин +5 на самом модуле..

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Вот как его отключить, вопрос.

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

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

У меня от +5 ардуины от усб :) всё работает.

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

knack пишет:

По поводу этого поста, походу софт сериал имеет маленький буфер, если он вообще есть и туда не попадает текст сообщения если ставить задержку.

Поумолчанию буфер 64 байта. Для чтения SMS этого мало. Размер правится в softwareserial.h

#define _SS_MAX_RX_BUFF 64

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

Вот как его отключить, вопрос.

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

Отключить AT+CPOF не помогает?

Мне проще, у меня нет кнопки на модуле, только пин :)

 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Помогает! Спасибо! Чёт даташит ковырял на shutdown, power off не откликается а 200 страниц таблиц уже надоело туда сюда гонять.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

Помогает! Спасибо! Чёт даташит ковырял на shutdown, power off не откликается а 200 страниц таблиц уже надоело туда сюда гонять.

Не за что :)

http://www.2150692.ru/files/a6_at_commands.pdf - мануал по командам А6, прям по оглавлению читать удобно кто что делает :)

toc
Offline
Зарегистрирован: 09.02.2013

>> Так проблема не в том, каким способом перезапустить модуль (землей по ресету или 5В на PWK), а в том как это организовать. Напрямую с ардуины нельзя - потребление на обоих выводах модуля больше номинального на выходах ардуины - могут выгореть.

flyback, откуда информация про потребление пина power key?

у меня a6 отлично включается этим пином, подключён напрямую к пину ардуины.

flyback
Offline
Зарегистрирован: 23.11.2016

По ноге reset здесь http://www.electrodragon.com/w/GSM_GPRS_A6_Module ("Module hardware RESET pin, this pin is used when the low <0.05V, current 70ma")

по PWR_KEY - точно не помню откуда, возможно, индуцировалось после прочтения/просмотра разных туториалов (напр. https://raymondtunning.wordpress.com/2016/05/31/a6-gsmgprs-module-pinout...), в которых говорится о соединении VCC5.0 с PWR_KEY, но нигде про "подайте HIGH с вывода ардуины на PWR_KEY"

 

toc пишет:

flyback, откуда информация про потребление пина power key?

у меня a6 отлично включается этим пином, подключён напрямую к пину ардуины.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Что-то у меня не работает переключение на 9600.. Подключено, вроде, все правильно, но IPR not 9600 :(

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Sergy1222 пишет:

Что-то у меня не работает переключение на 9600.. Подключено, вроде, все правильно, но IPR not 9600 :(

код 1 в 1?

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

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

SoftwareSerial треш полный, немного поработает, потом буфер пилит, в топку!

Попробывал AltSoftSerial вроде как полёт нормальный.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

код 1 в 1?

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

Да, 1 в 1, пробовал прям весь код, только, конечно же, без считывания температуры и прочего :)

Попробую altsoft..

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Sergy1222 пишет:

knack пишет:

код 1 в 1?

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

Да, 1 в 1, пробовал прям весь код, только, конечно же, без считывания температуры и прочего :)

Попробую altsoft..

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

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

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

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

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Sergy1222 пишет:

knack пишет:

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

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

Ну смотри, ну у меня поделка получилась, мужику на дачу охранка, на альте переделал код полностью, если хочешь скину. Кста работало от усб, норм, воткнул блок питания пару смс и встаёт, сменил блок питания заработало. Модуль рабочий, когда отладку делал, всё сразу паял иначе съэкономишь 5 минут на пайке потратишь 2 часа при отладке.

Sergy1222
Offline
Зарегистрирован: 05.10.2016

knack пишет:

Ну смотри, ну у меня поделка получилась, мужику на дачу охранка, на альте переделал код полностью, если хочешь скину. Кста работало от усб, норм, воткнул блок питания пару смс и встаёт, сменил блок питания заработало. Модуль рабочий, когда отладку делал, всё сразу паял иначе съэкономишь 5 минут на пайке потратишь 2 часа при отладке.

Да, скинь, пожалуйста.

Ща домой заберу, запитаю все от 12В БП, на модуль понижайкой 5В подам, посмотрю что будет.. Я спаял, теперь распаивать пришлось :) впаял теперь провода для макетки, так удобнее собирать-разбирать, потом уже спаяю с двух сторон..

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012
#include <AltSoftSerial.h> //8,9 rx,tx
#include <OneWire.h>
OneWire  ds(2);
int alarmInter = 0;
int pirInter = 0;
float celsius = 0;
unsigned long dsDelay = 0;
unsigned long pirDelay = 0;
unsigned long alarmDelay = 0;
unsigned long resetInterDelay = 0;



const int nN = 2;///количество номеров////////////////////////////////////////////////////////////////////
const char* trueNum[] = {
  "+7962483хххх",//1
  "+7919209хххх" //2
};
const char* Name[] = {
  "Misha, ",
  "Petya, "
};




String val = "";
String str = "";
boolean ok = false;
boolean pir = true;
boolean sms = true;
boolean alarm = false;
boolean statPir = false;
const int pirPin = 3;
const int tPin = 5;
const int APin = 7;
AltSoftSerial altSerial;
void setup() {
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  pinMode(APin, OUTPUT);//A6 power pin
  pinMode(pirPin, INPUT_PULLUP);//pir signal pin
  pinMode(tPin, OUTPUT);
  digitalWrite(APin, HIGH);//power up A6
  Serial.begin(9600);


  do {
    altSerial.begin(115200);
    delay(200);
    altSerial.println(F("ATZ+IPR=9600"));
    delay(500);
    altSerial.end();
    delay(200);
    altSerial.begin(9600);
    delay(200);
    altSerial.println(F("ATE 0"));//отключаем эхо
    delay(200);
    altSerial.println(F("AT+CNMI=2,2"));
    delay(200);
    altSerial.println(F("AT"));
    delay(200);
    str = "";
    while (altSerial.available())
    {
      char ch = altSerial.read();
      str += ch;
      delay(5);
    }
    if (str.indexOf(F("OK")) > -1) {
      ok = true;
      Serial.println("IPR:9600 OK");
    }
    else {
      altSerial.end(); delay(500); ok = false;
      Serial.println("IPR not 9600");
    }
  } while (!ok);
  delay(5000);
  DS();
}

void loop() {

  /*
    if (altSerial.available()) {
      Serial.write(altSerial.read());
    }
    if (Serial.available()) {
      altSerial.write(Serial.read());
    }
  */

  ///задержка для алярма чтоб не пуляла смсками
  if (millis() - alarmDelay > 60000) {
    alarmDelay = millis();
    alarm = true;
  }

  ///меряем температуру///////////////////
  if (millis() - dsDelay > 60000) {
    dsDelay = millis();
    DS();
  }

  //сбрасываем интерракции через 4 часа///
  if (millis() - resetInterDelay > 14400000) {
    resetInterDelay = millis();
    alarmInter = 0;
    pirInter = 0;
  }

  ///если что то пришло, читаем
  if (altSerial.available()) {
    delay(5);
    char ch = altSerial.read();
    val += ch;
    Serial.write(ch);
  }

  ///устанавливаем текстовый режим
  if (val.indexOf("+CREG:") > -1) {
    delay(200);
    altSerial.println(F("AT+CMGF=1"));
    delay(300);
    val = "";
  }

  for (int i = 0; i < nN; i++) {
    
    ///ждём смс с запросом температуры"t?" и отправляем смс с ней
    if (val.indexOf(trueNum[i]) > -1 && val.indexOf("t?") > -1) {
      smsSend(trueNum[i], String(Name[i]) + "temperatura v dome: " + String(celsius) + "C");
    }

    ///отключаем пир по смс
    if (val.indexOf(trueNum[i]) > -1 && val.indexOf("pir off") > -1) {
      smsSend(trueNum[i], String(Name[i]) +  "datchik dvigheniya otkluchen");
      sms = false;
      pirInter = 0;
    }

    ///включаем пир по смс
    if (val.indexOf(trueNum[i]) > -1 && val.indexOf("pir on") > -1) {
      smsSend(trueNum[i], String(Name[i]) + "datchik dvizheniya vkluchen");
      pirInter = 0;
      sms = true;
    }
    //включаем отопление пин 5
    if (val.indexOf(trueNum[i]) > -1 && val.indexOf("teplo on") > -1) {
      smsSend(trueNum[i], String(Name[i]) + "otoplenie vklucheno");
      digitalWrite(tPin, HIGH);
    }
    //выключаем отопление
    if (val.indexOf(trueNum[i]) > -1 && val.indexOf("teplo off") > -1) {
      smsSend(trueNum[i], String(Name[i]) + "otoplenie otklucheno");
      digitalWrite(tPin, LOW);
    }
  }

  //затираем переменную после отправки смс////
  if (val.indexOf("CMGS:") > -1) {
    val = "";
  }

  //если что то не то с температурой//////////
  if (celsius > 50 && celsius != 85 && alarmInter < 3 && alarm == true) {
    //for (int i =0; i < nN; i++){
    smsSend(trueNum[0], String(Name[0]) + "Temperatura:" + String(celsius) + "C opasnost pozhara!!!");
    //}
    alarm = false;
    alarmInter++;
  }

  //если сработал датчик движения////////////
  statPir = digitalRead(pirPin);
  if (pir == true && statPir == true && sms == true && pirInter < 3) {
    pir = false;
    pirInter++;
    //for (int i =0; i < nN; i++){
    smsSend(trueNum[0], String(Name[0]) + "proniknovenie v dom");
    //}
  }

  ///задержка для пира чтоб не пулял смсками 10 минут
  if (millis() - pirDelay > 600000) {
    pirDelay = millis();
    pir = true;
  }
}
void smsSend(char tel[12], String text){
    altSerial.print("AT+CMGS=\"");
    delay(200);
    for(int i = 0; i < 12; i++)altSerial.write(tel[i]);
    delay(300);
    altSerial.print(char(34));
    delay(200);
    altSerial.write(0x0D);
    delay(100);
    altSerial.print(text);
    delay(300);
    altSerial.println(char(26));
    delay(50);
    val="";
}

 

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Пфффф.. то ли модуль не едет, то ли я жопорукий..

Напрямую тоже не переключить..

Переключаюсь на 9600 и шляпа..

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

Ну и питание еще проверю..

rrr111
Offline
Зарегистрирован: 04.10.2016


 

подскажите, пожалуйста, за что отвечает эта строчка (на нее компилятор ругается ошибкой)?

 DS();

при удалении этой строки компилятор перестает выдавать ошибку, но выводит "предупреждение"

invalid conversion from 'const char*' to 'char*' [-fpermissive]

 

какую константу он просит перевести в простой """char*"""

 

 

rrr111
Offline
Зарегистрирован: 04.10.2016

Попытался использовать кусок Вашего скетча по поводу проверки правильной загрузки GSM-модуля. Вот что получилось:

 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);          // RX, TX
int ch = 0;
String str = "";
String val = "";
boolean ok=false;
#define MASTER "+790********"          //укажите  телефон хозяина

void setup()
{
  do{
  Serial.begin(9600);                  //подключаем порт компьютера
  Serial.println("naladka GSM");
  mySerial.begin(115200);                //подключаем порт модема (при других скоростях не отвечает)
  delay(100);
  mySerial.println("ATZ0");
delay(100);
  mySerial.println("ATZ+IPR=9600");
  delay(100);
  mySerial.end();
  delay(100);
  mySerial.begin(9600);
delay(100);
  mySerial.println("ATI");              //вывести в терминал иноформацию о модеме
  delay(100);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(100);
  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);
  mySerial.println("AT+CMGD=1,4");     //удаляем все сообщения из памяти, которые были до включения модема
 delay(100);
mySerial.println(F("AT"));
    delay(200);
    str = "";
    while (mySerial.available())
    {
      char ch = mySerial.read();
      str += ch;
      delay(5);
    }
    if (str.indexOf(F("OK")) > -1) {
      ok = true;
      Serial.println("IPR:9600 OK");
    }
    else {
      mySerial.end(); delay(500); ok = false;
      Serial.println("IPR not 9600");
    }
  }
   while (!ok);
  delay(5000);
}

void loop()
{
  if (mySerial.available()) {          //есть данные от GSM модуля
    delay(200);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
    while (mySerial.available()) {      //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
    }
    Serial.println(val);                    // дублируем сообщение в терминал

    //----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и)
    if (val.indexOf("+CMT") > -1 && val.indexOf(MASTER) > -1 && val.indexOf("sendme") > -1) 
    {         
      sms("da", MASTER);            // отвечаем смской
      val = "";
      mySerial.println("AT+CMGD=15");   //удаляем 15тое сообщение после каждого получения смс. Получается мы в памяти храним постоянно 14 входящих смс
    }
  }
}

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

 

 

Но при этом в мониторе порта не выводится текст сообщения и соответсвенно поэтому в ответ модуль не шлет смс. В чем может быть загвоздка? (кол-во смс на симке врое не должно быть переполнено, чистка смс лишних производится, строка "AT+CNMI=2,2" тоже имеется)


 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Ds(); это функция для снятия температуры с далласовского датчика, тут нет этого куска.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Delay после присвоения переменой ch не даёт читать СМС строка 67, но всё равно на софтвар сериал криво работает.
После переполнения СМС, счётчик идёт по новой, 200 штук вроде всего.

rrr111
Offline
Зарегистрирован: 04.10.2016

Спасибо, knack, за помощь!

Решил сделать через альтсериал, но возникла проблема:
Не работает основная строка (определяющая чей номер, наш ли текст смс), до этого момента модуль работает стабильно (грузится пока не получит ОК от команды АТ, переходит стабильно на скорость 9600 и, следовательно, смс получает правильно).
Также при компиляции выходит "ошибка" (вернее замечание, т. к эта "ошибка" дает работать и прошивать ардуинке. Но, видимо, именно эта "ошибка" и не дает до конца грамотно работать программе. Самое интересное, что не показывается в какой строке эта "ошибка" и не понятно где нужно подправить тип данных):

/Users/admin/Documents/Arduino/_2017/_2017.ino:8:1: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

 };
 ^
 
Подскажите, пожалуйста, в чем может быть недочет (скетч прикрепляю ниже)?
 
 
#include <AltSoftSerial.h> //8,9 rx,tx
const int nN = 1;///количество номеров////////////////////////////////////////////////////////////////////
char* trueNum[] = {
  "+79*********"//,//1
  //"+7919209хххх" //2
};
const char* Name[] = {
  "Privet, "//,
  //"Petya, "
};
int x=5;
String val = "";
String str = "";
boolean ok = false;

AltSoftSerial altSerial;

void setup() {
  Serial.begin(9600);

  do {
    altSerial.begin(115200);
    delay(200);
    altSerial.println(F("ATZ+IPR=9600"));
    delay(500);
    altSerial.end();
    delay(200);
    altSerial.begin(9600);
    delay(200);
    altSerial.println(F("ATE 0"));//отключаем эхо
    
    /////////////////////
    //delay(200);
    //altSerial.println(F("AT+CNMI=2,2"));
   //////////////////////
    
    delay(200);
    altSerial.println(F("AT"));
    delay(200);
    str = "";
    while (altSerial.available())
    {
      char ch = altSerial.read();
      str += ch;
      delay(5);
    }
    if (str.indexOf(F("OK")) > -1) {
      ok = true;
      Serial.println("IPR:9600 OK");
    }
    else {
      altSerial.end(); delay(500); ok = false;
      Serial.println("IPR not 9600");
    }
  } while (ok==false);
  delay(5000);
///////////////////////////////////
          altSerial.println(F("AT+CNMI=2,2"));
          delay(200);
          altSerial.println(F("AT+CMGF=1"));
          delay(300);
////////////////////////////////////         
}
       
void loop() {

  ///если что то пришло, читаем
  if (altSerial.available()) {
    delay(5);
    char ch = altSerial.read();
    val += char(ch);
    Serial.write(ch);   // до этого момента работает все прекрасно!
  }
//далее текст "наше смс" и значение переменной val ="sendme" не выводиятся в монитор порта, видимо, в этом куске программы что-то не так...
  for (int i = 0; i < nN; i++) { 
    
    if (val.indexOf(trueNum[i]) > -1 && val.indexOf("+CMT") > -1 && val.indexOf("sendme") > -1) {
      Serial.write("nashe sms");
      Serial.println(val);
      smsSend(trueNum[i], String(Name[i]) + "chislo x= " + String(x));
       }
    }
val = "";
  }

void smsSend(char tel[12], String text){
    altSerial.print("AT+CMGS=\"");
    delay(200);
    for(int i = 0; i < 12; i++)altSerial.write(tel[i]);
    delay(300);
    altSerial.print(char(34));
    delay(200);
    altSerial.write(0x0D);
    delay(100);
    altSerial.print(text);
    delay(300);
    altSerial.println(char(26));
    delay(50);
}

 

 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

в 77й строке val.indexOf("+CMT") > -1 это что?

83 строка у вас переменная постоянно затирается, естественно 77я строка не сработает.

rrr111
Offline
Зарегистрирован: 04.10.2016

knack пишет:

в 77й строке val.indexOf("+CMT") > -1 это что?

83 строка у вас переменная постоянно затирается, естественно 77я строка не сработает.

 

в 77й строке val.indexOf("+CMT") > -1 это определение поступило смс или звонок.

За подсказку затирания val - спасибо большое! исправил ошибку.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

rrr111 пишет:

в 77й строке val.indexOf("+CMT") > -1 это определение поступило смс или звонок.

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

Sergy1222
Offline
Зарегистрирован: 05.10.2016

Ну что, питание от понижайки не помогло, ждем новый модуль..

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

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

bugmenot
Offline
Зарегистрирован: 30.09.2016

Так и что, какие плюсы и минусы у данного модуля относительно того же SIM800L? Цена то одинакова, что выбрать?

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

х.з. бери что обкатано

V-max VL
Offline
Зарегистрирован: 22.04.2016

Короче я тоже являюсь обладателем 2-х SIM800L  и одного A6. Вот, что нарыл.

1. Модули серии SIM800 являются самыми оптимальными модулями, содержащими возможность работы по 4-м частотам, Блютуз, да и очень расширенный перечень команд, полезный определенным программистам.

Минусы: очень требователен к питанию, и самое главное, очень нужен преобразователь уровней. Вероятно из-за отсутствия последнего я подпалил все же оба модуля и сейчас заказал еще один для тестов. Плюс обнаружил, что в серии 800L не работает команда AT+CPOWD=1, что на одном, что на втором выдает ошибку. Есть подозрение, что символ L обозначает Light, обрезок одним словом, и часть команд по общему перечню, предназначенному для полновесной версии, просто не работает. Но и есть положительные стороны, в отличии от A6: это возможнотсь воспроизведения аудиофайлов, загруженных в сам модуль в расширении ARM, а модуль сам сожет декодировать DTMF сигналы без всяких обвязок. Я нормально цеплял оба своих через преобразователь, включал декодирование командой AT+DDET=1 и нормально получал ответы в цвет. Без ошибок.

2. Модули серии A6 нихера не могут декодировать DTMF сигналы, не могут воспроизводить аудиофайлы. В описании и на практике я опробовал единственно возможную комманду - воспроизведение DTMF сигналов. Да работает, но кому это нужно. Более того, я на модулях SIM800L нормально могу отправлять и принимать смс сообщения на русском языке, используя таблицу в режиме UCS2. И прием и отправка. Но к сожалению, А6 так не может. Даже в описании команд, на команду AT+CSCS есть такая сноска: This command is used to read and write phonebook entries. SMS doesn’t effected by this command. Т.е. для работы с телефоном как бы нормально, про сообщения можете забыть. Таким образом для себя я выбрал следующее:

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

Если тебе нужно, как я описывал выше, принимать смс или отсылать команды на Ардуинку на русском, управлять Ардуинкой DTMF командами, возможно услышать аудиофайл типа: "Ваш голос важен для нас, не отключайтесь" или "Для приготовления пиццы нажмите 1, для самоуничтожения нажмите 2" и потребляемость по питанию не важно, хотя разница и не большая, то нужно брать только 800 серию, причем желательно обычный SIM800 в корпусе SMT с боковыми контактами. Он крупнее. Можно и припаять и обвязать. И он будет работать по всему перечню комманд и еще есть Блютуз, кому надо. 

Его усовершенствованная копия только в меньшем размере SIM800C. Все тоже самое + добавлена функция Embedded AT + Блютуз но еще и маленький. Для реализации на плате удобней, но и паять трудней. 

Для дополнительной информации, модули серии 800 являются новее серии 900, как бы это не было странным. И действительно, по всем проблемам молуля SIM800L мы не сможем найти ответов, т.к. даже на сайте MT-System этого модуля нет. Почему? Х.з. Однако если почитать описание модуля SIM800H то в описании идет полное сравнение 800H с 800L. http://www.mt-system.ru/documentation/polnoe-opisanie-sim800h

Чисто теоретически, почитав описания, я как бы понял, что версия 800L это копия 800H только без Блютуз.

 

bugmenot
Offline
Зарегистрирован: 30.09.2016

V-max VL,

Благодарствую, очень обстоятельно. Помимо прочего меня интересует такой аспект, как передача данных. Насколько я понял, в A6 по дефолту не всё гладко с POST-запросами, для этого есть отдельная либа. Еще упоминались какие-то проблемы с dns lookup, впрочем последнее под вопросом. У SIM800, в свою очередь, есть максимальное ограничение на длину URL - 64 символа.

Ну и фиксированная скорость порта в A6 заставляет использовать только аппаратный UART, тогда как SIM800 можно посадить и на программные пины.

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

V-max VL
Offline
Зарегистрирован: 22.04.2016

К сожалению товарищ гонять модуль именно в этом направлении мне не приходиться. Задача немного другая. И опять таки, повторюсь, для SIM800 КАТЕГОРИЧЕСКИ обязателен преобразователь уровней 5-3В. Именно прямое подключение к Ардуино помогло моим обоим модулям немного подгореть, но хитро. Описываю:

Два модуля абсолютно идентичны SIM800L. Так вот, оба, по очереди, были протестированы на профпригодность, после того как я их получил по почте, я отписался продавцу что все ок. Начал плотно сидеть на одном и гонять его по полной (в рамках моих потребностей). Спустя какое то время начались глюки и небольшие сбои. Частично перестал прогружать команды, на некоторые начал давать ERROR. Когда дошел до потребности прогрузить AT+CPOWD=1 в ответ получил ERROR. Прогружаю AT+CREC?  в ответ ERROR. Ну дамаю очень лайтовый модем. Подключаю второй и опа, команда AT+CREC? прогрузилась, причем в этом направлении его сейчас начанаю гонять, но только через преобразователь, а вот AT+CPOWD так же дает ERROR, Причем если включить отчет об ошибках AT+CMEE=0, вместо ERROR начинает писать Неизвестная команда. Плюс начались глюки с поиском сети. Очень долго ищет сеть частым миганием светодиода при включении. А когда нашел и перешел на редкое мигание то по долгу дозвониться на модем не получается. Типа абонент не доступен. Если бы эти проблемы были в самом начале, я бы решил что модемы битые с Китая пришли. Но они начались после прямого подключения. 

Еще хотелось бы добавить, что у А6 действительно очень хорошая чувствительность у микрофона. Если сделать небольшу прослушку и позвонить на модем с автоподнятием трубки то множно услышать как таракан ползет на противоположной стороне большой комнаты. Это офигенно. Но после этого я подключил этот же микрофон к более подгорелому 800L, услышал сильные шумы, невнятная речь, короче очень неочень. Сейчас буду цеплять микрофон к тому, что по живее, отпишусь.

Подцепил к полуживому, микрофон работает лучше, чем на первом. Но по прежнему получается дозвониться раз на 5-6й. Причем плюс еще он сам как то перезагружается. И это при том, что уровень сигнала 12. Короче им каюк, жду новый. 

rrr111
Offline
Зарегистрирован: 04.10.2016

Модуль подвисает периодически. Работал часа два-три и после этого уже не отправлял ответные смс. С телефона до модуля смс доходит (в телефоне пишет смс доставлено, на ардуинке в момент отправки смс перемигивается светодиод). Приходится перезагружать ардуино/gsm-модуль... После перезагрузки начинает работать некоторое время стабильно, после чего опять зависает через некоторое время.

 

В итоге, решив проблему со скоростью обмена через "altserial", вышла еще одна серьезная проблема стабильности работы (ранее уже в этой ветке писали о подобной проблеме)...
Видимо, придется искать другой более стабильно работающий gsm-модуль.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

rrr111 пишет:

Модуль подвисает периодически. Работал часа два-три и после этого уже не отправлял ответные смс. С телефона до модуля смс доходит (в телефоне пишет смс доставлено, на ардуинке в момент отправки смс перемигивается светодиод). Приходится перезагружать ардуино/gsm-модуль... После перезагрузки начинает работать некоторое время стабильно, после чего опять зависает через некоторое время.

 

В итоге, решив проблему со скоростью обмена через "altserial", вышла еще одна серьезная проблема стабильности работы (ранее уже в этой ветке писали о подобной проблеме)...
Видимо, придется искать другой более стабильно работающий gsm-модуль.

подтверждаю, если его посадить на 0, 1 он будет так же виснуть? Мне кажется, что просто мы не умеем его готовить. А возможно, что он уходит в какой то sleep mode?