GSM устройство управления котлами Webasto и не только

vgk_com
Offline
Зарегистрирован: 02.03.2017

Да я обе пробовал и 3.66 возвращал на телефон 12 цифр. 

vgk_com
Offline
Зарегистрирован: 02.03.2017

Вроде бы разобрался, СМС отправляет если перезапустить СИМ800. Что удивительно, он их только принимает, а после перезагрузки и отправляет. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Да я давно еще об этом глюке писал ,  снимешь аккумулятор для подзарядки и после его установки смс больше не отправляет, только принимает, но если просто передернуть штекер питания , то все приходит в норму , и еще если деньги на счете кончились, то тоже перегружать вручную нужно. Я так и не понял что это за глюк,но он есть.Я думаю нужно в скейтч добавить смс команду на перезагрузку модема или всего устройства.

MaksVV
Offline
Зарегистрирован: 06.08.2015

можно после старта МК (перезапуск питания) через некоторое время делать рестарт сим800. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

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

vgk_com
Offline
Зарегистрирован: 02.03.2017

Я вчера немного экспериментировал с прошивкой и упростил немного код инициализации модема, не знаю почему, но ответные смс  стали нормально приходить даже без перезагрузки. Может просто тоже какой глюк ))). Код взял с программы которая давно хорошо работает. Замерял потребление тока  флюком в спячке показал 0,005А. 

    digitalWrite (DTR, LOW);      // выводим из спячки GSM модуль
    delay (150);
    SIM800.print("AT+CMGF=1\r");
    delay(300);
    SIM800.print("AT+IFC=1, 1\r");
    delay(300);
    SIM800.print("AT+CPBS=\"SM\"\r");
    delay(300);
    SIM800.print("AT+CNMI=3,2,2,1,0\r");
    delay(500);
    digitalWrite (DTR, HIGH); 

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

vgk_com
Offline
Зарегистрирован: 02.03.2017

Я тут еще почитал мануалы про СИМ800, у него обмен по уарту должен быть в диапазоне 2.1 - 3.1 вольта. Получается, что с СИМ800 идет по tx на ардуинку нормальное напряжение и прием смс происходит хорошо, а с ардуинки по tx идет 5В, это завышенное и получаются глюки СИМ800.  По схеме у нас просто установлено на tx и rx сопротивление по 1 ком. Мне кажется нужно попробовать на tx c ардуинки на СИМ800 поставить делитель, а с  tx СИМ800 на ардуинку  вообще убрать.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

По схеме есть делитель на линии tx от ардуины , присмотрись повнимательнее.

vgk_com
Offline
Зарегистрирован: 02.03.2017

Согласен, не заметил. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Скорее всего прием смс работает , а отправка нет - по причине , что сим800 не выводится из сна. т.к. даже во сне смски будут приниматься. Но ни на какие команды прр этом сим800 реагировать не будет, поэтому и смс не отправятся. Короче внимательнее нужно смотреть в скетче про пин DTR. У меня пока времени нет, работа.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Dushman7776 пишет:
ответ же о том что смс получена приходит , значит  модем принял смску и по идее должен был ее передать на ардуино , может это все таки дело в самой ардуино , она не не принимает от модема смс . В чем все таки дело?

А какую смс ты отправляешь? В момент глюка отправь команду на включение котла и смотри. Если включился, значит до ардуино все доходит норм. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

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

vgk_com
Offline
Зарегистрирован: 02.03.2017

MaksVV пишет:

Dushman7776 пишет:
ответ же о том что смс получена приходит , значит  модем принял смску и по идее должен был ее передать на ардуино , может это все таки дело в самой ардуино , она не не принимает от модема смс . В чем все таки дело?

А какую смс ты отправляешь? В момент глюка отправь команду на включение котла и смотри. Если включился, значит до ардуино все доходит норм. 

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

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Получается что можем криво начинает работать после подачи питания и его надо два сбрасывать.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Может когда планеты в ряд сойдутся и я , наконец, сделаю мкютт там будет по другому происходить инит модема и , надеюсь, проблема станет неактуальна. Инит будет в диалоге, а не просто дали команду, подождали 300мс, следующую команду. Такой подход без диалога это вата, т.к. модем иногда с бОльшими задержками реагирует. И следующую команду через 300мс может проигнорировать

vgk_com
Offline
Зарегистрирован: 02.03.2017

MaksVV пишет:
Может когда планеты в ряд сойдутся и я , наконец, сделаю мкютт там будет по другому происходить инит модема и , надеюсь, проблема станет неактуальна. Инит будет в диалоге, а не просто дали команду, подождали 300мс, следующую команду. Такой подход без диалога это вата, т.к. модем иногда с бОльшими задержками реагирует. И следующую команду через 300мс может проигнорировать

На этом сайте хорошо расписан код как посылать команды в СИМ800 с получением ответов от него.

MaksVV
Offline
Зарегистрирован: 06.08.2015

я давно как то смотрел то, что по ссылке. Мало того, что у автора там такой подход: 

"Более корректным является подход, при котором МК остановит исполнение программы до тех пор, пока не будет получен ответ на отправленную команду. "
 
Дак ещё он и Стринги направо и налево использует и не дай бог придёт рекламная смс ка от оператора , МК повиснет в конвульсиях от заполнения ОЗУ.  Да,  у меня тоже будет Стринг, но не так чтобы между функциями им кидаться создавая копии и т.д. 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

MaksVV пишет:

Да,  у меня тоже будет Стринг, но не так чтобы между функциями им кидаться создавая копии и т.д. 

Носи лучше обычные, ситцевые char * в горошек. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

опыта не хватит боюсь, пока так

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну, значить, пока будешь красивый ходить.  Со String-ами. :) 

MaksVV
Offline
Зарегистрирован: 06.08.2015

ага, пока сишные строки не изучу

seowayder
Offline
Зарегистрирован: 01.10.2019

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

тестовый скетч с чисто MQTT в принципе есть. Но очень трудно его интегрировать в основной скетч. И также этот тестовый скетч нужно дополнить ещё программными блоками на внештатные ситуации. Например, на предмет заезжания автомобиля в зону, где сеть gsm отсутствует, или MQTT сервер не отвечает, или деньги на симке кончились.  Если таковые вещи случатся скетч вообще неадекватно будет работать, постоянно перезагружая модем и к тому же жря аккумулятор автомобиля. Пока вечерами балуюсь. Чё лукавить, тяжела такая задача для дилетанта. 

Ладно хоть железо вроде отладил на предмет того, что происходила непредвиденная перезагрузка ардуины в момент намеренной перезагрузки модема при помощи реле. Короче развязка диодами питания модема и ардуины + установка конденсаторов помогла на 100%. Тестировал в разных режимах рестарт СИМ800 - всё гуд, ардуина в этот момент стабильна. 

vgk_com
Offline
Зарегистрирован: 02.03.2017

Отличные новости, да работа большая интегрировать скетч, когда все знаешь, а для нас дилетантов не подъемная. У меня с основной работой времени вообще нет. Да я и не дилетант, а начинающий чайник. Ищу у кого бы код посмотреть ))).  Терпения Вам и удачи.

MaksVV
Offline
Зарегистрирован: 06.08.2015

пока рекомендую освоить MQTT. Инструкция в картинках. Далее в собранную плату нужно залить такой скетч, задав вверху настройки MQTT сервера

//---------------------------Настройки MQTT

#define ACCESSPOINT  "\"internet.mts.by\"" // точка доступа оператора связи симкарты
#define PROTOCOLIUS  "MQIsdp"              // это и оставляем
#define MQTTNAME     "M    V"              // это смотрим на сервере MQTT
#define MQTTUSER     "iu   bw"             // это смотрим на сервере MQTT
#define MQTTPASSWORD "1QH      W"          // это смотрим на сервере MQTT
#define SERVERNAME_PORT   "\"m16.cloudmqtt.com\", \"15235\""       // это смотрим на сервере MQTT
#define TIMEBROKER   80   // продолжительность сессии с брокером , мин (пока такое и оставляем)

//----------------------------------------------




#define debugator

#include <SoftwareSerial.h>
SoftwareSerial SIM800(10, 11); // RX, TX

String currStr = "";
byte isStringMessage = 0;

byte TimeWebasto = 20;
int16_t Refresh_time = 1200; //сек 
uint32_t currmillis = 0;
uint32_t prev_refreshMQTT = 0;


uint32_t timerStart_W_BUS = 0; bool timerenabledStart_W_BUS = false;
#define TIMEREXPIRED_Start_W_BUS (currmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL

#define OutWebasto_12V      2  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Dallas_pin          3  // пин шины OneWire для датчиков даллас
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define IGN                 8  // Сюда состояние зажигания
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define ResetGSM           12  // пин ресета GSM подключен к реле, разрывающее питание модуля. 
#define Eng                14  // (А0) Сюда состояние работы ДВС
#define StatusWebastoLED   15  // (А1) пин LED  индикация включенности котла
#define StartButtonpin     16  // (А2) пин тактовой кнопки вкл/выкл котла 
#define DTR                17  // пин (А3), управляющий энергосберегающим режимом GSM модуля
#define StartEng           18  // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define OutWebasto_GndImp  19  // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).  
#define Voltmeter_pin      A7  // пин, которым измеряем напряжение питания
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        1; // логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
#define GSM_RX             10  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             11  // пин софт TX Arduino для соединения с RX модуля SIM800




uint32_t prevGSMnastr = 0;
uint32_t interval_doprosGSM = 123000UL; 
uint16_t delayATcommand = 5000;
byte fails = 0;
byte failresets = 0;

bool settingGSM = 1;

enum gsmstatus_  {WaitGSM, echoOFF, EnergySave, Head, setText, setProgctrl, closeIncoming, newMessage, delSMS, setGPRS, setAccPoint,
                  setGPRSconnect, setBrokerconnect, setAuthPack, setSubPack, setPubPack
                 };

byte gsmstatus = WaitGSM;


enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp}; // перечисление нужных температур (в конце размер массива температур)

// ниже соответствие адресов датчиков различным температурам
byte DS18B20 [size_arrayTemp][10] = {
  {0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC,  93},
  {0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC,  89},
  {0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC,   -3},
  {0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC,   +2}
};

int8_t HeaterC = -100;

bool webasto = 0;             // флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool last_webasto = 0;
bool startWebasto_OK = 1;     // флаг успешного запуска котла
bool report = false;          // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;    // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool engine = 0;              // флаг работает ли ДВС или нет
bool ignition = 0;            // флаг включено ли зажигание или нет
bool ohrana = 0;              // флаг включена ли охрана или нет
bool trevoga = 0;             // флаг включена ли тревога или нет
bool alarmSMS = 0;            // флаг отправлена ли смс о тревоге или нет

bool waterpump = 0;           // флаг работы циркуляционного насоса
bool plug      = 0;           // флаг работы штифта накаливания
bool airfan    = 0;           // флаг работы нагнетателя воздуха
bool fuelpump  = 0;           // флаг работы топливного насоса
bool blowerfan = 0;           // флаг работы вентилятора печки автомобиля
byte DTC[7] = {0};            // коды неисправностей котла


void setup() {
  delay (4000);
#ifdef debugator
  Serial.begin(19200);
#endif

  SIM800.begin(19200);
  pinMode(13, OUTPUT);
  pinMode(DTR, OUTPUT);
  digitalWrite (DTR, LOW);
  fails = 3;

}



void loop() 
{
  digitalWrite (13, webasto);
  
  currmillis = millis();
  if   (settingGSM) NastroykaGSM ();
  else if (fails >= 3) settingGSM = 1;

//если MQTT активен 
  if (failresets < 5) 
    {     
    if (last_webasto != webasto ){ MQTTsendDatastream();}
    refreshDataMQTT (); 
    }
if (!webasto)
    {
      static uint32_t prevTestModem = 0;
      if (!settingGSM && currmillis - prevTestModem > interval_doprosGSM)
      {
         digitalWrite (DTR, LOW);
         delay (150);
         SIM800.println (F("AT"));
         prevTestModem = currmillis;
         fails++;
         interval_doprosGSM = 10000;
      }
    
    }  

  readSMS();

  if (timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) // если время работы котла истекло
    {
    timerenabledStart_W_BUS = 0;
    webasto = 0; Refresh_time = 1200;
    }

}// end loop


void Reset() {

static bool resettimer = 0;             // для таймера удерживания реле в режиме сброс питания
static uint32_t  resetTimer = 0;        // для таймера удерживания реле в режиме сброс питания
  
  if (!resettimer) {
    digitalWrite (ResetGSM, RelayON);
    resettimer = 1;
    resetTimer = currmillis;
  }
  else if (currmillis - resetTimer > 5000 ) {
    resettimer = 0;

    digitalWrite (ResetGSM, !RelayON);
    digitalWrite (DTR, LOW);
    delay (150);

    prevGSMnastr = currmillis;
    delayATcommand = 150;
    fails = 0;
    failresets ++; if (failresets > 4) failresets = 5;
    gsmstatus = WaitGSM;
    settingGSM = 1;
    interval_doprosGSM = 123000UL;
  }
}








void NastroykaGSM () {

  if (fails >= 3) Reset();

  else if (currmillis - prevGSMnastr > delayATcommand)
  {

    fails ++;

    if (gsmstatus == WaitGSM)               SIM800.println (F("AT"));
    else if (gsmstatus == EnergySave)       SIM800.println (F("AT+CSCLK=1"));
    else if (gsmstatus == Head)             SIM800.println (F("AT+CIPHEAD=1"));
    else if (gsmstatus == echoOFF)          SIM800.println (F("AT"));  //SIM800.println (F("ATE0"));
    else if (gsmstatus == setText)          SIM800.println (F("AT+CMGF=1"));
    else if (gsmstatus == setProgctrl)      SIM800.println (F("AT+IFC=0, 0"));
    else if (gsmstatus == closeIncoming)    SIM800.println (F("AT+GSMBUSY=1"));
    else if (gsmstatus == newMessage)       SIM800.println (F("AT+CNMI=1,2,2,1,0"));
    else if (gsmstatus == delSMS)           SIM800.println (F("AT+CMGDA=\"DEL ALL\""));

    else if (gsmstatus == setGPRS)          SIM800.println (F("AT+SAPBR=3,1, \"Contype\",\"GPRS\""));
    else if (gsmstatus == setAccPoint)      SIM800.print (F("AT+SAPBR=3,1, \"APN\",")), SIM800.println (F(ACCESSPOINT));
    else if (gsmstatus == setGPRSconnect)   SIM800.println (F("AT+SAPBR=1,1"));
    else if (gsmstatus == setBrokerconnect) SIM800.print (F("AT+CIPSTART=\"TCP\",")),  SIM800.println (F(SERVERNAME_PORT));
    else if (gsmstatus == setAuthPack)      AUTHsend ();
    else if (gsmstatus == setSubPack)       SUBsend("h/#");
    else if (gsmstatus == setPubPack)       MQTTsendDatastream();
    delayATcommand = 5000;
    prevGSMnastr = currmillis;
  }
}


void readSMS() //--------------Цикл чтения входящих СМС-сообщений--------------
{
  static uint32_t timerMQTTreconnect = 0;
  static bool TimerMQTTreconnect = 0;

// если было неудачное подключение к MQTT, ждём час и снова пробуем
if (TimerMQTTreconnect && currmillis - timerMQTTreconnect > 3600000UL) 
    {
      TimerMQTTreconnect = 0; 
      fails = 3;
      settingGSM = 1;
    }

  
  if (!SIM800.available()) return;

  char currSymb = SIM800.read();

#ifdef debugator
  if (currSymb != '&' && currSymb != '$') Serial.write(currSymb);
  else if (currSymb == '&') Serial.println();
#endif





  if ('\r' == currSymb || '&' == currSymb)
  {
    if (isStringMessage != 0 && isStringMessage != 3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
    {
      
//----------------------------смс-ки, принятые от юзера
  
      if  (!currStr.compareTo(F("ON")))    {
          timerenabledStart_W_BUS = 1;
          timerStart_W_BUS = currmillis;
          webasto = 1; Refresh_time = 60;
                                           }
        
      else if (!currStr.compareTo(F("OFF")))    {webasto = 0; Refresh_time = 1200; timerenabledStart_W_BUS = 0; }
      else if (!currStr.compareTo(F("Balance")))    {};
      isStringMessage = 0;
    }

//--------------------принятие служебных сообщений от модема (настройка соединения)

    else if (isStringMessage == 0) {

      if (currStr.startsWith(F("+CMT: \"")))  isStringMessage = 1;

      if (currStr.indexOf(F("CLOSED")) > -1 || currStr.indexOf(F("ERROR")) > -1)  {
        fails = 3;
        settingGSM = 1;
      }
      if (currStr.indexOf(F("OK")) > -1) {
        if (!settingGSM){ if (failresets > 4 || (failresets <= 4 && gsmstatus >= setPubPack)) {fails = 0; digitalWrite (DTR, HIGH); interval_doprosGSM = 123000UL;}}
        if (settingGSM && gsmstatus > WaitGSM && gsmstatus < setBrokerconnect) {
             // если подключиться к MQTT серверу не удалось, оставляем настройки только для СМС
             // и запускаем таймер на час, чтобы через час ещё раз пробовать:
             if (gsmstatus == delSMS && failresets > 4) 
                  {settingGSM = 0; 
                   digitalWrite (DTR, HIGH);
                   timerMQTTreconnect = currmillis;
                   TimerMQTTreconnect = 1;
                   }  
             gsmstatus++; if (gsmstatus>16)gsmstatus=16;
             fails = 0;
             delayATcommand = 400;
                                                                                }
      }
      if (currStr.indexOf(F("CONNECT")) > -1) if (gsmstatus == setBrokerconnect) {
          gsmstatus++; if (gsmstatus>16)gsmstatus=16;
          fails = 0;
          delayATcommand = 300;
        }
      if (currStr.indexOf(F("SMS Ready")) > -1) if (gsmstatus == WaitGSM) {
          gsmstatus++; if (gsmstatus>16)gsmstatus=16;
          fails = 0;
          delayATcommand = 300;
        }
      if (currStr.indexOf(F("SEND OK")) > -1) {
        fails = 0;
        if (settingGSM && gsmstatus >= setAuthPack && gsmstatus <= setPubPack) {
          if (gsmstatus == setPubPack) {
            settingGSM = 0;
            failresets = 0;
          } delayATcommand = 300;
          gsmstatus++; if (gsmstatus>16)gsmstatus=16;
        }
      }


//-------------------------топики MQTT, принимаемые от брокера
     
      if (currStr.indexOf(F("h/ctrl")) > -1) {
        webasto = currStr.substring(currStr.indexOf(F("h/ctrl")) + 6).toInt();
        if (webasto) {
          timerenabledStart_W_BUS = 1;
          timerStart_W_BUS = currmillis; Refresh_time = 60;
        } else {timerenabledStart_W_BUS = 0; Refresh_time = 1200;}
      }
      if (currStr.indexOf(F("h/time/ctrl")) > -1) {
        String TimeW = currStr.substring(currStr.indexOf(F("h/time/ctrl")) + 11);
        TimeWebasto = TimeW.toInt();
        PUBsend("h/time/stat",  TimeW, 0);
        remTime(0) ;
      }
      if (currStr.indexOf(F("h/refr0")) > -1)  MQTTsendDatastream();

//-----------------------------------------
      
      
      
      if (currStr.startsWith(F("+CUSD: 0,"))) {}  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
      

      else if (currStr.startsWith(F("+CSQ:"))) {} //если текущая строка начинается с "+CSQ",то значит был запрос на уровень сигнала GSM, отправим ответ запрашивающему
      

    }

    currStr = "";
  }

  else if ('\n' != currSymb && '$' != currSymb)  {
    currStr += String(currSymb);
  }
  if (currStr.length() > 100) currStr = "";
}




void AUTHsend () {
  cipsend_begin ();
 const char Prot[]         = PROTOCOLIUS;  
 const char MQTTname[]     = MQTTNAME;     
 const char MQTTuser[]     = MQTTUSER;      
 const char MQTTpassword[] = MQTTPASSWORD; 
 uint16_t timeBroker       = TIMEBROKER;    // продолжительность сессии с брокером , мин 
  
  SIM800.write (0x10);
  SIM800.write (strlen(Prot) + strlen(MQTTname) + strlen(MQTTuser) +  strlen(MQTTpassword) + 12);
  SIM800.write ((byte)0);
  SIM800.write (strlen(Prot));
  SIM800.write (Prot);
  SIM800.write (0x03);
  SIM800.write (0xC2);
  
  timeBroker *=60;
  byte * timeBr = (byte*)&timeBroker;
  SIM800.write(*(timeBr+=1)); // время сеанса связи с брокером, сек (ст. байт)
  SIM800.write(*(--timeBr));  // время сеанса связи с брокером, сек (мл. байт)

//SIM800.write (0x04);    // время сеанса связи с брокером, сек (ст. байт)
//SIM800.write (0xB0);    // время сеанса связи с брокером, сек (мл. байт)

  SIM800.write ((byte)0);
  SIM800.write (strlen(MQTTname));
  SIM800.write (MQTTname);
  SIM800.write ((byte)0);
  SIM800.write (strlen(MQTTuser));
  SIM800.write (MQTTuser);
  SIM800.write ((byte)0);
  SIM800.write (strlen(MQTTpassword));
  SIM800.write (MQTTpassword);
  SIM800.write (0x1A);
}


void PUBsend  (char topPub[30], const String Command, const bool &multidata) {

  if (!multidata) {cipsend_begin ();}
  SIM800.write (0x30);
  SIM800.write (strlen (topPub) + Command.length() + 2);
  SIM800.write ((byte)0x00);
  SIM800.write (strlen (topPub));
  SIM800.write (topPub);
  for (byte i = 0; i < Command.length(); i++) SIM800.write (Command[i]);
  if (!multidata) {SIM800.write(0x1A);  digitalWrite (DTR, HIGH);}
}


void SUBsend (char topSub[20]) {
  cipsend_begin ();
  SIM800.write (0x82);
  SIM800.write (strlen(topSub) + 5);
  SIM800.write ((byte)0);
  SIM800.write (0x01);
  SIM800.write ((byte)0);
  SIM800.write (strlen(topSub));
  SIM800.write (topSub);
  SIM800.write ((byte)0x00);
  SIM800.write (0x1A);
}



int8_t Temper (const byte &addressTemp) {
  for (byte j = 0; j < size_arrayTemp; j++) {
    if (DS18B20[j][8] == addressTemp)return (int8_t)DS18B20[j][9];
  } return -99;
}


void  MQTTsendDatastream() {
  cipsend_begin ();
  PUBsend ("h/time/stat",  String(TimeWebasto), 1);
  remTime(true);
  PUBsend ("h/stat",       String(webasto) + "&$", 1);
  PUBsend ("h/flame",      String(startWebasto_OK), 1);
  PUBsend ("h/temp/dvs",   String(Temper(EngineC)), 1);
  PUBsend ("h/temp/heat",  String(HeaterC), 1);
  PUBsend ("h/temp/ul",    String(Temper(UlicaC)), 1);
  PUBsend ("h/temp/sal",   String(Temper(SalonC)), 1);
  SIM800.write (0x1A);
  prev_refreshMQTT = currmillis;
  digitalWrite (DTR, HIGH);
  last_webasto = webasto;
}

void remTime   ( bool s) {
  int rem = TimeWebasto - ((currmillis - timerStart_W_BUS) / 60000ul);
  PUBsend ("h/remtime",    webasto ? String(rem) : "выкл", s);
}

void cipsend_begin () 
{
  digitalWrite (DTR, LOW); delay (150);
  SIM800.println (F("AT+CIPSEND"));
  delay (250);
}

void refreshDataMQTT ()
{
  if (currmillis - prev_refreshMQTT > (uint32_t)Refresh_time * 1000) 
  {
     MQTTsendDatastream();
     prev_refreshMQTT = currmillis;
     fails++;
  }
}

пробуйте, заливайте, управляйте хоть и виртуально (но led 13 кстати будет показывать включенность котла). Хорошо бы кто нибудь в машину поставил и затестил как ведёт себя скетч после заезда в зону , где нет сети и обратно. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот как исправить плату v8.8, чтобы ардуино не перезагружалась. диоды 1N4007. (В плате v8.91 это уже решено).  После чего на DC-DC подправить напряжение, чтобы на модеме было 4,1В. У меня на DC-DC при этом 4,75В. 

не, там не 470 mF а 47 скорее   -  уж больно маленький. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Что то ни хрена не получается с этим MQTT , даже создать аккаунт . Может поподробнее расскажешь.

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

Всё там норм, иногда подождать просто надо, у меня три аккаунта на mqtt.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Создать аккаунт вроде получилось , но вот когда я выбираю  websocket то пишет что не удалось подключиться вероятно брандмауэр блокирует порт , у меня каспер стоит и я уже в нем выставил разрешения на тот порт , и все равно пишет что не удалось подключиться , а на смартфоне тоже какая то херня , настройки вбил пароль, имя , порт , адрес , но все равно подключения нет. Где можно нормальную инфу черпнуть по этому MQTT? Что бы понятно было? Или это без включенного  контроллера котла прошитого под mqtt  не будет работать ?

MaksVV
Offline
Зарегистрирован: 06.08.2015

Mqtt dash на смартфоне конечно должна подключиться , без всякой ардуины, причем и метрики можно загрузить. Нужно внимательно пароли все вводить, там они зловещие

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

С телефона ещё проще, копипаст рулит.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Ни чего не получается , захожу на сайт mqtt, авторизируюсь, выбираю ту херню которую по картинкам создавал, захожу в вебсокет этот , пишет типо что соединяется а потом ошибка соединения , что порт 32628 закрыт фаерволом или хрен знает чем . При чем пробовал и с компа и со смартфона и с домашнего роутера и с мобильного интернета. А mqtt dash постоянно крутит что соединяется , но соединить не может.

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Да по ходу этот американский брокер на Россию не работает, не подключается и все , пишет что порт заблокирован, и нет коннекта. Я попробовал проделать на другом бесплатном брокере https://mqtt.4api.ru , там тоже свои заморочки , коннект есть  и в приложении на телефоне , но вот не получается добавить эти метрики , на сайте ввожу metrics/exchange  в окно названия топика, вставляю из текстового файла эти метрики , жму опубликовать и ни чего в приложении не происходит так и висит в ожидании данных , что я делаю не правильно не пойму.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Да по ходу этот американский брокер на Россию не работает, не подключается и все , пишет что порт заблокирован, и нет коннекта. Я попробовал проделать на другом бесплатном брокере https://mqtt.4api.ru , там тоже свои заморочки , коннект есть  и в приложении на телефоне , но вот не получается добавить эти метрики , на сайте ввожу metrics/exchange  в окно названия топика, вставляю из текстового файла эти метрики , жму опубликовать и ни чего в приложении не происходит так и висит в ожидании данных , что я делаю не правильно не пойму.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Да по ходу этот американский брокер на Россию не работает, не подключается и все , пишет что порт заблокирован, и нет коннекта. Я попробовал проделать на другом бесплатном брокере https://mqtt.4api.ru , там тоже свои заморочки , коннект есть  и в приложении на телефоне , но вот не получается добавить эти метрики , на сайте ввожу metrics/exchange  в окно названия топика, вставляю из текстового файла эти метрики , жму опубликовать и ни чего в приложении не происходит так и висит в ожидании данных , что я делаю не правильно не пойму.

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

Пользуюсь cloudmqtt, живу в россии . Сперва прожимаю подписаться и ждать метрики, а потом на компе жму отправить, можно вот так "34metrics/echange " попробовать вбить, так сказать чтобы отличались от чужих.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

На cloudmqtt аккаунт создал, делал все по картинкам , когда нажиаю websocket UI в верхнем правом углу появляется сообщение типа попытка соединиться , но потом выдает сообщение что не получилось что порт недоступен , должно же быть зеленое сообщение что connected , а уменя красное что коннекта нет порт закрыт , не знаю что за херня , и в смарте тоже нет соединения , а на русском брокере , соединение есть но вот метрики обновить не получается, висит в ожидании данных. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Попробуй другую территорию сервера выбрать при создании аккаунта

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

На мой взгляд с регистрацией на mqtt с подтверждённым ящиком gmail проблем меньше всего, с mailовской почтой зарегался без проблем ввёл правильно все пароли и явки (через копирку) залил в устройство, но связи не было...

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Ни хрена у меня не получается настроить этот клятый mqtt , на cloudmqtt  порты закрыты , на русском mqtt.4api.ru подключение вроде есть и прога на смартфоне подключается  но не знаю почему метрики эти не доходят до смарта , на myqtthub.com смарт подключаться не хочет пишет ошибка подключения , я уже не знаю что делать. В сети по Mqtt  дельной информации нет , или поверхностно или для гиков с их линуксом , ни хрена не понял .

MaksVV
Offline
Зарегистрирован: 06.08.2015

Через гугл акк пробовал? С другого места компьютера и/или ip ? в каком городе находишься?

MaksVV
Offline
Зарегистрирован: 06.08.2015

Я долго не мог подключиться в mqtt dash потому что пробел в конце логина поставил. Его не видно, а он есть

MaksVV
Offline
Зарегистрирован: 06.08.2015

Отпишитесь те, у кого получилось

Dushman7776
Offline
Зарегистрирован: 13.01.2019

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

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Может я чего не догоняю, я создал аккаунт на русском брокере  mqtt.4api.ru  , вбил в mqtt dash пароли логины порты , с сайта брокера вошел в вебсокет  вбил пароли логины нажал коннект все вроде работает , статус коннект , в смартфоне тоже все соединилось , по крайней мере нет ошибки соединения, в смарте жму на стрелки вверху и выбираю metrics/exchange , смарт пишет что ожидает данные , на сайте брокера в окне topic ввожу metrics/exchange ,а в окне message  копипастом вставляю текст из файла , жму publish и ни чего не происходит, смарт висит в ожидании , на компе тоже ни каких изменений на экране, жму еще раз публиш , экранная кнопка вроде как нажимается но ни каких изменений нет, в смарте кнопки  не появляются. Или все таки нужно сначала подключить ардуину с прошивкой под mqtt  к вебасто. Второй день бьюсь ни чего не выходит.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Нет ардуино не надо. Топики со смарта на брокер и наобортот естественно должны передаваться без всякой ардуины. Попробуй на смарте , когда уже подключился, создай кнопку и в ее настройка в поле pub напиши ченибудь. При нажатии на сохданную кнопку в брокере топик должен появиться. И cloudmqtt еще нужно попробовать с другого компа (ну айпи в смысле). 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Разобрался я почему не работал couldmqtt.com, эти пидары реально с Россией не работают, включил в телефоне vpn зашёл под голандским ip и всё соединение пошло. Козлы ,я два дня потерял чтобы допетрить .

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Все получилось когда я в смартфоне запустил программу BROWSEC  и отключил вайфай, коннект пошел и в вебсокете и mqtt dash , потом помучился заливать эти метрики , открывал разными текстовыми редакторами на смартфоне копировал и вставлял в окно в вебсокете, но ни хрена не получалось, потом додумался сравнить что в компе открывает и что в андроиде , так вот этот долбанный файл .rtf  в андроиде совсем криво открывался , вообще другой текст, не знаю почему, я скопировал с компа в обычный тхт и закинул на телефон , и все с обычного текстового файла все правильно скопироваллось , в mqtt dash  появились кнопки с какими то левыми значениями по температуре . Может это старые данные от автора. Но вот не знаю может на какой нибудь другой брокер переделать , а то эта пиндосская контора мало того что мало очень жадная так еще и с Россией не работает. Может это конечно Ростелеком порты блочит ,  и Мегафон с ним , но через BROWSEC на смарте работает , но не удобно , я его постоянно не держу включенным.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Попробовал сейчас залить скетч mqtt в ардуину , не работает, настройки правильные вбил ,но я думаю и не будет работать на этом брокере , это я смартфон обманул и зашел черея VPN   а  сим 800 же с обычными настройками пытается соединиться с брокером , а это не получатся. И еще модем почему то на этом скетче раз 5 перегрузился  , реле щелкало , а потом вроде замигал как обычно но данные не дал в смартфон.