#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define SPO2_ADDRESS 0x11 // I2C address of the custom SPO2 sensor
#define MQ2_PIN 34 // Analog pin for MQ2 sensor
#define CO2_THRESHOLD 2500 // Updated CO2 threshold for apnea detection
// LCD I2C address (0x27 or 0x3F depending on your module)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
Serial.println("Starting SPO2 + MQ2 Monitor");
// Initialize I2C for SPO2 and LCD
Wire.begin(21, 22); // SDA = GPIO 21, SCL = GPIO 22
// Initialize LCD
lcd.begin(16, 2);
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(2000);
}
void loop() {
byte spo2 = 0;
// Request SPO2 value from custom chip
Wire.requestFrom(SPO2_ADDRESS, 1);
if (Wire.available()) {
spo2 = Wire.read();
}
// Read CO2 from MQ2 sensor
int co2Value = analogRead(MQ2_PIN);
// Print to Serial Monitor
Serial.print("SpO2: ");
Serial.print(spo2);
Serial.print("% | CO2: ");
Serial.println(co2Value);
// Update LCD
lcd.clear();
// Line 1: SpO2 display
lcd.setCursor(0, 0);
lcd.print("SpO2: ");
lcd.print(spo2);
lcd.print("%");
// Line 2: CO2 and Apnea
lcd.setCursor(0, 1);
lcd.print("CO2: ");
lcd.print(co2Value);
if (co2Value > CO2_THRESHOLD) {
lcd.setCursor(10, 1); // Adjust to fit within 16 chars
lcd.print("Apnea");
} else {
lcd.setCursor(10, 1);
lcd.print(" OK ");
}
delay(1000);
}