SIM800L не отсылает данные по mqtt
- Войдите на сайт для отправки комментариев
Пнд, 01/10/2018 - 18:27
Доброго времени суток, товарищи!
Столкнулся с проблемой - SIM800L не отсылает данные на брокер. При чем такой эффект достигается при добавлении SoftwareSerial. Он сам подключен через софтовый uart, и прекрасно работает один, но если добавить еще один сериал, то к брокеру подключается, но данные не доходят.
Для работы использую библиотеки TinyGsmClient и PubSubClient.
Заранее благодарю за любую помощь и подсказку
А читал про метод listen у SoftwareSerial? И про то, зачем его употреблять в случае использования нескольких экземпляров класса SoftwareSerial?
Хм, не знал. Прочитал информацию, тем не менее, не помогло. Или я не понял, как использовать. Нужно вызывать до отправки, так ?
Хм, не знал. Прочитал информацию, тем не менее, не помогло. Или я не понял, как использовать. Нужно вызывать до отправки, так ?
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 - не вызывается, поэтому ответа - никогда не дождётесь. Так - понятней?
Я вызвал mySerial.listen();, более того, выполнял отправку данных при условии mySerial.isListening(), все равно не доходит информация. А смысл функции я понял
Я вызвал mySerial.listen();, более того, выполнял отправку данных при условии mySerial.isListening(), все равно не доходит информация. А смысл функции я понял
Значит, нужен код. Что у вас там написано - издалека не видать, мутные нынче хрустальные шары пошли.
#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); } }Ну и где вы переключаетесь по listen между вашими GPRSSerial и mySerial? ГДЕ? Ессно, оно работать не будет.
Так а я нигде mySerial и не использую. Уже в таком варианте оно не работает
Так а я нигде mySerial и не использую. Уже в таком варианте оно не работает
В строке 31 - дядя Вася его использует вместо вас, да? Видимо, да. Так вот - инициализация - это уже ИСПОЛЬЗОВАНИЕ. Закомментируйте строчку 31 и посмотрите.
Тот же результат. Помогает только убрать SofwareSerial mySerial(7, 6);
Тот же результат. Помогает только убрать SofwareSerial mySerial(7, 6);
Помогает правильное использование listen, и всё. Добавьте перед 40-й строкой две строчки:
Что будет?
Темболее, в 34 строке, в сетапе я указал слушать GPRS, и нигде больше не менял
Темболее, в 34 строке, в сетапе я указал слушать GPRS, и нигде больше не менял
Добавьте перед 40-й строкой две строчки:
1mySerial.listen();2GPRSSerial.listen();Что будет?
Вот этот пример почитайте - там с комментариями, и используются два SoftwareSerial: https://www.arduino.cc/en/Tutorial/TwoPortReceive
Никаких других подводных камней нет? Схему соединения бы, на всякий - что куда подсоединено.
Не изменилось ничего
Никаких других подводных камней нет? Схему соединения бы, на всякий - что куда подсоединено.
Да тут только SIM800, в скетче указаны пины, и конденсатор к нему, по питанию
Вот этот пример почитайте - там с комментариями, и используются два SoftwareSerial: https://www.arduino.cc/en/Tutorial/TwoPortReceive
Смотрел и этот, и еще много подобных примеров, на форумах, на сайтах с документацией по ардуино.
Еще, после 75 строки не выводится текст в сериал порт (аппаратный)
Еще, после 75 строки не выводится текст в сериал порт (аппаратный)
Т.е. зависает на вызове mqtt.publish?
Походу да, и 5 сек задержки нет. Но потом опять перезагружает модем и так далее
Походу да, и 5 сек задержки нет. Но потом опять перезагружает модем и так далее
Что значит "перезагружает модем"? Так зависает или нет?
Программно перезагружаю модем, вначале цикла. Пропускает все, что после 75 строки
Обратитесь к авторам библиотек - наверное им виднее что там внутри перезагружается
P. S. Я например в своих проектах всегда делаю перезагрузку модема если от него нет нужных команд - возможно в библиотеках аналогично.
Так я тоже делаю перезагрузку модема после отправки данных. И в используемой библиотеке аналогично.