Зуммер

Artem Khe

✩✩✩✩✩✩✩
21 Дек 2025
8
0
Оформи код соответствующим тэгом, см. Правила
Вообщем идея такая:если кол не равен полученному, то зумер пищит одну секунду. Но почему-то зуммер пищит без остановки и на секунду прекращает, когда я ввожу неверный код:
#include <Keypad.h>
String f = "2121";

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
{'1', '4', '7', '*'},
{'2', '5', '8', '0'},
{'3', '6', '9', '#'},
{'A', 'B', 'C', 'D'}
};
byte rowPins[ROWS] = {6, 5, 4, 3};
byte colPins[COLS] = {10, 9, 8, 7};
String s = "";
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup() {
pinMode(1, OUTPUT);
}

void loop() {
if (s.length() < 4) {
char customKey = customKeypad.getKey();
if (customKey) {
s += customKey;
}
} else {
if (s.length() == 4) {
if (s != f) {
digitalWrite(1, HIGH);
delay(1000);
digitalWrite(1, LOW);
s = "";
} else {
s = "";
}
} else {
s = "";
}
}

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,348
1,327
Москва
1. Хорошо бы код вставлять с помощью соответствующего тега. А перед этим сделать в ардуино иде автоформат. тогда читать его будет можно. А так смотреть где условия начинаются и заканчиваются сложно и не хочется.
2. Добавляем в код Serial и смотрим как он работает, выводим в монитор порта промежуточные данные, начинать лучше с того места где выполняется условие на подачу сигнала. Ну на время отладки подачу можно отключить, что бы писк не задолбал.
3. Самое главное. На пине 1 (если это ардуино нано) обычно стоит хардварный UART по которому идет прошивка. Соответственно надо а) указывать конроллер б) приводить схему . Точно надо выводить звук на 1ый пин ? А если сделать код который будет 1 сек. пишать, 1 паузу безо всяких условий , будет работать корректно ?
 
  • Лойс +1
Реакции: Artem Khe

Bruzzer

★★★★✩✩✩
23 Май 2020
784
242
Но почему-то зуммер пищит без остановки и на секунду прекращает, когда я ввожу неверный код:
Если работает в точности наоборот, то может просто зумер включается не 1 а 0.
 

bort707

★★★★★★✩
21 Сен 2020
3,429
985
Вот это что за ужас:
C++:
if (s.length() < 4) {
    ....
  }
  else
  {
    if (s.length() == 4) {
      if (s != f) {
       ...
       s = "";
      }
      else
      {
        s = "";
      }
    }
    else
    {
      s = "";
    }
  }
Зачем три else, которые делают одно и то же? В глазах не рябит еще?
Достаточно просто вынести обнуление строки за скобки, раз оно у вас выполняется в любом случае
C++:
 if (s.length() < 4) {
    ....
  }
  else
  {
    if (s.length() == 4) {
      if (s != f) {
       ...
      
      }
      s = "";
  }