#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MPU6050.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// ---------- Pin Definitions ----------
#define ONE_WIRE_BUS 2 // DS18B20 data pin
#define BUZZER_PIN 8
#define SD_CS_PIN 10
#define OLED_RESET -1 // Reset pin for OLED (not used)
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// ---------- Objects ----------
Adafruit_MPU6050 mpu;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature tempSensor(&oneWire);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
File dataFile;
// ---------- Thresholds ----------
float vibrationThreshold = 1.5; // Acceleration in g
float temperatureThreshold = 60.0; // Celsius
void setup() {
Serial.begin(9600);
Wire.begin();
tempSensor.begin();
mpu.begin();
pinMode(BUZZER_PIN, OUTPUT);
// OLED Setup
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED not found!");
}
display.clearDisplay();
// SD Card Setup
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD Card initialization failed!");
} else {
Serial.println("SD Card OK.");
}
}
void loop() {
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
float accelX = a.acceleration.x;
float accelY = a.acceleration.y;
float accelZ = a.acceleration.z;
float totalVibration = sqrt(accelX * accelX + accelY * accelY + accelZ * accelZ);
tempSensor.requestTemperatures();
float temperature = tempSensor.getTempCByIndex(0);
// -------- Display on OLED --------
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Vib: "); display.println(totalVibration, 2);
display.print("Temp: "); display.println(temperature, 1);
display.display();
// -------- Log to SD Card --------
dataFile = SD.open("log.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(millis());
dataFile.print(", ");
dataFile.print(totalVibration, 2);
dataFile.print(", ");
dataFile.println(temperature, 1);
dataFile.close();
}
// -------- Trigger Alert --------
if (totalVibration > vibrationThreshold || temperature > temperatureThreshold) {
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
delay(1000); // 1 second interval
}