SIM800L не отсылает данные по mqtt

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Доброго времени суток, товарищи!

Столкнулся с проблемой - SIM800L не отсылает данные на брокер. При чем такой эффект достигается при добавлении SoftwareSerial. Он сам подключен через софтовый uart, и прекрасно работает один, но если добавить еще один сериал, то к брокеру подключается, но данные не доходят.

Для работы использую библиотеки TinyGsmClient и PubSubClient.

Заранее благодарю за любую помощь и подсказку

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А читал про метод listen у SoftwareSerial? И про то, зачем его употреблять в случае использования нескольких экземпляров класса SoftwareSerial? 

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Хм, не знал. Прочитал информацию, тем не менее, не помогло. Или я не понял, как использовать. Нужно вызывать до отправки, так ?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Nazar_Diadiun пишет:

Хм, не знал. Прочитал информацию, тем не менее, не помогло. Или я не понял, как использовать. Нужно вызывать до отправки, так ?

Enables the selected software serial port to listen. Only one software serial port can listen at a time; data that arrives for other ports will be discarded.

Что из вышеописанного непонятно? Понимаете, что если мы не будем поочерёдно вызывать listen для каждого из экземпляров SoftwareSerial - то входящие на этот программный порт данные - тю-тю. А вы, вестимо, чего-то там в этом случае ждёте от SIM800 - например, ответа на посланную команду. При этом listen - не вызывается, поэтому ответа - никогда не дождётесь. Так - понятней?

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Я вызвал mySerial.listen();, более того, выполнял отправку данных при условии mySerial.isListening(), все равно не доходит информация. А смысл функции я понял

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Nazar_Diadiun пишет:

Я вызвал mySerial.listen();, более того, выполнял отправку данных при условии mySerial.isListening(), все равно не доходит информация. А смысл функции я понял

Значит, нужен код. Что у вас там написано - издалека не видать, мутные нынче хрустальные шары пошли.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016
#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
#include <PubSubClient.h>
#include <stdlib.h>

const char apn[]  = "internet";
const char user[] = "";
const char pass[] = "";

#include <SoftwareSerial.h>
SoftwareSerial GPRSSerial(10, 11); // RX, TX
SoftwareSerial mySerial(7, 6);

TinyGsm modem(GPRSSerial);
TinyGsmClient client(modem);
PubSubClient mqtt(client);

//MQTT CERDITIONALS
const char* broker = "m15.cloudmqtt.com";
const int mqtt_port = 11406;
const char *mqtt_user = "enlrztmd";
const char *mqtt_pass = "VfKcNvv9sPpL";
const char *mqtt_gsm_client_name = "sim800";

const char* topicInit = "TestJson";

void setup() {
  Serial.begin(9600);
  delay(10);
  
  mySerial.begin(9600);
  
  GPRSSerial.begin(9600);
  GPRSSerial.listen();
}


void loop()
{
  if (GPRSSerial.isListening())
  {
    Serial.println("Перезагрузка модема, 10 секунд задержки");
    modem.restart();
    delay(10000);
    Serial.println("Ожидаем сети...");
    if (!modem.waitForNetwork()) {
      delay(10000);
      return;
    }

    if (modem.isNetworkConnected()) {
      Serial.println("Получили сеть, применяем настройки апн, коннектимся к интернету!");
    }

    if (!modem.gprsConnect(apn, user, pass)) {
      delay(10000);
      return;
    }

    bool res = modem.isGprsConnected();
    Serial.println(res ? "Подключено!" : "не подключено");

    Serial.print("Коннектимся к ");
    Serial.println(broker);
    mqtt.setServer(broker, mqtt_port);
    if (!mqtt.connect(mqtt_gsm_client_name, mqtt_user, mqtt_pass)) {
      Serial.println(" Все плохо :(");
      return false;
    }
    Serial.print("На связи ");
    Serial.print(broker);
    Serial.println(" :)");
    delay(1000);
    Serial.println("Пишем что нибуть");
    mqtt.publish(topicInit, "Is it work ? -_-");
    
    modem.gprsDisconnect();
    if (!modem.isGprsConnected()) {
      Serial.println("GPRS Отключен. Не Миша, все фигня, давай по новой!");
    } else {
      Serial.println("GPRS отключение. Не удалось.");
    }
    delay(5000);
  }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ну и где вы переключаетесь по listen между вашими GPRSSerial и mySerial? ГДЕ? Ессно, оно работать не будет.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Так а я нигде mySerial и не использую. Уже в таком варианте оно не работает

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Nazar_Diadiun пишет:

Так а я нигде mySerial и не использую. Уже в таком варианте оно не работает

В строке 31 - дядя Вася его использует вместо вас, да? Видимо, да. Так вот - инициализация - это уже ИСПОЛЬЗОВАНИЕ. Закомментируйте строчку 31 и посмотрите.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Тот же результат. Помогает только убрать SofwareSerial mySerial(7, 6);

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Nazar_Diadiun пишет:

Тот же результат. Помогает только убрать SofwareSerial mySerial(7, 6);

Помогает правильное использование listen, и всё. Добавьте перед 40-й строкой две строчки:

mySerial.listen();
GPRSSerial.listen();

Что будет?

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Темболее, в 34 строке, в сетапе я указал слушать GPRS, и нигде больше не менял 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Nazar_Diadiun пишет:

Темболее, в 34 строке, в сетапе я указал слушать GPRS, и нигде больше не менял 

Добавьте перед 40-й строкой две строчки:

1 mySerial.listen();
2 GPRSSerial.listen();

Что будет?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вот этот пример почитайте - там с комментариями, и используются два SoftwareSerial: https://www.arduino.cc/en/Tutorial/TwoPortReceive

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Никаких других подводных камней нет? Схему соединения бы, на всякий - что куда подсоединено.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Не изменилось ничего

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

DIYMan пишет:

Никаких других подводных камней нет? Схему соединения бы, на всякий - что куда подсоединено.

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

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

DIYMan пишет:

Вот этот пример почитайте - там с комментариями, и используются два SoftwareSerial: https://www.arduino.cc/en/Tutorial/TwoPortReceive

Смотрел и этот, и еще много подобных примеров, на форумах, на сайтах с документацией по ардуино.

Еще, после 75 строки не выводится текст в сериал порт (аппаратный)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Nazar_Diadiun пишет:

Еще, после 75 строки не выводится текст в сериал порт (аппаратный)

Т.е. зависает на вызове mqtt.publish?

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Походу да, и 5 сек задержки нет. Но потом опять перезагружает модем и так далее

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Nazar_Diadiun пишет:

Походу да, и 5 сек задержки нет. Но потом опять перезагружает модем и так далее

Что значит "перезагружает модем"? Так зависает или нет?

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Программно перезагружаю модем, вначале цикла. Пропускает все, что после 75 строки

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Обратитесь к авторам библиотек - наверное им виднее что там внутри перезагружается

P. S. Я например в своих проектах всегда делаю перезагрузку модема если от него нет нужных команд - возможно в библиотеках аналогично.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

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