#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'A', 'B', 'C', 'D'},
{'E', 'F', 'G', 'H'},
{'I', 'J', 'K', 'L'},
{'M', 'N', 'O', 'P'}
};
byte rowPins[ROWS] = {7, 6, 5, 4};
byte colPins[COLS] = {3, 2, 1, 0};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const int ledPin = 13;
unsigned long holdStart = 0;
char currentKey = NO_KEY;
bool isHolding = false;
unsigned long totalHoldTime = 0;
struct HoldData {
char key;
unsigned long holdTime;
};
const int maxRecords = 10;
HoldData holdDataArray[maxRecords];
int recordCount = 0;
void addHoldData(char key, unsigned long holdTime) {
if (recordCount < maxRecords) {
holdDataArray[recordCount++] = {key, holdTime};
} else {
holdDataArray[maxRecords - 1] = {key, holdTime};
}
for (int i = 0; i < recordCount - 1; i++) {
for (int j = 0; j < recordCount - i - 1; j++) {
if (holdDataArray[j].holdTime < holdDataArray[j + 1].holdTime) {
HoldData temp = holdDataArray[j];
holdDataArray[j] = holdDataArray[j + 1];
holdDataArray[j + 1] = temp;
}
}
}
}
void printHoldData() {
Serial.println("Сохранённые данные об удержании:");
for (int i = 0; i < recordCount; i++) {
Serial.print("Клавиша: ");
Serial.print(holdDataArray[i].key);
Serial.print(" | Время удержания: ");
Serial.print(holdDataArray[i].holdTime / 1000.0, 3);
Serial.println(" секунд");
}
}
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key != currentKey) {
currentKey = key;
holdStart = millis();
isHolding = true;
}
}
if (isHolding && currentKey != NO_KEY) {
if (!keypad.getState()) {
unsigned long holdDuration = millis() - holdStart;
totalHoldTime += holdDuration;
Serial.println(" ");
Serial.print("Отпущена клавиша : ");
Serial.println(currentKey);
Serial.print("Время удержания: ");
Serial.print(holdDuration / 1000.0, 3);
Serial.println(" секунд");
addHoldData(currentKey, holdDuration);
printHoldData();
Serial.println("Статистика удержания:");
Serial.print("Общее время удержания: ");
Serial.print(totalHoldTime / 1000.0, 3);
Serial.println(" секунд");
if (holdDuration >= 2000) {
digitalWrite(ledPin, HIGH);
Serial.print("Светодиод будет гореть");
Serial.print(holdDuration / 1000.0, 3);
Serial.println(" секунд");
delay(holdDuration);
digitalWrite(ledPin, LOW);
}
currentKey = NO_KEY;
isHolding = false;
}
}
}