// LDR pin definitions
#define LDR_ANALOG_PIN A0  // Analog input pin connected to LDR A0
#define LDR_DIGITAL_PIN D10 // Digital input pin connected to LDR D0

// Keypad pin definitions
const int rowPins[4] = {D2, D3, D4, D5};  // Row pins of the 4x4 keypad
const int colPins[4] = {D6, D7, D8, D9};  // Column pins of the 4x4 keypad

// 4x4 Keypad layout
const char keys[4][4] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

void setup() {
  // Initialize Serial communication
  Serial.begin(9600);
  
  // Set up LDR pins
  pinMode(LDR_ANALOG_PIN, INPUT); // Analog pin for continuous light measurement
  pinMode(LDR_DIGITAL_PIN, INPUT); // Digital pin for threshold-based light detection
  
  // Set up keypad row pins as outputs
  for (int i = 0; i < 4; i++) {
    pinMode(rowPins[i], OUTPUT);
    digitalWrite(rowPins[i], HIGH); // Set rows HIGH initially
  }
  
  // Set up keypad column pins as inputs with pullup resistors
  for (int i = 0; i < 4; i++) {
    pinMode(colPins[i], INPUT_PULLUP);
  }
}

void loop() {
  // Read LDR analog value
  int ldrAnalogValue = analogRead(LDR_ANALOG_PIN);
  Serial.print("Analog LDR Value: ");
  Serial.println(ldrAnalogValue);
  
  // Read LDR digital value
  int ldrDigitalValue = digitalRead(LDR_DIGITAL_PIN);
  Serial.print("Digital LDR Value: ");
  Serial.println(ldrDigitalValue == HIGH ? "Light Detected" : "Low Light");
  
  // Scan keypad for keypresses
  scanKeypad();
  
  // Small delay to avoid rapid looping
  delay(500);
}

// Function to scan the 4x4 keypad and detect keypresses
void scanKeypad() {
  for (int i = 0; i < 4; i++) {
    // Set the current row LOW
    digitalWrite(rowPins[i], LOW);
    
    // Check all columns for a LOW signal (indicating a key press)
    for (int j = 0; j < 4; j++) {
      if (digitalRead(colPins[j]) == LOW) {
        // Key detected, print it to Serial Monitor
        Serial.print("Key Pressed: ");
        Serial.println(keys[i][j]);
        
        // Wait for key release (debouncing)
        while (digitalRead(colPins[j]) == LOW);
        delay(300); // Delay for debouncing
      }
    }
    
    // Reset the row back to HIGH
    digitalWrite(rowPins[i], HIGH);
  }
}