//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//Libraries for BME280
#include <Adafruit_Sensor.h>
#include "MAX30100_PulseOximeter.h"
//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
#define REPORTING_PERIOD_MS 1000
// Create a PulseOximeter object
// Time at which the last beat occurred
uint32_t tsLastReport = 0;
#define BAND 433E6
//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//BME280 definition
#define SDA 21
#define SCL 22
PulseOximeter pox;
//packet counter
int readingID = 0;
int counter = 0;
String LoRaMessage = "";
float oxygen;
int spo2;
void getReadings(){
Wire.setClock(10000);
oxygen= pox.getHeartRate();
spo2=pox.getSpO2();
Serial.println("♥ Beat!");
}
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
//Initialize OLED display
void startOLED(){
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("LORA SENDER");
}
//Initialize LoRa module
void startLoRA()
{
Serial.println("LoRa Sender Test");
//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);
while (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("LoRa Initialization OK!");
display.setCursor(0,10);
display.clearDisplay();
display.print("LoRa Initializing OK!");
display.display();
delay(2000);
}
void displayReadings(){
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.print("Heart rate:");
display.setCursor(0,20);
display.setTextSize(2);
display.setCursor(20,23);
display.print(pox.getHeartRate());
display.display();
display.setTextSize(1);
display.setCursor(0,30);
display.setTextSize(1);
display.print(pox.getSpO2());
Serial.print("Sending packet: ");
Serial.println(readingID);
readingID++;
}
void sendReadings() {
LoRaMessage = String(readingID) + "/" + String(oxygen) + "&" + String(spo2);
//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print(LoRaMessage);
LoRa.endPacket();
Serial.println("Packet Sent!");
displayReadings();
delay(500);
}
void setup() {
//initialize Serial Monitor
Serial.begin(115200);
startOLED();
startLoRA();
Serial.print("Initializing pulse oximeter..");
// Initialize sensor
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
}
void loop() {
pox.update();
// Grab the updated heart rate and SpO2 levels
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Heart rate:");
Serial.print(pox.getHeartRate());
Serial.print("bpm / SpO2:");
Serial.print(pox.getSpO2());
Serial.println("%");
tsLastReport = millis();
}
sendReadings();
getReadings();
}

Do you have a question?
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
