Ynt: Tuş takımı ve Şifre

Başlatan veliusta, 15 Mart 2015, 07:51:39

veliusta

Alıntı Yap
#include <Keypad.h>
#include <Password.h>

String newPasswordString;
char newPassword[8];

Password password = Password( "1234567" );

byte maxPasswordLength = 8;
byte currentPasswordLength = 0;
const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte rowPins[ROWS] = {5,6,7,8};
byte colPins[COLS] = {9,10,11,12};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(13, LOW);
}

void loop(){
   char key = keypad.getKey();
   if (key != NO_KEY){
      delay(50);
      switch (key){
      case 'A': break;
      case 'B': break;
      case 'C': break;
      case 'D': changePassword(); break;
      case '#': checkPassword(); break;
      case '*': resetPassword(); break;
      default: processNumberKey(key);
      }
   }
}

void processNumberKey(char key){
   Serial.print(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength){
      checkPassword();
   }
}

void checkPassword(){
   if (password.evaluate()){
      Serial.println(" OK.");
   }else{
      Serial.println(" Wrong passwowrd!");
   }
   resetPassword();
}

void resetPassword(){
   password.reset();
   currentPasswordLength = 0;
}

void changePassword(){
   newPasswordString = "123";
   newPasswordString.toCharArray(newPassword, newPasswordString.length()+1); //convert string to char array
   password.set(newPassword);
   resetPassword();
   Serial.print("Password changed to ");
   Serial.println(newPasswordString);
}


Serial haberleşme ile şifreyi değiştirmek istiyorum. D tuşuna basınca şifre sıfırlanıyor.
D tuşuna basınca Serial.print("Yeni Sifre Gir: "); yazsın
Keypadtan şifreyi girdikten sonra girdikten sonra A tuşuna basıp bu sayıları newPasswordString'a aktarsın. Bunu nasıl yapacağımı bilmiyorum.

KAYNAK: http://www.ediy.com.my/index.php/tutorials/item/69-password-access-with-arduino-using-keypad

mesaj birleştirme:: 15 Mart 2015, 09:19:24

#include <Keypad.h>
#include <Password.h>

String newPasswordString;
char newPassword[8];
 
Password password = Password( "1234567" );

int x;
boolean Sifre_degisim = false;

byte maxPasswordLength = 8;
byte currentPasswordLength = 0;
const byte ROWS = 4; 
const byte COLS = 4;

char keys[ROWS][COLS]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
 
byte rowPins[ROWS] = {5,6,7,8};
byte colPins[COLS] = {9,10,11,12};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(13, LOW);
}
 
void loop(){
   char key = keypad.getKey();
   if(Sifre_degisim==false){
     if(key != NO_KEY){
      switch (key){
      case 'A': break;
      case 'B': break;
      case 'C': break;
      case 'D': changePassword(); break;
      case '#': checkPassword(); break;
      case '*': resetPassword(); break;
      default: processNumberKey(key);
      }
   }
 }else{
      if(key != NO_KEY){
      switch (key){
      case '0': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '1': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '2': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '3': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '4': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '5': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '6': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '7': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '8': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case '9': newPasswordString = newPasswordString + key; Serial.print(key); break;
      case 'A': break;
      case 'B': break;
      case 'C': break;
      case 'D': break;
      case '*': break;
      case '#': newPasswordString.toCharArray(newPassword, newPasswordString.length()+1); //convert string to char array
   password.set(newPassword);
   resetPassword(); 
   Serial.println(" OK.");
   Sifre_degisim=false;
   break;
     }
    }
   }
 }
void processNumberKey(char key){
   Serial.print(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength){
      checkPassword();
   }
}

void checkPassword(){
   if (password.evaluate()){
      Serial.println(" OK.");
   }else{
      Serial.println(" Wrong passwowrd!");
   }
   resetPassword();
}

void resetPassword(){
   password.reset();
   currentPasswordLength = 0;
}

void changePassword(){
 Serial.print("Yeni Sifre Gir: ");
 Sifre_degisim=true;
}


Başardım. Buyrun saçmalığımı görün. Lütfen bana kusursuz programlamayı öğret!

Kabil ATICI

#1
if(key != NO_KEY){

 if((key!='A') &&(key!='B' ) &&(key!='C') &&(key!='D') &&(key!='*') &&(key!='#') )
{newPasswordString = newPasswordString + key; Serial.print(key); break;
}
if'(key =='#')
{
newPasswordString.toCharArray(newPassword, newPasswordString.length()+1); //convert string to char array
   password.set(newPassword);
   resetPassword(); 
   Serial.println(" OK.");
   Sifre_degisim=false;
   }
    }


programlama algoritması oluşturma bir çeşit labirenttir, aynı yere çıkan birçok yol olduğu gibi, bir yere çıkmayan çıkmazlarda var.

Bazı şeyler zamanla oturacak. Şu anda başka biri yukarıda eklediğim kodu gülüyor olup, kendisininkini ekliyor olabilir. 

İyi veya kötü kendine o labirentten yolu bulmuşsun, düşünce şeklini biraz değiştirip farklı bir bakış açısı ile başka bir yol bulmaya kalmış. Bunun için programlama dilini iyi kavramak gerekir.

Basitçe elma deyince aklına gelen yapıyı temel alırsak, bir program akışında gidilecek yollarda göz önüne gelebilmesi gerekir, bunu da zamanla kazanılıyor.
ambar7

mehmet

Kusursuzluk çok iddialı olur. Az hatalı
ya da kusursuza yakın demek daha doğru
olur diye düşünüyorum.
Kod satırları arttıkça işler karışmaktadır. Mutlaka daha fonksiyonel, daha optimum
kodlar yazılabilir.
Mümkün olduğunca sade kodlar hem bizim
için hem de mcular için daha anlaşılır
olacaktır.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr