Блок для GPRS модулей, связь по MQTT

Создаем свой блок. Вопросы, помощь знатоков.
sampl
Сержант
Сообщения: 199
Зарегистрирован: 31 мар 2017, 11:28
Откуда: Днепропетровск

Блок для GPRS модулей, связь по MQTT

Сообщение sampl »

starshoy81 писал(а): 05 дек 2022, 15:43 [ref]sampl[/ref], wemos не прошит
Та прошит( проэкт приложил но блин не могу до воевать(

Отправлено спустя 1 минуту 27 секунд:
Phazz писал(а): 05 дек 2022, 15:58 [ref]sampl[/ref], срабатывает защита от зависания. Вариантов этому много: нехватка памяти, слишком длинный цикл, деление на ноль )
А если можно дайте рабочий проэкт, попробую вашь, но вроде в своём (приложил его) все правельно. (( а то уже сил нет боротся
starshoy81
Лейтенант
Сообщения: 530
Зарегистрирован: 05 апр 2016, 23:30
Откуда: Санкт-Петербург
Имя: Илья

Блок для GPRS модулей, связь по MQTT

Сообщение starshoy81 »

[ref]sampl[/ref], в проекте не указан топик куда отправлять данные и проект сделан для нано
sampl
Сержант
Сообщения: 199
Зарегистрирован: 31 мар 2017, 11:28
Откуда: Днепропетровск

Блок для GPRS модулей, связь по MQTT

Сообщение sampl »

starshoy81 писал(а): 06 дек 2022, 16:42 [ref]sampl[/ref], в проекте не указан топик куда отправлять данные и проект сделан для нано
Ок спс попробую, но просто смущает то что нет даже попытки подключения к брокеру(((((

Отправлено спустя 2 часа 2 минуты 34 секунды:
подскажите еще, при компиляции пишет что нет библиотеки avrwdt.h, как ее установить, или можно просто вырезать ее я так понимаю она не очень нужна, подскажите как с ней быть
starshoy81
Лейтенант
Сообщения: 530
Зарегистрирован: 05 апр 2016, 23:30
Откуда: Санкт-Петербург
Имя: Илья

Блок для GPRS модулей, связь по MQTT

Сообщение starshoy81 »

[ref]sampl[/ref], у меня библиотеку не требует. Эта библиотека, видимо, тянется из зависимостей другой библиотеки. Прямой её вставки в коде нет. Можно игнорировать предупреждение.
Ещё надо объявлять тип модема перед вставкой библиотеки модема.
sampl
Сержант
Сообщения: 199
Зарегистрирован: 31 мар 2017, 11:28
Откуда: Днепропетровск

Блок для GPRS модулей, связь по MQTT

Сообщение sampl »

starshoy81 писал(а): 06 дек 2022, 20:57 [ref]sampl[/ref], у меня библиотеку не требует. Эта библиотека, видимо, тянется из зависимостей другой библиотеки. Прямой её вставки в коде нет. Можно игнорировать предупреждение.
Ещё надо объявлять тип модема перед вставкой библиотеки модема.
Незнаю у меня пишет нет библиотеки, и не могу найти, а если закоментить в коде?
Да я помню, я поднимал строку в начало с типом модэма.
А может есть какой то проверенный проект на wemos d1 mini или nodemcu v3, просто проверить свой модэм чтоб понимать что не так
starshoy81
Лейтенант
Сообщения: 530
Зарегистрирован: 05 апр 2016, 23:30
Откуда: Санкт-Петербург
Имя: Илья

Блок для GPRS модулей, связь по MQTT

Сообщение starshoy81 »

[ref]sampl[/ref], код из приложенного проекта. Закомментировать ненужное можно

Код: Выделить всё

#include <OneWire.h>
#include <SoftwareSerial.h>
#include <PubSubClient.h>
#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
byte _d18x2x1Addr[8]={0x28, 0x8A, 0x58, 0xEB, 0x5, 0x0, 0x0, 0x78};
OneWire  _ow6(6);

//#define SerialMon Serial
String MQTT_inputTopic;
String MQTT_inputtext;
SoftwareSerial SerialAT(5, 4);
const char apn[]  = "internet";
const char user[] = "";
const char pass[] = "";
const char* topicInit= "GsmClient/init";
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
PubSubClient mqtt(client);
long lastReconnectAttempt= 0;
bool En_75656550_1;
String msg_75656550_1;
String outTopic_75656550_1;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
float _tempVariable_float;
void setup()
{
    Serial.begin(115200);
    delay(10);
    SerialAT.begin(19200);
    delay(3000);
    Serial.println("Initializing modem...");
    modem.restart();
    // Unlock your SIM card with a PIN
      //modem.simUnlock("1234");
    Serial.print("Waiting for network...");
    if (!modem.waitForNetwork()) 
    {
        Serial.println(" fail");
        while (true);
    }
    Serial.println(" OK");
    Serial.print("Connecting to ");
    Serial.print(apn);
    if (!modem.gprsConnect(apn, user, pass)) 
    {
        Serial.println(" fail");
        while (true);
    }
    Serial.println(" OK");
    // MQTT Broker setup
      mqtt.setServer("m16.cloudmqtt.com", 10816);
    mqtt.setCallback(mqttCallback);
}
void loop()
{
    //Плата:1
    if (mqtt.connected()) 
    {
        mqtt.loop();
    }
    else 
    {
        // Reconnect every 10 seconds
            unsigned long t = millis();
        if (t - lastReconnectAttempt > 10000L) 
        {
            lastReconnectAttempt = t;
        }
        if (mqttConnect()) 
        {
            lastReconnectAttempt = 0;
        }
        else if (!modem.gprsConnect(apn, user, pass)) 
        {
            while (true);
        }
    }
    if (1) 
    {
         if (! _gen1I) 
        {
            _gen1I = 1;
            _gen1O = 1;
            _gen1P = millis();
        }
    }
     else 
    {
        _gen1I = 0 ;
        _gen1O= 0;
    }
    if (_gen1I) 
    {
          if (_isTimer (_gen1P , 180000)) 
        {
             _gen1P = millis();
            _gen1O = ! _gen1O;
        }
    }
    if (_gen1O) 
    {
         if (_trgrt1I) 
        {
             _trgrt1 = 0;
        }
         else 
        {
            _trgrt1 = 1;
            _trgrt1I = 1;
        }
    }
     else 
    {
        _trgrt1 = 0;
        _trgrt1I = 0;
    }
    ;
    if(_isTimer(_d18x2x1Tti, 360000)) 
    {
        _d18x2x1Tti = millis();
        _tempVariable_float =  _readDS18_ow6(_d18x2x1Addr, 0);
        if (_tempVariable_float < 500) 
        {
            _d18x2x1O = _tempVariable_float;
        }
    }
    En_75656550_1 = _trgrt1;
    msg_75656550_1 = (_floatToStringWitRaz((_d18x2x1O),2));
    outTopic_75656550_1 = String("drev");
    if (En_75656550_1 == 1) 
    {
        mqtt.publish((char*) outTopic_75656550_1.c_str(), (char*) msg_75656550_1.c_str());
    }
}
String  _floatToStringWitRaz(float value, int raz)
{
    return String(value,raz);
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
    unsigned long currentTime;
    currentTime = millis();
    if (currentTime>= startTime) 
    {
        return (currentTime>=(startTime + period));
    }
     else 
    {
        return (currentTime >=(4294967295-startTime+period));
    }
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
    int16_t raw = (data[1] << 8) | data[0];
    if (type_s)
    {
        raw = raw << 3;
        if (data[7] == 0x10) 
        {
             raw = (raw & 0xFFF0) + 12 - data[6];
        }
    }
    else
    {
        byte cfg = (data[4] & 0x60);
        if (cfg == 0x00)raw = raw & ~7;
        else if(cfg == 0x20)raw = raw & ~3;
        else if(cfg == 0x40) raw = raw & ~1;
    }
    return  (float)raw / 16.0;
}
float _readDS18_ow6(byte addr[8], byte type_s)
{
    byte data[12];
    byte i;
    _ow6.reset();
    _ow6.select(addr);
    _ow6.write(0xBE);
    for (i = 0; i < 9; i++) 
    {
         data[i] = _ow6.read();
    }
    _ow6.reset();
    _ow6.select(addr);
    _ow6.write(0x44);
    if (_ow6.crc8(data, 8) != data[8])
    {
        return 501;
    }
    return _convertDS18x2xData(type_s, data);
}
boolean mqttConnect()
{
    Serial.print("Connecting to ");
    Serial.print("m16.cloudmqtt.com");
    if (!mqtt.connect("", "bzcnhecm", "8jdgYxHld-tu")) 
    {
        Serial.println(" fail");
        return false;
    }
    Serial.println(" OK");
    mqtt.publish(topicInit, "GsmClient started");
    mqtt.subscribe("#");
    return mqtt.connected();
}
void mqttCallback(char* topic, byte* payload, unsigned int len)
{
    MQTT_inputtext = "";
    MQTT_inputTopic = "";
    MQTT_inputTopic = topic;
    for (int i=0; i<len; i++) 
    {
        MQTT_inputtext += (char)payload[i];
    }
}
sampl
Сержант
Сообщения: 199
Зарегистрирован: 31 мар 2017, 11:28
Откуда: Днепропетровск

Блок для GPRS модулей, связь по MQTT

Сообщение sampl »

starshoy81 писал(а): 06 дек 2022, 22:26 [ref]sampl[/ref], код из приложенного проекта. Закомментировать ненужное можно

Код: Выделить всё

#include <OneWire.h>
#include <SoftwareSerial.h>
#include <PubSubClient.h>
#define TINY_GSM_MODEM_SIM800
#include <TinyGsmClient.h>
byte _d18x2x1Addr[8]={0x28, 0x8A, 0x58, 0xEB, 0x5, 0x0, 0x0, 0x78};
OneWire  _ow6(6);

//#define SerialMon Serial
String MQTT_inputTopic;
String MQTT_inputtext;
SoftwareSerial SerialAT(5, 4);
const char apn[]  = "internet";
const char user[] = "";
const char pass[] = "";
const char* topicInit= "GsmClient/init";
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
PubSubClient mqtt(client);
long lastReconnectAttempt= 0;
bool En_75656550_1;
String msg_75656550_1;
String outTopic_75656550_1;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
float _tempVariable_float;
void setup()
{
    Serial.begin(115200);
    delay(10);
    SerialAT.begin(19200);
    delay(3000);
    Serial.println("Initializing modem...");
    modem.restart();
    // Unlock your SIM card with a PIN
      //modem.simUnlock("1234");
    Serial.print("Waiting for network...");
    if (!modem.waitForNetwork()) 
    {
        Serial.println(" fail");
        while (true);
    }
    Serial.println(" OK");
    Serial.print("Connecting to ");
    Serial.print(apn);
    if (!modem.gprsConnect(apn, user, pass)) 
    {
        Serial.println(" fail");
        while (true);
    }
    Serial.println(" OK");
    // MQTT Broker setup
      mqtt.setServer("m16.cloudmqtt.com", 10816);
    mqtt.setCallback(mqttCallback);
}
void loop()
{
    //Плата:1
    if (mqtt.connected()) 
    {
        mqtt.loop();
    }
    else 
    {
        // Reconnect every 10 seconds
            unsigned long t = millis();
        if (t - lastReconnectAttempt > 10000L) 
        {
            lastReconnectAttempt = t;
        }
        if (mqttConnect()) 
        {
            lastReconnectAttempt = 0;
        }
        else if (!modem.gprsConnect(apn, user, pass)) 
        {
            while (true);
        }
    }
    if (1) 
    {
         if (! _gen1I) 
        {
            _gen1I = 1;
            _gen1O = 1;
            _gen1P = millis();
        }
    }
     else 
    {
        _gen1I = 0 ;
        _gen1O= 0;
    }
    if (_gen1I) 
    {
          if (_isTimer (_gen1P , 180000)) 
        {
             _gen1P = millis();
            _gen1O = ! _gen1O;
        }
    }
    if (_gen1O) 
    {
         if (_trgrt1I) 
        {
             _trgrt1 = 0;
        }
         else 
        {
            _trgrt1 = 1;
            _trgrt1I = 1;
        }
    }
     else 
    {
        _trgrt1 = 0;
        _trgrt1I = 0;
    }
    ;
    if(_isTimer(_d18x2x1Tti, 360000)) 
    {
        _d18x2x1Tti = millis();
        _tempVariable_float =  _readDS18_ow6(_d18x2x1Addr, 0);
        if (_tempVariable_float < 500) 
        {
            _d18x2x1O = _tempVariable_float;
        }
    }
    En_75656550_1 = _trgrt1;
    msg_75656550_1 = (_floatToStringWitRaz((_d18x2x1O),2));
    outTopic_75656550_1 = String("drev");
    if (En_75656550_1 == 1) 
    {
        mqtt.publish((char*) outTopic_75656550_1.c_str(), (char*) msg_75656550_1.c_str());
    }
}
String  _floatToStringWitRaz(float value, int raz)
{
    return String(value,raz);
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
    unsigned long currentTime;
    currentTime = millis();
    if (currentTime>= startTime) 
    {
        return (currentTime>=(startTime + period));
    }
     else 
    {
        return (currentTime >=(4294967295-startTime+period));
    }
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
    int16_t raw = (data[1] << 8) | data[0];
    if (type_s)
    {
        raw = raw << 3;
        if (data[7] == 0x10) 
        {
             raw = (raw & 0xFFF0) + 12 - data[6];
        }
    }
    else
    {
        byte cfg = (data[4] & 0x60);
        if (cfg == 0x00)raw = raw & ~7;
        else if(cfg == 0x20)raw = raw & ~3;
        else if(cfg == 0x40) raw = raw & ~1;
    }
    return  (float)raw / 16.0;
}
float _readDS18_ow6(byte addr[8], byte type_s)
{
    byte data[12];
    byte i;
    _ow6.reset();
    _ow6.select(addr);
    _ow6.write(0xBE);
    for (i = 0; i < 9; i++) 
    {
         data[i] = _ow6.read();
    }
    _ow6.reset();
    _ow6.select(addr);
    _ow6.write(0x44);
    if (_ow6.crc8(data, 8) != data[8])
    {
        return 501;
    }
    return _convertDS18x2xData(type_s, data);
}
boolean mqttConnect()
{
    Serial.print("Connecting to ");
    Serial.print("m16.cloudmqtt.com");
    if (!mqtt.connect("", "bzcnhecm", "8jdgYxHld-tu")) 
    {
        Serial.println(" fail");
        return false;
    }
    Serial.println(" OK");
    mqtt.publish(topicInit, "GsmClient started");
    mqtt.subscribe("#");
    return mqtt.connected();
}
void mqttCallback(char* topic, byte* payload, unsigned int len)
{
    MQTT_inputtext = "";
    MQTT_inputTopic = "";
    MQTT_inputTopic = topic;
    for (int i=0; i<len; i++) 
    {
        MQTT_inputtext += (char)payload[i];
    }
}
Спс утром попробую, а то модуль остался на работе(
sampl
Сержант
Сообщения: 199
Зарегистрирован: 31 мар 2017, 11:28
Откуда: Днепропетровск

Блок для GPRS модулей, связь по MQTT

Сообщение sampl »

:( залил скеч но теперь новая беда ((
в мониторе ком порта
Initializing modem...
Waiting for network... fail


я так понимаю что он не может инеацелезировать модем (
Хотя карта с интернетом АПН правельный (( что может быть еще за беда(?
:smile225: Решено, проблема была что модуль не хотел мннять скорость на 19200 остался на 9600, поменял скорость в скече и запустился.
Всем спасибо ребята за нервную систему ))
kostetalt
Рядовой
Сообщения: 1
Зарегистрирован: 10 янв 2023, 04:31
Имя: константин

Блок для GPRS модулей, связь по MQTT

Сообщение kostetalt »

здравствуйте.простите за глупый вопрос. так можно блоки соединять?
Снимок.JPG
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Phazz
Полковник
Сообщения: 3120
Зарегистрирован: 17 окт 2016, 15:38
Откуда: Сургут
Имя: Анатолий
Благодарил (а): 232 раза
Поблагодарили: 112 раз

Блок для GPRS модулей, связь по MQTT

Сообщение Phazz »

[ref]kostetalt[/ref], всегда так можно было )
tornado
Рядовой
Сообщения: 33
Зарегистрирован: 14 апр 2020, 21:17
Имя: Ivan
Благодарил (а): 1 раз

Блок для GPRS модулей, связь по MQTT

Сообщение tornado »

rw9,
не могли бы вы добавить в блок MQTT_client функции "willTopic,willMessageOnline,willMessageOffline",а параметры: Broker,Port,mqttUser,mqttPass становятся входными, чтобы их можно было вводить из WEB-интерфейса?

Выход GSM_OK не работает!
Artem5000
Рядовой
Сообщения: 1
Зарегистрирован: 17 окт 2021, 15:58
Имя: Артем

Блок для GPRS модулей, связь по MQTT

Сообщение Artem5000 »

доброго времени суток! Поделитесь пожалуйста библиотекой bit_list.h или подскажите где ее взять
AstroGraf
Рядовой
Сообщения: 93
Зарегистрирован: 21 авг 2018, 19:05
Откуда: Калининград
Имя: Алексей
Благодарил (а): 1 раз
Поблагодарили: 2 раза

Re: Блок для GPRS модулей, связь по MQTT

Сообщение AstroGraf »

в мониторе ком порта
Initializing modem...
Waiting for network... fail

Аналогичная проблема. Все перепробовал, менял симку, снижал скорость до 9600, понизил версию библиотеки до 0.7.9. Как мне показалось новая версия сильно библиотеки изменилась.
Есть еще варианты?
alfred
Рядовой
Сообщения: 2
Зарегистрирован: 10 окт 2024, 21:08
Имя: альфред

Re: Блок для GPRS модулей, связь по MQTT

Сообщение alfred »

rw9 писал(а): 01 фев 2022, 21:52 Как обещал выкладываю блоки для wi fi и GPRS. Работают и с ЕСП32 и с Ардуино Мега( у УНО или Нано маловато памяти).. В ESP32_Test_.7z и Test release_m.7z это примеры.. Можно в случае пропадания одного канала связи с помощью логики автоматом переходить на другой канал...с Wi Fi на Gprs. Работают стабильно,зависаний не обнаружено, НО! надо правильно их расставлять, т.е. соблюдать порядок! Иначе Фл прог начинает путать скетч, особенно важно первыми выставлять блок Streams, потом Провайдер и после Клиента! Streams прописывает порт, поэтому он нужен только для СИМ800. ИЗ-за нехватки времени мой товарищ не смог... пока... сделать описание блоков... В примерах ESP32_Test_ проект метеостанции - Улица, дом, атм. давление и котёл отопления с установкой верх порога температуры при достижение которого отправляется уведомление каждые 2 мин. Датчик дыма при сработке тоже отправляется уведомление на тел. каждые 2 мин.. Test release_m блоки Wi Fi и Gprs работают по очереди каждые 2 мин.. Пользуюсь приложением Mqtt Push Client, в нём есть пуш-уведомления. Блок Wi Fi Diag - это показатель уровня сигнала.Всё работает стабильно.. Да, ещё забыл.. во вложениях есть библиотека st_timers.zip, она используется в блоках и возможно её придётся установить если IDE попросит.
здравствуйте, создаю проект с этими блоками, все прошивается но по ком порту видно что не нет подключения к gprs, после долгих мучений пришел к тому что в иде добавляю код в начале:#define SerialAT Serial2
#define RX_PIN 16
#define TX_PIN 17 потом. потом в сетапе SerialAT.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
delay(3000); . и вот здесь прописать id где "Test_client" mqtt_reconnected = mqttConnect( &mqtt_264134246, "Test_client", и после этого только запускается все но периодический теряет связь с брокером , не подскажете в чем может быть проблема?
Ответить

Вернуться в «Разработка пользовательских блоков»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя