Ciao! Sto provando a usare un cardiofrequenzimetro (DAOKAI MAX30102) con un Arduino Uno R4 Wifi tramite l'IoT Cloud. Avevo provato lo script prima sull'IDE un paio di giorni fa e sembrava essere tutto ok, ma quando l'ho poi portato sull'IoT Cloud, ho notato dal serial monitor che, quando non c'è nulla sul sensore, viene stampato -1 (che è corretto), ma quando metto il dito sul sensore, viene stampato 0 oppure un numero a caso e sempre lo stesso (quindi una volta stampa sempre 7, una volta sempre 22 e così via). Pensavo potesse essere un problema del Cloud o della variabile che avevo scelto (non essendo ancora pratica con il Cloud). Ieri tuttavia, riprovando lo script sull'IDE, ho visto che anche lì ha cominciato a dare quel problema. A quel punto ho cambiato i cavi, il sensore, ma senza risultati. Non riesco davvero a capire quale possa essere il motivo. Vi giro qui lo script presente sull'IoT Cloud, dove sto usando la variabile int beatAvg.
#include <MAX30105.h>
#include <heartRate.h>
#include <spo2_algorithm.h>
#include "thingProperties.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
float beatsPerMinute;
unsigned long int last_beat = 0;
void setup() {
Serial.begin(115200);
Serial.println("Initializing...");
// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 was not found. Please check wiring/power. ");
while (1)
;
}
Serial.println("Place your index finger on the sensor with steady pressure.");
particleSensor.setup(); //Configure sensor with default settings
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
/*
The following function allows you to obtain more information
related to the state of network and IoT Cloud connection and errors
the higher number the more granular information youâll get.
The default is 0 (only errors).
Maximum is 4
*/
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
void loop() {
ArduinoCloud.update();
// Your code here
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true) {
//We sensed a beat!
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
rateSpot %= RATE_SIZE; //Wrap variable
//Take average of readings
beatAvg = 0;
for (byte x = 0; x < RATE_SIZE; x++)
beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
if (irValue >= 50000)
Serial.println(beatAvg);
if (irValue < 50000)
{
Serial.println(-1);
}
}
/*
Since BeatAvg is READ_WRITE variable, onBeatAvgChange() is
executed every time a new value is received from IoT Cloud.
*/
void onBeatAvgChange() {
// Add your code here to act upon BeatAvg change
}