Подредактировать скетч

Ребята всем привет! Есть 24 нефиксируемых кнопки, подключенные к трем 74нс165. нужно изменить код, чтобы работало так: кнопку нажал-включил, еще нажал- выключил.

#define latchPin 10 // защелка 12 вывод м/c
#define clockPin 11 // Синхронизация 11 вывод м/c
#define dataPin 12 // Данные 14 вывод м/c

#define clkPin 7 // CLK
#define latchInPin 4 // защелка
#define dateInPin 6 // DATE IN

uint8_t mk_C = 1, dateIn = 0;
uint8_t mk = 0b00000000;

void setup()
{
// инициализация пинов как выходы
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
// инициализация пинов как входы
pinMode(clkPin, OUTPUT);
pinMode(latchInPin, OUTPUT);
pinMode(dateInPin, INPUT); // инициализация пина как вход
digitalWrite(latchInPin, 1);
digitalWrite(clkPin, 0);
}

void date_In() // Подпрограмма для чтения одной 74HC165
{
mk_C = 0;
mk = 0;
do { // Бесконечный цыкл пока (mk_C < 8).
mk = mk << 1; // Сдвинуть на один бит в лево.
mk = mk + digitalRead(dateInPin); // Прочесть и записать один бит.
digitalWrite(clkPin, 1); // Переключить один бит.
//delay(1);
digitalWrite(clkPin, 0); // Подготовить для переключения одного бита.
//delay(1);
mk_C ++;
} while (mk_C < 8); // Выполняем до тех пор пока CLK меньше 8 тактов.
// delay(1);
}

void loop()
{
digitalWrite(latchInPin, 0); // Прочесть и зиблокировать CLK всех 74HC165. Вывести 1-й бит.
digitalWrite(latchInPin, 1); // Снятие блокировки CLK.
digitalWrite(latchPin, LOW); // Защёлка для приёма
date_In(); // Прочитать первую 74HC165.
shiftOut(dataPin, clockPin, MSBFIRST, mk); // отправляем данные в 1-ю м/с 74HC595
date_In(); // Прочитать вторую 74HC165.
shiftOut(dataPin, clockPin, MSBFIRST, mk); // отправляем данные во 2-ю м/с 74HC595
date_In(); // Прочитать третью 74HC165.
shiftOut(dataPin, clockPin, MSBFIRST, mk); // отправляем данные в 3-ю м/с 74HC595
digitalWrite(latchPin, HIGH); // Защёлка передача
}

Понятно.

1 лайк

А я не совсем понял. Это всё сразу нажать нужно или только одну.? А если одну, то какую? А если не одную то сколько? А если больше? А если меньше? А если не нажать? А если нажать не в той последовательности? А если не нажать, но сработает? А если не сработает, а ты уже нажал? А если нажал, а уже не хочется? А если хочется нажать, а не нажимается? А если нажимать чаще двух раз в секунду? А если держать всё кнопки нажатыми одновременно? А если не нажимать всё кнопки одновременно? А если отпустить кнопку? А если всё кнопки отпустить? А если пол мыть и кнопки нажимать? А если пол мыть и кнопки не нажимать? А если нажимать кнопки и не нажимать одновременно? А если одновременно? А если если?…

Остановите меня…

4 лайка

lol :wink:

Когда хотя-бы читать научишься, тогда и приходи.

скетч уже настроен так, что если подаешь кнопкой на определенный вход микросхемы питание, то на соответствующем выходе микросхемы появляется питание и включает реле. но чтобы реле было включено нужно удерживать кнопку, то есть скетч настроен под кнопку с фиксацией, а мне нужно чтобы было настроено на кнопку без фиксации.

Десять баксов… с кнопки.

1 лайк

сесть попой на все кнопки сразу?

Что? Обратный отсчёт старта ракеты на Марс?

Демпингуете! ФАС на Вас нет!

Попробуй этот скрипт

#define latchPin 10 // защелка 12 вывод м/c
#define clockPin 11 // Синхронизация 11 вывод м/c
#define dataPin 12 // Данные 14 вывод м/c

#define clkPin 7 // CLK
#define latchInPin 4 // защелка
#define dateInPin 6 // DATE IN

uint8_t mk_C = 1, dateIn = 0;
uint8_t mk = 0b00000000;
uint8_t previousState[3] = {0}; // Хранение предыдущих состояний кнопок для всех 74HC165
uint8_t currentState[3] = {0};  // Текущее состояние кнопок для всех 74HC165
uint8_t outputState[3] = {0};   // Состояние выходов для всех 74HC595

void setup() {
  // инициализация пинов как выходы
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  // инициализация пинов как входы
  pinMode(clkPin, OUTPUT);
  pinMode(latchInPin, OUTPUT);
  pinMode(dateInPin, INPUT); // инициализация пина как вход
  digitalWrite(latchInPin, 1);
  digitalWrite(clkPin, 0);
}

uint8_t readShiftRegister() {
  mk_C = 0;
  uint8_t value = 0;
  do {
    value = value << 1;
    value = value + digitalRead(dateInPin);
    digitalWrite(clkPin, 1);
    digitalWrite(clkPin, 0);
    mk_C++;
  } while (mk_C < 8);
  return value;
}

void updateState() {
  digitalWrite(latchInPin, 0); // Прочесть и заблокировать CLK всех 74HC165.
  digitalWrite(latchInPin, 1); // Снятие блокировки CLK.
  
  for (int i = 0; i < 3; i++) {
    currentState[i] = readShiftRegister(); // Чтение состояния текущей 74HC165
    for (int bit = 0; bit < 8; bit++) {
      uint8_t mask = 1 << bit;
      // Проверка изменения состояния кнопки
      if ((currentState[i] & mask) != (previousState[i] & mask)) {
        // Если кнопка нажата (переключена)
        if (currentState[i] & mask) {
          // Переключение состояния выхода
          outputState[i] ^= mask;
        }
      }
    }
    previousState[i] = currentState[i];
  }
}

void sendOutputState() {
  digitalWrite(latchPin, LOW); // Защёлка для приёма
  for (int i = 0; i < 3; i++) {
    shiftOut(dataPin, clockPin, MSBFIRST, outputState[i]); // Отправка данных в 74HC595
  }
  digitalWrite(latchPin, HIGH); // Защёлка передача
}

void loop() {
  updateState();  // Обновление состояния кнопок и выходов
  sendOutputState(); // Отправка состояния выходов на 74HC595
  delay(50); // Небольшая задержка для устранения дребезга кнопок
}