Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

проблем със ардуино код(къде ми е грешката)
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=11903
Страница 1 от 1

Автор:  tedo_kinta [ Пон Ное 11, 2013 4:04 pm ]
Заглавие:  проблем със ардуино код(къде ми е грешката)

Здравейте, доста съм бос в програмирането на 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;

}

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/