М590 не выводит инфу в СОМ порт

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Ребята, подскажите - конструкция выходного дня - сигнализация в гараж.

Сам код работает, опрашиваются датчики, отправляются смс, но если "забанена" 260 строка, то в СОМ порт не выводится инфа с М590 модуля. Ничего нет - не отображается исполнения команд инициализации модема. Если 260 строка работает (Serial.println) то в СОМ порте вижу отображение команд инициализации и ответа с GSM модуля.... На работу схемы и кода это не влияет. 

почему? просто не понятно и хочется узнать почему

#include <EEPROM.h>

String(ss1), (ss2), (ss3), (ss4), (ss5), (ss6), (ss7);     // строковые переменные для sms

void(* resetFunc) (void) = 0;                   //объявляем функцию reset с адресом 0

int F1 = 1;                                     // флаг для СМС "Г открыт
int F2 = 0;                                     // флаг для СМС "проникновение
int F3 = 0;                                     // флаг для СМС "Г закрыт
int Fln = 0;                                    // флаг нажатия кнопки "сброс"
int Count = 0;                                  // счётчик защиты от дребезга кнопки
int Fz = 0;                                     // флаг однократности очистки EEPROM
int sir = 0;                                    // флаг включения сирены
int Fzp = 0;                                    // флаг задержки пуска программы для рег. модема
unsigned long sirena;                           // переменная для таймера сирены
unsigned long sirenat;                          // переменная для таймера сирены
unsigned long res;                              // для ресета
unsigned long pit;                              // для начальной задержки для регистрации модема

void setup()
{
  pinMode(2, INPUT);                            // датчик верхнего замка
  pinMode(3, INPUT);                            // датчик нижнего замка
  pinMode(4, INPUT);                            // датчик объёма
  pinMode(6, OUTPUT);                           // выход на пищалку
  pinMode(7, OUTPUT);                           // выход на LED
  pinMode(5, INPUT);                            // вход кнопка
  digitalWrite(6, LOW);
  digitalWrite(7, EEPROM.read(15));             // вкл или выкл LED в зависимости от состояния EEPROM
  res = millis();
  pit = millis();

  // ------------------------------- установки модема ---------------------------------

  Serial.begin(9600);
  Serial1.begin(9600);
  delay(2000);
  //Serial1.println("ATE1");                 // откл. ЭХО (0 выкл, 1 вкл)
  //delay(100);
  //Serial1.println("AT+IPR=9600");          // скорость модема
  //delay(100);
  //Serial1.println("AT+CSQ");               // уровень сигнала
  //delay(500);
  Serial1.println("AT+CLIP=1");              // включить АОН
  delay(100);
  Serial1.println("AT+CMGF=1");              // текстовый формат SMS
  delay(100);
  Serial1.println("AT+CSCS=\"GSM\"");        // кодировка текста - GSM
  delay(100);
  Serial1.println("AT+CMGD=1,4");            //удалить все смс
  delay(100);
  Serial1.println("AT&W");                 // запомнить настройки
  delay(100);

  // ----------------------------------------------------------------------------------

}
void loop()
{
  //---------------------------- задержка выполнения программы для грегистрации модема ------------------------

  if (Fzp == 0) {
    if (millis() - pit < 60000)                            // задержка - ч\з 60 секунд п подачи питания
    {
      return;
    }
    Fzp = 1;
  }

  //-----------------------------------------------------------------------------------------------------------

  if (digitalRead(2) == LOW && digitalRead(3) == LOW) {             // закрыты ли замки?  LOW -> закрыты
    F1 = 0;
    if (F3 == 1) {                                                   // проверка флага "Г закрыт"
      F3 = 0;
      delay(3000);
      while (Serial1.available())              // очистка буфера
      {
        char c = Serial1.read();
      }
      delay(100);
      Serial1.println("AT+CUSD=1,\"#100#\"");  //запрос баланса
      delay(7000);
      if (Serial1.available()) {
        char ch = ' ';
        String val = "";
        while (Serial1.available())
        {
          ch = Serial1.read();
          val += char(ch);                  //собираем принятые символы в строку
          delay(10);
        }
        //Serial.println(val);
        if (val.indexOf("+CUSD") > -1) {
          char result1 = val.charAt(38);    // для МТС\SIM800 45    для МТС\М590 38
          char result2 = val.charAt(39);
          char result3 = val.charAt(40);
          char result4 = val.charAt(41);
          char result5 = val.charAt(42);
          char result6 = val.charAt(43);
          char result7 = val.charAt(44);
          ss1 = String(result1);
          ss2 = String(result2);
          ss3 = String(result3);
          ss4 = String(result4);
          ss5 = String(result5);
          ss6 = String(result6);
          ss7 = String(result7);
        }
      }
      if (EEPROM.read(15) != 0) {
        delay(500);
        sms(String("Garag Zakrit, bila srabotka! balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
        delay(500);
      }
      else {
        delay(500);
        sms(String("Garag Zakrit, srabotki ne bilo, balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
        delay(500);
      }
    }
    if (F2 == 0) {
      if (digitalRead(4) == HIGH) {                                 // проверка сработки объёмника
        F2 = 1;
        sir = 1;                                                    // разрешение на вкл. сирены
        sirenat = millis();
        sirena = millis();
        EEPROM.write(15, 1);                                        // запись "проникновения" в EEPROM
        digitalWrite(7, HIGH);                                      // LED "проникновение"
        delay(100);
        sms(String("Proniknovenie v garag!"), String("+79122200000"));
        delay(100);
      }
    }
  }
  else {
    F3 = 1;
    if (F1 == 0) {                         // проверка для отсылки смс "гараж открыт" (правая ветка программы)
      F1 = 1;
      delay(100);
      while (Serial1.available())              // очистка буфера
      {
        char c = Serial1.read();
      }
      delay(100);
      Serial1.println("AT+CUSD=1,\"#100#\"");                //запрос баланса
      delay(5000);
      if (Serial1.available()) {
        char ch = ' ';
        String val = "";
        while (Serial1.available())
        {
          ch = Serial1.read();
          val += char(ch);                  //собираем принятые символы в строку
          delay(10);
        }
        //Serial.println(val);
        if (val.indexOf("+CUSD") > -1) {
          char result1 = val.charAt(38);    // для МТС\SIM800 45    для МТС\М590 38
          char result2 = val.charAt(39);
          char result3 = val.charAt(40);
          char result4 = val.charAt(41);
          char result5 = val.charAt(42);
          char result6 = val.charAt(43);
          char result7 = val.charAt(44);
          ss1 = String(result1);
          ss2 = String(result2);
          ss3 = String(result3);
          ss4 = String(result4);
          ss5 = String(result5);
          ss6 = String(result6);
          ss7 = String(result7);
        }
      }
      if (EEPROM.read(15) != 0) {
        delay(500);
        sms(String("Garag Otkrit, bila srabotka! balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
        delay(500);
      }
      else {
        delay(500);
        sms(String("Garag Otkrit, srabotki ne bilo, balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
        delay(500);
      }
    }
  }

  // ---------------------------------------- проверка кнопки -------------------------------------

  if (Fln == 1)
  {
    if (digitalRead(5) == HIGH)           // проверка на отпускание
    {
      Count++;
      if (Count > 50)
      {
        Count = 0;
        Fln = 0;
      }
    }
    else {
      Count = 0;
    }
  }
  else
  {
    if (digitalRead(5) == LOW)            // проверка на нажатие
    {
      Count++;
      if (Count > 50)
      {
        Count = 0;
        Fln = 1;
        Fz = 1;
      }
    }
    else {
      Count = 0;
    }
  }

  // --------------------------------------- конец проверки кнопки -------------------------------

  if (Fln == 1 && Fz == 1) {
    EEPROM.write(15, 0);                         // сброс тревоги в EEPROM по нажатию кнопки "сброс"
    digitalWrite(7, LOW);                        // выключили LED
    Fz = 0;
    F2 = 0;
  }

  // ------------------------------------ пищим 5 минут ----------------------------------------------

  if (sir == 1 && EEPROM.read(15) != 0 && millis() - sirena < 300000) {   // 5 минут
    if (millis() - sirenat < 500) {
      digitalWrite(6, HIGH);                       // пищалка вкл.
    }
    if (millis() - sirenat > 500 && millis() - sirenat < 1000) {
      digitalWrite(6, LOW);                       // пищалка выкл.
    }
    if (millis() - sirenat > 1000) {
      sirenat = millis();
    }
  }
  else {
    sir = 0;
    digitalWrite(6, LOW);                       // пищалка выкл.
  }

  // -------------------------------------- проверка на запрос состояния по смс ---------------------

  if (Serial1.available()) {
    char ch = ' ';
    String val = "";
    while (Serial1.available())
    {
      ch = Serial1.read();
      val += char(ch);                          //собираем принятые символы в строку
      delay(5);
    }
    //Serial.println(val);
    if (val.indexOf("RING") > -1)   //если есть входящий вызов и нужный номер
    {
      if (val.indexOf("9122200000") > -1) {
        Serial1.println("ATH");                //разрываем связь
        delay(2000);
        while (Serial1.available())              // очистка буфера
        {
          char c = Serial1.read();
        }
        delay(100);
        Serial1.println("AT+CUSD=1,\"#100#\"");  //запрос баланса
        delay(5000);
        if (Serial1.available()) {
          char ch = ' ';
          String val = "";
          while (Serial1.available())
          {
            ch = Serial1.read();
            val += char(ch);                  //собираем принятые символы в строку
            delay(10);
          }
          //Serial.println(val);
          if (val.indexOf("+CUSD") > -1) {
            char result1 = val.charAt(38);    // для МТС\SIM800 45    для МТС\М590 38
            char result2 = val.charAt(39);
            char result3 = val.charAt(40);
            char result4 = val.charAt(41);
            char result5 = val.charAt(42);
            char result6 = val.charAt(43);
            char result7 = val.charAt(44);
            ss1 = String(result1);
            ss2 = String(result2);
            ss3 = String(result3);
            ss4 = String(result4);
            ss5 = String(result5);
            ss6 = String(result6);
            ss7 = String(result7);
          }
        }
        if (digitalRead(2) == LOW && digitalRead(3) == LOW) {
          if (EEPROM.read(15) != 0) {
            delay(500);
            sms(String("Garag Zakrit, bila srabotka! balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
            delay(500);
          }
          else {
            delay(500);
            sms(String("Garag Zakrit, srabotki ne bilo, balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
            delay(500);
          }
        }
        else {
          if (EEPROM.read(15) != 0) {
            delay(500);
            sms(String("Garag Otkrit, bila srabotka! balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
            delay(500);
          }
          else {
            delay(500);
            sms(String("Garag Otkrit, srabotki ne bilo, balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + ss7), String("+79122200000"));
            delay(500);
          }
        }
      }
    }
  }
  if (millis() - res > 21600000) {         // перезапуск раз в 6 часов (21600000)
    res = millis();
    delay(100);
    resetFunc();
  }
}
void sms(String text, String phone)              // отправка СМС
{
  Serial1.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  Serial1.println(text);
  delay(500);
  Serial1.println((char)26);
  delay(5000);
}

 

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

Простите Вы троллите? Это шутка такая? Или Вы вообще (от слова совсем, абсолютно) не понимаете что в коде написано и что означает строка 260? Или Вы хотите сказать, что без неё у Вас все остальные print'ы не работают?

alexbel620017
Offline
Зарегистрирован: 26.03.2017

В мониторе СОМ порта, если эта строка закомментирована, нет ответа модема "ОК" на команды ему....

Было бы просто не задавал бы вопрос.... В том и дело - вообще связи не вижу как от наличия этой строки может зависить вывод ответа модема на команды инициализации в монитор СОМ порта (модем на Serial1 сидит, Mega 2560)

b707
Offline
Зарегистрирован: 26.05.2017

alexbel620017 пишет:

Было бы просто не задавал бы вопрос.... В том и дело - вообще связи не вижу как от наличия этой строки может зависить вывод ответа модема на команды инициализации в монитор СОМ порта

вы точно не прикидываетесь?

Строка 260 выводит ответы модема в монитор. Совершенно естесственно, что без нее вы этих ответов не видите...

Может, вам не стоит этим заниматься, если у вас так все плохо с соображалкой?

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Чем мне стОит заниматься я буду решать сам, оскорблениями не занимайтесь на форуме.

Строка 260 выводит переменную val, полученную вычиткой буфера модема на определённом этапе работы программы. Как это может влиять на вывод ответов на АТ команды на инициализацию модема в начале программы (строки 44, 46, 48)?... Вы хоть читаете что я пишу?! Ответа от модема я не вижу, а не вывод чего-либо другого в монитор!....

b707
Offline
Зарегистрирован: 26.05.2017

alexbel620017 пишет:

Строка 260 выводит переменную val, полученную вычиткой буфера модема на определённом этапе работы программы. Как это может влиять на вывод ответов на АТ команды на инициализацию модема в начале программы (строки 44, 46, 48)?...

Очень просто влияет. Ответов модема в процессе иннициализации (строки 44, 46, 48) вы в своей программе не читаете вовсе. Но если потом строка 260 включена - часть ответов модема, оставшихся в буфере - выводится в монитор.

alexbel620017 пишет:
Вы хоть читаете что я пишу?! Ответа от модема я не вижу, а не вывод чего-либо другого в монитор!....

да вы ничего полезного не пишете, смысл ваши бредни-то читать?

Ответы модема. если вам они нужны - надо читать там же, в строках 40-48 процедуры setup(),. Вы же в своем коде повторяете типичную ошибку всех начинающих при работе с модемом - посылаете ему команды и не читаете ответы. Получение "ОК" нужно проверять ПОСЛЕ КАЖДОЙ КОМАНДЫ иннициализации, прежде чем посылать новую.

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

alexbel620017 пишет:

Строка 260 выводит переменную val, полученную вычиткой буфера модема на определённом этапе работы программы. Как это может влиять на вывод ответов на АТ команды на инициализацию модема в начале программы (строки 44, 46, 48)?... Вы хоть читаете что я пишу?! Ответа от модема я не вижу, а не вывод чего-либо другого в монитор!....

вы с модемом общаетесь через Serial1, а читаете через Serial, и все что прочитано из Serial1 складаывается в буфер val и вам выводится в строке 260

b707
Offline
Зарегистрирован: 26.05.2017

Valera19701 пишет:

вы с модемом общаетесь через Serial1, а читаете через Serial

Валера, смотрите внимательнее - Serial он тоже не читает. Он вообще не читает ответов модема, а потом удивляется "А что это я их в мониторе не вижу?"  :)

Еще имеет наглость обижаться на невинную насмешку :)

alexbel620017
Offline
Зарегистрирован: 26.03.2017

"Очень просто влияет. Ответов модема в процессе иннициализации (строки 44, 46, 48) вы в своей программе не читаете вовсе. Но если потом строка 260 включена - часть ответов модема, оставшихся в буфере - выводится в монитор."

Вот так и надо было сразу сказать,... столько лишнего текста...

Valera19701, подскажите пожалуйста как читается ответ модема. Я просто думал что ответ как-то автоматом в монитор попадает... 

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

alexbel620017 пишет:

В мониторе СОМ порта, если эта строка закомментирована, нет ответа модема "ОК" на команды ему....

Перечитайте ещё раз мой пост. Я ж Вам практически прямо сказал, что у Вас просто не команд print, которые бы печатали не константы кроме строки 260 (ну ещё текст смс печатается в строке 337.

Т.е. у Вас НЕТ команд print. Вы НЕ печатаете ничего. И какого рожна Вы ожидаете увидеть в мониторе?

Если я ошибаюсь, укажите мне номер строки в которой стоит команда print(ln), которая должна печатать ответы, на отсутствие которых Вы жалуетесь.

alexbel620017
Offline
Зарегистрирован: 26.03.2017

"Я просто думал что ответ как-то автоматом в монитор попадает... "......

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

можете так

void loop() {
  if (Serial1.available()) {
    smsstr = readsmsstr();
    Serial.println(smsstr);
}
String readsmsstr() {
  String content = "";
  boolean returnstr = false;
  char smschar;
  //delay(10);
  while (Serial1.available() && returnstr == false) {
    smschar = Serial1.read();
    if (smschar == '\n') {
      returnstr = true;
    }
    else {
      content.concat(smschar);
    }
  }
  return content;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

alexbel620017 пишет:

подскажите пожалуйста как читается ответ модема. Я просто думал что ответ как-то автоматом в монитор попадает... 

А что ардуина "как-то автоматом" станет сигналкой для гаража - вы не думали? :) Было бы удобно - вообще не надо было бы код писать.

Если по делу - как чиать ответ модема, смотрите в вашей же программе, строки с 251 по 260. И так надо делать В КАЖДОМ МЕСТЕ программы, где нужны ответы модема.

b707
Offline
Зарегистрирован: 26.05.2017

"Чем меньше знаний у ТС, чем масштабнее проект"

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

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Понятно, спасибо.

alexbel620017
Offline
Зарегистрирован: 26.03.2017

b707, обязательно помигаю!.... 

сейчас этим и займусь....

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Valera19701, я уже понял свою ошибку, спасибо. Просто не часто делаю что-либо с GSM модулем. Вообще-то мог бы конечно и догадаться сам... ))

b707
Offline
Зарегистрирован: 26.05.2017

alexbel620017 пишет:

Просто не часто делаю что-либо с GSM модулем. Вообще-то мог бы конечно и догадаться сам... ))

Ага-ага... Оказывается, теперь GSM модуль виноват :)

А что, есть какие-то другие модули, которые выдают ответы в Сериал сами, которые не надо читать???

alexbel620017
Offline
Зарегистрирован: 26.03.2017

b707 пишет:

alexbel620017 пишет:

Просто не часто делаю что-либо с GSM модулем. Вообще-то мог бы конечно и догадаться сам... ))

Ага-ага... Оказывается, теперь GSM модуль виноват :)

А что, есть какие-то другие модули, которые выдают ответы в Сериал сами, которые не надо читать???

Да уймитесь, вы, Гений, самому-то не надоело?....

Админ, закройте тему пожалуйста.