#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define ADXL345_ADDR 0x53
#define POWER_CTL 0x2D
#define MOTION_VARIATION_THRESHOLD 5
int16_t prevX = 0, prevY = 0, prevZ = 0;
void setup() {
Serial.begin(115200);
Wire.begin();
lcd.init();
lcd.backlight();
lcd.print("Init...");
delay(500);
lcd.clear();
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(POWER_CTL);
Wire.write(0x08);
Wire.endTransmission();
delay(100);
}
void loop() {
int16_t x, y, z;
readADXL345(x, y, z);
bool motionDetected = abs(x - prevX) > MOTION_VARIATION_THRESHOLD ||
abs(y - prevY) > MOTION_VARIATION_THRESHOLD ||
abs(z - prevZ) > MOTION_VARIATION_THRESHOLD;
prevX = x; prevY = y; prevZ = z;
lcd.clear();
if (!motionDetected) {
lcd.setCursor(0, 0);
lcd.print("Apnea Detected");
} else {
lcd.setCursor(0, 0);
lcd.print("No Apnea");
}
lcd.setCursor(0, 1);
lcd.print("X:");
lcd.print(x);
Serial.print("X:"); Serial.print(x);
Serial.print(" Y:"); Serial.print(y);
Serial.print(" Z:"); Serial.println(z);
delay(2000);
}
void readADXL345(int16_t &x, int16_t &y, int16_t &z) {
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(0x32);
Wire.endTransmission(false);
Wire.requestFrom(ADXL345_ADDR, 6, true);
x = Wire.read() | (Wire.read() << 8);
y = Wire.read() | (Wire.read() << 8);
z = Wire.read() | (Wire.read() << 8);
}