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

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

knack пишет:

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

У меня на хардверном сериале один модуль уже 4й месяц работает без перезагрузок и глюков (тьфу, тьфу, тьфу).

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

может оно? может кто проверить? 9ю ногу на в HIGH держать, будет ли он засыпать?

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

okta пишет:

knack пишет:

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

У меня на хардверном сериале один модуль уже 4й месяц работает без перезагрузок и глюков (тьфу, тьфу, тьфу).

Он бывает в простое продолжительное время? Всё же кажется, что он тупо засыпает. Или крестится пора?

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

knack пишет:

может оно? может кто проверить? 9ю ногу на в HIGH держать, будет ли он засыпать?

Извините за глупый вопрос, но 8, 9 пины у нас rx, tx.. Просто в void setup прописать digitalWrite(9, HIGH) ?

В принципе могу попробовать, если подтвердите, что я Вашу мысль правильно понял..

И еще один глупый вопрос: что такое харвердный сериал?

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

GPIO01  9 нога камня

тут она 10я например

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

rrr111 пишет:

knack пишет:

может оно? может кто проверить? 9ю ногу на в HIGH держать, будет ли он засыпать?

Извините за глупый вопрос, но 8, 9 пины у нас rx, tx.. Просто в void setup прописать digitalWrite(9, HIGH) ?

нет, на самом модуле найти GPIO1  и туда подать 5 вольт с ардуины или 3.3 не суть и дать постоять долгое время, будет ли после этого простоя работать или нет.

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

knack пишет:

GPIO01  9 нога камня, тут она 10я например

 

Готово, сделал, теперь подождем некоторое время. Сегодня в течение вечера несколько попробую получить от модуля ответ, если в течение вечера "выживет", то завтра ближе к обеду отпишусь (после утренних "тестирований" модуля).

Что такое харвердный сериал?

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

у атмелевского камня который в ардуино вставлен\впаян есть хардварный UART он сидит на 0 и 1 пине, к этим же ногам припаяна микруха  USB - TTL через которую вы и шьёте камень.

 

"

На платформе Arduino Uno установлено несколько устройств для осуществления связи с компьютером, другими устройствами Arduino или микроконтроллерами. ATmega328 поддерживают последовательный интерфейс UART TTL (5 В), осуществляемый выводами 0 (RX) и 1 (TX). Установленная на плате микросхема ATmega8U2 направляет данный интерфейс через USB, программы на стороне компьютера "общаются" с платой через виртуальный COM порт. Прошивка ATmega8U2 использует стандартные драйвера USB COM, никаких стороних драйверов не требуется, но на Windows для подключения потребуется файл ArduinoUNO.inf.  Мониторинг последовательной шины (Serial Monitor) программы Arduino позволяет посылать и получать текстовые данные при подключении к платформе. Светодиоды RX и TX на платформе будут мигать при передаче данных через микросхему FTDI или USB подключение (но не при использовании последовательной передачи через выводы 0 и 1). 

"

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

knack пишет:

у атмелевского камня который в ардуино вставлен\впаян есть хардварный UART он сидит на 0 и 1 пине, к этим же ногам припаяна микруха  USB - TTL через которую вы и шьёте камень.

 

"

На платформе Arduino Uno установлено несколько устройств для осуществления связи с компьютером, другими устройствами Arduino или микроконтроллерами. ATmega328 поддерживают последовательный интерфейс UART TTL (5 В), осуществляемый выводами 0 (RX) и 1 (TX). Установленная на плате микросхема ATmega8U2 направляет данный интерфейс через USB, программы на стороне компьютера "общаются" с платой через виртуальный COM порт. Прошивка ATmega8U2 использует стандартные драйвера USB COM, никаких стороних драйверов не требуется, но на Windows для подключения потребуется файл ArduinoUNO.inf.  Мониторинг последовательной шины (Serial Monitor) программы Arduino позволяет посылать и получать текстовые данные при подключении к платформе. Светодиоды RX и TX на платформе будут мигать при передаче данных через микросхему FTDI или USB подключение (но не при использовании последовательной передачи через выводы 0 и 1). 

"

 

Так может тогда попробовать подключить все через 0,1 пины (я так понял, что в данном случае все настроено через SoftWareSerial?)

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

Тогда теряешь возможность отлаживать в дальнейшем без доболнительного конвектора TTL USB. У меня уже спортивный интерес проснулся, если плата заводится, работает стабильно какое то время, что такого магического происходит, что она перестаёт отвечать? весящий в воздухе GPIO1, возможно в этом причина. надо достать второй модуль и проверить, а ваш как завис?

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

knack пишет:

 а ваш как завис?

Просто тупо перестал отвечать на смс, от монитора порта отключен был всегда в эти моменты модуль , поэтому ответить на 100% что смс было получено - не могу (хотя на телефоне писалось, что смс доставлено).

И еще одна интересная штука получилась у меня (но это уже не связано с gsm), но все же напишу, вдруг поможете с ответом:

Есть программа, считающая кол-во прерываний на двух пинах (назовем их входы А и В)на плате ардуино УНО. При запросе по смс (модуль А6) необходимо в ответном смс отправить количество прерываний в десятках (например, если было 37 прерываний, то нужно отправить в ответ 3.7).

Для тестирования стабильности и правильности работы gsm-модуля и программы в целом (пока что без учета прерываний, т.е к пинам 2, 3 ничего не было подключено) ввел некоторые значения А, В (чтобы в ответном смс приходило будто произошло 72 и 51 прерывание соответственно). В первые пару часов отправлял периодически смс и получал в ответ как и положено А=7.2, В=5.1 (4 раза отправлял смс и получал верные значения), но через несколько часов работы (часов через 8-10) отправил смс и в ответ получил А=0,1, В=5.1 (напомню, что к пинам 2, 3 ничего не было поключено. Даже если бы и было подключено, то А уменьшаться не должно было никак, только если увеличиваться). 

Как могло такое получиться?

Возможно наведенка ( ардуинка и gsm-модем все это время лежали около жк телевизора и домашнего стационарного телефона, могли ли они превнести помехи и исказить показания значений? Для более точного представления отмечу, что телевизор работал часто из этого периода времени, а телефон не звонил ни разу)?

 

#include <AltSoftSerial.h> //8,9 rx,tx
const int nN = 1;///количество номеров////////////////////////////////////////////////////////////////////
char* trueNum[] = {
  "+79xxxxxxxx"//,//1
  //"+79xxxxxхххх" //2
};
const char* Name[] = {
  "kol-vo: "//,     
  //"kol-vo: "
};
String val = "";
String str = "";
boolean ok = false;
volatile float A=7.20;           
volatile float A_celoe=0.00;
volatile float kol_A=0.00;
volatile float B=5.10;        
volatile float B_celoe=0.00;
volatile float kol_B=0.00;

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"));
    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");
          delay(200);
          altSerial.println(F("AT+CNMI=2,2"));
          delay(200);
          altSerial.println(F("AT+CMGF=1"));
          delay(200);
    }
    else {
      altSerial.end(); delay(500); ok = false;
      Serial.println("IPR not 9600");
    }
  } while (ok==false);
  delay(5000);
  //////////////////////////////////////////////////////////////////
  attachInterrupt(1, blink_A, RISING);
  attachInterrupt(0, blink_B, RISING); 
  //////////////////////////////////////////////////////////////////     
}     
void loop() {

  ///если что то пришло, читаем
  if (altSerial.available()) {
    delay(5);
    char ch = altSerial.read();
    val += char(ch);
  }
  for (int i = 0; i < nN; i++) { 
    
    if (val.indexOf(trueNum[i]) > -1 && val.indexOf("sendme") > -1) {
      Serial.write("nashe sms");
      Serial.println(val);
      smsSend(trueNum[i], String(Name[i]) + "A= " + String(A) + ",   B" + String(B));
       }
    }
/////////////////////////////////////
 //затираем переменную после отправки смс////
  if (val.indexOf("CMGS:") > -1) {
    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);
    val = "";
    delay(50);
    Serial.println("sms otpravleno");
}
////////////////////////////////////////////////////////////////////
void blink_A()

{
  if (digitalRead(3) == HIGH)
  {
kol_A+=1.00;

A= A_celoe+kol_A/10.00;     
if (kol_A == 10.00)           
{
  kol_A=0.00;
  A_celoe++;
}
}
}
void blink_B()
{
  if (digitalRead(2) == HIGH)
  {
kol_B+=1.00;

B= B_celoe+kol_B/10.00;  
if (kol_B == 10.00)            
  kol_B=0.00;
  B_celoe++;
}
}
}

 

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

rrr111 пишет:

knack пишет:

 а ваш как завис?

Просто тупо перестал отвечать на смс, от монитора порта отключен был всегда в эти моменты модуль , поэтому ответить на 100% что смс было получено - не могу (хотя на телефоне писалось, что смс доставлено).

И еще одна интересная штука получилась у меня (но это уже не связано с gsm), но все же напишу, вдруг поможете с ответом:

Есть программа, считающая кол-во прерываний на двух пинах (назовем их входы А и В)на плате ардуино УНО. При запросе по смс (модуль А6) необходимо в ответном смс отправить количество прерываний в десятках (например, если было 37 прерываний, то нужно отправить в ответ 3.7).

Для тестирования стабильности и правильности работы gsm-модуля и программы в целом (пока что без учета прерываний, т.е к пинам 2, 3 ничего не было подключено) ввел некоторые значения А, В (чтобы в ответном смс приходило будто произошло 72 и 51 прерывание соответственно). В первые пару часов отправлял периодически смс и получал в ответ как и положено А=7.2, В=5.1 (4 раза отправлял смс и получал верные значения), но через несколько часов работы (часов через 8-10) отправил смс и в ответ получил А=0,1, В=5.1 (напомню, что к пинам 2, 3 ничего не было поключено. Даже если бы и было подключено, то А уменьшаться не должно было никак, только если увеличиваться). 

Как могло такое получиться?

Возможно наведенка ( ардуинка и gsm-модем все это время лежали около жк телевизора и домашнего стационарного телефона, могли ли они превнести помехи и исказить показания значений? Для более точного представления отмечу, что телевизор работал часто из этого периода времени, а телефон не звонил ни разу)?

 


если пин 3 в воздухе висит, то и без модуля там может быть хаос.

так модуль заснул и с GPIO1 в  HIGH???

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

knack пишет:

так модуль заснул и с GPIO1 в  HIGH???

пока что работает, пять смс отправил (с разной периодичностью) - в ответ пять штук получил (по скетчу, который выше написал. Получил как и положено 7.2 и 5.1)

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

Утром, к сожалению, модуль перестал отвечать на сообщения...
Пробовал звонить на номер, гудки идут, т.е модуль полностью не засыпает по сути (до подключения GPIO1 в  HIGH, когда модуль зависал  звонки до модуля тоже доходили).

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

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

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

knack пишет:

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

Да, если перезагружать ардуинку - то "просыпается".

okta, на хардварном сериале через SoftWareSerial работает или без библиотеки просто через сериал?

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

knack пишет:

Он бывает в простое продолжительное время? Всё же кажется, что он тупо засыпает. Или крестится пора?

Принимает максимум до 5 звонков за сутки и отправляет SMS 1-2 раза в неделю. GPIO1 висит в воздухе.

rrr111 пишет:

okta, на хардварном сериале через SoftWareSerial работает или без библиотеки просто через сериал?

просто через сериал.

Кстати, судя по тому, что после перезагрузки ардуины, модуль начинает отвечать, есть вероятность, что слетают какие-то настройки, которые делаете в сетапе (например, установка скорости). Проверить предположение не могу - нет свободного модуля сейчас.

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

okta пишет:

knack пишет:

Он бывает в простое продолжительное время? Всё же кажется, что он тупо засыпает. Или крестится пора?

Принимает максимум до 5 звонков за сутки и отправляет SMS 1-2 раза в неделю. GPIO1 висит в воздухе.

rrr111 пишет:

okta, на хардварном сериале через SoftWareSerial работает или без библиотеки просто через сериал?

просто через сериал.

Кстати, судя по тому, что после перезагрузки ардуины, модуль начинает отвечать, есть вероятность, что слетают какие-то настройки, которые делаете в сетапе (например, установка скорости). Проверить предположение не могу - нет свободного модуля сейчас.

 

Может ли это быть связано с размещением строки во флэш-памяти: altSerial.println(F("ATZ+IPR=9600")) ?

 

Не могли бы Вы, пожалуйста, поделиться скетчем, написанным на сериале?

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

С использованием флеш-памяти это, видимо, никак не связано: залил было скетч без F , но результат плачевный - модуль отказался отвечать уже менее чем через час (изначально, после перепрошивки без F, отвечал).

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

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

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

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

rrr111 пишет:

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

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


Вовсе не обязательно, у вас в режиме сна УСБ питание есть? Просто говорит о том что ардуина перезагрузилась, кстати если на рабочую рдуину подключить монитор порта она перезагружается. А скорость на модуле года остаться прежней, можно опробовать ребут дуины или altSerialBegin (9600) переодически запускать.

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

knack пишет:
Вовсе не обязательно, у вас в режиме сна УСБ питание есть? Просто говорит о том что ардуина перезагрузилась, кстати если на рабочую рдуину подключить монитор порта она перезагружается. А скорость на модуле года остаться прежней, можно опробовать ребут дуины или altSerialBegin (9600) переодически запускать.

питание есть.

Видимо как раз за счет перезагрузки при открытии монитора порта все и "проснулось".

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

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

А если altserialbegin дёргать переодически?

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

knack пишет:
А если altserialbegin дёргать переодически?

что значит периодически дергать ?

Т.е пытаться периодически обращаться к альтсериал?

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

AltSerialBegin запускает последовательную шину связи

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

knack пишет:
AltSerialBegin запускает последовательную шину связи

Это я понимаю. Я имел в виду обращаться к нему (т.е вводить команду AltSerialBegin(9600);).
Попробовал ввести команду AltSerialBegin(9600); в цикле void loop  -  модуль перестал отвечать на запросы (в пониторе порта перестало выводиться, что принято сообщение). Если сделать только какое-либо условие, при котором нужно будет выводить AltSerialBegin(9600);

Может быть при звонке на модуль вводить AltSerialBegin(9600)? тем самым будем оживлять модуль звонком...

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

    if (val.indexOf("RING") > -1) {
    delay(200);                       //чтобы успеть услышать гудок
    altSerial.println("ATH");
    delay(100);
    Serial.write("perezag-ka modul'a");
    delay(100);
    altSerial.begin(9600);
    delay(100);
    val = ""; 
    }

 

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

Не сработает, т.к. он ring не получит, altserial же лежать будет по предположению, может дёргать модуль коммандой АТ и ждать ок, и по тайм аут перезамуускать altserial

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

knack пишет:
Не сработает, т.к. он ring не получит, altserial же лежать будет по предположению, может дёргать модуль коммандой АТ и ждать ок, и по тайм аут перезамуускать altserial

При "зависании" модуля, да, скорее всего не получит ардуинка "RING", пока не завис модуль - я проверил работоспособности данного куска программы (делал звонок на модуль) - в мониторе порта выходило "перезагрузка модуля", но если глюк действительно в обмене данными между модулем и ардуиной (предположительно по скорости), тогда да, бесполезный номер со звонком.

По таймеру... Да он не понятно с какой периодичностью зависает - в этом вся и фишка. когда через час, а когда только через ночь (часов через 8-9) виснет...

Если уж только совсем "обидеться" на модуль и перезапускать (отправлять altSerialBegin (9600)) его условно раз в полчаса - но надежность (безотказность) здесь очень сильно просядет.

Ну или, например, применить что-то наподобие того, что у нас в начале программы есть (добавив таймер):

 

do {
    altSerial.println("AT");
    delay(200);
    str = "";
    while (altSerial.available())
    {
      char ch = altSerial.read();
      str += ch;
      delay(5);
    }
    if (str.indexOf("OK") > -1) {
      ok = true;
      Serial.println("Ne spit");
          delay(200);
    }
    else {
      altSerial.begin(9600);
      delay(500);
      ok = false;
      Serial.println("usnul");
    }
  } while (ok==false);

 

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

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

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

knack пишет:
Типа так, только вы в свете уже мониторинг то что в ардуина приходит, надо отправить коммандой AT и ждать ответа, если ответа нет, то перезапуска альсофтсериал

Не совсем понял, что Вы имеете в виду?

и второе: я так понял millis() здесь не подойдет, надо будет использовать другой таймер (пока не разбирался с другими таймерами, но миллис при достижении предположим 15 минут нельзя сбросить в ноль и заставить считать время заново)

 

Да и вообще, думаю, может все решится сбросом настроек модуля перед тем, как установить его на скорость 9600. вот так (раньше я такой кусок скетча уже в этой теме скидывал, он в принципе работал, но длительно после такого метода установки скорости модем не тестировался):

    do {
    altSerial.begin(115200);
    delay(200);
    altSerial.println("ATZ0");
    delay(200);
    altSerial.println("ATZ+IPR=9600");
    delay(500);
    altSerial.end();
    delay(200);
    altSerial.begin(9600);
    delay(200);
    altSerial.println("ATE 0");//отключаем эхо

    delay(200);
    altSerial.println("AT");
    delay(200);
    str = "";
    while (altSerial.available())
    {
      char ch = altSerial.read();
      str += ch;
      delay(5);
    }
    if (str.indexOf("OK") > -1) {
      ok = true;
      Serial.println("IPR:9600 OK");
          delay(200);
          altSerial.println("AT+CNMI=2,2");
          delay(200);
          altSerial.println("AT+CMGF=1");
          delay(200);
    }
    else {
      altSerial.end(); delay(500); ok = false;
      Serial.println("IPR not 9600");
    }
  } while (ok==false);
  delay(5000);
knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Примерно так:
if(millis() - delayPing > 100000){
AltSoftSerial.println("AT");
if (val.indexOf("OK") > -1){
delayPing = millis();
}
}
if(millis() - delayPing > 105000){
delayPing = millis();
AltSoftwareSerial.end();
AltSoftwareSerial.begin(9600);
}

Писал с телефона, возможна куча ошибок

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

Короче если разность пинг и миллис будет больше 100000 то отправляем АТ и ждём ответ ОК если пришёл ОК сбрасываем разность пинга и миллис на ноль, если ОК не приходит до разности 105000 перезапускаем шину.

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

knack пишет:
Примерно так: if(millis() - delayPing > 100000){ AltSoftSerial.println("AT"); if (val.indexOf("OK") > -1){ delayPing = millis(); } } if(millis() - delayPing > 105000){ delayPing = millis(); AltSoftwareSerial.end(); AltSoftwareSerial.begin(9600); } Писал с телефона, возможна куча ошибок

Не увидел как вы сбрасываете на ноль millis() ? (В этом и проблема у меня возникла: как обнулить millis через Н-ное количество времени). Вы присваиваете значению делайпинг значение таймера ( delayPing = millis(); ), а обнуление где?

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

Примерно так:

if(millis() - delayPing > 100000){ 
if (boolPing == true){ 
altSerial.println("AT"); 
boolPing = false; 
}
if (val.indexOf("OK") > -1){
boolPing = true; 
delayPing = millis(); 
val = "";
}
} if(millis() - delayPing > 105000){ 
delayPing = millis();
altSerial.end(); 
altSerial.begin(9600); 
boolPing = true; }

 Поправил

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

rrr111 пишет:

knack пишет:
Примерно так: if(millis() - delayPing > 100000){ AltSoftSerial.println("AT"); if (val.indexOf("OK") > -1){ delayPing = millis(); } } if(millis() - delayPing > 105000){ delayPing = millis(); AltSoftwareSerial.end(); AltSoftwareSerial.begin(9600); } Писал с телефона, возможна куча ошибок

Не увидел как вы сбрасываете на ноль millis() ? (В этом и проблема у меня возникла: как обнулить millis через Н-ное количество времени). Вы присваиваете значению делайпинг значение таймера ( delayPing = millis(); ), а обнуление где?


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

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

knack пишет:
rrr111 пишет:

knack пишет:
Примерно так: if(millis() - delayPing > 100000){ AltSoftSerial.println("AT"); if (val.indexOf("OK") > -1){ delayPing = millis(); } } if(millis() - delayPing > 105000){ delayPing = millis(); AltSoftwareSerial.end(); AltSoftwareSerial.begin(9600); } Писал с телефона, возможна куча ошибок

Не увидел как вы сбрасываете на ноль millis() ? (В этом и проблема у меня возникла: как обнулить millis через Н-ное количество времени). Вы присваиваете значению делайпинг значение таймера ( delayPing = millis(); ), а обнуление где?

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

я поэтому и не понимал как Вы его сбрасываете :-)
 

Теперь понял Вашу логику, как Вы предлагаете сравнивать значения.

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

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

Ошибки поправьте

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

knack пишет:
Ошибки поправьте

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

  if(millis() - delayPing > 100000)
  {
if (boolPing == true)
{
AltSoftSerial.println("AT");
boolPing = false; 
}  
}

if (val.indexOf("OK") > -1)
{
 boolPing = true; 
 delayPing = millis(); 
 }
 
 
 if(millis() - delayPing > 105000)
 {
///////////////////////////////////////
//  delayPing = millis();
//////////////////////////////////////
  AltSoftwareSerial.end();
  AltSoftwareSerial.begin(9600);
  boolPing = true; }

 

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

Но тогда второе условие будет всегда заводить альтсериал заново и опять не заработает. Ведь delayPing уже больше 105000.

тогда надо во втором ifдобавить delayPing = delayPing+5000;

Ошибки поправьте, не забудьте обьявить переменные: 

if(millis() - delayPing > 100000){ 
if (boolPing == true){ 
altSerial.println("AT"); 
boolPing = false; 
}if (val.indexOf("OK") > -1){
boolPing = true; 
delayPing = millis(); 
val = "";
}
} if(millis() - delayPing > 105000){ 
delayPing = delayPing+5000;
altSerial.end(); 
altSerial.begin(9600); 
boolPing = true; }

 

boolean boolPing = true;
unsigned long delayPing = 0;
 
rrr111
Offline
Зарегистрирован: 04.10.2016

knack пишет:

Но тогда второе условие будет всегда заводить альтсериал заново и опять не заработает. Ведь delayPing уже больше 105000.

тогда надо во втором ifдобавить delayPing = delayPing+5000;

Позвольте с Вами не согласиться. Т.к в первом цикле если мы превысим 105000 и изменим восстановим скорость обмена 9600, то сначала мы попадем в первый if:

if(millis() - delayPing > 900000) //900000мс = 15минут
{
if (boolPing == true)
{
altSerial.println("AT");
boolPing = false; 
}  
if (val.indexOf("OK") > -1)
{
 boolPing = true; 
 delayPing = millis();
 val=""; 
 }
 }

и после прохождения данного куска программы, во второй if мы не попадем.. А если скорость не изменится (данный способ не будет работать), тогда нам без разницы будем мы добавлять эти 5 секунд или не будем - в любом случае будем попадать во второй цикл if

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

Помните вы поставили altSerial.begin(9600) в loop. Так это получается то же самое. Модулю нужно время что бы написать в ответ ОК, за это время вы закроете и откроете шину несколько раз и в итоге ничего не получите. Можно поставить delay(); но лучше без него. Подождём 5 сек, что бы пришёл ок.

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

Что то вышло?

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

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

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

Отлично, так ОК всегда приходят?

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

Насчет прихода ОК сказать ничего не могу, т.к не вставлял в код отправку СМС при положительном ответе, а от компьютера отключен.

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

Пока что все работает (порядка 40 часов без перебоев, ранее такого не было)...
Решил чтобы исключить вероятность случайного совпадения, отключил питание и заново подключил. Буду еще тестировать некоторое время.

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

Рад, что хоть у кого-то работает :)

Купил SIM800L, попробую с ним поработать (он капризный, зараза, по питанию, но стабильный вроде как), ну и жду А6 новый, мой так и не хочет работать на 9600..

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

Sergy1222 пишет:

Рад, что хоть у кого-то работает :)

Купил SIM800L, попробую с ним поработать (он капризный, зараза, по питанию


Как найдёте отличное решение по питанию этого модуля - отпишите здесь, вдруг пригодится решение:)
(Брал А6 из соображений что есть питание от юсб и , вроде, не так требователен к питанию, но как оказалось у каждого свои болячки)

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

rrr111 пишет:
Как найдёте отличное решение по питанию этого модуля - отпишите здесь, вдруг пригодится решение:) (Брал А6 из соображений что есть питание от юсб и , вроде, не так требователен к питанию, но как оказалось у каждого свои болячки)

Ну, решение по питанию модуля простое - понижайка. А вот делитель напряжения на rx-tx пока не совсем понял как правильно организовать..

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

rrr111 пишет:
Пока что все работает (порядка 40 часов без перебоев, ранее такого не было)... Решил чтобы исключить вероятность случайного совпадения, отключил питание и заново подключил. Буду еще тестировать некоторое время.

Есть какие то новости?

Достал второй модуль, залил скетч, включил на ночь без обвеса, ОК приходял без осечек, получается постоянно по altSerial пинговать модуль надо, что бы связь не пропала. Глюк со стороны модуля или ардуины так и осталось загадкой, ну если после ребута ардуины, связь восстанавливается, то предположительно со стороны ардуины.

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

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