(Arduino Mega2560)键盘密码检查

时间:2018-02-27 20:00:29

标签: arduino passwords lcd keypad numeric-keypad

我正在研究一个学校项目,基本上我必须创建一个锁定系统,在输入正确的代码时打开一个虚拟门。我们被要求在实际构建之前模拟我们的系统。所以,我在Proteus(Labcenter Electronics的仿真软件)中制作了以下电路: Keypad circuit

抱歉,我无法发布图片。

以下是我的系统应该做的事情:变量包含正确的代码,用户必须在键盘上键入代码,如果正确,则绿色LED亮起,LCD屏幕显示“Acces Granted!”如果代码错误,屏幕将显示“拒绝访问!”。这是一个基本的系统,但我试图让它尽可能简单/简短(我必须在口头演示中解释它,所以越简单越好)由于某种原因,我无法让我的代码工作。理想情况下,我想让液晶显示器显示每个字符的*,在真实的安全系统上喜欢,但我也没有设法做到这一点。我一直在研究它几个小时,尝试不同的变体等等。但似乎没有任何东西像我想要的那样工作。顺便说一句,我的电路工作得很好,因此我的代码的初始化部分也是正确的。任何人都可以帮我弄清楚我的代码有什么问题,以及如何让它变得更好?

到目前为止,这是我的代码:

#include <LiquidCrystal.h>
#include <Keypad.h>

//define LED pins
#define redLED 11
#define greenLED 10

String codeSerrure = "87362";   //correct code that opens the imaginative gate
String enteredCode = "";
int keyPressed;

const byte rows = 4;
const byte cols = 3;

char touches_digicode [rows] [cols] = {

  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins [rows] = {25, 26, 27, 28};
byte colPins [cols] = {24, 23, 22};

Keypad leDigicode = Keypad( makeKeymap(touches_digicode), rowPins, colPins, rows, cols);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);


void setup(){
  lcd.begin(16, 2);
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  digitalWrite(redLED, HIGH);
}

void loop(){
  lcd.setCursor(0,0);
  lcd.print(" Entrez le code");

  keyPressed = leDigicode.getKey();
  enteredCode += String(keyPressed);
  if(enteredCode.length() >= 5){
    if(enteredCode == codeSerrure){
      digitalWrite(greenLED, HIGH);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("  Acces autorise!");
      delay(4000);
      digitalWrite(greenLED, LOW);
      digitalWrite(redLED, HIGH);
      enteredCode = "";
    }
    else{
      digitalWrite(redLED, HIGH);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("  Acces refuse!");
      delay(4000);
      enteredCode = "";
    }
  }
  if(keyPressed == "#"){
    lcd.clear();
    enteredCode = "";
  }
}

问题是当我在模拟软件中运行此代码时,液晶显示屏显示“Acces refuse!”并且红色LED亮起。无论我按哪个键(在键盘上)都没有任何反应。所以问题是我的代码直接跳转到else语句,推断输入的密码是错误的(尽管实际上没有输入密码)。我认为错误就在这里:

keyPressed = leDigicode.getKey();
  enteredCode += String(keyPressed);
  if(enteredCode.length() >= 5){
    if(enteredCode == codeSerrure){
顺便说一句,请原谅法语,我是法国人。另外,我忘了说,#键应该清除输入的代码。任何解释,代码示例或链接都会有所帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

方法getKey()返回一个char;所以它总是返回一个字符! 例如,如果没有按下任何键,则返回NO_KEY(=&#39; \ 0&#39;)。

您编写代码的方式,您可以使用&#34; \ 0 \ 0 \ 0 \ 0 \ 0&#34;快速填充enteredCode字符串。 使用以下命令更改您的代码:

keyPressed = leDigicode.getKey();
if (keyPressed)   {
    enteredCode += String(keyPressed);
    // following is for debug
    // lcd.print(keyPressed);   delay(300);
}
if(enteredCode.length() >= 5) {   ...  

答案 1 :(得分:0)

感谢大家的帮助,我终于设法编写了我想要的所有功能,没有任何故障,代码更清晰。我知道我的代码并不完美,可能会有所改进,所以如果有人仍感兴趣,欢迎提出任何修改建议。无论如何,这是我感兴趣的最终代码:

didFailToRegisterForRemoteNotificationsWithError

你可以看到我改变了很多东西。我用一个while循环重写了密码检查功能,并集成了一个功能,每次按下一个键时,LCD上都会显示*。我还为*和#键添加了擦除功能。而且由于我的液晶显示器不支持é和è等字符(我需要它们用于法语单词,为什么我们必须使一切变得更复杂),我创建了自己的。我也对我的电路做了一个小修改,我取下了电位器并在我的代码中指定了LCD的对比度值。这是完成的原理图:

Can't post pictures yet

感谢所有帮助我的人!