Сбор информации о температуре в теплице

thedeadstone
Offline
Зарегистрирован: 04.01.2016

Добрый день!

Нужно помочь мне собрать такую схему. Может быть можно ее оптимизировать. Большинство комплектующих уже есть, вышлю список того, что заказал на алиэксрпесс. Но, скорее всгео, чего-нибудь не хватает, буду докупать там же или в Москве.

Схема будет использоваться в отапливаемой теплице. Задача - собирать данные о температуре из разных углов теплицы, температуру котла. Пока что только сбор информации.

Рассмотрю варианты удаленного сотрудничества.

 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

такой вопрос = почему DHT11/22 почему не 18b20?

Если дело еще и во влажности то сразу скажу что тогда надо думать как датчик ставить, иначе на нено роса выпадет и влажность будет всегда 100%

Если только температура однозначно рекомендую 18b20, есть варианты с влагоизоляцией, в принципе сделано очень удобно.

 

thedeadstone
Offline
Зарегистрирован: 04.01.2016

18b20 тоже можно. Я новичок в ардуино, поэтому и пришел за советом. 18b20 тоже купил, уже есть в наличии.

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

spa-sam
Offline
Зарегистрирован: 14.12.2012

А почему отправка по HTTP, лучше MQTT. Сейчас именно так и делаю, тем более он гораздо удобнее.

spa-sam
Offline
Зарегистрирован: 14.12.2012

Из всего, что тебе нужно: DS18B20, nrf24l01+, sim800L,  atmega168 , ну и LCD

thedeadstone
Offline
Зарегистрирован: 04.01.2016

spa-sam пишет:

Из всего, что тебе нужно: DS18B20, nrf24l01+, sim800L,  atmega168 , ну и LCD

Спасибо за советы! Можешь помочь с реализацией? Я готов оплатить услуги.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

пишите на yaryarikyar@ya.ru . помогу с реализацией)

spa-sam
Offline
Зарегистрирован: 14.12.2012

Могу помочь просто так. Говори почту. Но только, если ты сам хочешь научиться, готов разбираться и т.д.!

thedeadstone
Offline
Зарегистрирован: 04.01.2016

alexisdenisov@gmail.com

skype - thedeadstone

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

spa-sam  а куда данные от Arduino передаете? Кто сервер?

spa-sam
Offline
Зарегистрирован: 14.12.2012

По mqtt sim800L передаёт на www.cloudmqtt.com с удалённой теплицы, т.к. находится на расстоянии 1.5км. А уже с www.cloudmqtt.com  забираю на комп. В пределах 150 метров собираю с датчиков на nrf24l01+, где всё собирается на базовый приёмник и передаётся по com порту. Написал свою прогу на C#, где выводятся графики и показания датчиков, плюс сигнализация по привышению параметра и отсутствию 220В в сети на удалённой теплице. Этой же прогой передаются данные на "народный мониторинг" и Xively.  Так же сейчас доделываю, что эта прога будет передавать показания с датчиков принятых по nrf24l01+  по протоколу MQTT на  www.cloudmqtt.com. Это для того, чтобы можно было взять с собой прогу на флешке, запустить на любом компе и получать данные в любом месте.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

spa-sam Спасибо. Понятно, не люблю я все эти облака. Получаешься привязан к сервису. Хотя их (облачных технологий) все больше вокруг. 

Почитал немного о MQTT, в принципе интересно, хотя HTTP привычнее.
 

spa-sam
Offline
Зарегистрирован: 14.12.2012

Согласен, привязан. Но можно в качестве резервирования отправлять данные на несколько сайтов или развернуть свой сервер. Хотел попробовать передатчики lora rfm98, заказал их и по своеё невнимательности сжёг их. 

griin
Offline
Зарегистрирован: 19.04.2015

Добрый день.

Я бы сделал так

Купил планшет по акции(4000 руб), ардуино уно, датчики ДС1820.

На планшете копил данные о температуре и по запросу передавал непосредственно на свой компьютер без всяких облаков

MacSim
Offline
Зарегистрирован: 28.11.2012

griin пишет:

Добрый день.

Я бы сделал так

Купил планшет по акции(4000 руб), ардуино уно, датчики ДС1820.

На планшете копил данные о температуре и по запросу передавал непосредственно на свой компьютер без всяких облаков

передавали бы каким образом? флешку бы вынимали-втыкали руками? 4000тр. против 400 за sim800L. Глупо.

terminal
Offline
Зарегистрирован: 02.09.2015

Такое чувство что все ходят вокруг да около.  Я уже давно предлагаю: Давайте построим систему на RS485. Если нужно данные с системы в комп то просто переходник FT232->485.

energokom
Offline
Зарегистрирован: 31.07.2016

spa-sam пишет:

По mqtt sim800L передаёт на www.cloudmqtt.com с удалённой теплицы, т.к. находится на расстоянии 1.5км. А уже с www.cloudmqtt.com  забираю на комп. В пределах 150 метров собираю с датчиков на nrf24l01+, где всё собирается на базовый приёмник и передаётся по com порту. Написал свою прогу на C#, где выводятся графики и показания датчиков, плюс сигнализация по привышению параметра и отсутствию 220В в сети на удалённой теплице. Этой же прогой передаются данные на "народный мониторинг" и Xively.  Так же сейчас доделываю, что эта прога будет передавать показания с датчиков принятых по nrf24l01+  по протоколу MQTT на  www.cloudmqtt.com. Это для того, чтобы можно было взять с собой прогу на флешке, запустить на любом компе и получать данные в любом месте.

День добрый.

Можете выложить скетч и библиотеку, для подключение микроконтроллера к www.cloudmqtt.com по GPRS c помощью SIM800l.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

p.masyukov - sckype

если еще нужно - пишите..

energokom
Offline
Зарегистрирован: 31.07.2016

Подскажите как cloudmqqt c SIM800l подружить?

Использую NodeMCU, по wi fi работает, хочу так же реализовать по GPRS

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

https://www.arduino.cc/en/Tutorial/GSMExamplesWebClient

 

Andrey12 пишет:

spa-sam Спасибо. Понятно, не люблю я все эти облака. Получаешься привязан к сервису. Хотя их (облачных технологий) все больше вокруг. 

Почитал немного о MQTT, в принципе интересно, хотя HTTP привычнее.
 

Да. Тоже посмотрел - костыль еще тот... Хотя без этого в последнее время не обойтись..

 

spa-sam
Offline
Зарегистрирован: 14.12.2012

Использовал библиотеку  от adafruit  https://learn.adafruit.com/adafruit-io-basics-digital-output/arduino-cellular

По ссылке подробно расписано как привязать к брокеру на примере IoT от adafruit. Если будет затыка разобраться, то обращайтесь, помогу! По поводу костыля...да есть неудобство, но зато расстояние становится не критично. Я сначала использовал  www.cloudmqtt.com  , теперь решил сделать иначе - поставил на raspberry Pi  mqtt брокер mosquito и пользуюсь своим брокером без ограничений. В планах помимо C# приложения на компе написать своё андроид приложение.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Ядрён батон, зачем так сложно?

1) ставим роутер(как роутер к инету плодключить сами думайте, и нужно ли), объединяем через изернет или wifi+изернет

2) экран зачем? есть же ПК (опять же с телефона можно зайти по wi-fi)

3)переключатель выбрасываем

4) вторую ардуино уно(а лучше - мегу) подключаем как и первую через изернет к роутеру.

получаем стройную систему.

 

 

_SergeY_
Offline
Зарегистрирован: 29.07.2015

А может у кого есть пример как с Arduino через Wi-Fi на ESP8266 отправлять/принимать данные (топик) на CloudMQTT? 

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

_SergeY_ пишет:

А может у кого есть пример как с Arduino через Wi-Fi на ESP8266 отправлять/принимать данные (топик) на CloudMQTT? 

В гугле ссылок на первой странице прям:

https://sonyarouje.com/2016/03/15/mqtt-communication-with-arduino-using-...

https://home-assistant.io/blog/2015/10/11/measure-temperature-with-esp82...

Ну и далее по тексту, по волшебному заклинанию "arduino esp mqtt" ;)

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

дубль.

energokom
Offline
Зарегистрирован: 31.07.2016

Удалось на NodeMCU c помощью SIM800l по GPRS отправлять данные температуры и влажности по MQTT на broker.mqtt-dashboard.com.

 

Попробовал этот же скетч на atmega168 nano V3 пишет недостаточно памяти, программа может работать не корректно.  и данные не отправляются.

Можете помочь подкорректировать мой скетч что бы он работал на atmega168 nano V3.

 

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

Вопрос задан в воздух :)

energokom
Offline
Зарегистрирован: 31.07.2016

spa-sam пишет:

Использовал библиотеку  от adafruit  https://learn.adafruit.com/adafruit-io-basics-digital-output/arduino-cellular

По ссылке подробно расписано как привязать к брокеру на примере IoT от adafruit. Если будет затыка разобраться, то обращайтесь, помогу! По поводу костыля...да есть неудобство, но зато расстояние становится не критично. Я сначала использовал  www.cloudmqtt.com  , теперь решил сделать иначе - поставил на raspberry Pi  mqtt брокер mosquito и пользуюсь своим брокером без ограничений. В планах помимо C# приложения на компе написать своё андроид приложение.

День добрый.

Удалось на NodeMCU c помощью SIM800l по GPRS отправлять данные температуры и влажности по MQTT на broker.mqtt-dashboard.com. (он без логина и пароля)

 

Попробовал этот же скетч на atmega168 nano V3 пишет недостаточно памяти, программа может работать не корректно.  и данные не отправляются.

Можете помочь подкорректировать мой скетч что бы он работал на atmega168 nano V3. и коннектиться  с логином и паролем к  www.cloudmqtt.com

У Вас есть аська или какой-нибудь другой месенджер?

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

energokom пишет:

spa-sam пишет:

Использовал библиотеку  от adafruit  https://learn.adafruit.com/adafruit-io-basics-digital-output/arduino-cellular

По ссылке подробно расписано как привязать к брокеру на примере IoT от adafruit. Если будет затыка разобраться, то обращайтесь, помогу! По поводу костыля...да есть неудобство, но зато расстояние становится не критично. Я сначала использовал  www.cloudmqtt.com  , теперь решил сделать иначе - поставил на raspberry Pi  mqtt брокер mosquito и пользуюсь своим брокером без ограничений. В планах помимо C# приложения на компе написать своё андроид приложение.

День добрый.

Удалось на NodeMCU c помощью SIM800l по GPRS отправлять данные температуры и влажности по MQTT на broker.mqtt-dashboard.com. (он без логина и пароля)

 

Попробовал этот же скетч на atmega168 nano V3 пишет недостаточно памяти, программа может работать не корректно.  и данные не отправляются.

Можете помочь подкорректировать мой скетч что бы он работал на atmega168 nano V3. и коннектиться  с логином и паролем к  www.cloudmqtt.com

У Вас есть аська или какой-нибудь другой месенджер?

купи нано на 328

стоит всего 120 рублей

energokom
Offline
Зарегистрирован: 31.07.2016

p.masyukov пишет:

energokom пишет:

День добрый.

Удалось на NodeMCU c помощью SIM800l по GPRS отправлять данные температуры и влажности по MQTT на broker.mqtt-dashboard.com. (он без логина и пароля)

 

Попробовал этот же скетч на atmega168 nano V3 пишет недостаточно памяти, программа может работать не корректно.  и данные не отправляются.

Можете помочь подкорректировать мой скетч что бы он работал на atmega168 nano V3. и коннектиться  с логином и паролем к  www.cloudmqtt.com

У Вас есть аська или какой-нибудь другой месенджер?

купи нано на 328

стоит всего 120 рублей

Купил, жду когда придет (надеюсь у него памяти хватит).

Осталось изменить библиотеку, что бы конектиться с логином и паролем.

было:
//clientID, IP, Port, Topic, Message
    
    sendMQTTMessage("MYID", "broker.mqtt-dashboard.com", "1883", "mytopic", jsonStr);
   mqttMessageLength = 16 + strlen(clientId);
   mqtt_connect_message(mqttMessage, clientId);


изменил на 
sendMQTTMessage("MYID", "m12.cloudmqtt.com", "14311", "login", "pass", "mytopic", jsonStr);
 mqttMessageLength = 16 + strlen(clientId)+ strlen(mqtt_user)+ strlen(mqtt_pass);
 mqtt_connect_message(clientId, mqtt_user, mqtt_pass);


в библиотеке было:
#ifndef MQTT_H_INCLUDED
#define MQTT_H_INCLUDED

#include <string.h>
#include <stdint.h>

void mqtt_connect_message(uint8_t *, char *);

void mqtt_publish_message(uint8_t *, char *, char *);

void mqtt_disconnect_message(uint8_t *);


#endif // MQTT_H_INCLUDED

изменил на:
void mqtt_connect_message(char *,  char *, char *);

void mqtt_publish_message(uint8_t *, char *, char *);


При компеляции выдает ошибку,  стал смотреть файл ССP там:

#include <mqtt.h>

	void mqtt_connect_message(uint8_t * mqtt_message, char * client_id) {

        uint8_t i = 0;
        uint8_t client_id_length = strlen(client_id);

		mqtt_message[0] = 16;                      // MQTT Message Type CONNECT
		mqtt_message[1] = 14 + client_id_length;   // Remaining length of the message




Вот тут я заступорился.

Как добавить в скет, коннектиться по логину и паролю?

_SergeY_
Offline
Зарегистрирован: 29.07.2015

Мне удалось заставить работать только один из 3 вариантов библиотек PubSubClient работать с CloudMQTT. Arduino Nano отправляет данные через ESP8266 по Wi-Fi на Cloud. Читаю данные Андроид приложением на смартфоне и со смартфона управляю Ардуиной через Cloud. Остался пока только не решенным вопрос - иногда зависает не то ESP не то глючит сервер Cloud. Причем сервер EU (м21.cloud) работает стабильнее чем м12 US. Возможно кривую прошивку загнал в ESP. 

smart_pic
Offline
Зарегистрирован: 17.04.2016

Делали управление уличным освещением . Автоматизированная система управления наружным освещением (АСУНО)

Отправка данных через модем SIM900 ( сейчас лучше взять SIM800) или по LAN

Можно в контроллере сразу сделать сервер на HTML5, тогда будет и графики рисовать.

 

 

spa-sam
Offline
Зарегистрирован: 14.12.2012

Рабочий код, подставить только свои данные

#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_FONA.h"
#include <Adafruit_SleepyDog.h>

//******************используемые переменные********************************

char *val; 




/*************************** FONA Pins ***********************************/
#define FONA_RX 3
#define FONA_TX 4
#define FONA_RST 2
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);


/*************************  Setup *********************************/

#define AIO_SERVER      "сервак"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "ваше имя"
#define AIO_KEY         "пароль"

const char MQTT_SERVER[] PROGMEM    = AIO_SERVER;
const char MQTT_USERNAME[] PROGMEM  = AIO_USERNAME;
const char MQTT_PASSWORD[] PROGMEM  = AIO_KEY;

Adafruit_MQTT_FONA mqtt(&fona, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);

/****************************** Feeds ***************************************/
// настройки MQTT на публикацию топика "/my"
const char DATA_SND_FEED[] PROGMEM = AIO_USERNAME "/my";
Adafruit_MQTT_Publish snd_data = Adafruit_MQTT_Publish(&mqtt, DATA_SND_FEED);

// настройки MQTT на подписку топика "/my"
const char DATA_RCV_FEED[] PROGMEM =AIO_USERNAME "/my";
Adafruit_MQTT_Subscribe rcv_data = Adafruit_MQTT_Subscribe(&mqtt, DATA_RCV_FEED);

/*************************** Sketch Code ************************************/

// сколько ошибок подключения нужно, чтобы перегрузить МК
uint8_t txfailures = 0;
#define MAXTXFAILURES 3





void setup() {

Serial.begin(115200);
fonaSS.begin(9600);
fona.begin(fonaSS);

Serial.println(F("Initializing SIM800L....(3 seconds)"));
fonaSS.println("AT+CMEE=2");
Serial.println(F("FONA is OK"));  

//Включаем Watchdog на 8 секунд, если вдруг МК зависнит
Watchdog.enable(8000);

//переодически сбрасываем таймер Watchdog
Watchdog.reset();

 
Serial.println(F("Checking for network..."));
while (fona.getNetworkStatus() != 1) { delay(500); }

Watchdog.reset();
 delay(5000); //для стабилизации подключения
Watchdog.reset();
 
fona.setGPRSNetworkSettings(F("internet"));  //точка доступа для gprs, в данном случае это "internet" (мтс Украина)
delay(1000); //для стабилизации подключения 

//проваеряем отключен ли gprs
Serial.println(F("Disabling GPRS"));
fona.enableGPRS(false);  


Watchdog.reset();
 delay(5000);  //для стабилизации подключения
Watchdog.reset();


//подключаем gprs
Serial.println(F("Enabling GPRS"));
if (!fona.enableGPRS(true)) { Serial.println(F("Failed to turn GPRS on")); }
else { Serial.println(F("Connected to Cellular!"));}

Watchdog.reset();
  delay(5000);  // //для стабилизации подключения
Watchdog.reset();


Watchdog.reset(); 

//подписываемся на топик
mqtt.subscribe(&rcv_data);

}




void loop() {

Watchdog.reset();

//подлючаемся по mqtt
MQTT_connect();

Watchdog.reset();


//пример строки
String str_1 = "ID"  + String(44) + ";" + String("hello") + ";" + "base" + ";" + String("V_pwr") + ";"+ String("V_bat")+";" + String("--")+";" + String("--")+ ";" + String("mr_long")+ ";" + "com";

//переводим нашу строку в набор символов
char str_Char_1[100];
str_1.toCharArray(str_Char_1, str_1.length()+1);

// отправляем через mqtt строку
if (!snd_data.publish(str_Char_1) ) {txfailures++;
                                     Watchdog.reset();} 
else {txfailures= 0;} 


//получаем подписку по MQTT и выводим в com порт, то что получили 

Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
     if (subscription == &rcv_data) {
      Serial.print(F("Got: "));
      val  = (char*)&rcv_data.lastread;  //получаем нашу строку из MQTT и записываем в массив символов
     Serial.print(F("Received: "));    //выводим в com порт, что получили
     Serial.println(val);}
}//закончили подписку

//***********************************************************************************************   
//в самом низу программы есть функция String getValue, которая парсит нашу строку **************
//парсим полученную через MQTT строку
String val_1 = getValue(val,';',0 );
String val_2 = getValue(val, ';', 1);
String val_3 = getValue(val, ';', 2);
String val_4 = getValue(val, ';', 3);
String val_5 = getValue(val, ';', 4);
String val_6 = getValue(val, ';', 5);
String val_7= getValue(val, ';', 6);
String val_8 = getValue(val, ';', 7);
String val_9 = getValue(val, ';', 8);
    


//пингуем и держим связь с mqtt
if(! mqtt.ping()) {Serial.println(F("MQTT Ping failed."));}
                      
  
}


//*********************************************************************************************************************
// Function to connect and reconnect to the MQTT server.***************************************************************
void MQTT_connect() {
  int8_t ret;
  // Stop if already connected.
  if (mqtt.connected()) { return;}

Serial.print("Connecting to MQTT... ");

while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
  }
Serial.println("MQTT Connected!");
}


// Функция парсинга строки, которая вызывается в loop ******************************************************************
String getValue(String data, char separator, int index)
{
 int found = 0;
 int strIndex[] = {0, -1  };
 int maxIndex = data.length()-1;
 for(int i=0; i<=maxIndex && found<=index; i++){
 if(data.charAt(i)==separator || i==maxIndex){ found++;
                                               strIndex[0] = strIndex[1]+1;
                                               strIndex[1] = (i == maxIndex) ? i+1 : i;}
                                                }
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}














 

Aleksander
Offline
Зарегистрирован: 08.01.2017

Здравствуйте, подскажите пожалуйста новичку. В этом коде логин и пароль вводятся из регистрации к MQTT ? Если да то где зарегистрироваться. Или это на компе устанавливается брокер и пробрасываются порты на роутере и уже от домашнего брокера логин и пароль?

spa-sam
Offline
Зарегистрирован: 14.12.2012
ale_mild
Offline
Зарегистрирован: 20.04.2017

Здравствуйте! Спасибо большое за код программы!  Но помогите,пожалуйста! Использовала ваш код, подставила свои значения, в итоге все подключается. Но не могу разобраться как в приложении получить?  регестрировалась на сайте cloudmqtt.com, приложение mqqt dashboard. 

 

ale_mild
Offline
Зарегистрирован: 20.04.2017

в сериал выходит:

Sending photocell val 148... ---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
AT+CIPSEND=31
 0x30 0x1D 0x0 0x18 0x76 0x70 0x66 0x62 0x75 0x63 0x63 0x67 0x2F 0x66 0x65 0x65 0x64 0x73 0x2F 0x70 0x68 0x6F 0x74 0x6F 0x63 0x65 0x6C 0x6C 0x31 0x34 0x38
<--- > 
<--- SEND OK
OK!
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
 
и так до бесконечности... это нормально?
ale_mild
Offline
Зарегистрирован: 20.04.2017

ale_mild пишет:

в сериал выходит:

Sending photocell val 148... ---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
AT+CIPSEND=31
 0x30 0x1D 0x0 0x18 0x76 0x70 0x66 0x62 0x75 0x63 0x63 0x67 0x2F 0x66 0x65 0x65 0x64 0x73 0x2F 0x70 0x68 0x6F 0x74 0x6F 0x63 0x65 0x6C 0x6C 0x31 0x34 0x38
<--- > 
<--- SEND OK
OK!
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPRXGET=4
<--- +CIPRXGET: 4,0
0 bytes available
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
---> AT+CIPSTATUS
<--- OK
<--- STATE: CONNECT OK
 
и так до бесконечности... это нормально?

 

это было вчера! сегодня подключила заново,в программе ничего не меняла, подключается к gprs,пытается подключиться к mqtt, не получается один раз,второй и опять начинает подключать gprs. как так?

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

ale_mild пишет:

это было вчера! сегодня подключила заново,в программе ничего не меняла, подключается к gprs,пытается подключиться к mqtt, не получается один раз,второй и опять начинает подключать gprs. как так?

Это нормально для GRPS, сеть может работать нестабильно. Делаю проект на GRPS - то же самое - то с первого раза подключается. то с пятого, в иные дни вообще нет связи. Чтобы все работало более-менее автоматически - необходимо проверять в программе каждый "OK" в процедуре подключения к сети. И отслеживать таймаут - если за разумное время не подключились - сделать паузу, все отключить и начать с самого начала

pasha413
Offline
Зарегистрирован: 27.11.2016

Здравствуйте. попробовал код из поста #32

#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_FONA.h"
#include <Adafruit_SleepyDog.h>

//******************используемые переменные********************************

char *val; 

/*************************** FONA Pins ***********************************/
#define FONA_RST 2
SoftwareSerial fonaSS = SoftwareSerial(6, 7);

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

/*************************  Setup *********************************/

#define MQTT_SERVER      "m14.cloudmqtt.com"
#define MQTT_SERVERPORT  17665
#define MQTT_USERNAME    "*******"
#define MQTT_PASSWORD    "********"

Adafruit_MQTT_FONA mqtt(&fona, MQTT_SERVER, MQTT_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);

/****************************** Feeds ***************************************/
// настройки MQTT на публикацию топика "/my"
const char DATA_SND_FEED[] PROGMEM = MQTT_USERNAME "/my";
Adafruit_MQTT_Publish snd_data = Adafruit_MQTT_Publish(&mqtt, DATA_SND_FEED);

// настройки MQTT на подписку топика "/my"
const char DATA_RCV_FEED[] PROGMEM = MQTT_USERNAME "/my";
Adafruit_MQTT_Subscribe rcv_data = Adafruit_MQTT_Subscribe(&mqtt, DATA_RCV_FEED);

/*************************** Sketch Code ************************************/

// сколько ошибок подключения нужно, чтобы перегрузить МК
uint8_t txfailures = 0;
#define MAXTXFAILURES 3

void setup() {

Serial.begin(115200);
fonaSS.begin(9600);
fona.begin(fonaSS);

Serial.println(F("Initializing SIM800L....(3 seconds)"));
fonaSS.println("AT+CMEE=2");
Serial.println(F("FONA is OK"));  

//Включаем Watchdog на 8 секунд, если вдруг МК зависнит
Watchdog.enable(8000);

//переодически сбрасываем таймер Watchdog
Watchdog.reset();

 
Serial.println(F("Checking for network..."));
while (fona.getNetworkStatus() != 1) { delay(500); }

Watchdog.reset();
 delay(5000); //для стабилизации подключения
Watchdog.reset();
 
fona.setGPRSNetworkSettings(F("internet.tele2.ru"));  //точка доступа для gprs, в данном случае это "internet" (мтс Украина)
delay(1000); //для стабилизации подключения 

//проваеряем отключен ли gprs
Serial.println(F("Disabling GPRS"));
fona.enableGPRS(false);  


Watchdog.reset();
 delay(5000);  //для стабилизации подключения
Watchdog.reset();

//подключаем gprs
Serial.println(F("Enabling GPRS"));
if (!fona.enableGPRS(true)) { Serial.println(F("Failed to turn GPRS on")); }
else { Serial.println(F("Connected to Cellular!"));}

Watchdog.reset();
  delay(5000);  // //для стабилизации подключения
Watchdog.reset();

Watchdog.reset(); 

//подписываемся на топик
mqtt.subscribe(&rcv_data);
}

void loop() {

Watchdog.reset();

//подлючаемся по mqtt
MQTT_connect();

Watchdog.reset();


//пример строки
String str_1 = "ID"  + String(44) + ";" + String("hello") + ";" + "base" + ";" + String("V_pwr") + ";"+ String("V_bat")+";" + String("--")+";" + String("--")+ ";" + String("mr_long")+ ";" + "com";

//переводим нашу строку в набор символов
char str_Char_1[100];
str_1.toCharArray(str_Char_1, str_1.length()+1);

// отправляем через mqtt строку
if (!snd_data.publish(str_Char_1) ) {txfailures++;
                                     Watchdog.reset();} 
else {txfailures= 0;} 


//получаем подписку по MQTT и выводим в com порт, то что получили 

Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
     if (subscription == &rcv_data) {
      Serial.print(F("Got: "));
      val  = (char*)&rcv_data.lastread;  //получаем нашу строку из MQTT и записываем в массив символов
     Serial.print(F("Received: "));    //выводим в com порт, что получили
     Serial.println(val);}
}//закончили подписку

//***********************************************************************************************   
//в самом низу программы есть функция String getValue, которая парсит нашу строку **************
//парсим полученную через MQTT строку
String val_1 = getValue(val,';',0 );
String val_2 = getValue(val, ';', 1);
String val_3 = getValue(val, ';', 2);
String val_4 = getValue(val, ';', 3);
String val_5 = getValue(val, ';', 4);
String val_6 = getValue(val, ';', 5);
String val_7= getValue(val, ';', 6);
String val_8 = getValue(val, ';', 7);
String val_9 = getValue(val, ';', 8);
    


//пингуем и держим связь с mqtt
if(! mqtt.ping()) {Serial.println(F("MQTT Ping failed."));}
                      
}

//*********************************************************************************************************************
// Function to connect and reconnect to the MQTT server.***************************************************************
void MQTT_connect() {
  int8_t ret;
  // Stop if already connected.
  if (mqtt.connected()) { return;}

Serial.print("Connecting to MQTT... ");

while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
  }
Serial.println("MQTT Connected!");
}


// Функция парсинга строки, которая вызывается в loop ******************************************************************
String getValue(String data, char separator, int index)
{
 int found = 0;
 int strIndex[] = {0, -1  };
 int maxIndex = data.length()-1;
 for(int i=0; i<=maxIndex && found<=index; i++){
 if(data.charAt(i)==separator || i==maxIndex){ found++;
                                               strIndex[0] = strIndex[1]+1;
                                               strIndex[1] = (i == maxIndex) ? i+1 : i;}
                                                }
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

 вроде все подключается, но ардуинка зависает, вот лог запуска:

Attempting to open comm with ATs
	---> AT
	<--- ⸮
	---> AT
	<--- 
	---> AT
	<--- ⸮
	---> AT
	<--- AT
	---> ATE0
	<--- ATE0
	---> ATE0
	<--- OK
	---> AT+CVHU=0
	<--- OK
	---> ATI
	<--- SIM800 R13.08

OK

+CPIN: READY

	---> AT+GMM
	<--- SIMCOM_SIM800L

OK

	---> AT+CPMS="SM","SM","SM"
	<--- ERROR
Initializing SIM800L....(3 seconds)
FONA is OK
Checking for network...
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,1
Disabling GPRS
	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+SAPBR=0,1
	<--- +CME ERROR: operation not allowed
Enabling GPRS
	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+CGATT=1
	<--- OK
	---> AT+SAPBR=3,1,"CONTYPE","GPRS"
	<--- OK
	---> AT+SAPBR=3,1,"APN","internet.tele2.ru"
	<--- OK
	---> AT+CSTT="internet.tele2.ru"
	<--- OK
	---> AT+SAPBR=1,1
	<--- OK
	---> AT+CIICR
	<--- OK
Connected to Cellular!
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: IP GPRSACT
Connecting to MQTT... 	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+CIPMUX=0
	<--- OK
	---> AT+CIPRXGET=1
	<--- OK
AT+CIPSTART="TCP","m14.cloudmqtt.com","17665"
	<--- OK
	<--- CONNECT OK
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=24
 0x10 0x16 0x0 0x4 0x4D 0x51 0x54 0x54 0x4 0xFFFFFF82 0x1 0x2C 0x0 0x0 0x0 0x8 0x70 0x61 0x73 0x68 0x61 0x34 0x31 0x33
	<--- > 
	<--- 
Connection failed
Retrying MQTT connection in 5 seconds...
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=2
 0xFFFFFFE0 0x0
	<--- > 

Загрузил код из примера Adafruit MQTT/MQTT_FONA:

/***************************************************
  Adafruit MQTT Library FONA Example

  Designed specifically to work with the Adafruit FONA
  ----> http://www.adafruit.com/products/1946
  ----> http://www.adafruit.com/products/1963
  ----> http://www.adafruit.com/products/2468
  ----> http://www.adafruit.com/products/2542

  These cellular modules use TTL Serial to communicate, 2 pins are
  required to interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  MIT license, all text above must be included in any redistribution
 ****************************************************/
#include <Adafruit_SleepyDog.h>
#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_FONA.h"

/*************************** FONA Pins ***********************************/

// Default pins for Feather 32u4 FONA
#define FONA_RST 4
SoftwareSerial fonaSS = SoftwareSerial(6, 7);

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

/************************* WiFi Access Point *********************************/

  // Optionally configure a GPRS APN, username, and password.
  // You might need to do this to access your network's GPRS/data
  // network.  Contact your provider for the exact APN, username,
  // and password values.  Username and password are optional and
  // can be removed, but APN is required.
#define FONA_APN       "internet.tele2.ru"
#define FONA_USERNAME  ""
#define FONA_PASSWORD  ""

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "m14.cloudmqtt.com"
#define AIO_SERVERPORT  17665
#define AIO_USERNAME    "******"
#define AIO_KEY         "********"

/************ Global State (you don't need to change this!) ******************/

// Setup the FONA MQTT class by passing in the FONA class and MQTT server and login details.
Adafruit_MQTT_FONA mqtt(&fona, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

// You don't need to change anything below this line!
#define halt(s) { Serial.println(F( s )); while(1);  }

// FONAconnect is a helper function that sets up the FONA and connects to
// the GPRS network. See the fonahelper.cpp tab above for the source!
boolean FONAconnect(const __FlashStringHelper *apn, const __FlashStringHelper *username, const __FlashStringHelper *password);

/****************************** Feeds ***************************************/

// Setup a feed called 'photocell' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");

// Setup a feed called 'onoff' for subscribing to changes.
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");

/*************************** Sketch Code ************************************/

// How many transmission failures in a row we're willing to be ok with before reset
uint8_t txfailures = 0;
#define MAXTXFAILURES 3

void setup() {
  while (!Serial);

  // Watchdog is optional!
  //Watchdog.enable(8000);
  
  Serial.begin(115200);

  Serial.println(F("Adafruit FONA MQTT demo"));

  mqtt.subscribe(&onoffbutton);

  Watchdog.reset();
  delay(5000);  // wait a few seconds to stabilize connection
  Watchdog.reset();
  
  // Initialise the FONA module
  while (! FONAconnect(F(FONA_APN), F(FONA_USERNAME), F(FONA_PASSWORD))) {
    Serial.println("Retrying FONA");
  }

  Serial.println(F("Connected to Cellular!"));

  Watchdog.reset();
  delay(5000);  // wait a few seconds to stabilize connection
  Watchdog.reset();
}

uint32_t x=0;

void loop() {
  // Make sure to reset watchdog every loop iteration!
  Watchdog.reset();

  // Ensure the connection to the MQTT server is alive (this will make the first
  // connection and automatically reconnect when disconnected).  See the MQTT_connect
  // function definition further below.
  MQTT_connect();

  Watchdog.reset();
  // Now we can publish stuff!
  Serial.print(F("\nSending photocell val "));
  Serial.print(x);
  Serial.print("...");
  if (! photocell.publish(x++)) {
    Serial.println(F("Failed"));
    txfailures++;
  } else {
    Serial.println(F("OK!"));
    txfailures = 0;
  }

  Watchdog.reset();  
  // this is our 'wait for incoming subscription packets' busy subloop
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &onoffbutton) {
      Serial.print(F("Got: "));
      Serial.println((char *)onoffbutton.lastread);
    }
  }

  // ping the server to keep the mqtt connection alive, only needed if we're not publishing
  //if(! mqtt.ping()) {
  //  Serial.println(F("MQTT Ping failed."));
  //}

}

// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
  }
  Serial.println("MQTT Connected!");
}

вот лог:

Adafruit FONA MQTT demo
Initializing FONA....(May take 3 seconds)
Attempting to open comm with ATs
	---> AT
	<--- AT
	---> AT
	<--- AT
	---> ATE0
	<--- ATE0
	---> ATE0
	<--- OK
	---> AT+CVHU=0
	<--- OK
	---> ATI
	<--- SIM800 R13.08

OK

	---> AT+GMM
	<--- SIMCOM_SIM800L

OK

	---> AT+CPMS="SM","SM","SM"
	<--- +CPMS: 8,10,8,10,8,10
FONA is OK
Checking for network...
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,2
	---> AT+CREG?
	<--- +CREG: 0,1
Disabling GPRS
	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+SAPBR=0,1
	<--- +CME ERROR: operation not allowed
Enabling GPRS
	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+CGATT=1
	<--- OK
	---> AT+SAPBR=3,1,"CONTYPE","GPRS"
	<--- OK
	---> AT+SAPBR=3,1,"APN","internet.tele2.ru"
	<--- OK
	---> AT+CSTT="internet.tele2.ru","",""
	<--- OK
	---> AT+SAPBR=3,1,"USER",""
	<--- OK
	---> AT+SAPBR=3,1,"PWD",""
	<--- OK
	---> AT+SAPBR=1,1
	<--- OK
	---> AT+CIICR
	<--- OK
Connected to Cellular!
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: IP GPRSACT
Connecting to MQTT... 	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+CIPMUX=0
	<--- OK
	---> AT+CIPRXGET=1
	<--- OK
AT+CIPSTART="TCP","m14.cloudmqtt.com","12147"
	<--- OK
	<--- CONNECT OK
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=35
 0x10 0x21 0x0 0x4 0x4D 0x51 0x54 0x54 0x4 0xFFFFFFC2 0x1 0x2C 0x0 0x0 0x0 0x8 0x70 0x61 0x73 0x68 0x61 0x34 0x31 0x33 0x0 0x9 0x61 0x6B 0x6D 0x53 0x37 0x38 0x34 0x39 0x32
	<--- > 
	<--- 
Connection failed
Retrying MQTT connection in 5 seconds...
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=2
 0xFFFFFFE0 0x0
	<--- > 
	<--- 
	---> AT+CIPCLOSE
	<--- CLOSE OK
	---> AT+CIPSHUT
	<--- SHUT OK
	---> AT+CIPMUX=0
	<--- OK
	---> AT+CIPRXGET=1
	<--- OK
AT+CIPSTART="TCP","m14.cloudmqtt.com","12147"
	<--- OK
	<--- CONNECT OK
	---> AT+CIPSTATUS
	<--- OK
	<--- STATE: CONNECT OK
AT+CIPSEND=35
 0x10 0x21 0x0 0x4 0x4D 0x51 0x54 0x54 0x4 0xFFFFFFC2 0x1 0x2C 0x0 0x0 0x0 0x8 0x70 0x61 0x73 0x68 0x61 0x34 0x31 0x33 0x0 0x9 0x61 0x6B 0x6D 0x53 0x37 0x38 0x34 0x39 0x32
	<--- > 
	<--- 
Connection failed

вроде работает, не виснет, но данные на cloudmqtt не приходят.

кучу всего перепробовал, никак не могу отправить...

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

spa-sam пишет:

По mqtt sim800L передаёт на www.cloudmqtt.com с удалённой теплицы, т.к. находится на расстоянии 1.5км. А уже с www.cloudmqtt.com  забираю на комп. В пределах 150 метров собираю с датчиков на nrf24l01+, где всё собирается на базовый приёмник и передаётся по com порту. Написал свою прогу на C#, где выводятся графики и показания датчиков, плюс сигнализация по привышению параметра и отсутствию 220В в сети на удалённой теплице. Этой же прогой передаются данные на "народный мониторинг" и Xively.  Так же сейчас доделываю, что эта прога будет передавать показания с датчиков принятых по nrf24l01+  по протоколу MQTT на  www.cloudmqtt.com. Это для того, чтобы можно было взять с собой прогу на флешке, запустить на любом компе и получать данные в любом месте.

Мое мнение:

Зачем возиться с проводами и какими то левыми сервисами? Раз уж имеется своя теплица, мне кажется проще поставить какой-то дешевый сервер, поставить Ubuntu, Установить Web сервер, Mosquitto.

Далее тянем в теплицу кабель с сетью, делаем глобальную сеть + WiFI роутер, далее покупаем ESP8266 цепляем на них все свои датчики, отправляем на свой сервер в локальной сети эти данные, если есть знания, пишем на PHP скриптик для мониторинга и отображения этих данных. Если нужнен удалееный монторинг, пробрасываем порт, берем статический IP у провайдера или на крайний случай, пользуемся бесплатным DDNS от NOIP. - Профит! В конце концов если у тебя пропадает интернет, данные никуда не пропадают, а хранятся на твоем сервере в локальной сети, но это опять же моё мнение:)

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

послушайте, Вадусик!

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

Вы уже во второй ветке выглядите клоуном со своими своевременными замечаниями...

spa-sam
Offline
Зарегистрирован: 14.12.2012

Все зависит от конкретных условий. Есть теплицы, где стоят возле дома, а есть где на отдалённых учасках и там нет интернета, поэтому гже можно  по wifi, а где нет, то там gsm. Плюс иногда перебои с элекричеством и т.д. Провода в теплицу лишний гемор, батареек на датчиках хватает на год минимум (данные раз в минуту передают), к тому же беспроводной датчик можно перенести куда угодно без лишних заморочек. А так, уже давно всё переделал. Сделал свои платы базовых ретрансляторов на esp32+ sim800c + rfm69hw(универсальность + с помощью wifi manager  можно поменять настройки без перепрошивки), есть вариант с LORA. Завязано по mqtt на самый простой виртуальный сервер от провайдера (надежность больше чем дома, но домашний вариант тоже реализован на Debian). На сервере mosquitto, node-red, BD, grafana. Данные можно смотреть как на приложении на телефоне, тк и на сайте, на приложении на компе. Перешел с nrf24 на rfm69 (дальность стала до 500 метров в прямой видимости на обычную проволчную антенну).

Бибилиотека для sim800 от adafruit  ведет себя иногда "неадекватно", иногда приходится добавлять костыли и вносить незначительные изменения, проблемы от версии к версии разного рода. Поэтому стал использовать tinygsm https://github.com/vshymanskyy/TinyGSM, там же неплохой пример по mqtt: https://github.com/vshymanskyy/TinyGSM/blob/master/examples/MqttClient/M...