- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 20

Thema: Probleme mit einfacher Tasterschaltung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Zitat Zitat von achso Beitrag anzeigen
    Switch sagt mir nur Schalter?
    wkrug hat es richtig erklärt, was ich meinte. Entschuldige! Bin nicht davon ausgegangen, dass Du switch nicht kennst. Kenne Deinen Kenntnisstand noch nicht.

    Zitat Zitat von achso Beitrag anzeigen
    Danke,
    Nun habe ich schon ca. 80 Std mit dem Sketch zugebracht. Fast schon deprimert aufgegeben.
    Ärgerlicherweise wird die Zeit knapp.
    Dein Problem ist nicht so schwer zu lösen. Der Code, den Du hier gezeigt hast, ist das alles? Also alles zu den Tastern oder hast Du noch mehr Code zu den Tastern?
    Wenn, dann stell den mal vollständig hier rein, vielleicht kann man ihn direkt verändern, dass er so funktioniert, wie Du denkst. Dann sparst Du Zeit.

    Weihnachten rückt immer näher. Und merkwürdiger Weise geht das jetzt von Tag zu Tag auch immer schneller.

    MfG


    PS: Ein Beispiel, wie man eine Tastenabfrage und die Reaktion darauf auch umsetzen kann.
    Es gibt, je nach Anforderung, immer mehrere Lösungen oder eine Lösung, die besser geeignet ist.
    Deshalb ist das in erster Linie nur ein Denkanstoß.

    Code:
    //Pin-Zuordnungen
    #define Taster1 11
    #define Taster2 12
    #define Taster3 13
    
    
    void setup()
    {
      //Eingänge für Taster konfigurieren
      pinMode(Taster1, INPUT_PULLUP);  
      pinMode(Taster2, INPUT_PULLUP);  
      pinMode(Taster3, INPUT_PULLUP);  
    }
    
    
    //Status-Variable ist ein Byte, also 8 Bit
    byte Status; 
    
    
    
    
    void loop()
    {
    
    
      //Taster Zustände abfragen, bei INPUT_PULLUP ist Taster geschlossen, wenn der Eingang = LOW ist
      Status = 0;
      if(!digitalRead(Taster1))Status += 1;  //Bit#0 für Taster1 setzen
      if(!digitalRead(Taster2))Status += 2;  //Bit#1 für Taster2 setzen
      if(!digitalRead(Taster3))Status += 4;  //Bit#2 für Taster3 setzen
      //Status hat jetzt alle Zustände der Taster gespeichert.
      //Ist ein Taster geschlossen, dann ist das zugehörige Bit in "Status" = 1, sonst 0
       
    
    
      //Hier die Auswertung
      switch (Status)
      {
        case 1:
            //Wenn 1, dann ist Taster1 geschlossen und alle anderen offen
            break;
        case 2:
            //Wenn 2, dann ist Taster2 geschlossen und alle anderen offen
            break;
        case 4:
            //Wenn 4, dann ist Taster3 geschlossen und alle anderen offen
            break;
        case 3:
            //Wenn 3, dann ist Taster1 und Taster2 geschlossen und alle anderen offen
            break;
        case 5:
            //Wenn 5, dann ist Taster1 und Taster3 geschlossen und alle anderen offen
            break;
        case 7:
            //Wenn 7, dann ist Taster1 und Taster2 und Taster3 geschlossen
            break;
        case 6:
            //Wenn 6, dann ist Taster2 und Taster3 geschlossen und alle anderen offen
            break;
    
    
        default:
            //Wenn kein Zustand von oben zutreffend ist, dann wird der Code ausgeführt, der hier steht
      }
    
    
    }
    Geändert von Moppi (18.12.2019 um 19:20 Uhr) Grund: Fehler im Code korrigiert

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128
    Super,
    dankeschön!
    Im Januar hatte ich mit dem Bauen begonnen. Nun kam mir das ganze Jahr was dazwischen. Leider stelle ich mich mit dem Lernen immer so kompliziert an.
    Die Hindernis IR Module baue ich wieder raus. Die Einfache Version reicht.
    Einen Sketch hatte ich natürlich schon fertig. Da ging aber gar nichts. Das ist das Erste Mal, das weder delay, noch Millis gingen.
    Heute Abend probiere ich weiter.
    Fast hätte ich mich schon aus der Situation gezogen und mit je 2 ATTiny das Problem locker umschifft.
    Aber die Prominis auslöten ist wenig spaßig.

    Immerhin 6 Stück davon.


    Klicke auf die Grafik für eine größere Ansicht

Name:	Weihn.jpg
Hits:	9
Größe:	58,8 KB
ID:	34566

    Nochmals Danke.
    Wenigstens nur noch 3 Tage bis zur Sonnenwende!
    Dann gehts Bergauf
    Achim

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.200
    Tip zu denen: ich löt denen meistens die mitgelieferten Steckleisten ein.
    Wenn ich das Ganze dann irgendwo einbauen will, kommen dort-passend dazu- Buchsenleisten auf Lochrasterplatine.
    Schon kann man die Dinger einfach runter nehmen, wie IC's mit Fassungen.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128
    Danke für die nette Info!

    Mit dem switch!
    Woher weiß der code dieses?
    case '3':
    //Wenn 3, dann ist Taster1 und Taster2 geschlossen und alle anderen offen
    Wie ändert man das?
    Wie mache ich weiter?
    Beziehe ich mich dann auf z.B.
    case`3`:

    Hier mal der Stromlaufplan in reduzierter Zeichnung:

    Klicke auf die Grafik für eine größere Ansicht

Name:	Weihnachtsquatsch.jpg
Hits:	2
Größe:	39,3 KB
ID:	34571

    So hatte ich es naiv zuerst versucht. Irgendwann gemerkt, das 12 kein PWM kann. Die IR Sache baue ich aus.
    Eigentlich war das gar nicht so schlecht. Nur das der Promini nicht auf die `Drückzeit` der Tasten reagiert hat.

    Code:
    #include <Servo.h>
    Servo myservo;  // create servo object to control a servo
    
    const int L = 2; // Links Fern
    const int R = 3; // Rechts Fern
    const int Vor = 4; // Vor Fern
    const int Rueck = 5; // Rückwärts Fern
    const int IRL = 6; //Hinderniss Rechts
    const int IRR = 7; // Hinderniss Links
    const int FERNON = 13; //Fernsteuerung Spannung
    int PWM = 10; // PWM Motor
    const int Motor_1 = 11; //Motor vor rück
    const int Motor_2 = 12; //Motor vor rück
    int val = 0;
    
    void setup() {
      myservo.attach(9);  // Servo auf DigitalPin 9
      pinMode(2, INPUT);
      pinMode(3, INPUT);
      pinMode(4, INPUT);
      pinMode(5, INPUT);
      pinMode(6, INPUT);
      pinMode(7, INPUT);
      pinMode(10, OUTPUT); //PWM
      pinMode(11, OUTPUT);
      pinMode(12, OUTPUT);
      pinMode(13, OUTPUT);
    }
    void loop() {
      int val = 0;
    
      val = digitalRead(IRL); //Ir Links lesen
      if (digitalRead(IRL) == HIGH)
      {
        digitalWrite(FERNON, LOW);
        analogWrite(PWM, 170);
        myservo.write(60);
        digitalWrite(Motor_1, LOW);
        digitalWrite(Motor_2, HIGH);
        delay(2000);
      }
      else
      {
        digitalWrite(FERNON, HIGH);
        digitalWrite(PWM, LOW);
        myservo.write(90);
        digitalWrite(Motor_1, LOW);
        digitalWrite(Motor_2, LOW);
      }
      {
        val = digitalRead(IRR); //Ir Rechts lesen
        if (digitalRead(IRR) == HIGH)
        {
          digitalWrite(FERNON, LOW);
          analogWrite(PWM, 170);
          myservo.write(120);
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, HIGH);
          delay(2000);
        }
        else
        {
          digitalWrite(FERNON, HIGH);
          digitalWrite(PWM, LOW);
          myservo.write(90);
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, LOW);
          delay(50);//Pause, damit das Servo drehen kann
        }
        val = digitalRead(2); //Links Fernsteuerung
        if (digitalRead(2) == HIGH)
        {
          myservo.write(60);
          delay(50);//Pause, damit das Servo drehen kann
        }
        else
        {
          myservo.write(90);
          delay(50);//Pause, damit das Servo drehen kann
        }
        {
          val = digitalRead(3); //Rechts Fernsteuerung
          if (digitalRead(3) == HIGH)
          {
            myservo.write(120);
            delay(50);//Pause, damit das Servo drehen kann
          }
          else
          { 
            myservo.write(90);
          }
            delay(50);//Pause, damit das Servo drehen kann
          }
          {
            val = digitalRead(4);//Fernsteuerung vor
            if (digitalRead(4)==HIGH)
            {
              analogWrite(PWM, 170);
          digitalWrite(Motor_1, HIGH);
          digitalWrite(Motor_2, LOW);
            }
            else
            {
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, LOW);
            }
               {
            val = digitalRead(5);//Fernsteuerung vor
            if (digitalRead(5)==HIGH)
            {
              analogWrite(PWM, 170);
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, HIGH);
            }
            else
            {
          digitalWrite(Motor_1, LOW);
          digitalWrite(Motor_2, LOW);
            }
            
            }
          }
        }}
    Geändert von radbruch (18.12.2019 um 21:57 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Woher weiß der Code das?

    switch (nummer)
    {
    case 3:

    default:

    }

    die Nummer, angegeben bei switch in Klammern, ist die Variable, auf die sich das bezieht.

    case 3: bedeutet, dass switch in einem Fall die Variable auf den Wert 3 prüft. Wenn das erfolgreich war, wird der Code ausgeführt, der nach case 3: steht. Und zwar bis zu einem break. Wenn kein break steht, mach switch mit der nächsten Fallprüfung (case) weiter.

    Verstehe jetzt nur nicht, wie Du nichts weißt, wie Du da den Wert ändern sollst.

    Die 3 bei case 3 ergibt sich aus 1 + 2. Die 1 steht für Bit#0 der Variablen, die 2 steht für Bit#1 der Variablen, die 4 steht für Bit#2 der Variablen, die 8 steht für Bit#3 der Variablen usw.
    Warum? Weil:

    01 Dezimal = 00001 Binär
    02 Dezimal = 00010 Binär
    04 Dezimal = 00100 Binär
    08 Dezimal = 01000 Binär
    16 Dezimal = 10000 Binär
    usw.

    Vorteil der Variante: Du kannst mit einer Zahl mehrere Taster abfragen, also Tastenkombinationen.

    Wenn alle 5 Taster gedrückt wären, ergäbe sich hier: 1+2+4+8+16 = 31
    Der Wert '31' stünde also dafür, dass alle Taster gedrückt wären.

    Wenn Taster 3 und 5 gedrückt wären, dann ergäbe sich: 4+16 = 20
    etc.



    MfG
    Geändert von Moppi (18.12.2019 um 19:19 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.191
    Ich weiss jetzt nicht wie die Arduino IDE das handelt, aber '3' bedeutet in C das der Character 3, also die ASCII Ziffer 3 erwartet wird, das ist dann der dezimale Wert 51.

    Ich würde wie oben schon geschrieben 2 Switch abfragen einbauen.
    Die erste für die Richtung, die zweite für vor / zurück und Stopp.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Guter Hinweis, da muss man noch mal schauen.

    Ja, das mit den Werten ist korrekt, ich ändere das oben noch einmal.

    Danke wkrug!

    MfG

    - - - Aktualisiert - - -

    Zitat Zitat von wkrug Beitrag anzeigen
    Ich würde wie oben schon geschrieben 2 Switch abfragen einbauen.
    Die erste für die Richtung, die zweite für vor / zurück und Stopp.
    Wenn mehr nicht benötigt wird, sicher die einfachere Variante.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.066
    Code sollte in den Code Tags sein, dann ist es lesbar.


    als Beispiel:
    Code:
    Hier steht der Code
    Zum Thema, wie du den Switch Befehl ändern musst. Du musst verstehen wie Switch funktioniert.

    Code:
    switch (variable)
    {
    case 1: Hier steht der Code für Auswahl 1
    break;
    
    case 2: Hier steht der Code für Auswahl 2
    break;
    
    default:
    }
    Die Variable bei Switch muss eine Integervariable sein (nicht Float o.Ä.), dadurch hast du immer ganze Zahlen. Der Switch Befehl kontrolliert die angegebene Variable auf den darin enthaltenen Wert und springt zum richtigen Case. Steht z.B. in der Variable eine 1, wird zum "Case 1" gesprungen. Sollte die Zahl keinen Case zugeordnet sein (z.B. Variable=3), wird zum "default" gesprungen. Default sollte immer eingebaut werden, auch wenn nichts darin steht. Das switch wird nach jedem Break abgebrochen. Solltest du kein Break verwenden wird in die nächste Case Bedingung gesprungen. Z.B. du vergisst bei Case 1 das Break und in der Variable steht "1" drinnen, wird "case 1" ausgeführt und geht danach weiter zu "case 2".



    Als Variable kannst du jede Ganzzahlvariable nehmen, also auch z.B. einen Eingangsport. Wenn du in PINB z.B. PB0 und PB1 auf 1 hast, wird direkt in Case 3 gesprungen (wenn PINB bei der Variable angegeben ist). Achte aber darauf das du nur die Eingänge maskierst.

    Ich hoffe es ist so verständlich.

    MfG Hannes

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    128
    Hallo Moppi,
    unheimlich Nett von Dir. Danke
    Aber das wird mit mir nichts.
    Man gibt ja ungern zu, das man in gewissen Bereichen blöd ist.
    Mein Problem ist mein Gehirn. (Stromunfall, kann kaum lernen, vergesse neue Sachen schnell. Alles `Alte`ist noch da. Aber da hatte ich noch keinen Arduino)
    Deshalb ist es wohl doch besser, ich nehme 2 Attiny je Bot. Der Übersichtlichkeit halber. Habe ich auch noch, allerdings in SMD. Dazu muss der Code schon stehen!(Nach dem verlöten ist Schicht.)
    Zum flashen habe ich mir eine Fassung gebaut. Drunter ist eine 8 Pol Fassung gelötet. Die passt in die ATTiny Fassung für bedrahtete auf den UNO zum Programmieren.
    Also ganz blöde bin ich nun auch nicht. Das sind mir nur zuviele Unbekannte.
    Klicke auf die Grafik für eine größere Ansicht

Name:	SNC10003.jpg
Hits:	3
Größe:	40,6 KB
ID:	34573
    Mit der While Schleife. Das hat den Vorteil, das man nicht gleichzeitig Vor/Rück bei ATTiny 1 schalten kann. Und nicht gleichzeitig rechts/links bei ATTiny 2. Schon aber Vor/Rück bei ATTiny 1 und Rechts/Links bei Attiny 2. Damit umgehe ich doch mein Unvermögen ziemlich locker.
    Ich scheiter jetzt schon am sketch daran, das der Fehler mit der Deklarierung von > if (case '2': ) < für mich unklar ist.

    if (case'1'
    {
    digitalWrite(Motor_1, HIGH);//Vorwärts
    digitalWrite(Motor_2, LOW);
    }
    else
    {
    digitalWrite(Motor_1, LOW);
    digitalWrite(Motor_2, LOW);
    }
    {
    if (case '2'
    {
    digitalWrite(Motor_1, LOW);//Rückwärts
    digitalWrite(Motor_2, HIGH);
    }
    else
    {
    digitalWrite(Motor_1, LOW);
    digitalWrite(Motor_2, LOW);
    }

    Arduino: 1.8.10 (Windows 7), Board: "Arduino/Genuino Uno"

    C:\Users\Kellerassel\Documents\Arduino\Wein__ben\W ein__ben.ino: In function 'void loop()':

    Wein__ben:84:5: error: expected primary-expression before 'case'

    if (case'1'

    ^~~~

    Wein__ben:84:5: error: expected ')' before 'case'

    Wein__ben:95:5: error: expected primary-expression before 'case'

    if (case '2'

    ^~~~

    Wein__ben:95:5: error: expected ')' before 'case'

    Wein__ben:104:1: error: expected '}' at end of input

    }

    ^

    Wein__ben:104:1: error: expected '}' at end of input

    Mehrere Bibliotheken wurden für "Servo.h" gefunden
    Benutzt: C:\Program
    exit status 1
    expected primary-expression before 'case'

    Dieser Bericht wäre detaillierter, wenn die Option
    "Ausführliche Ausgabe während der Kompilierung"
    in Datei -> Voreinstellungen aktiviert wäre.

    Oh
    Achim

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Hallo Achim,

    switch ersetzt if (...) else ...

    aus dem
    Code:
    if(variable == 1){
    ...
    }
    else{
    ...
    }

    kann man diesen machen
    Code:
    switch (variable){
    
    case 1:
       ...
    
    case ...
    
    }

    Für Deinen Beispielcode kann man das etwa so machen
    Code:
    switch (...){
    
    
    case 1:
    digitalWrite(Motor_1, HIGH);//Vorwärts
    digitalWrite(Motor_2, LOW); break;
    case 2:
    digitalWrite(Motor_1, LOW);//Rückwärts digitalWrite(Motor_2, HIGH); break;
    }



    Mach es aber bitte so, wie es für Dich besser ist.


    MfG
    Geändert von Moppi (18.12.2019 um 20:06 Uhr)

Ähnliche Themen

  1. Fehleranalyse PWM-Tasterschaltung
    Von hansesel im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 09.01.2014, 13:51
  2. Probleme mit Tasterschaltung
    Von Tuxist im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 13.05.2012, 06:48
  3. Probleme mit einfacher Linenverfolgung!
    Von RuKi000 im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 17.04.2009, 20:47
  4. einfacher Getränkemixer
    Von Feli im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 9
    Letzter Beitrag: 23.03.2008, 20:54
  5. Einfacher Pegelwandler
    Von Coalminer im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 22.11.2004, 06:48

Berechtigungen

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

LiFePO4 Speicher Test