// Pin Definitions
const int MQ137Pin = 34;          // Analog pin for MQ137 sensor
const int MotorDrive = 25;        // for Motor Drive
const int PumpDrive = 33;         // for Pump Drive
const int OnOffButton = 26;       // Digital pin for the button
const int OverrideButton = 27;    // Digital pin for the override button
const int OverrideIndicator = 14; // Override Indicator Led

// Threshold for MQ137
const int threshold = 400;       // Adjust this value based on your calibration

// Debounce variables for OnOffButton
bool buttonState = LOW;
bool lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 10;
const unsigned long debounceDelayOverride = 100;

// Debounce variables for OverrideButton
bool overrideState = LOW;
bool lastOverrideState = LOW;
unsigned long lastOverrideDebounceTime = 0;

// Motor and pump state
bool motorWaterPumpState = LOW;
bool overrideEnabled = false;

void setup() {
  Serial.begin(115200);
  pinMode(MQ137Pin, INPUT);
  pinMode(MotorDrive, OUTPUT);
  pinMode(PumpDrive, OUTPUT);
  pinMode(OverrideIndicator, OUTPUT);
  pinMode(OnOffButton, INPUT_PULLUP);
  pinMode(OverrideButton, INPUT_PULLUP);
  digitalWrite(MotorDrive, LOW);
  digitalWrite(PumpDrive, LOW);
  digitalWrite(OverrideIndicator, LOW);
}

void loop() {
  // Handle OverrideButton debounce
  handleOverrideButton();

  if (!overrideEnabled) {
    int sensorValue = analogRead(MQ137Pin);
    Serial.print("MQ137 Value: ");
    Serial.println(sensorValue);

    // Check if the sensor value exceeds the threshold
    if (sensorValue >= threshold) {
      motorWaterPumpState = HIGH;
    } else {
      motorWaterPumpState = LOW;
    }

    delay(100); // Small delay to prevent rapid toggling
  } else {
    // Handle OnOffButton debounce
    handleOnOffButton();
  }

  // Update the relay state
  digitalWrite(MotorDrive, motorWaterPumpState);
  digitalWrite(PumpDrive, motorWaterPumpState);
  digitalWrite(OverrideIndicator, overrideEnabled);
}

void handleOnOffButton() {
  bool readOnOff = digitalRead(OnOffButton);

  // Debouncing the button
  if (readOnOff != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (readOnOff != buttonState) {
      buttonState = readOnOff;
      if (buttonState == LOW) {
        // Toggle motor and water pump state
        motorWaterPumpState = !motorWaterPumpState;
      }
    }
  }

  // Save the readOnOff state
  lastButtonState = readOnOff;
}

void handleOverrideButton() {
  bool readOverride = digitalRead(OverrideButton);

  // Debouncing the override button
  if (readOverride != lastOverrideState) {
    lastOverrideDebounceTime = millis();
  }

  if ((millis() - lastOverrideDebounceTime) > debounceDelayOverride) {
    if (readOverride != overrideState) {
      overrideState = readOverride;
      if (overrideState == LOW) {
        // Toggle override state
        Serial.println("Overide eneble");
        overrideEnabled = !overrideEnabled;
      }
    }
  }

  // Save the readOverride state
  lastOverrideState = readOverride;
}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module