INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
atoi() mehrere Zeichen/ Code durch Benutzer ändern (Safe)
09.01.2015, 18:33
Beitrag #1
Sad atoi() mehrere Zeichen/ Code durch Benutzer ändern (Safe)
Hallo,

wir arbeiten an folgendem Projekt:

Wir bauen einen Safe der mit Codeeingabe über ein Keypad(4x3) geöffnet werden kann (durch einen Servomotor), wird der Code 3 mal falsch eingegeben wird eine Zufallszahl erzeugt, welche vom Benutzer dann über das Keypad eingegeben werden muss (quasi wie ein Captcha auf Internetseiten) um die Code Eingabe wieder zu ermöglichen. Wird die Zufallszahl falsch eingegeben wird die Eingabefunktion für eine Stunde gesperrt.

Eine weitere Funktion ist die Änderung des Codes mittels Eingabe eines vorher festgelegten Superpins.

Wir haben soweit schon alle Funktionen, haben allerdings das Problem, dass wir die Zufallszahl nicht überprüfen können, die Eingabe erfolgt ja über das Keypad und dieses gibt Zeichenketten wieder. Daher müssen wir diese Zeichen mittels der Funktion atoi() in einen Int umwandeln damit wir die Zufallszahl mit der Eingabe überprüfen können. Wir schaffen es ein eingegebens Zeichen umzuwandeln, schaffen es aber nicht die darauffolgenden Zeichen auch umzuwandeln. Wir haben da entweder einen Denkfehler oder kriegen es einfach seit Tagen nicht hin, dies zu programmieren und langsam sind wir am verzweifeln.

Ein weiteres Problem ist dass wir den Code mittels Eingabe des Superpins nur auf einen vorher festgelegten Wert ändern können("1234") , unser Ziel ist es allerdings das der Benutzer einen beliebiegen neuen Code eingeben kann.

hier das Versuchsprogramm, in dem wir versuchen mehrere Zeichen über das Keypad umzuwandeln(wie Ihr seht ist es alles was durcheinander und man sieht vielleicht wie verzweifelt wir sind Confused:

Code:
#include <Keypad.h>
int c=0;
int i=0;
int eingabe;
char test[4];
//char test[1];
const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] = {
{'1','2','3',},
{'4','5','6',},
{'7','8','9',},
{'*','0','#',}
};
byte rowPins[ROWS] = {5,4,3,2 };//
byte colPins[COLS] = { 8,7,6 };


// Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  {
//randomSeed(analogRead(0));

Serial.begin(9600);
}

keypad.addEventListener(keypadEvent);

}
void loop()
  {
keypad.getKey();
  }


  
    //test[0]=random(1000, 10000);
    void keypadEvent(KeypadEvent eKey){//int a;
      
//switch (keypad.getState()){
  
   //case PRESSED:
  
switch(c){
  for(c=0;c<4;c++);
     case 0:
     {
     char str1[4] = {eKey};
    
     int i1;
    Serial.println(str1[0]);
    i1 = atoi(str1);
    Serial.println("Wert1:");
    Serial.print(i1);
  
    
    
    
    
     }
    case 1:
    {
     char str2[2] = {eKey};
    
     int i2;
    Serial.println(str2[1]);
    i2 = atoi(str2);
    Serial.println("Wert2:");
    Serial.print(i2);
  
    while(1);
    
    
    }
    case 2:
{  
     char str3[2] = {eKey};
    
     int i3;
    Serial.println(str3[1]);
    i3 = atoi(str3);
    Serial.println("Wert3:");
    Serial.print(i3);
    
    while(1);
    
    
}
    case 3:    
   {
     char str4[2] = {eKey};
    
     int i4;
    Serial.println(str4[1]);
    i4 = atoi(str4);
    Serial.println("Wert4:");
    Serial.print(i4);
    break;
    while(1);
    
    
   }}

...und noch unser Hauptprogramm mit allen Funktionen:

Code:
#include <Servo.h>

#include <Password.h>

#include <Keypad.h>
Servo motor1;
int i;
int x;
int zuf;
int vergl;

Password password = Password( "4711" );


const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] = {
{'1','2','3',},
{'4','5','6',},
{'7','8','9',},
{'*','0','#',}
};
byte rowPins[ROWS] = {5,4,3,2 };//
byte colPins[COLS] = { 8,7,6 };


// Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



void setup(){
  
  randomSeed(analogRead(0));
  
{
motor1.attach(9);
Serial.begin(9600);
}




keypad.addEventListener(keypadEvent); //event keypad



}

void loop(){
keypad.getKey();
}

//events
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
  
case PRESSED:
     Serial.print(eKey);
    
     switch (eKey){
       case '#': guessPassword(); break;
       case '12345678':
       {
      //Überprüfung alter Code  
      password.set("1234");
      Serial.print("Neuen Code erstellen");
      //password.reset();
      Serial.println("Code geändert");
      break;}
        default:
              password.append(eKey);
              // *Case`*`->Superpin
}
}}
    void zu()
  {
  motor1.write(90);
  }
  
  
void auf()
  {
  motor1.write(4);
  }
  
    
void guessPassword(){
    Serial.print("Code wird gelesen...");
    if (password.evaluate()){
          //hier Servo einbauen
           i=0;              
           auf();
          Serial.println("Safe oeffnet! "); //
             password.reset(); }
    else{
          i++;
          delay(3);
          zu();
          Serial.println("ungueltiger Code!");
             password.reset();  
                for (int i=0 ; i<3 ;i++);
                if(i>=3){motor1.detach();
                for(x=0;x<1;x++);}}}

etwas Hilfe könnten wir echt gut gebrauchen, da[/code] das Projekt am Dienstag abgegeben werden muss Confused Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2015, 19:33 (Dieser Beitrag wurde zuletzt bearbeitet: 09.01.2015 19:34 von aepfelbirnen.)
Beitrag #2
RE: atoi() mehrere Zeichen/ Code durch Benutzer ändern (Safe)
Die Aufgabenstellung war nicht gegeben, sondern wir haben diese selbst entwickelt als eigenes Projekt, diese steht seit ca. 2 Wochen und bisher haben wir uns ,weil es unser Projekt ist, auch selbst alles erarbeitet.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2015, 20:40 (Dieser Beitrag wurde zuletzt bearbeitet: 09.01.2015 20:46 von rkuehle.)
Beitrag #3
RE: atoi() mehrere Zeichen/ Code durch Benutzer ändern (Safe)
Wenn ich mir den Code so angucke (ohne tiefer in die Logik reinzugehen) fällt auf, dass ihr ab der zweiten Eingabe
Code:
while (1);
benutzt. Das könnte der Grund sein, dass ihr nur die erste Eingabe vergleichen könnt.
Die Zeile sieht umgeschrieben so aus:
Code:
while (1)
        {
          ;
        }
Pseudo: Solange 1 dann mache nichts.
Da "Solange 1" immer wahr ist, beibt er in dem while, kommt nicht mehr raus und tut was da drin steht:Nichts (das Semikolon).
Ausserdem dürften in den Case-Zweigen die breaks fehlen.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2015, 13:55
Beitrag #4
RE: atoi() mehrere Zeichen/ Code durch Benutzer ändern (Safe)
(09.01.2015 20:40)rkuehle schrieb:  Wenn ich mir den Code so angucke (ohne tiefer in die Logik reinzugehen) fällt auf, dass ihr ab der zweiten Eingabe
Code:
while (1);
benutzt. Das könnte der Grund sein, dass ihr nur die erste Eingabe vergleichen könnt.
Die Zeile sieht umgeschrieben so aus:
Code:
while (1)
        {
          ;
        }
Pseudo: Solange 1 dann mache nichts.
Da "Solange 1" immer wahr ist, beibt er in dem while, kommt nicht mehr raus und tut was da drin steht:Nichts (das Semikolon).
Ausserdem dürften in den Case-Zweigen die breaks fehlen.
Grüße Ricardo

Ja, da hast du recht. Wir hatten das Problem, dass die cases einfach durchlaufen werden ohne dass wir einen weiteren Wert eingeben können und der erste eingegebene Wert wurde einfach übernommen und es sah dann auf dem seriellen Monitor so aus wenn man beispielsweise die "4" auf dem Keypad drückt:

"
4
Wert1:
4
Wert2:
4
Wert3:
4
Wert4:
44
Wert1:
4
Wert2:
4
....."

Der Loop ist folgender:
Code:
void loop()
  {
keypad.getKey();
  }


  
    //test[0]=random(1000, 10000);
    void keypadEvent(KeypadEvent eKey){//int a;
      
//switch (keypad.getState()){
  
   //case PRESSED:
for(c=0;c<4;c++){
switch(c){
    
     case 0:
     {
    
    char str1[2] = {eKey};
     int i1;
    Serial.println(str1[0]);
    i1 = atoi(str1);
    Serial.println("Wert1:");
    Serial.print(i1);
    break;
    
    
    
    
     }
    case 1:
    {
     char str2[2] = {eKey};
    
     int i2;
    Serial.println(str2[0]);
    i2 = atoi(str2);
    Serial.println("Wert2:");
    Serial.print(i2);
    break;
  
    
    
    }
    case 2:
{  
     char str3[2] = {eKey};
    
     int i3;
    Serial.println(str3[0]);
    i3 = atoi(str3);
    Serial.println("Wert3:");
    Serial.print(i3);
    break;
    
  
    
    
}
    case 3:    
   {
     char str4[2] = {eKey};
    
     int i4;
    Serial.println(str4[0]);
    i4 = atoi(str4);
    Serial.println("Wert4:");
    Serial.print(i4);
    break;
    
    
    
   }}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ampelschaltung mehrere Befehle möglichst gleichzeitig Jan5663 15 173 Heute 15:46
Letzter Beitrag: Chopp
  Wie Programmiere ich mehrere if-Abfragen? Mr.Purz 7 246 12.12.2017 21:25
Letzter Beitrag: Tommy56
Question Mehrere HX711 an einem Arduino Nano Lambacher 59 2.375 17.10.2017 09:34
Letzter Beitrag: Tommy56
  ASCII Zeichen Seriell ausgeben huber5093 3 373 07.10.2017 20:35
Letzter Beitrag: Tommy56
  Code wird langsamer mit der Laufzeit Wampo 9 582 05.10.2017 11:32
Letzter Beitrag: SkobyMobil
  LED-Bilnker: Wechsel durch Interrupt djculture2001 10 643 04.10.2017 19:23
Letzter Beitrag: djculture2001
Tongue Visual Studio Code als Editor für die Entwicklung von Arduino Code Klaus(i) 1 355 03.09.2017 19:15
Letzter Beitrag: Mathias
Lightbulb mehrere Funktionen mit Schalter mechastef 7 911 21.08.2017 22:34
Letzter Beitrag: SkobyMobil
Brick Welcher FTP Client um mehrere Dateien auf den Server zu schieben. derAllgaeuer 26 2.186 19.08.2017 21:27
Letzter Beitrag: Bitklopfer
  Countdown - Werte ändern am Touchscreen ElAleMaNo 2 441 04.07.2017 18:43
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste