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;
}