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
  Motor Steuerung durch Sensoren Werte Zerebrator 14 368 12.06.2017 14:36
Letzter Beitrag: Franz54
  delay(...) im Code ok? donut 4 177 08.06.2017 20:16
Letzter Beitrag: donut
  Sketch ändern für ACS712 Sandro2504 3 170 04.06.2017 05:55
Letzter Beitrag: Bitklopfer
  Textdokument in Arduino Code umwandeln Tellen 9 316 03.06.2017 16:30
Letzter Beitrag: Tellen
  TFT Pixel to Code oOSpikeOo 5 280 06.04.2017 18:49
Letzter Beitrag: Tommy56
  SD-Library pins ändern. möglich? stefan-87 3 455 14.03.2017 11:46
Letzter Beitrag: Tommy56
  Tri-State Code ?? Franz54 3 228 12.02.2017 19:23
Letzter Beitrag: Franz54
  Mehrere HX711 mit einem Arduino Uno be14b029 5 402 08.02.2017 18:09
Letzter Beitrag: Binatone
  Code aus 1.6.9 geht mit 1.8.1 nicht mehr zu kompilieren DL1AKP 7 546 02.02.2017 12:16
Letzter Beitrag: Tommy56
  Mehrere Servos gleichzeitig steuern (Hexapod) scritch 7 520 25.01.2017 08:18
Letzter Beitrag: scritch

Gehe zu:


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