Отговори на тема  [ 1 мнение ] 
проблем със ардуино код(къде ми е грешката) 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Фев 19, 2013 11:26 am
Мнения: 16
Мнение проблем със ардуино код(къде ми е грешката)
Здравейте, доста съм бос в програмирането на uC, така че всички съвети биха били полезни и не ме щадете от към критика по кода, тъй като ми е първия проект.
Ето го и проблема:
Захванал съм се да правя кодова брава, като реших да имам допълнителни функции, много пароли, запазени в EEPROM паметта, както и възможност за добавяне на нови в процес на работа на контролера. Проблема е че при влизане в режима за добавяне на пароли, след въвеждането на новата парола не се връща до нормалната работа. Вместо това продължава да добавя нови пароли в EEPROM-a.
Изпозлвам Proteus и simulino, за да симулирам схемата.
Схема
Изображение
линк към keypad.h
Код:
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>

#define lockPin 2
const String newPasswordKey = "s*123#s";
const int errorDelayTime = 1500;
const byte ROWS = 4;
const byte COLS = 4;
char Keys[ROWS][COLS] = {
  {'1','2','3','c'},
  {'4','5','6','d'},
  {'7','8','9','a'},
  {'*','0','#','s'}
};

byte rowPins[ROWS] = {12, 11, 10, 9};
byte colPins[COLS] = {8, 7, 6, 5};

Keypad _keyboard = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS);

LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);
String inputStr = "";
boolean checkStr = false;
byte currentCursorPosition = 0;
boolean makeNewPassword = false;

void setup(){
  lcd.begin(16, 2);
  pinMode(lockPin, OUTPUT);
}

void loop(){
  char button = _keyboard.getKey();

  if (button){
    if (button == 'c'){
      inputStr = "";
      makeNewPassword = false;
      lcd.clear();
    }
    else if (button == 'd'){
      if(inputStr.length()>0){
        byte currentPosition = inputStr.length()-1;
        inputStr.setCharAt(currentPosition, ' ');
        inputStr.trim();
        lcd.setCursor(currentPosition, 1);
        lcd.write(" ");
        lcd.setCursor(currentPosition, 1);
      }
    }
    else if (button == 'a'){
      checkStr = true;
    }
    else{
      inputStr += button;
      lcd.setCursor(inputStr.length()-1, 1);
      if(makeNewPassword){
        lcd.print(button);
      }
      else{
        lcd.print("*");
      }
    }
  }

  if(inputStr.length()>=4 && checkStr == true){
    int inputStrLen = inputStr.length();
    if (inputStr == newPasswordKey){
      lcd.clear();
      lcd.write("New Password:");
      lcd.setCursor(0,1);
      makeNewPassword = true;
    }
    else if(makeNewPassword == true){
      if(inputStr.indexOf('s')>-1){
        //ERROR
        //sound signal
        lcd.clear();
        lcd.print("forbidden character");
        delay(errorDelayTime);
        lcd.clear();
      }
      else{
        //read the new password and save it to the EEPROM
        for(int address = 0; address<1024; address++){
          if((EEPROM.read(address) == 0xFF) && (EEPROM.read(address+1) == 0xFF)){
            for(int Nchar=0; Nchar<inputStrLen; Nchar++){
              EEPROM.write(address+1+Nchar, inputStr[Nchar]);
            }
            lcd.clear();
            //sound signal
            lcd.print("PASSWORD SAVED");
            delay(errorDelayTime);
            lcd.clear();
            break;
          }
          if(address==1021){
            //No space for new passwords
            //sound signal
            lcd.clear();
            lcd.print("OUT OF MEMORY");
            delay(errorDelayTime);
            lcd.clear();
            break;
          }
        }
      }

      makeNewPassword == false;
    }

    else{
      //check passwords
      byte currentEEPROMCell;
      String EEPROMPassword = "";
      for(int readAddress=0; readAddress < 1024; readAddress++){
        currentEEPROMCell = EEPROM.read(readAddress);
        if(currentEEPROMCell!= 0xFF){
          EEPROMPassword += (char)currentEEPROMCell;
        }
        else{
          if(inputStr == EEPROMPassword){
            //sound signal
            lcd.clear();
            lcd.print("ACCESS GRANTED");
            digitalWrite(lockPin, HIGH);
            delay(2500);
            digitalWrite(lockPin, LOW);
            lcd.clear();
            break;
          }
          else if(EEPROM.read(readAddress+1) == 0xFF){
            //sound signal
            lcd.clear();
            lcd.print("ACCESS DENIED");
            delay(errorDelayTime);
            lcd.clear();
            break;
          }
          else{
            EEPROMPassword = "";
          }
        }
      }
      EEPROMPassword = "";
    }
    inputStr = "";
  }
  else if(checkStr == true){
    //String is too short
    lcd.clear();
    lcd.print("SHORT PASSWORD");
    delay(errorDelayTime);
    lcd.clear();
    inputStr = "";
  }

  checkStr = false;

}


Пон Ное 11, 2013 4:04 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 1 мнение ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни