Нужна помощь с проводными соединениями и кодом

В настоящее время я работаю над механизмом блокировки двери клавиатуры (аналогично этому проекту, Замок двери клавиатуры).

Проблема с кодом, который у меня есть, заключается в том, что клавиатура, прикрепленная к моей плате, не позволяет мне ввести полный пароль. Перемещается только первое значение, отображаемое на жидкокристаллическом экране, но ни одно значение не исключается. Кроме того, кнопки, используемые для открытия и закрытия серводвигателя, работают не так, как предполагалось.

Диаграмма фритцинга

Fritzing diagram

Фото макета

Photo of breadboard

Ниже приведен код, который у меня в настоящее время есть:

//LCD config
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include <Servo.h>
#include <Keypad.h>

//Variables
int mot_min = 90;   //min servo angle  (set yours)
int mot_max = 180; //Max servo angle   (set yours)
int character = 0;
int activated = 0;
char Str[16] = {' ', ' ', ' ', ' ', ' ', ' ', '-', '*', '*', '*', ' ', ' ', ' ', ' ', ' ', ' '};
//               0    1    2    3    4    5    6    7    8    9    10   11  12    13   14  15

//Pins
Servo myservo;
int buzzer = 11;   //pin for the buzzer beep
int external = 12; //pin to inside open
int internal = 13; //pin to inside close

//Keypad config
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1', '4', '7', '*'},
  {'2', '5', '8', '0'},
  {'3', '6', '9', '#'},
  {'A', 'B', 'C', 'D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup() {
  myservo.attach(10); //attach the servo to pin D10
  pinMode(buzzer, OUTPUT);
  pinMode(external, INPUT);
  pinMode(internal, INPUT);
  //Init the screen and print the first text
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("    PASSWORD");
  lcd.setCursor(0, 1);
  lcd.print("      -***     ");
  //put the servo in the close position first
  myservo.write(mot_min);

}

void loop() {
  ///////////////EMERGENCY OPEN/CLOSE/////////
  if (digitalRead(external) == LOW) // if (digitalRead(external))
  {
    myservo.write(mot_max);
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("INSIDE  OPEN");
    activated = 2;
    analogWrite(buzzer, 240);
    delay(250);
    analogWrite(buzzer, 200);
    delay(250);
    analogWrite(buzzer, 180);
    delay(250);
    analogWrite(buzzer, 250);
    delay(250);
    analogWrite(buzzer, LOW);


    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print("WELLCOME");

    lcd.setCursor(2, 1);
    lcd.print("ELECTRONOOBS");


    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print("DOOR  OPEN");
    lcd.setCursor(2, 1);
    lcd.print("ELECTRONOOBS");
    delay(500);

  }

  if (digitalRead(internal) == LOW) // if (digitalRead(internal))
  {
    myservo.write(mot_min);
    activated = 0;
    character = 0;
    Str[6] = '-';
    Str[7] = '*';
    Str[8] = '*';
    Str[9] = '*';
    Str[10] = ' ';
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("    PASSWORD");
    lcd.setCursor(0, 1);
    lcd.print(Str);
  }

  ///////////////KEYPAD OPEN/CLOSE////////////
  char customKey = customKeypad.getKey(); //this function reads the presed key

  if (customKey != NULL) { // if (customKey)

    if (character == 0)
    {
      Serial.println(customKey);
      Str[6] = customKey;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("    PASSWORD");
      lcd.setCursor(0, 1);
      lcd.print(Str);

    }

    if (character == 1)
    {
      Serial.println(customKey);
      Str[7] = customKey;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("    PASSWORD");
      lcd.setCursor(0, 1);
      lcd.print(Str);

    }

    if (character == 2) {
      {
        Serial.println(customKey);
        Str[8] = customKey;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("    PASSWORD");
        lcd.setCursor(0, 1);
        lcd.print(Str);

      }

      if (character == 3)
      {
        Serial.println(customKey);
        Str[9] = customKey;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("    PASSWORD");
        lcd.setCursor(0, 1);
        lcd.print(Str);

      }

      if (character == 4)
      {
        Serial.println(customKey);
        Str[10] = customKey;
        activated = 1;

      }
      character = character + 1;
    }

    if (activated == 1)
    {
      /*Change your password below!!!
        Change each of Str[6], Str[7], Str[8], Str[9]*/

      // if (Str[10] = 'A' && ...)
      if (Str[10] == 'A' && character == 5 && Str[6] == '3' && Str[7] == '0' && Str[8] == '0' && Str[9] == '7' )
      {
        myservo.write(mot_max);
        lcd.clear();
        lcd.setCursor(4, 0);
        lcd.print("ACCEPTED");
        activated = 2;
        analogWrite(buzzer, 240);
        delay(250);
        analogWrite(buzzer, 200);
        delay(250);
        analogWrite(buzzer, 180);
        delay(250);
        analogWrite(buzzer, 250);
        delay(250);
        analogWrite(buzzer, LOW);
        delay(1000);

        lcd.clear();
        lcd.setCursor(4, 0);
        lcd.print("WELLCOME");
        delay(500);
        lcd.setCursor(2, 1);
        lcd.print("ELECTRONOOBS");
        delay(1000);

        lcd.clear();
        lcd.setCursor(3, 0);
        lcd.print("DOOR  OPEN");
        lcd.setCursor(2, 1);
        lcd.print("ELECTRONOOBS");

      }
      else
      {
        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print("PASSWORD ERROR");
        lcd.setCursor(3, 1);
        lcd.print("TRY  AGAIN");
        analogWrite(buzzer, 150);
        delay(3000);
        analogWrite(buzzer, LOW);
        character = 0;
        Str[6] = '-';
        Str[7] = '*';
        Str[8] = '*';
        Str[9] = '*';
        Str[10] = ' ';
        activated = 0;
        lcd.clear();
        lcd.setCursor(4, 0);
        lcd.print("PASSWORD");
        lcd.setCursor(0, 1);
        lcd.print(Str);
      }
    }
    if (activated == 2)
    {
      if (customKey == 'B' )
      {
        myservo.write(mot_min);
        activated = 0;
        character = 0;
        Str[6] = '-';
        Str[7] = '*';
        Str[8] = '*';
        Str[9] = '*';
        Str[10] = ' ';
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("    PASSWORD");
        lcd.setCursor(0, 1);
        lcd.print(Str);

      }
    }
  }
}

Чтобы повторить итерацию, с помощью этого кода теперь на жидкокристаллическом экране отображается ПАРОЛЬ, но когда я ввожу пароль в клавиатуру, только первое число меняет значение и не переходит ко второму значению.

, 👍2

Обсуждение

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

Это проблема, которая у меня есть (https://youtu.be/aWixfn1pe3A)., @NotaBot

требуется больше повторно вызываемых подпрограмм. гораздо больше..., @dandavis


1 ответ


1

Здесь у вас, по-видимому, избыток {:

if (character ==2) {
{    <<<< Удалить это

а затем удалите лишнее } в конце кода.

Казалось бы, это влияет на логику вашего кода, так как в итоге вы непреднамеренно сгруппировали некоторые ifв другом if.


Чтобы избежать подобных ситуаций, вам нужно гораздо больше соответствовать стилю вашего кода (т. Е. форматированию/отступу).

Либо используйте:

if (character ==2) {

или

if (character ==2) 
{

но не смешивайте их. Иначе вы окажетесь в настоящей старой неразберихе.

Если вы будете сохранять согласованный стиль кодирования, то в мгновение ока увидите что - то неуместное-просто быстро прокрутив код.


Кроме того, используйте пункт меню Инструменты ► Автоматическое форматирование в среде IDE Arduino, чтобы правильно отформатировать код и упростить его чтение.

,

Изменил код с вашим предложением, но все равно получил аналогичную проблему с выводом., @NotaBot

Поскольку он компилируется, это, скорее всего, логическая ошибка в вашем коде. Я настоятельно рекомендую вам привести код в порядок, так как отступы повсюду, и следить за ними практически невозможно. Если вы сделаете отступ правильно, то увидите, правильно ли сгруппированы операторы " если` и следуют ли они логическим последовательностям. Отступ стал значительно хуже с момента вашего последнего редактирования. Вы необъяснимым образом удалили отступы в больших разделах кода, @Greenonline

Я приношу извинения за отступ, но если это поможет, очень похожий код, который я использую, включен (http://www.electronoobs.com/eng_arduino_tut11.php). Спасибо за отзыв., @NotaBot

К сожалению, я больше не мог следовать вашему коду с удаленным отступом и сдался. Извините. Удачи. :-), @Greenonline

Я правильно отформатировал ваш код для вас, пожалуйста, проверьте правку, которую я внес в ваш вопрос, чтобы понять, как вы должны были его улучшить. Ура :-) Обратите внимание, что я не изменил код и не исправил его, так как это изменило бы характер вашего вопроса. Надеюсь, теперь люди смогут легко понять, что не так с кодом, и опубликуют ответ., @Greenonline