Загрузка данных


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