Ayuda para comunicar un sensor con thinger a traves de altsoftserial


#1

hola necesito ayuda para comunicar un sensor que funciona con la libreria <AltSoftSerial.h> y necesito enviar la variable llamada final a thinger pero no estoy muy experto en este tipo de comunicacion rx y tx para thinger.

#define _DEBUG_
#define _DISABLE_TLS_


#include <BridgeSSLClient.h>
#include <ThingerYun.h>
#define USERNAME "xxxx"
#define DEVICE_ID "xxx"
#define DEVICE_CREDENTIAL "xxx"
ThingerYun thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);

#include <AltSoftSerial.h> //Librería AltSoftSerial
AltSoftSerial altSerial; //Instancia de la clase AltSoftSerial
//Flags para el control de la entrada de datos
boolean startSequence = true;
boolean receiveData = false;
boolean flag = true;
void(* resetFunc) (void) = 0;
int contador = 0;
void setup() {
  //Se inicia el puerto serie con la computadora
  Serial.begin(115200);
     Bridge.begin();
  //Se inicia el puerto serie con el sensor
  altSerial.begin(4800);
  delay (5000);
 // thing["millis"] >> outputValue(millis());
  thing["dato"] >> [](pson& out){
// out["humedad"]=;
  };


//delay(2000);
  }


//}

void loop() {
   thing.handle(); 
delay(1000);
  /*
     Bloque de programación para recibir datos
     de la computadora
  */
  if (flag) {  // Parte a eliminar y que sea automático sin tener que poner start en el puerto serial
    //Serial.println("starting...");
    receiveData = true;
    Serial.flush();
    altSerial.flush();
    startTraceMode();
    flag = false;
    Serial.println("starting...");
  }

  // if (Serial.available() > 0) {
  // String input = Serial.readString();
  //Si el dato recibido es start, se empieza a leer datos
  //if (input == "start") {  // Parte a eliminar y que sea automático sin tener que poner start en el puerto serial
  //Serial.println("starting...");
  //receiveData = true;
  //Serial.flush();
  //altSerial.flush();
  //startTraceMode();
  //flag = false;
  //}
  // }
  //Si el flag esta activo
  if (receiveData) {
    //Si hay datos disponibles en el puerto serie del sensor...
    if (altSerial.available() > 0) {
      while (altSerial.available() > 0) {
        delay(25);
        //Se bloquea la secuencia de inicio
        if (startSequence) {                       // Luego de conectar el protoboard la secuencia se queda aquí
          altSerial.read();
        }
        else
        {
          //Se transforman los datos leidos a capacitancia

          if (contador <= 62) {
            int capacitance = 0;
            float intervalos = 0;
            float porcentaje = 0;
            float final = 0;
            capacitance = altSerial.read();
            capacitance = capacitance + (altSerial.read() * 256);
            // Se convierte a valores de humedad en porcentaje
            intervalos = 15;
            porcentaje = (capacitance - 12483) / (15);
            final = 100 - porcentaje;
            //Se imprime el resultado
            Serial.println(final);
            Serial.println(" %");
            contador++;

          }
          else {

            resetFunc();
          }

        }
      }
      if (startSequence) {
        startSequence = false;
      }
    }
  }
}
//Secuencia de inicio del sensor
void startTraceMode() {
  startSequence = true;
  altSerial.write(1);
  delay(1000);
  altSerial.write(0x54); // valores de bits obtenidos de device monitoring para recoger los datos
  altSerial.write(0x19); // valores de bits obtenidos de device monitoring para recoger los datos
}

#2

Hola @Euribiel_Roberto_Val,

Si nos explicas más detalladamente el problema nos será más facil ayudarnte, pero en principio, para enviar esa variabe lo único que tienes que hacer es declararla como global y luego incluirla en el recurso de salida de thinger:

thing["final"] >> [](pson & out){
    out=final;
}

//o bien 
thing["final"] >> outputValue(final);
 

un saludo


#3

hola @jtrinc26 la variable final esta dentro de un void loop y con una condicion si declaro la variable al inicio no toma el valor correcto en thinger. el sensor funciona de la siguiente manera
void startTraceMode() {
startSequence = true;
altSerial.write(1);
delay(1000);
altSerial.write(0x54); // valores de bits obtenidos de device monitoring para recoger los datos
altSerial.write(0x19); // valores de bits obtenidos de device monitoring para recoger los datos
}
cuando realiza esa secuencia el procede a enviar los datos. sin embargo debe cumplir con los con la condiciones de flag , no se como declarar dentro del void setup para thinger estas condiciones o de que manera puede comunicar a través de este protocolo que la variable final establezca comunicación con thinger.


#4

Creo que estas confundido.

Una cosa es la lectura de la variable en el microcontrolador (interrogar al sensor), y otra es enviar el dato a la nube, para la plataforma debería ser transparente cualquier procedimiento que deba ejecutar el micro para obtener el valor de la variable.

Te sugiero que hagas la rutina para interrogar el sensor y una vez logres visualizar los datos por consola serial, nos posteas el sketch y nos indicas que variable quieres enviar a la nube, porque repito la plataforma no tiene absolutamente nada que ver con la comunicación del puerto serial del microcontrolador, si se podría activar alguna llamada o acción en función del estado del puerto, pero eso es otra historia.

Saludos,


#5

@ega muchas gracias por responder, ya he solventado el problema tienes toda la razón el problema estaba en una mala declaración de la variable todo independiente de la comunicación del sensor.