Sensor frecuencia cardiaca

Buenas tardes,

Necesito enviar a thinger.io el valor de la frecuencia cardiaca según el código anexo que funciona tal y como pueden ver en la imagen08

No consigo intercalar correctamente la función:
thing[“HR”] >> [](pson& out){
out[“frecuencia cardiaca”] = ¿?;

void loop() {
uint8_t rateValue;
heartrate.getValue(heartratePin); ///< A1 foot sampled values
rateValue = heartrate.getRate(); ///< Get heart rate value
if(rateValue) {
Serial.println(rateValue);
}
delay(20);
}

Esta mal establecida la variable de salida, algo como esto debería funcionar

thing["Frecuencia Cardiaca"] >> outputValue(rateValue);

Y así deberías poder interrogarlo desde la plataforma, mediante un widget en un dashboard o un bucket.

Saludos

He seguido tus instrucciones pero recibo el siguiente mensaje de error. Te muestro el código es muy simple en un archivo adjunto
El mensaje es: rateValue is not captured

Gracias,

Podrían responderme hoy pf?
Gracias

Hola @wallen,

Esto no te va a funcionar tal y como lo tienes actualmente, porque el código de lectura del sensor se encuentra en el setup. Tienes dos opciones, llevarte las líneas 31-33 al loop y declarar rateValue como global, o bien introducirlo todo en el recurso, para lo que te propongo una estructura diferente a la que indicaba Ega.

  thing["frecuencia"] >> [](pson &out){
    uint8_t rateValue;
    heartrate.getValue(heartratePin);
    heartValue = heartrate.getRate();
    out=rateValue;
 };

de esta manera, la frecuencia sólo se lee cuando se ejecuta el recurso y no miles de veces por segundo… sin mucho sentido, en tu loop.

espero que te sea de ayuda. La próxima vez haznos un favor: introduce tu código como texto enriquecido en C++ escribiendo “```cpp” antes y tres comillas simples seguidas “`` `” después, como he hecho yo en este post: image eso nos ayudará mucho

Hola @JorgeTrincado,

He probado tus dos propuestas y ninguna funciona. No da error pero no es capaz de lanzar el dato correctamente a la plataforma thinger.io. Parece que la instrucción en el loop tampoco me dejar ver el dato en el puerto serie. Ya te comenté que con el programa base si funciona, adjunto pantallazo y el código del programa para thinger.io. Ustedes pueden ver en tiempo real si el dato está entrando en la plataforma, podríamos hacer una prueba online?46
Es para un prototipo y me urge mucho. Muchas gracias

``cpp
include <ThingerESP32.h> //Librería de la plataforma thinger.io
#include <WiFi.h>
#include “DFRobot_Heartrate.h”

// Thinger.io connection parameters
#define user “Wallen”
#define device_Id “test”
#define device_credentials “123456”
ThingerESP32 thing(user, device_Id, device_credentials);

#define heartratePin 2
DFRobot_Heartrate heartrate(DIGITAL_MODE);
int rateValue =0;

// WiFi connection parameters
//const char WiFi_ssid[]=
//const char WiFi_password[]=

void setup() {
Serial.begin(115200);

// Inicialización de la WiFi para comunicarse con la API
thing.add_wifi(WiFi_ssid, WiFi_password);

// Inicialización de la lectura de datos desde la API
thing[“frecuencia”] >> [](pson & out) {
out = rateValue;
};
}

void loop() {
uint8_t rateValue;
heartrate.getValue(heartratePin);
rateValue = heartrate.getRate();
if(rateValue) {
Serial.println(rateValue);
}
thing.handle();

}
`` `

No sé si te fijaste que el código no está bien publicado, ayúdanos a ayudarte…

Los pantallazos no son de mucha ayuda… Publica los códigos de forma apropiada.

Si quieres ver el comportamiento en tiempo real, puedes hacerlo con un widget en un dashboard y consultar cada segundo la variable en el dispositivo.

#include <ThingerESP32.h>    //Librería de la plataforma thinger.io
#include <WiFi.h>
#include "DFRobot_Heartrate.h"

// Thinger.io connection parameters
#define user "Wallen"
#define device_Id "test"
#define device_credentials "123456"
ThingerESP32 thing(user, device_Id, device_credentials);

#define heartratePin 2
DFRobot_Heartrate heartrate(DIGITAL_MODE);
int rateValue =0;

// WiFi connection parameters
//const char WiFi_ssid[]=
//const char WiFi_password[]=

void setup() {
  Serial.begin(115200);

  // Inicialización de la WiFi para comunicarse con la API
  thing.add_wifi(WiFi_ssid, WiFi_password);  

  // Inicialización de la lectura de datos desde la API
  thing["frecuencia"] >> [](pson & out) {  
  out = rateValue;
  };
}

void loop() {   
  uint8_t rateValue;
  heartrate.getValue(heartratePin); 
  rateValue = heartrate.getRate();  
  if(rateValue)  {
    Serial.println(rateValue);
  }
  thing.handle();     
  
}

Hola,

He colgado anteriormente el código de una de las opciones que me diste para ver si detectas algún error. Dime si necesitas algo más.

Gracias

Igual les ayuda a ayudarme.
El código anterior funciona con el puerto serie solo si suprimo la instrucción thing.handle();
En cuanto la pongo en el loop el sensor no es capaz de leer el valor de frecuencia cardiaca. Como funciona realmente esta instrucción? Donde podría colocarla entonces para que envíe el dato correctamente a la plataforma?

Hola @Wallen,

Una forma sencilla de conocer cual es el problema es incluyendo:

#define _DEBUG_

en la primera linera de tu código y abrir el monitor serie durante la ejecución del programa. De esta forma podrás conocer si el problema está en la conexión con el router, en el certificado SSL, o en las credenciales del dispositivo. Cópianos la traza que imprime el dispositivo y buscamos el problema.

En principio el código que has subido debería funcionar correctamente, yo sólo eliminaría la re-definición de rateValue dentro del loop.

un saludo

Buenas, he jugado con Serial.println(""); para aproximarme lo más que pueda a #define DEBUG (que aún no domino) y creo que puedo mostrar claridad junto con el monitor del puerto serie

  1. Código que funciona:
#include <ThingerESP32.h>    //Librería de la plataforma thinger.io
#include <WiFi.h>
#include "DFRobot_Heartrate.h"
#define heartratePin 14

// Thinger.io connection parameters
#define user "Wallen"
#define device_Id "test"
#define device_credentials "123456"
ThingerESP32 thing(user, device_Id, device_credentials);


DFRobot_Heartrate heartrate(DIGITAL_MODE);
uint8_t rateValue;

// WiFi connection parameters
const char WiFi_ssid[]="MOVISTAR_C25B";      //WiFi SSID
const char WiFi_password[]="xcVck4H33nivNiZgGcvq";  //WiFi password
//const char WiFi_ssid[]="MOVISTAR_16E0"; // Put your WifiSSID here
//const char WiFi_password[]="C7153BEE20F93EAFF749"; // Put your wifi password here
//const char WiFi_ssid[]= "ParqueGC_Usuarios"; // Put your WifiSSID here
//const char WiFi_password[]="EfesvercentE"; // Put your wifi password here


void setup() {
  Serial.begin(115200);

  // Inicialización de la WiFi para comunicarse con la API
  thing.add_wifi(WiFi_ssid, WiFi_password);

  // Inicialización de la lectura de datos desde la API
  thing["frecuencia"] >> [](pson & out) { 
  Serial.println("Llamada a la Api desde thing.handle");
  out = rateValue;
  Serial.println("dato enviado"); 
       
  }; 
}

void loop() {  
  heartrate.getValue(heartratePin); ///< A1 foot sampled values
  rateValue = heartrate.getRate(); ///< Get heart rate value 
  if(rateValue)  {
  Serial.println(rateValue);
  Serial.println("dato enviado");  
  }
  delay(20);

  //thing.handle();
  //Serial.println("loop");
  //delay(2000);
}

Monitor del puerto serie:

Wait for valid data !
Wait for valid data !
Wait for valid data !
Wait for valid data !
77
dato enviado
76
dato enviado
75
dato enviado
75
dato enviado
75
dato enviado
76
dato enviado
75
dato enviado
75
dato enviado
75
dato enviado
74
dato enviado
73
dato enviado
Wait for valid data !
Wait for valid data !
Wait for valid data ! 

Ahora intercalo la instrucción thing.handle(); y es aquí donde el Sensor no es capaz de capturar el valor y se pierde. Ya no es capaz de entrar en el condicional if (rateValue) { que es clave para capturar el dato

  1. Código que no funciona. El Refresh time en el Widget Dato del Dashboard lo tengo a 1 min
#include <ThingerESP32.h>    //Librería de la plataforma thinger.io
#include <WiFi.h>
#include "DFRobot_Heartrate.h"
#define heartratePin 14

// Thinger.io connection parameters
#define user "Wallen"
#define device_Id "test"
#define device_credentials "123456"
ThingerESP32 thing(user, device_Id, device_credentials);


DFRobot_Heartrate heartrate(DIGITAL_MODE);
uint8_t rateValue;

// WiFi connection parameters
const char WiFi_ssid[]="MOVISTAR_C25B";      //WiFi SSID
const char WiFi_password[]="xcVck4H33nivNiZgGcvq";  //WiFi password
//const char WiFi_ssid[]="MOVISTAR_16E0"; // Put your WifiSSID here
//const char WiFi_password[]="C7153BEE20F93EAFF749"; // Put your wifi password here
//const char WiFi_ssid[]= "ParqueGC_Usuarios"; // Put your WifiSSID here
//const char WiFi_password[]="EfesvercentE"; // Put your wifi password here


void setup() {
  Serial.begin(115200);

  // Inicialización de la WiFi para comunicarse con la API
  thing.add_wifi(WiFi_ssid, WiFi_password);

  // Inicialización de la lectura de datos desde la API
  thing["frecuencia"] >> [](pson & out) { 
  Serial.println("Llamada a la Api desde thing.handle");
  out = rateValue;
  Serial.println("dato enviado"); 
       
  }; 
}

void loop() {  
  heartrate.getValue(heartratePin); ///< A1 foot sampled values
  rateValue = heartrate.getRate(); ///< Get heart rate value 
  if(rateValue)  {
  Serial.println(rateValue);
  Serial.println("dato enviado");  
  }
  delay(20);

  thing.handle();
  Serial.println("loop");
  delay(2000);
}

Monitor serie:

loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
Llamada a la Api desde thing.handle
dato enviado
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
loop
Llamada a la Api desde thing.handle
dato enviado
loop
loop
loop
loop
loop

Ok, estas colocando Serial.println("dato enviado"); tanto en el código que se ejecuta al enviar el dato, así como en la rutina que se lee, esto se presta a confusión en la consola serial, es recomendable usar mensajes diferentes.

El delay genera irregularidades en la plataforma, si necesitas controlar el tiempo debes utilizar otro método, en el foro de arduino explican cómo hacerlo.

Si no imprime el valor en el puerto serial, lo que yo haría es hacer seguimiento a la variable rateValue para ver que está sucediendo.

La instrucción #define _DEBUG_ no es necesario que la domines, con solo colocar esa linea al principio del sketch, el micro va a reportar todo lo que hace con respecto a la plataforma thinger, y a reportar errores si los hay.

Saludos

Sería interesante que nos dejaras ver la salida del debug del cliente de Thinger.io junto con la tuya (eliminando el “dato enviado” del loop y el delay(2000))… como dice Ega.

El problema son los delay ( principalmente este “delay(2000);”, tienes que utilizar millis() y tu programa se va a ejecutar mas fluidamente, y sin errores hay miles de tutoriales sobre como utilizarlo en La web revisalo y luego cuentanos como te fue. si no lo consigues puedo mandarte algo de codigo de ejemplo.
Saludos! Mariano

1 Like