Не работает код.

Darkhtur
Offline
Зарегистрирован: 17.08.2013

Подозрения пали на конструкцию if. Я скорее всего неправильно расставил кнопки.

Буду благодарен всем за помощь!

 

#include <LiquidCrystal.h> 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );

// Переменные
int i;
int button;
int codeIndex;
int led = 13;
int userInputs[5];
int doorPass[5] = {1,2,3,4,5};
int servicePass[5] = {5,4,3,2,1};

// Кнопки
const int BUTTON_NONE   = 0;
const int BUTTON_RIGHT  = 1;
const int BUTTON_UP     = 2;
const int BUTTON_DOWN   = 3;
const int BUTTON_LEFT   = 4;
const int BUTTON_SELECT = 5;

// Привязка кнопок
//

// Проверка кода
//

// Получение значения кнопки
int getPressedButton()
{
  int buttonValue = analogRead(0);
  if (buttonValue < 100) {
    return BUTTON_RIGHT;  
  }
  else if (buttonValue < 200) {
    return BUTTON_UP;
  }
  else if (buttonValue < 400){
    return BUTTON_DOWN;
  }
  else if (buttonValue < 600){
    return BUTTON_LEFT;
  }
  else if (buttonValue < 800){
    return BUTTON_SELECT;
  }
  return BUTTON_NONE;
}

// SETUP
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);             
  lcd.print(" ENTER PASSCODE");
  lcd.setCursor(0, 2);
  lcd.print("=====LOCKED=====");
  pinMode(led, OUTPUT);   
}
void loop()
{
 codeIndex = button;
 button = getPressedButton();
 if(button!=0){ // что-то нажал
  userInputs[codeIndex]=button; // запомнили что нажал
  delay(500); // защита от дребезга кнопок
  Serial.println(userInputs[codeIndex]);
  codeIndex++; // ждем следующую кнопку
}
 if(codeIndex>5){ // пользователь ввел код целиком
  if ( userInputs[0] == doorPass[0] &&
       userInputs[1] == doorPass[1] &&
       userInputs[2] == doorPass[2] &&
       userInputs[3] == doorPass[3] &&
       userInputs[4] == doorPass[4] ) {
    lcd.clear();
    lcd.print("DOOR");
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);               // wait for a second
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    delay(1000); 
  if ( userInputs[0] == servicePass[0] &&
       userInputs[1] == servicePass[1] &&
       userInputs[2] == servicePass[2] &&
       userInputs[3] == servicePass[3] &&
       userInputs[4] == servicePass[4] ) {
    lcd.clear();
    lcd.print("SERVICE");
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);               // wait for a second
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);
     }
   }
 }
}

 

Darkhtur
Offline
Зарегистрирован: 17.08.2013

Darkhtur пишет:

Я скорее всего неправильно расставил кнопки.

скобки*

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

И тут все форумчане кинулись ломать головы - что же хотел сделать Darkhtur? И что у него не работает?

Смотрите строчки 61,62 и 67

И в 68-й у Вас loop заканчивается

Учитесь красиво фоорматировать код  - это дает не только эстетическое удовольствие

Darkhtur
Offline
Зарегистрирован: 17.08.2013

Именно в строчках 61,62 и 67 я ничего толком не понимаю. Я использовал код leshak.

if(button!=NO_BUTTON){ // что-то нажал
  userInputs[codeIndex]=button; // запомнили что нажал
  codeIndex++; // ждем следующую кнопку
}

if(codeIndex>5){ // пользователь ввел код целиком

   .. тут сравниваем userInputs с PKeys или SKeys...
  .. если совпадают поэлементно... открываем двери, сезам, объятия...
}

loop поправил. Код немного переоформи. Но эффекта всеравно 0.

// Библиотеки
#include <LiquidCrystal.h> 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );
// Переменные
int button;
int codeIndex;
int led = 13;
int userInputs[5];
int doorPass[5] = {1,2,3,4,5};
int servicePass[5] = {5,4,3,2,1};
// Кнопки
const int BUTTON_NONE   = 0;
const int BUTTON_RIGHT  = 1;
const int BUTTON_UP     = 2;
const int BUTTON_DOWN   = 3;
const int BUTTON_LEFT   = 4;
const int BUTTON_SELECT = 5;
// Получение значения кнопки
int getPressedButton()
{
  int buttonValue = analogRead(0);
  if (buttonValue < 100) {
    return BUTTON_RIGHT;  
  }
  else if (buttonValue < 200) {
    return BUTTON_UP;
  }
  else if (buttonValue < 400){
    return BUTTON_DOWN;
  }
  else if (buttonValue < 600){
    return BUTTON_LEFT;
  }
  else if (buttonValue < 800){
    return BUTTON_SELECT;
  }
  return BUTTON_NONE;
}
// SETUP
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);             
  lcd.print(" ENTER PASSCODE");
  lcd.setCursor(0, 2);
  lcd.print("=====LOCKED=====");
  pinMode(led, OUTPUT);   
}
// LOOP
void loop()
{
 codeIndex = button;
 button = getPressedButton();
 if(button!=0){ // что-то нажал
  userInputs[codeIndex]=button; // запомнили что нажал
  delay(500); // защита от дребезга кнопок
  Serial.println(userInputs[codeIndex]);
  codeIndex++; // ждем следующую кнопку
 if(codeIndex>5){ // пользователь ввел код целиком
  if ( userInputs[0] == doorPass[0] &&
       userInputs[1] == doorPass[1] &&
       userInputs[2] == doorPass[2] &&  // Проверка кода на правильность
       userInputs[3] == doorPass[3] &&
       userInputs[4] == doorPass[4] ) {
    lcd.clear();
    lcd.print("DOOR");
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);               // wait for a second
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    delay(1000); 
  if ( userInputs[0] == servicePass[0] &&
       userInputs[1] == servicePass[1] &&
       userInputs[2] == servicePass[2] &&  // Проверка кода на правильность
       userInputs[3] == servicePass[3] &&
       userInputs[4] == servicePass[4] ) {
    lcd.clear();
    lcd.print("SERVICE");
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);               // wait for a second
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);
    }
   }
  }
 }
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

Darkhtur пишет:

Именно в строчках 61,62 и 67 я ничего толком не понимаю. Я использовал код leshak.

Ну а зачем было плодить еще одну тему? Что-бы было больше вопросов "о чем вообще речь"?
Неужели даже собственную тему искать было лениво?

Записать переменную после ее ввода с кнопок. | Аппаратная платформа Arduino

userInputs[0] == doorPass[0] &&
userInputs[1] == doorPass[1] &&
userInputs[2] == doorPass[2] &&  // Проверка кода на правильность
userInputs[3] == doorPass[3] &&
userInputs[4] == doorPass[4] 

Говорит о том, что с "базовыми конструкциями" мы не ознакомились. Про циклы - не читали for

Вроде же говорил о том, что жесткое кодирование индексов массива - это почти всегода признак почесать пяткой ухо.

boolean compareResult=true;
for(byte i=0;i<5;i++){
  if(userInputs[i]!=doorPass[i]){ 
   compareResult=false;
   break; // дальше не имеет смысла проверять, прерываем цикл
  }
}

if(compareResult){ // все элеметы совпали
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

Но как ленивые существа, мы видим, что у нас два раза пишется один и тот же код, для чуть-чуть разных массивов. А если нам нужно будет 15-ть раз сравнивать? Что же, кадый раз делать copy-paste?

Нет, конечно. Значит явный кандидат на использование Функции


byte someArray[]={1,2,3,4,5};
byte testArrayA[]={1,2,3,4,5};
byte testArrayB[]={5,4,3,2,1};
void setup(){
  Serial.begin(9600);
  

  Serial.print("someArray=testArrayA ->");
  if(compareArrays(someArray,testArrayA,5)){
     Serial.println("Equals");
  } else  
  {
      Serial.println("NOT Equals");
  }
  
  
  Serial.print("someArray=testArrayA ->");
  if(compareArrays(someArray,testArrayB,5)){
     Serial.println("Equals");
  } else  
  {
      Serial.println("NOT Equals");
  }
  
  

}

void loop(){}

// сравнимавает aArray и bArray длиной length поэлементно. Возвращает false - если хотя-бы один элемент отличается
bool compareArrays(byte aArray[], byte bArray[], unsigned int length){
  for(unsigned int i=0;i<length;i++){
     if(aArray[i]!=bArray[i])return false;
  }
  
  return true;
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

>codeIndex = button;

А это что за чудо чудное?  Почему код кнопки у нас начал влиять на "в какую ячейку сохранять"? Можно все-таки нужно по порядку сохранять?  

codeIndex нам нужно только "обнулять". Причем в двух случаях - при старте скетча (что-бы первое нажатие сохранилось в userInputs[0]) и после того как пользователь "ввел целиком" (что-бы следующя попытка опять начала сохранять "по очереди" в userInputs[0],userInputs[1] и т.п.

> if(codeIndex>5){

Ну тут я на бегу очепятался. Но я же "просто объяснял идею". Притереть напильником - эже ваша задача.  Нумерация-то у нас с нуля.

Крутите в голове что происходит с codeIndex при нажатии.

1. Первое нажатие. Сохранилось в userInput[0], codeIndex++ - значит он стал cpdeIndex==1
2. Второе нажатие. Сохранилось в userInput[1], codeIndex++ - значит стал codeIndex==2

и т.д.

Значит после пятого нажатия codeIndex у нас будет равен 5-ти.

Следовательно условие "было сделанно 5-ть нажатий" должно быть

if(codeIndex>4)

или таким if(codeIndex>=5)
или таким if(codeIndex==5)

 

Darkhtur
Offline
Зарегистрирован: 17.08.2013

Спасибо.

Я тоже пытался сделать это с циклом for,но ничего толком не получилось,поэтому и решил использовать "костыли".

Darkhtur
Offline
Зарегистрирован: 17.08.2013

>codeIndex = button;

и

>if(codeIndex>5){

методом тыка смог починить самостоятельно до написания вашего поста.

Спасибо за неимоверную помощь.