#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Display parameters
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Clap detection parameters
const int minClapCount = 3;
const int maxClapCount = 5;
const int clapThreshold = 100; // Increase this value to make the system less sensitive
const unsigned long clapTimeout = 300; // Adjust this value to better recognize consecutive claps
const unsigned long displayTimeout = 3000;
int clapCount = 0;
unsigned long lastClapTime = 0;
unsigned long displayStartTime = 0;
bool displayActive = false;
void setup() {
Serial.begin(115200);
pinMode(13, OUTPUT);
// Initialize the display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Waiting for passcode");
display.display();
}
void displayResult(bool accessGranted) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
if (accessGranted) {
display.println("Access granted");
display.setTextSize(2);
display.setCursor(0, 20);
display.print((char)0x221A); // Tick symbol (✓)
} else {
display.println("Access denied");
display.setTextSize(2);
display.setCursor(0, 20);
display.print((char)0x00D7); // Cross symbol (✗)
}
display.display();
displayStartTime = millis();
displayActive = true;
}
void loop() {
int sample = analogRead(A0);
int soundLevel = abs(sample - 512);
Serial.println(sample);
if (soundLevel > clapThreshold) {
unsigned long currentTime = millis();
if (currentTime - lastClapTime > clapTimeout) {
clapCount = 1;
} else {
clapCount++;
}
lastClapTime = currentTime;
if (clapCount >= minClapCount && clapCount <= maxClapCount) {
digitalWrite(13, clapCount == minClapCount ? HIGH : LOW);
displayResult(clapCount == minClapCount);
}
// Wait for the clap sound to end
while (soundLevel > clapThreshold) {
sample = analogRead(A0);
soundLevel = abs(sample - 512);
delay(10);
}
}
if (displayActive && (millis() - displayStartTime > displayTimeout)) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Waiting for passcode");
display.display();
displayActive = false;
clapCount = 0;
}
}
Loading
ssd1306
ssd1306