Нужна помощь с проводными соединениями и кодом
В настоящее время я работаю над механизмом блокировки двери клавиатуры (аналогично этому проекту, Замок двери клавиатуры).
Проблема с кодом, который у меня есть, заключается в том, что клавиатура, прикрепленная к моей плате, не позволяет мне ввести полный пароль. Перемещается только первое значение, отображаемое на жидкокристаллическом экране, но ни одно значение не исключается. Кроме того, кнопки, используемые для открытия и закрытия серводвигателя, работают не так, как предполагалось.
Диаграмма фритцинга
Фото макета
Ниже приведен код, который у меня в настоящее время есть:
//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);
}
}
}
}
Чтобы повторить итерацию, с помощью этого кода теперь на жидкокристаллическом экране отображается ПАРОЛЬ
, но когда я ввожу пароль в клавиатуру, только первое число меняет значение и не переходит ко второму значению.
@NotaBot, 👍2
Обсуждение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
- Как использовать SPI на Arduino?
- Библиотека DHT.h не импортируется
- Светодиоды: разница между общим анодом и общим катодом
- Как повторить кусок кода
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Отображение двоичных данных на светодиодах
- Корпус кнопки и переключателя
вы не описывали никаких проблем и не задавали никаких вопросов .... голосование, чтобы закрыть как "неясно, что вы спрашиваете".... пожалуйста, обновите свой пост.... включите описание ожидаемого поведения, наблюдаемого поведения и любых ошибок, которые вы получаете, @jsotola
Это проблема, которая у меня есть (https://youtu.be/aWixfn1pe3A)., @NotaBot
требуется больше повторно вызываемых подпрограмм. гораздо больше..., @dandavis