Hilfe: Programmieren eines Zahlenschlosses

Hallo It Genies,

ich brauche dringend Hilfe von euch. Ich muss für mein It Praktikum ein Projekt erstellen. Das Problem : ich verstehe wirklich nicht viel. Deswegen wollte ich mein Glück hier versuchen. Hoffe jmd. von euch kann mir weiterhelfen. Es wäre wirklich seeeeehr lieb von euch, wenn jmd. mir das Projekt programmieren könnte. Bin wirklich am verzweifeln.

Über jegliche Hilfe wäre ich sehr erfreut. Ihr würdet mir ein Stein vom Herzen nehmen :blush: :kissing:

Hier mein Lastenheft bzw. das was ich machen wollte :)

Thema: PIN-Verschlüsselung

Beschreibung: Wir haben vor eine Verschlüsselung für einen Tresor zu erstellen. Dazu wollen wir eine Hardware verwenden, an der man, mithilfe von Tastern, einen PIN eingibt, die für das Öffnen und Schließen des Tresors zuständig ist. Hierbei hat man drei Versuche für die richtige Eingabe. Falls alle drei falsch eingegeben wurden, gibt es die Möglichkeit anhand eines Mastercodes den Tresor zu entsperren. Die PIN-Änderung ist ohne große Umstellung des Programms möglich. Für die Eingabe des PINs werden wir drei Taster und für die Bestätigung ein Taster nutzen. Insgesamt werden sich also an der Hardware 4 Tasten befinden. Jede Eingabetaste hat die Eigenschaft vier Mal gedrückt zu werden. Ab vier Mal drücken fängt das Programm wieder von Anfang an. Die drei PIN-Taster müssen nacheinander betätigt werden. Ist der angegebene Code der richtige, so wird es an der Hardware eine Leuchte geben, die kurz grün aufleuchtet. Ist der PIN falsch, so leuchtet eine andere Leuchte rot. Wird der PIN drei Mal falsch eingegeben, so blinkt die rote Leuchte durchgehend und ein Alarm wird ausgelöst. Nun kann man mithilfe des Mastercodes den Tresor öffnen und den Alarm ausstellen. Der Mastercode ist nicht zu verändern und wird nur einmal festgelegt. Zum Schließen genügt es denselben Code erneut einzugeben und zu bestätigen.

Tolles Projekt, dann zeig uns doch mal, was du bis jetzt programmiert hast.

Füge den Sketch bitte in Code-Tags hier ein. Und benenne bitte deinen Thread um, damit jeder erkennen kann, was für eine Frage du hast. Anders liest das wohl keiner, wenn alle Threads nur "Hilfe" heißen.

Warum verwendest du keine Code-Tags?
So ist der Sketch schlechtlesbar.

Ehrlich gesagt, weiß ich nicht wie das funktioniert :( Ich bin wirklich ne NIETE bei den ganzen IT sachen :(

Dafür gibt es das “How to use…”
Code-Tags ist die Schaltfläche “</>”.

Und dann nimmst du so ein Projekt an?

Ich muss es leider machen :( ich hätte es nie im Leben freiwillig genommen

int CodeArray[3] = {1,2,3}; //Code beim Start
int CodeMasterArray[3] = {3,2,3}; //Mastercode

int ZahlEins = 1;           //Gedrückte Tasten  
int ZahlZwei = 1;           
int ZahlDrei = 1;

int pin_button_B = 1;               // vier Taster --> Bestätigung 
int pin_button_eins = 3;            // --> Eingabe         // zum einstecken in Arduino-PINs
int pin_button_zwei = 5;
int pin_button_drei = 7;

int LEDgruen = 8;
int LEDrot = 10;
int Ton = 12;
int rnd=1;                        //für Taster
int count=0;

void ZahlenEingabe(void);
void LEDgruenleuchten(void);
void LEDrotleuchten(void);


////////////////////////////////////////////////////

void setup() {

    pinMode(pin_button_B,INPUT);
    pinMode(pin_button_eins,INPUT);
    pinMode(pin_button_zwei,INPUT);
    pinMode(pin_button_drei,INPUT);

    pinMode(LEDgruen,OUTPUT);
    pinMode(LEDrot,OUTPUT);
    pinMode(Ton,OUTPUT);

    digitalWrite(LEDrot, HIGH);
    
    

void loop()
{
 rnd++
 if(digitalRead(pin_button_eins)==HIGH)
 { 
  switch 

  {
   
  }
  
  }
}
//===========================================================================
 
}

void loop() {

      if(digitalRead(LEDrot) == HIGH && digitalRead(LEDgruen) == LOW) {

        ZahlenEingabe();
        
      }
 for (int j = 1 ; j<4; j++)
          
      do {

          if (digitalRead(LEDrot) == HIGH) {
            
              if(( CodeArray[0] == ZahlEins) && (CodeArray[1] == ZahlZwei) && (CodeArray[2] ==  ZahlDrei))

                {   
                  LEDgruenleuchten();
                  digitalWrite(LEDrot,LOW);
                  
                 break;
          
               
                  }
               else {

                LEDrotleuchten();
                digitalWrite(Ton,HIGH);
                delay(2000);
               return;
               }
        
  


       
           }
           
           
      }while(1); 
           
            
    
        
      }


 void ZahlenEingabe(void) {
    
      for (int i = 1; i<5; i++)
      {

         do {
          delay(50);
         }
        
          while(digitalRead((pin_button_eins) == LOW) &&     digitalRead((pin_button_zwei) == LOW) &&  digitalRead((pin_button_drei) == LOW));
          {

                    if(digitalRead (pin_button_eins)== HIGH) {

                       ZahlEins =i;
                       LEDrotleuchten();
                       
                      
                      }

                    else if(digitalRead(pin_button_zwei) == HIGH)  {

                       ZahlZwei = i;
                        LEDrotleuchten();
                    }

                     else if(digitalRead(pin_button_drei) == HIGH) {

                       ZahlDrei = i;
                       LEDrotleuchten();
                      
                    }

                    

        
        }
    
    
    }

 
}
 //=======================================================================================================================



 void LEDrotleuchten(void){

        digitalWrite(LEDrot,HIGH);
        delay(1000);
 
 }

void LEDgruenleuchten(void) {
  
        digitalWrite(LEDgruen,HIGH);
        delay(1000);
  
  }


//============================================================================================================================


//Alarmton

void playTone(int dur)
{
  digitalWrite(_pin_,HIGH);
  for(int i = 0, i < dur; i++)
  {
    digitalWrite(_speakerpin_,HIGH);
    delayMicroseconds(1000);
    digitalWrite(_speakerpin_,LOW);
    delayMicroseconds(1000);
  }
  digitalWrite(_pin_,LOW);
  }
}

//================================================================================================


//Mastercode

Kurzkritik:

Compiler-Meldung:

Test_Forum.ino: In function 'void setup()': Test_Forum:42: error: a function-definition is not allowed here before '{' token Test_Forum:183: error: expected '}' at end of input a function-definition is not allowed here before '{' token

void loop() doppelt.

do {}while(1); ergibt eine Endlosschleife.

Ok, den Sketch in Post #2 kannst du jetzt löschen.

Welchen Arduino verwendest du, hast du den Sketch schon mal kompiliert?

Edit:

Da du für alle Taster sowieso PullUp-Widerstände benötigst, ändere deine Input-Deklaration im Setup wie folgt:

pinMode(pin_button_B,INPUT_PULLUP);     // Eingang mit internem Pullup

Dies für alle Inputs mit entsprechendem Namen.

Dann fragst du die Eingänge auf LOW ab.
Damit sparst du externe Pullup-Widerstände.

Dankeschön, "agmue" und "HotSystems"

Wie gesagt, bisher habe ich nur das geschafft. Aber sicher bin ich mir da nicht. Ich komme leider auch nicht ganz weiter. Habe an einigen stellen, was angefangen, wo ich aber nicht mehr weiter wusste. Ich muss leider das Projekt machen, da das ein Pflichtpraktikum ist :(

Ich arbeite mit dem Arduino UNO und habe schon einige male den Sketch kompiliert, Es hatte mir mal auch keine Fehlermeldung angezeigt. Jedoch habe ich im nachhinein noch einiges hinzugefügt und einiges halb stehen lassen, weil ich nicht mehr weiter kam. Zurzeit zeigt es mir dementsprechend einige viele Fehler an. :(

smiley111: Hallo It Genies, [..] Das Problem : ich verstehe wirklich nicht viel. [..] Hoffe jmd. von euch kann mir weiterhelfen. Es wäre wirklich seeeeehr lieb von euch, wenn jmd. mir das Projekt programmieren könnte. [..]

Hallo Smiley,

ich schreibe es mal so hart wie das Leben halt ist.

Ein Praktikum dient dazu nachzuweisen, dass man in der Lage ist praxisnahe Themen eigenständig zu bewältigen. Das heißt, dass man sich intensiv damit beschäftigt und auch seine eigenen Lücken und Schwächen erkennt. Wenn du also nicht viel verstehst versuche dir das Verständnis anzueignen. Dir das Projekt zu programmieren hiesse dann auch dir beim Betrügen zu helfen, denn in einer Klausur darf dir ja auch niemand die Klausur schreiben, oder ? Das Pflichtenheft ist gar nicht so schwer, wir helfen dir gerne, aber machen musst du es selbst. Falls du merkst dass du es nicht und niemals hinbekommst: Frage dich, ob deine Ausbildungs/Berufswahl die richtige Wahl ist/war. Wenn du dich jetzt persönlich angegriffen fühlst. Ich selbst habe ein Studium abgebrochen weil ich gemerkt habe, dass ich die Probleme die das Fach mir gestellt hat im Berufsleben niemals bewältigen werde. Der nächste Studiengang war der richtige.

Viele Grüße

Harry

Es hilft oftmals, sich einen Ablaufplan aufzuzeichnen und den dann in Funktionsblöcke zu gliedern.

Die Aufgabenstellung ist ja nicht allzu umfangreich, portionsweise wird das sicher was. Und für die Feinheiten sind wir ja da ;)

Hier hast du mal schon einen guten Start http://playground.arduino.cc/Code/Keypad

Da hast du schon einen guten Start. Gruß DerDani

Hallo,

1) wichtig fände ich für so ein Projekt, dass du dir ein sauberes Flussdiagramm aufzeichnest. Damit hast du die Reihenfolge der Schritte und auch welche Verzweigungen genommen werden müssen. Auch bekommst du einen Überblick über die nötigen Variablen. Du hast einen Überblick, mit welchen Teilbereichen als erstes beschäftigen kannst.

2) Du solltest dich mit den Grundlagen des Arduinos beschäftigen. So sollte man Pin1 nur im absoluten Notfall benutzen, da er zur seriellen Schnittstelle gehört. Die serielle Schnittstelle ist äußerst hilfreich um herauszubekommen, ob das Programm wirklich macht, was du willst. Du programmierst eine manuelle Soundausgabe, obwohl es dazu einen fertigen Befehl tone() gibt. Ein Grundlagenbuch zum Arduino kann sehr hilfreich sein (gibt es bestimmt auch in der Bibliothek)

3) Du hast doch bestimmt Kommiltonen/Kollegen mit denen du dich hinsetzen kannst um gemeinsam an dem Problem zu arbeiten bzw. dich in den Arduino einzufuchsen. Bei mir im Studium war alles darauf angelegt, uns zur Zusammenarbeit zu zwingen. Teilweise war es sogar so, dass wir uns verzweifelt an die höheren Semester oder Fachschaft wenden sollten, da die früheren Jahrgänge sich auch dadurch gequält haben. Als Einzelkämpfer war man verloren.

4) Google führt zu sehr ähnlichen Projekten. Beispielsweise: erstes-arduinoprojekt-ein-tresor-fur-kinder .Nach dem Sketch müsstest du wohl mal nachfragen.

Theseus: 3) Du hast doch bestimmt Kommiltonen/Kollegen mit denen du dich hinsetzen kannst um gemeinsam an dem Problem zu arbeiten bzw. dich in den Arduino einzufuchsen. Bei mir im Studium war alles darauf angelegt, uns zur Zusammenarbeit zu zwingen. Als Einzelkämpfer war man verloren.

Da wärt ihr schon mal zwei Leidensgenossen: Noch ein Pin-Schloss

Erstmal dankeschön für eure Hilfe @volvodani und @Theseus Ich habe, das Programm doch noch hinbekommen, muss nur noch paar Sachen verändern. :)

@HarryR : Ich weiß, dass du das nur gut meintest. Ich studiere Wirtschaftsingenieurswesen und bin auch ziemlich zufrieden mit dem Studiengang. Leider ist nun mal IT ein Fach, was ich belegen muss. Sonst würde ich dies nicht freiwillig machen, da It definitiv nicht zu meinen Stärken gehört. Aber, dennoch danke ich, für deine Ratschläge :)

int button_best = 12;
int button_3 = 11;
int button_2 = 10;
int button_1 = 9;

boolean pressed_bbest;
boolean pressed_b1;
boolean pressed_b2;
boolean pressed_b3;
boolean alarm = false;

int pin1_ist = 0;
int pin2_ist = 0;
int pin3_ist = 0;

int pin1_soll = 1;
int pin2_soll = 2;
int pin3_soll = 3;

int pin1_master = 3;
int pin2_master = 3;
int pin3_master = 3;

int versuch_zaehler = 0;

int led_rot = 3;
int led_gruen = 6;

int buzzer = 4;

void setup() {
  Serial.begin(9600);

 
  
  pinMode(button_best, INPUT);
  pinMode(button_1, INPUT);
  pinMode(button_2, INPUT);
  pinMode(button_3, INPUT);

  pinMode(led_rot, OUTPUT);
  pinMode(led_gruen, OUTPUT);

  pinMode(buzzer, OUTPUT);

}

void loop() {
  if(digitalRead(button_best) == HIGH) {
    pressed_bbest = true;
  }

  if (pressed_bbest == true && digitalRead(button_best) == LOW) {
    if(pin1_ist == pin1_master && pin2_ist == pin2_master && pin3_ist == pin3_master && alarm == true) {
      alarm = false;
      digitalWrite(led_gruen, HIGH);
      delay(3000);
      digitalWrite(led_gruen, LOW);
    } else if(pin1_ist == pin1_soll && pin2_ist == pin2_soll && pin3_ist == pin3_soll && alarm == false){
      digitalWrite(led_gruen, HIGH);
      delay(3000);
      digitalWrite(led_gruen, LOW);
    } else {
      digitalWrite(led_rot, HIGH);
      delay(2000);
      digitalWrite(led_rot, LOW);
      versuch_zaehler++;
      if (versuch_zaehler == 3) {
        for (int i=0; i<1000; i++) {
          digitalWrite(buzzer, HIGH);
          delayMicroseconds(1000);
          digitalWrite(buzzer, LOW);
          delayMicroseconds(1000);
        }
        alarm = true;
      }
    }
    pressed_bbest = false;
  }

  if(digitalRead(button_1) == HIGH) {
    pressed_b1 = true;
  }

  if (pressed_b1 == true && digitalRead(button_1) == LOW) {
    if(pin1_ist == 4) {
      pin1_ist = 1;
    } else {
      pin1_ist++;
    }
    Serial.println(pin1_ist);
    pressed_b1 = false;
  }

  if(digitalRead(button_2) == HIGH) {
    pressed_b2 = true;
  }

  if (pressed_b2 == true && digitalRead(button_2) == LOW) {
    if(pin2_ist == 4) {
      pin2_ist = 1;
    } else {
      pin2_ist++;
    }
    Serial.println(pin2_ist);
    pressed_b2 = false;
  }

  if(digitalRead(button_3) == HIGH) {
    pressed_b3 = true;
  }

  if (pressed_b3 == true && digitalRead(button_3) == LOW) {
    if (pin3_ist == 4) {
      pin3_ist = 1;
    } else {
      pin3_ist++;
    }
    Serial.println(pin3_ist);
    pressed_b3 = false;
  }


  


}

Also, dass ist das, was meine Kommilitonin und Ich letztendlich geschafft haben. Bis hier hin funktioniert auch alles einwandfrei.
Die Sache ist, dass unser Professor nun meinte, dass unser Pin am Serillen Monitor veränderbar sein soll.
Wir schauen selber gerade, wie man das machen kann. Würde mich, dennoch sehr darüber freuen, wenn jemand uns weiterhelfen könnte :slight_smile:

smiley111: Die Sache ist, dass unser Professor nun meinte, dass unser Pin am Serillen Monitor veränderbar sein soll. Wir schauen selber gerade, wie man das machen kann. Würde mich, dennoch sehr darüber freuen, wenn jemand uns weiterhelfen könnte

Für eine Ziffer von 0-9 kannst du einfach das machen:

int pin

if (Serial.available())
{
   pin = Serial.read() - '0';
}

Für mehr als eine Ziffer das hier: http://forum.arduino.cc/index.php?topic=361111.msg2494595#msg2494595

Sind zwei Versionen. Einmal einen String einlesen und konvertieren oder Ziffern aufaddieren. Beim zweiten ist vielleicht glaubhafter dass du selbst darauf gekommen bist :p

Bei beiden Versionen musst du den Serial Monitor so einstellen dass ein Newline (Linefeed) am Ende gesendet wird!

Toll, dass ihr das hinbekommen habt. Auch wenn es jetzt vermutlich eine Qual war, du wirst bestimmt später mal froh sein, ein wenig programmieren zu können-sei es bei einer Studienarbeit, Erstellung eines Makros im Office-Programm oder auch in der Zusammenarbeit mit Programmierern/EDV-Fuzzies in einer Firma.

Dankeschön erstmal, ich werde es versuchen anzuwenden. :)

Ja es war wirklich eine Qual, aber paar andere Kommilitonen haben noch geholfen. Nun verstehe ich es ein wenig :D

Da ich in dem Beitrag davor nicht detalliert gesagt habe, wie wir es meinten, möchte ich es gerne einmal erklären.

Stand der Sache ist, wir haben schonmal ein Pin festgelegt, und ein Mastercode. Mein Professor meinte, es soll so sein, dass wenn keine Zahlen vorab eingetippt worden sind und man auf die Bestätigungstaste ein-oder zwei Mal drückt, dass am seriellen Monitor ein " Möchten Sie den Pin ändern " erscheint und wir unser Pin beliebig verändern können. Wenn ich das schaffe, dann bestehe ich das Praktikum. Deswegen ist es umso wichtiger, weil ich kurz vor dem Ende bin :D