Progetto di un sistema di monitoraggio IoT della frequenza cardiaca e della temperatura corporea – Parte 5

IoT

Nel precedente articolo “Progetto di un sistema di monitoraggio IoT della frequenza cardiaca e della temperatura corporea - Parte 4” abbiamo realizzato il prototipo del sistema di monitoraggio, installato tutto il software necessario, creato uno sketch con il codice del progetto e programmato la scheda Arduino UNO mediante l’IDE di Arduino. In questo articolo, spiegheremo le funzioni del codice e faremo il collaudo funzionale del prototipo mediante una simulazione del monitoraggio da remoto dei parametri di frequenza cardiaca e temperatura di un paziente utilizzando la piattaforma ThingSpeak e alcune sue app.

Descrizione del codice del sistema di monitoraggio

Il codice inizia definendo gli interrupt di basso livello per una più precisa corrispondenza della variabile BPM contenente il valore dei battiti cardiaci al minuto:

#define USE_ARDUINO_INTERRUPTS true

Ogni sketch che utilizza la libreria PulseSensor Playground deve definire “USE_ARDUINO_INTERRUPTS” prima di includere PulseSensorPlayground.h.

“#define USE_ARDUINO_INTERRUPTS false” informa la libreria di non utilizzare gli interrupt per leggere i dati dalla variabile PulseSensor.

Se intendete usare gli interrupt, basta semplicemente sostituire “false” con “true”:
#define USE_ARDUINO_INTERRUPTS true

Poi vengono incluse le librerie necessarie:

#include <SoftwareSerial.h>
#include "Timer.h"
#include <PulseSensorPlayground.h>

Viene creata un’istanza delle librerie Timer, PulseSensorPlayground e SoftwareSerial. Nella variabile Stringa “msg” si inserisce la chiave API del canale di ThingSpeak:

Timer t;
PulseSensorPlayground pulseSensor;
SoftwareSerial esp8266(10,11);

String msg = "GET /update?key=LA TUA CHIAVE API";

Funzione Setup

Nella funzione Setup, viene impostata la velocità di trasmissione per la comunicazione seriale con il monitor seriale di Arduino, e la velocità di trasmissione seriale tra Arduino e l'ESP8266. Viene avviata la comunicazione con l'ESP8266 con il comando “AT” e la connessione WiFi chiamando la funzione “connectWiFi()”. Poi si inizializzano i timer chiamando “t.every(10000, getReadings)”, ovvero “t.every(time_interval, do_this)” che prenderà le letture dei sensori, poi, chiamando “t.every(10000, updateInfo)”, si aggiornerà il canale di ThingSpeak ogni “time_interval” che potete definire voi stessi modificando il valore “time_interval” qui impostato a 10000:

void setup()
{
Serial.begin(9600); 
esp8266.begin(115200);
pulseSensor.analogInput(PulseWire); 
pulseSensor.blinkOnPulse(LED13); //auto-magically blink Arduino's LED with heartbeat.

pulseSensor.setThreshold(Threshold);

// Double-check the "pulseSensor" object was created and "began" seeing a signal. 
if (pulseSensor.begin()) {
Serial.println("We created a pulseSensor Object !"); //This prints one time at Arduino power-up, or on Arduino reset.

}

Serial.println("AT");
esp8266.println("AT");

delay(3000);

if(esp8266.find("OK"))
{
connectWiFi();
}

t.every(10000, getReadings);
t.every(10000, updateInfo);

}

Funzione connectWiFi()

E’ una funzione che avvia la connessione WiFi dell’ESP8266 mediante comandi AT. Restituisce True o False rispettivamente se l’ESP8266 è connesso alla rete Wi-Fi o no.
Il comando “AT+CWMODE=1” imposta l’ESP8266 in modalità Station.
Il comando “AT+CWJAP=\” connette l’ESP8266 all’Access Point (il vostro router Wi-Fi):

boolean connectWiFi()

{
Serial.println("AT+CWMODE=1");
esp8266.println("AT+CWMODE=1");

delay(2000);

String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";

Serial.println(cmd);
esp8266.println(cmd);

delay(5000);

if(esp8266.find("OK"))

{
return true;
}

else
{
return false;
}
}

Funzione getReadings()

Questa funzione acquisisce le letture del sensore di impulsi cardiaci e della temperatura rilevata dall’LM35 e le converte in stringa utilizzando la funzione dtostrf():

void getReadings()
{
raw_myTemp = analogRead(A1);
Voltage = (raw_myTemp / 1023.0) * 5000; // 5000 to get millivots.
tempC = Voltage * 0.1; 
myTemp = (tempC * 1.8) + 32; // conver to F

Serial.println(myTemp);

int myBPM = pulseSensor.getBeatsPerMinute();
// Calls function on our pulseSensor object that returns BPM as an "int".
// "myBPM" hold this BPM value now.

if (pulseSensor.sawStartOfBeat()) { // Constantly test to see if "a beat happened".

Serial.println(myBPM); // Print the value inside of myBPM. 
}

delay(20);

……………………………………………..

Nella stessa funzione getReadings() viene definito l'array di caratteri per le variabili BPM e temp e converte il valore float di questi valori dei sensori in Stringa usando la funzione dtostrf()

………………………………………………………………………….

char buffer1[10];
char buffer2[10];
BPM = dtostrf(myBPM, 4, 1, buffer1);
temp = dtostrf(myTemp, 4, 1, buffer2);

}

Funzione updateInfo()

Viene creata la funzione updateInfo() per aggiornare le informazioni del sensore sul canale ThingSpeak.
"AT+CIPSTART=\"TCP\",\"" invia il comando TCP sulla porta 80.

void updateInfo()
{

String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
Serial.println(cmd);
esp8266.println(cmd);

delay(2000);

if(esp8266.find("Error"))
{
return;
}

Allega le letture all'URL GET utilizzando "&field1=" per le letture della frequenza cardiaca, "&field2=" per le letture della temperatura. Poi invia queste informazioni a ThingSpeak usando il comando "AT+CIPSEND=".

cmd = msg ;
cmd += "&field1="; //field 1 for BPM
cmd += BPM;
cmd += "&field2="; //field 2 for temperature
cmd += temp;
cmd += "\r\n";

cmd = msg ;

cmd += "&field1="; //field 1 for BPM

cmd += BPM;

cmd += "&field2="; //field 2 for temperature

cmd += temp;

cmd += "\r\n";

Serial.print("AT+CIPSEND=");
esp8266.print("AT+CIPSEND=");
Serial.println(cmd.length());
esp8266.println(cmd.length());

if(esp8266.find(">"))
{
Serial.print(cmd);
esp8266.print(cmd);
}
else
{
Serial.println("AT+CIPCLOSE");
esp8266.println("AT+CIPCLOSE");

//Resend...
error=1;
}
}

Funzione panic_button()

Viene creata la funzione panic_button() per l’invio dell’email di allarme mediante la pressione sul pulsante “ALLARME”. Quando il pulsante viene premuto, l’ESP8266 invia le informazioni al server utilizzando i comandi AT+CIPSTART e AT+CIPSEND.

void panic_button()
{
panic = digitalRead(8);
{
panic = digitalRead(8);

if(panic == HIGH) {

Serial.println(panic);
String cmd = "AT+CIPSTART=\"TCP\",\"";

cmd += IP;
cmd += "\",80";
Serial.println(cmd);
esp8266.println(cmd);

delay(2000);

if(esp8266.find("Error"))

{
return;
}

Infine, allega queste informazioni al campo "&field3=".

cmd = msg ;
cmd += "&field3="; 
cmd += panic;
cmd += "\r\n";

Serial.print("AT+CIPSEND=");
esp8266.print("AT+CIPSEND=");
Serial.println(cmd.length());
esp8266.println(cmd.length());

if(esp8266.find(">"))

{
Serial.print(cmd);
esp8266.print(cmd);
}

else

{
Serial.println("AT+CIPCLOSE");
esp8266.println("AT+CIPCLOSE");

//Resend...
error=1;

}

Funzione loop()

Nella funzione loop() viene chiamata la funzione panic_button() per verificare se è attiva una richiesta di invio di allarme da parte del paziente, poi viene chiamata la funzione timer usando t.update():

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 1857 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Send this to a friend