// 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);
}
}