Ergebnis 1 bis 3 von 3

[Arduino/C]

  1. #1 Zitieren
    General Avatar von Dada
    Registriert seit
    Jan 2007
    Ort
    Krefeld
    Beiträge
    3.729
    Hallöchen zusammen,

    ich habe mich in den letzten Tagen in die Gefilde der µC-Programmierung begeben und wollte daraufhin ein Code-Schloss bauen. Zur Funktion: Es wird 5 Taster geben, die in der richtigen Reihenfolge betätigt werden müssen. Zu jedem richtig gedrückten Taster soll eine passende LED aufleuchten. Sind alle Tasten gedrückt, wird ein Servo angesteuert, der eine Verriegelung löst.
    Soweit zur Theorie. Da mein Arduino leider Lieferschwierigkeiten hat, habe ich die Schaltung erstmal online aufgebaut. Der bisherige Stand (Nur 4 Taster/LEDs, ohne Servo) ist hier zu finden.
    Der dazugehörige Code sieht folgendermaßen aus:

    Code:
    int LED=13, festgedrueckt=150, t=500;;int LED2 = 2;
    int LED3 = 7;
    int LED4 = 4;
    
    
    int t0p = 0;         //Überprüfung ob bereits gedrückt.
    int t1p = 0;
    int t2p = 0;
    int t3p = 0;
    
    
    void setup() {
      pinMode(LED, OUTPUT);       // LED Ausgang
      pinMode(LED2, OUTPUT);
      pinMode(LED3, OUTPUT);
      pinMode(A0,INPUT);          // Taste 0 
      digitalWrite(A0,HIGH);      // interner pullup Widerstand
      pinMode(A1,INPUT);          // Taste 1
      digitalWrite(A1,HIGH); 
      pinMode(A2,INPUT);          // Taste 2
      digitalWrite(A2,HIGH); 
      pinMode(A3, INPUT);         //Taste 3
      digitalWrite(A3, HIGH);
    }
    
    
    void loop() {
        if (readButton(0) || t0p == 1)
        {
            t0p = 1;
            digitalWrite(LED, HIGH);
            if (readButton(1) || t1p == 1)
            {
                t1p = 1;
                digitalWrite(LED2, HIGH);
                if (readButton(2) || t2p == 1)
                {
                    t2p = 1;
                    digitalWrite(LED3, HIGH);
                    if (readButton(3) || t3p == 1)
                    {
                        t3p = 1;
                        digitalWrite(LED4, HIGH);
                    }
                    else if (readButton(2))
                    {
                        t2p = 0;
                        t1p = 0;
                        t0p = 0;
                        digitalWrite(LED3, LOW);
                        digitalWrite(LED2, LOW);
                        digitalWrite(LED, LOW);
                    }
                    else if (readButton(1))
                    {
                        t2p = 0;
                        t1p = 0;
                        t0p = 0;
                        digitalWrite(LED3, LOW);
                        digitalWrite(LED2, LOW);
                        digitalWrite(LED, LOW);
                    }
                    else if (readButton(0))
                    {
                        t2p = 0;
                        t1p = 0;
                        t0p = 0;
                        digitalWrite(LED3, LOW);
                        digitalWrite(LED2, LOW);
                        digitalWrite(LED, LOW);
                    }
                }
                else if (readButton(0))
                {
                    t1p = 0;
                    t0p = 0;
                    digitalWrite(LED, LOW);
                    digitalWrite(LED2, LOW);
                }
                else if (readButton(1))
                {
                    t1p = 0;
                    t0p = 0;
                    digitalWrite(LED, LOW);
                    digitalWrite(LED2, LOW);
                }
            }
            else if (readButton(0))
            {
                t0p = 0;
                digitalWrite(LED, LOW);
            }
            else if (readButton(2))
            {
                t0p = 0;
                digitalWrite(LED, LOW);
            }
        }
    }
    
    
    int readButton(int pin) {     // Taste einlesen
      if(analogRead(pin) < 500) { // Analog Eingang abfragen
        delay(festgedrueckt);            
        if(analogRead(pin) < 500)
          return 1;               // war gedrückt
      }
      return 0;                   // war nicht gedrückt
    }
    Den Code habe ich teilweise übernommen, allerdings angepasst. Möglicherweise ist er nicht das gelbe vom Ei, sollte aber funktionieren.

    Nun kommt das Problem: Der erste Taster (von rechts nach links) kann ohne Probleme betätigt werden und die LED leuchtet auf. Beim zweiten funktioniert es meistens auch noch. Beim dritten Taster steigt das Programm in 90% der Fälle aus und verdunkelt alle LEDs, sprich der bisherige (richtige) Code wird gelöscht.

    Kennt sich hier jemand vielleicht mit µCs aus und sieht meinen Fehler? Ich selber vermute, es liegt an der Entprellung der Taster, allerdings kann ich die Parameter anpassen, wie ich möchte, das Ergebnis bliebt dasselbe.

    Liebe Grüße
    Dada
    Dada ist offline

  2. #2 Zitieren
    Knight Commander Avatar von Kellendil
    Registriert seit
    Jul 2009
    Beiträge
    2.093
    Liegt an deiner readButton-Methode, weil du delay benutzt.
    1. Problem: Dein Delay wird überschritten: Wenn man den Knopf 500ms lang drückt, wird das bereits als 3mal drücken gezählt. Dass heißt deine Schleife wird beim drücken mehrmals ausgeführt und löscht dann die LED, weil die Eingabe falsch war.
    2. Problem: Dein Delay wird unterschritten: Wenn man den Knopf innerhalb von 200ms 2mal drückt, kann es sein, dass gar nichts oder nur ein Tastendruck erkannt wird.

    Anstatt mit delays zu arbeiten, solltest du vesuchen, das Loslassen des Buttons zu erkennen (Tipp: Schleifen).

    Davon unabhängig geht die 4. LED nicht an, aber den Fehler findest du sucher selbst^^
    Kellendil ist offline

  3. #3 Zitieren
    General Avatar von Dada
    Registriert seit
    Jan 2007
    Ort
    Krefeld
    Beiträge
    3.729
    Das mit der vierten LED ist mir jetzt peinlich
    Gut, passiert

    Danke dir für den Denkanstoß.
    Man sollte nicht immer vorgefertigte Codeschnipsel übernehmen, sondern auch mal selber denken und fertige Libraries nehmen

    Mit 'nem Bounce, der die fallende Flanke abfragt scheint es jetzt im Simulator soweit zu funktionieren.

    Dankeschön!
    Dada ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •