Загрузка данных
#include <Servo.h>
// Настройка пинов клавиатуры 4x4 согласно схеме:
// Строки (Rows) -> пины D8, D7, D6, D5
// Столбцы (Cols) -> пины D4, D3, D2, D1
const byte ROW_PINS[4] = {8, 7, 6, 5};
const byte COL_PINS[4] = {4, 3, 2, 1};
const char KEYMAP[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
const char NO_KEY = '\0';
// Настройка пинов исполнительных устройств
const byte LAMPS_PIN = 13; // Две лампочки (светодиода) на макетной плате
const byte SERVO_PIN = 12; // Сервопривод
// Пины для RGB-светодиода (согласно вашему уточнению подключения)
const byte RGB_R_PIN = 11; // Красный цвет (Red) -> пин 11
const byte RGB_G_PIN = 10; // Зеленый цвет (Green) -> pin 10
const byte RGB_B_PIN = 9; // Синий цвет (Blue) -> pin 9
Servo myServo;
// Функция попинового сканирования матрицы клавиатуры без внешних библиотек
char scanKeypad() {
for (byte row = 0; row < 4; row++) {
digitalWrite(ROW_PINS[row], LOW);
pinMode(ROW_PINS[row], OUTPUT);
delayMicroseconds(5);
for (byte col = 0; col < 4; col++) {
if (digitalRead(COL_PINS[col]) == LOW) {
pinMode(ROW_PINS[row], INPUT);
return KEYMAP[row][col];
}
}
pinMode(ROW_PINS[row], INPUT);
}
return NO_KEY;
}
// Логика обработки нажатий на клавиши
void handleKey(char key) {
switch (key) {
case '1':
digitalWrite(LAMPS_PIN, HIGH); // Включить лампочки на pin 13
break;
case '2':
digitalWrite(LAMPS_PIN, LOW); // Выключить лампочки на pin 13
break;
case '3':
myServo.write(90); // Включить серво (поворот на 90 градусов)
break;
case '4':
myServo.write(0); // Выключить серво (возврат в 0 градусов)
break;
case '5':
digitalWrite(RGB_R_PIN, HIGH); // Включить Красный свет RGB
break;
case '6':
digitalWrite(RGB_R_PIN, LOW); // Выключить Красный свет RGB
break;
case '7':
digitalWrite(RGB_G_PIN, HIGH); // Включить Зеленый свет RGB
break;
case '8':
digitalWrite(RGB_G_PIN, LOW); // Выключить Зеленый свет RGB
break;
case '9':
digitalWrite(RGB_B_PIN, HIGH); // Включить Синий свет RGB
break;
case '0':
digitalWrite(RGB_B_PIN, LOW); // Выключить Синий свет RGB
break;
}
}
void setup() {
// Инициализация строк и столбцов клавиатуры (используем внутреннюю подтяжку INPUT_PULLUP)
for (byte col = 0; col < 4; col++) {
pinMode(COL_PINS[col], INPUT_PULLUP);
}
for (byte row = 0; row < 4; row++) {
digitalWrite(ROW_PINS[row], LOW);
pinMode(ROW_PINS[row], INPUT);
}
// Конфигурация пинов светодиодов на выход
pinMode(LAMPS_PIN, OUTPUT);
digitalWrite(LAMPS_PIN, LOW);
pinMode(RGB_R_PIN, OUTPUT);
pinMode(RGB_G_PIN, OUTPUT);
pinMode(RGB_B_PIN, OUTPUT);
digitalWrite(RGB_R_PIN, LOW);
digitalWrite(RGB_G_PIN, LOW);
digitalWrite(RGB_B_PIN, LOW);
// Инициализация сервопривода
myServo.attach(SERVO_PIN);
myServo.write(0); // Стартовое положение
}
void loop() {
static char candidateKey = NO_KEY;
static char stableKey = NO_KEY;
static unsigned long candidateSince = 0;
char reading = scanKeypad();
if (reading != candidateKey) {
candidateKey = reading;
candidateSince = millis();
}
// Программный антидребезг контактов (35 мс удержания для регистрации нажатия)
if ((millis() - candidateSince >= 35UL) && (stableKey != candidateKey)) {
stableKey = candidateKey;
if (stableKey != NO_KEY) {
handleKey(stableKey);
}
}
}