#include <Wire.h> // I2C Library
#include <Adafruit_GFX.h> // OLED Library
#include <Adafruit_SSD1306.h> // OLED Library
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include <DallasTemperature.h> // Temperature sensor Library
#include <Adafruit_MPU6050.h>
#include <LiquidCrystal_I2C.h>
// LCD Display Settings
#define LCD_ADDR 0x27 // LCD I2C address
#define LCD_COLUMNS 20 // Number of columns
#define LCD_ROWS 4 // Number of rows
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLUMNS, LCD_ROWS); // Declaring the display name (lcd)
// OLED Display Settings
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(OLED_RESET); // Declaring the display name (display)
// Accelerometer Setting
Adafruit_MPU6050 mpu;
sensors_event_t accelerometer, gyroscope, temp;
const float STEP_THRESHOLD = 1.5; // Adjust this value to fine-tune step detection
float accMag, gyroMag;
int stepCount = 0;
// Temperature Sensor Setting
#define ONE_WIRE_BUS 3 // Define input pin
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature temperatureSensors(&oneWire);
// Pulse Generator Setting
#define PULSE_PER_BEAT 1
#define PULSE_PIN 2
#define SAMPLING_INTERVAL 1000
volatile uint16_t pulse;
uint16_t count;
float heartRate;
// Interrupt function for pulse generator
void HeartRateInterrupt() {
pulse++;
}
void setup() {
// Setup serial monitor
Serial.begin(115200);
Serial.println("Started Temperature sensor...");
lcd.init();
lcd.backlight();
// Setup OLED display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
delay(2000);
display.clearDisplay();
// Setup Temperature sensor
temperatureSensors.begin();
// Setup Accelerometer
while (!mpu.begin()) {
Serial.println("Accelerometer not working.");
delay(1000);
}
Serial.println("Accelerometer is ready.");
// Setup pulse generator
pinMode(PULSE_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(PULSE_PIN), HeartRateInterrupt, RISING);
Serial.println("Started Pulse sensor...");
}
void loop() {
// Codes for timing
static unsigned long startTime;
if (millis() - startTime < SAMPLING_INTERVAL) {
return;
}
startTime = millis();
// Get temperature readings
temperatureSensors.requestTemperatures();
float temperature = temperatureSensors.getTempCByIndex(0);
// Output temperature to LCD Display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
// Output temperature to Serial monitor
Serial.print("Body Temperature: ");
Serial.print(temperature);
Serial.println(" C");
// Calculate and output heart rate
count = pulse;
pulse = 0;
heartRate = map(count, 0, 220, 0, 220);
lcd.setCursor(0, 1);
lcd.print("HR: ");
lcd.print(String(heartRate, 2) + " BPM");
Serial.println("Heart Rate: " + String(heartRate, 2) + " BPM");
display.setCursor(0, 10);
display.print("HR: ");
display.print(String(heartRate, 2) + " BPM");
}