const int POT_PIN = A2;
const int LDR_PIN = A1;
const int THERMISTOR_PIN = A0;
const int BUZZER_PIN = 8;
const int ALARM_LED_PIN = 13;
const float VOLTAGE_MIN = 1.0;
const float VOLTAGE_MAX = 4.0;
const int LIGHT_MIN = 200;
const int LIGHT_MAX = 800;
const float TEMP_MIN = 10.0;
const float TEMP_MAX = 35.0;
const int BUFFER_SIZE = 100;
float voltageHistory[BUFFER_SIZE];
int lightHistory[BUFFER_SIZE];
float tempHistory[BUFFER_SIZE];
int bufferIndex = 0;
bool bufferFull = false;
const unsigned long MEASURE_INTERVAL = 500;
unsigned long lastMeasureTime = 0;
const int NUM_READINGS = 10;
int voltageReadings[NUM_READINGS] = {0};
int voltageReadIndex = 0;
int voltageTotal = 0;
void setup() {
pinMode(ALARM_LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
for (int i = 0; i < NUM_READINGS; i++) {
voltageReadings[i] = analogRead(POT_PIN);
voltageTotal += voltageReadings[i];
}
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastMeasureTime >= MEASURE_INTERVAL) {
lastMeasureTime = currentTime;
float voltage = readVoltage();
int lightLevel = readLightLevel();
float temperature = readTemperature();
saveToHistory(voltage, lightLevel, temperature);
bool alarm = checkAlarm(voltage, lightLevel, temperature);
handleAlarm(alarm);
}
}
float readVoltage() {
voltageTotal -= voltageReadings[voltageReadIndex];
voltageReadings[voltageReadIndex] = analogRead(POT_PIN);
voltageTotal += voltageReadings[voltageReadIndex];
voltageReadIndex = (voltageReadIndex + 1) % NUM_READINGS;
int average = voltageTotal / NUM_READINGS;
float voltage = average * (5.0 / 1023.0);
return voltage;
}
int readLightLevel() {
return analogRead(LDR_PIN);
}
float readTemperature() {
int raw = analogRead(THERMISTOR_PIN);
float voltage = raw * (5.0 / 1023.0);
float tempC = (voltage - 0.5) * 100.0;
return tempC;
}
void saveToHistory(float voltage, int light, float temp) {
voltageHistory[bufferIndex] = voltage;
lightHistory[bufferIndex] = light;
tempHistory[bufferIndex] = temp;
bufferIndex = (bufferIndex + 1) % BUFFER_SIZE;
if (bufferIndex == 0) {
bufferFull = true;
}
}
bool checkAlarm(float voltage, int light, float temp) {
bool voltageAlarm = (voltage < VOLTAGE_MIN || voltage > VOLTAGE_MAX);
bool lightAlarm = (light < LIGHT_MIN || light > LIGHT_MAX);
bool tempAlarm = (temp < TEMP_MIN || temp > TEMP_MAX);
return voltageAlarm || lightAlarm || tempAlarm;
}
void handleAlarm(bool alarm) {
if (alarm) {
digitalWrite(ALARM_LED_PIN, HIGH);
tone(BUZZER_PIN, 1000, 200);
} else {
digitalWrite(ALARM_LED_PIN, LOW);
}
}