Не работает код.
- Войдите на сайт для отправки комментариев
Вс, 18/08/2013 - 12:22
Подозрения пали на конструкцию 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? И что у него не работает?
Смотрите строчки 61,62 и 67
И в 68-й у Вас loop заканчивается
Учитесь красиво фоорматировать код - это дает не только эстетическое удовольствие
Именно в строчках 61,62 и 67 я ничего толком не понимаю. Я использовал код leshak.
loop поправил. Код немного переоформи. Но эффекта всеравно 0.
Именно в строчках 61,62 и 67 я ничего толком не понимаю. Я использовал код leshak.
Ну а зачем было плодить еще одну тему? Что-бы было больше вопросов "о чем вообще речь"?
Неужели даже собственную тему искать было лениво?
Записать переменную после ее ввода с кнопок. | Аппаратная платформа Arduino
Говорит о том, что с "базовыми конструкциями" мы не ознакомились. Про циклы - не читали for
Вроде же говорил о том, что жесткое кодирование индексов массива - это почти всегода признак почесать пяткой ухо.
Но как ленивые существа, мы видим, что у нас два раза пишется один и тот же код, для чуть-чуть разных массивов. А если нам нужно будет 15-ть раз сравнивать? Что же, кадый раз делать copy-paste?
Нет, конечно. Значит явный кандидат на использование Функции
>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)
Спасибо.
Я тоже пытался сделать это с циклом for,но ничего толком не получилось,поэтому и решил использовать "костыли".
>codeIndex = button;
и
>
if
(codeIndex>5){
методом тыка смог починить самостоятельно до написания вашего поста.
Спасибо за неимоверную помощь.