Problems in communications with multiple IoT platforms

Hi, im trying the communication with differents iot plattaforms, but i got some problems with thingerio. I have been trying for some days but it doesnt work , can someone help me?

Buenas, estoy probando la comunicación con distintas plataformas de IoT pero me encuentro con algunos problemas al comunicarme con Thinger.io, llevo varios días probando cosas pero no doy con el resultado, a ver si pueden ayudarme, os dejo código:

//placa: Sparkfun SAM D1 Mini

#include <WDTZero.h>
#define TINY_GSM_MODEM_SIM808

#include <TinyGsmClient.h>
#include <ThingerTinyGSM.h>
#include <ArduinoHttpClient.h>

#include "ThingsBoard.h"
#include "definicionesSensorBox.h"
#include <Arduino.h>
#include "wiring_private.h"
#include <Wire.h>

#include <Adafruit_INA219.h>
#include <BlynkSimpleSIM800.h>

#include "parametros.h"

Adafruit_INA219 ina_vegaSensor(0x40);
Adafruit_INA219 ina_powersupply(0x41);
                             
typedef struct {
  float bus_voltage    = 0.0;
  float shunt_voltage  = 0.0;
  float current        = 0.0;
  float power          = 0.0;
} t_power;

t_power pwrSupply;
t_power powerVegaSensor;

WDTZero MyWatchDoggy;

//CONFIGURACION GSM
TinyGsm modem(SerialWifi);
TinyGsmClient client(modem);

HttpClient http(client, ENDPOINTMuu, 80);  


ThingsBoardHttp tb(client, TOKEN, THINGSBOARD_SERVER, THINGSBOARD_PORT);
ThingerTinyGSM thing(USERNAME, DEVICE_ID, device_credentials,SerialWifi); 

bool modemConnected = false;

float StatusTank = INICIOTANKE;
//float _variableTank = INCREMENTOS;

DynamicJsonDocument doc(200);
String output;

bool fixedGPS = false;


float default_lat   = 28.151106;
float default_lon   = -15.411716;

float latitude   = 28.151106;
float longitude  = -15.411716;

bool state = false;
float pcb_temperatura =0;
long sensor_4_20ma =0 ;

float sensorRadar=-20;
float valorEnviado = -20;

unsigned long _lastTime = 0;
int cont_minutos = 0;

int periodo_envio = ESPERA_ENTRE_MEDIDAS;




void setup() {

  init_IO();
  delay(5000);
  SerialUSB.begin(BAUDRATE);  //
  SerialWifi.begin(BAUDRATE);
  
  pinPeripheral(7, PIO_SERCOM); 
  pinPeripheral(6, PIO_SERCOM);
  //SerialUSB.println("Init system");
  analogReadResolution(12);
  startCommunicationModule();
  //modem.restart();   
  modem.enableGPS();
  unsigned long _lastTime=millis();
  SerialUSB.println("01.- Inicio configuracion GPS");    
  while ((!(fixedGPS))&&(millis()-_lastTime < FIX_GPS_TIME)){
    delay(1000);
    fixedGPS = modem.getGPS(&latitude, &longitude);
    SerialUSB.print(latitude);    
    SerialUSB.print('\t');
    SerialUSB.println(longitude);    
  }
  if (!fixedGPS){
    latitude = default_lat;
    longitude = default_lon;
  }
  modem.disableGPS();
  modem.gprsDisconnect();  
  stopCommunicationModule(); 
  SerialUSB.println("02.- FIN configuracion GPS");     
  MyWatchDoggy.attachShutdown(dummy);
  MyWatchDoggy.setup(WDT_SOFTCYCLE8M);
  
  _lastTime=millis();

    //THINGERIO SETUP SEND
     SerialUSB.println("- Datos a Thingerio...:"); 
  thing["DispDepositoA1"] >> [](pson& out)
  {
    out["Temperatura"]=pcb_temperatura;
    out["VIn"]=pwrSupply.bus_voltage;
    out["AmpIn"]=pwrSupply.current;
    out["Latitude"]=latitude;
    out["Longitude"]=longitude;
    out["TankStatus"]=valorEnviado;
  };

  //configuracion de access point para thingerio
  thing.setAPN(apn, gprsUser, gprsPass); 
  
  Serial.println("Thinger.io configurado"); 

   
    
}

void loop(){
  
  MyWatchDoggy.clear(); 
  SerialUSB.println("03.- Lectura de sensores"); 
  //Lectura de sensores
    init_i2c_devices();
    read_PowerSupply();

 
 
   digitalWrite(RELE1_D1,HIGH);
   if (pwrSupply.bus_voltage >= BATERIA_CRITICA){
      
      digitalWrite(RELE1_D1,HIGH);
      read_vegaSensor();
      pcb_temperatura = Get_temperature_value(); 
      StatusTank = powerVegaSensor.current;

     
      Serial.print("03.1.- Voltaje Sensor Vega...: ");Serial.println(powerVegaSensor.bus_voltage );
      Serial.print("03.2.- Amperaje Sensor Vega..: ");Serial.println(powerVegaSensor.current);
      Serial.println("");
      Serial.print("3.3.- Estado del Tanque......: ");
      Serial.println(StatusTank);
      
      sensorRadar= (6.25*StatusTank)-25;
      if (sensorRadar < 0) sensorRadar = 0;
      Serial.print("3.4.- %llenado del Tanque....: ");
      Serial.println(sensorRadar);
      Serial.print("3.5.- ALARMA.................: ");
//      if (sensorRadar >= AVISO_ALTO || sensorRadar <= AVISO_BAJO ){
      if (sensorRadar >= AVISO_ALTO){

          Serial.println("ACTIVA");    
          digitalWrite(RELE1_D0,true);
      }else{
          Serial.println("INACTIVA");    
          digitalWrite(RELE1_D0,false);
      }
      
      if ((abs(sensorRadar-valorEnviado)>=ERROR_PERMITIDO)){
        SerialUSB.println("04.1.- Enviando Datos por haber modificación desspúes de la última lectura");
        SerialUSB.print("Valor Leido");
        SerialUSB.println(sensorRadar);
        SerialUSB.print("Ultimo valor");
        SerialUSB.println(valorEnviado);
        _lastTime= millis();
        valorEnviado=sensorRadar;
        envioDatos();
        cont_minutos=0;
        Serial.print("SensorRadar: ");
        Serial.println(sensorRadar);
        MyWatchDoggy.clear();
        Serial.print("04.1.1.- Ajusttando periodo de envio de ");    
        Serial.print(periodo_envio);    
        Serial.print(" ms a ");
        periodo_envio=periodo_envio/2; // si hay modificación del tanque reducimos frecuencia de muestreo
        if (periodo_envio < MIN_ESPERA_ENTRE_MEDIDAS)  periodo_envio = MIN_ESPERA_ENTRE_MEDIDAS;
        Serial.print(periodo_envio);    
        Serial.println(" ms.");
        
//      }else if ((abs(sensorRadar-valorEnviado)>=ERROR_CRITICO)&&(sensorRadar>AVISO_ALTO) || (sensorRadar<AVISO_BAJO)  ){
      }else if ((abs(sensorRadar-valorEnviado)>=ERROR_CRITICO)&&(sensorRadar>AVISO_ALTO)){

        SerialUSB.println("04.2.- Enviando Datos..."); 
        SerialUSB.println("%");
        _lastTime= millis();
        valorEnviado=sensorRadar;
        envioDatos();
        cont_minutos=0;
        MyWatchDoggy.clear();
      }else if (cont_minutos >= SEND_DATA_TIME-1){
        SerialUSB.println("tiempo");
        _lastTime= millis();
        valorEnviado=sensorRadar;
        envioDatos();
        cont_minutos=0;
        //ajustamos frecuencia de envio
        Serial.print("04.3.1.- Ajusttando periodo de envio de ");    
        Serial.print(periodo_envio);    
        Serial.print(" ms a ");
        periodo_envio=periodo_envio * 2;
        if (periodo_envio > ESPERA_ENTRE_MEDIDAS)  periodo_envio = ESPERA_ENTRE_MEDIDAS;
       
        Serial.print(periodo_envio);    
        Serial.println(" ms.");

        MyWatchDoggy.clear();
      }else{
        cont_minutos+= 1;
        Serial.print("cont_minutos: ");
        Serial.println(cont_minutos);
      }     
    }else{
      digitalWrite(RELE1_D1,LOW);
      SerialUSB.println("sensor apagado");
    }    

    SerialUSB.print("Valor Enviado: ");
    SerialUSB.print(valorEnviado);
    SerialUSB.print(" Valor medido: ");
    SerialUSB.println(sensorRadar);
    shutdown_i2c_devices();     
    
    unsigned long _currentTime = millis();
    while(millis()-_currentTime < periodo_envio);
    SerialUSB.println(cont_minutos);
  
}

void envioDatos(){
  SerialUSB.println("04.2.- Iniciando envio de datos..."); 
  startCommunicationModule();
  modem.restart(); 
  modem.gprsConnect(apn, gprsUser, gprsPass);
  
  if (!modemConnected) {
    SerialUSB.print("04.3.- Iniciando envio de datos...");   
    SerialUSB.println(F("Waiting for network..."));
    if (!modem.waitForNetwork()) {
       SerialUSB.println("Fail");
        delay(10000);
        return;
    }
    //SerialUSB.println(" OK");
    modemConnected = true;    
   delay(10);
    
    if (modem.isNetworkConnected()) 
          SerialUSB.println("Network connected");  
  }

    
  //ENVIO THINGERIO 
  Serial.println("Enviando datos a Thinger.io...");
  thing.handle();
  thing.stream(thing["DispDepositoA1"]); 
 
  

  //ENVIO BLYNK
  SerialUSB.print("04.4.- Conexión BLYNK...");   
  SerialUSB.println("blink start");   
  Blynk.config(modem, auth );
  Blynk.connect();
  SerialUSB.print("04.5.- Llenado tanque.......:");   
  SerialUSB.println(valorEnviado);   
  SerialUSB.print("04.5.- Temperatura tanque...:");   
  SerialUSB.println(pcb_temperatura);   
  Blynk.virtualWrite(V1, valorEnviado);
  Blynk.virtualWrite(V3, valorEnviado);
  Blynk.virtualWrite(V2, pcb_temperatura);
  String notifcacion="";
  if ( pwrSupply.bus_voltage< BATERIA_BAJA){
    notifcacion = "TANQUE 01: Nivel de batería baja";
    SerialUSB.print("04.5.- notifiación BLYNK...:");   
    SerialUSB.println(notifcacion);
    notificar(notifcacion);
  }
  if ( valorEnviado > AVISO_ALTO){
    SerialUSB.print("04.5.- notificación a BLYNK...:");   
    notifcacion = "TANQUE 01: Nivel Demasiado Alto: "+ String(valorEnviado) + "%";
    notificar(notifcacion);
  }  
//  else 
//    if ( valorEnviado < AVISO_BAJO){
//    SerialUSB.print("04.5.- notificación a BLYNK...:");   
//    notifcacion = " TANQUE 01: Nivel Demasiado Bajo: "+ String(valorEnviado) + "%";
//    notificar(notifcacion);
//  }  

  SerialUSB.println("blink fin");


  //ENVIO THINGSBOARD
  output = "";  
  output = BuildThingsboardJSON(pcb_temperatura,pwrSupply.bus_voltage,pwrSupply.current, valorEnviado, latitude, longitude);
  tb.sendTelemetryJson(output.c_str());
  SerialUSB.println("04.6.- Datos a Thingsboards...:");   
  SerialUSB.println(output);

  
 //ENVIO MUUTECH
  SerialUSB.println("MUUTECH: Performing HTTP GET request... ");
int err =http.get(UrlStringMuutech(pcb_temperatura,pwrSupply.bus_voltage,pwrSupply.current, valorEnviado, latitude, longitude)); 
  
   if (err != 0) {
    SerialUSB.println("failed to connect");
    delay(10000);
    return;
  }
  
int status = http.responseStatusCode();
  SerialUSB.println("Response status code: ");
  SerialUSB.println(status);
  if (!status) {
    delay(10000);
    return;
  }
  
  http.stop();


  
  unsigned long in_lastTime=millis();
  while(millis()-in_lastTime < 10000);
  modem.gprsDisconnect();
  
  stopCommunicationModule();
  
  modemConnected = false;
}
String BuildThingsboardJSON(float _pcb_temperatura,float _bus_voltage,float _current, float _StatusTank, float _latitude, float _longitude){
  String _output = "";
  doc["temperatura"] = _pcb_temperatura;
  doc["VIN"] = _bus_voltage;
  doc["AmpIN"] = _current;
  doc["TankStatus"] = _StatusTank;
  doc["latitude"] = _latitude;
  doc["longitude"] = _longitude;
  serializeJson(doc, _output); 
  return _output;
}

void dummy() {

}


float Get_temperature_value(){  
  unsigned long _lastTime=millis();
  digitalWrite(EN_TEMP_LVL,HIGH);
  while(millis()-_lastTime < 100);
  float RawTemperature = ((3100 * analogRead(TEMP_LVL)/4096.0)-500)/10.000 ;
  digitalWrite(EN_TEMP_LVL,LOW);
  while(millis()-_lastTime < 1);
  return RawTemperature;
}

void init_i2c_devices(){                                //Se inician los  INA y el I2c
  Wire.begin();
  ina_powersupply.begin();
  ina_vegaSensor.begin(1);
   
}

void shutdown_i2c_devices(){                            //Se ponen los INA en modo Shutdown
  ina_powersupply.setpowerdown();
  ina_vegaSensor.setpowerdown();
 
}

void read_PowerSupply(){                                //Se leen los valores alimentacion de entrada y se almacenan en ina_powersupply
  
      float shuntvoltage = 0;
      float busvoltage = 0;
      float current_mA = 0;
      float loadvoltage = 0;
      float power_mW = 0;

      shuntvoltage = ina_powersupply.getShuntVoltage_mV();
      busvoltage = ina_powersupply.getBusVoltage_V();
      current_mA = ina_powersupply.getCurrent_mA();
      power_mW = ina_powersupply.getPower_mW();
      loadvoltage = busvoltage + (shuntvoltage / 1000.0);
      
      pwrSupply.bus_voltage = float(busvoltage);
      pwrSupply.shunt_voltage = float(shuntvoltage);
      pwrSupply.current = float(current_mA);
      pwrSupply.power = float(power_mW);
}

void read_vegaSensor(){                                 //Se leen los valores del panel solar y se almacenan en ina_vegaSensor 
  
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;

  shuntvoltage = ina_vegaSensor.getShuntVoltage_mV();
  busvoltage = ina_vegaSensor.getBusVoltage_V();
  current_mA = ina_vegaSensor.getCurrent_mA();
  power_mW = ina_vegaSensor.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);

  powerVegaSensor.bus_voltage = float(busvoltage);
  powerVegaSensor.shunt_voltage = float(shuntvoltage);
  powerVegaSensor.current = float(current_mA);
  powerVegaSensor.power = float(power_mW);
}

String startCommunicationModule(){
  unsigned long _lastTime=millis(); 
  String bufferString = "";
  char c;  
  enable5Volts();
    while ((millis()-_lastTime<6000)&& (!digitalRead(SIM_STATUS))){      
      if (SerialWifi.available()){
        c = (char)SerialWifi.read();
        //SerialUSB.write(c);
        bufferString += c;
      }      
  }
  return "OK";
}
String stopCommunicationModule(){
  unsigned long _lastTime=millis();   
  disable5Volts();
  return "OK";
}

int RST_GSM_SIM808(){                                 //Se enciende la sim808 y se espera que la misma responda
  unsigned long _lastTime = millis();
  digitalWrite(WIFI_RST,HIGH);
  while(millis()-_lastTime < 1000);
  digitalWrite(WIFI_RST,LOW);
  while ((!digitalRead(SIM_STATUS))&&(millis() - _lastTime < 6000)){
    //SerialUSB.println("GSM OFF");
  }
  //SerialUSB.println("GSM ON");
  return digitalRead(SIM_STATUS);
}


void notificar (String texto)
{
  Blynk.email(texto, texto);  
  Blynk.notify(texto);
}


String UrlStringMuutech(float _pcb_temperatura,float _bus_voltage,float _current, float _StatusTank, float _latitude, float _longitude)
{
  String  urlmuutech = (String(estacion)+"&temperatura="+String(_pcb_temperatura)+"&VIN="+String(_bus_voltage)+"&AmpIN="+String(_current)+"&TankStatus="+String(_StatusTank)+"&latitude="+String(_latitude)+"&longitude="+String(_longitude));
  Serial.println(ENDPOINTMuu+urlmuutech);
  return urlmuutech;
}

Hi,

Can you add the line:
#define _DEBUG_
At the very begining of the sketch.

Then the device will return through the serial console all the phases of the connection and the problem that avoids it from achieving it, paste here the results.

P.D.:And thank you for pasting the code in the right way :wink:

1 Like

Thanks for your answer, i´ll do it as soon as possible! Thanks!!

I got the results, i only receive 8 lines related with debug, i think its ok, right?

[EDIT]

it connect just 1 time then disconnect