Arduino Taster zählen und mehrere Funktionen.

Guten Tag,

ich habe mir vor nicht all zu langer Zeit ein Arduino Board zugelegt, deswegen verzeiht mir meine Wissenslücken im Programmieren.

Ich möchte gerne den Taster so programmieren, dass er zählt, wie oft ich geklickt habe, um dann verschiedene Programme laufen zu lassen.

Konkret mein ich:

Es wird angefangen bei 0 zu zählen.

Wird 1 mal geklickt, wird dem Motor Strom zugeführt, er dreht sich rechts herum.
Wird 2 mal geklickt, Motor bewegt sich nicht.
Wird 3 mal geklickt, Motor dreht sich links herum.

Der Taster soll später durch ein Muskelpotential ersetzt werden und das soll Programm erweitert werden, da noch ein Sensor hinzukommt und damit die Motorbewegung zusätzlich beschränkt wird.

Danke im Vorraus.

Arduino ist nicht geeignet um Prothesen zu steuern. Sollte Dein Projekt etwas anderes sein dann können wir Dir helfen.
Grüße Uwe

Konkret mein ich:

Es wird angefangen bei 0 zu zählen.

Wird 1 mal geklickt, wird dem Motor Strom zugeführt, er dreht sich rechts herum.
Wird 2 mal geklickt, Motor bewegt sich nicht.
Wird 3 mal geklickt, Motor dreht sich links herum.

Das ist zwar nicht konkret, aber andererseits sehe ich kein Problem.

Ausser: was für ein Motor und wie soll der Arduino ihn dazu bringen, sich zu drehen?
Das kann ein Arduino nämlich nicht. Ein Arduino kann angeschlossene Taster erkennen, zählen natürlich (was du vermutlich gar nicht brauchst), und Steuersignale ( 5V, max 20 mA) ausgeben. Die bewegen aber keinen Motor.

ClickButton oder OneButton Librarys nutzen.

Ich schätze mal, @Ilia will weder doppelklick noch dreifachclick sondern einfach
{ ... - 0 - Links - 0 - Rechts - 0 - Links - ... } usw immer weiterschalten.
Nach reset bei 0 (vor links) anfangen.

Fertig.

Daher braucht sie auch gar nicht zu zählen.

michael_x:
Das kann ein Arduino nämlich nicht. Ein Arduino kann angeschlossene Taster erkennen, zählen natürlich (was du vermutlich gar nicht brauchst), und Steuersignale ( 5V, max 20 mA) ausgeben. Die bewegen aber keinen Motor.

Der Motor wird mit einer externen Quelle beispeißt.

Mittlerweile habe ich einen Code geschrieben, der das erfüllen sollte was ich haben möchte.

Erstmal mit LED an und aus.

Der Code:

const int tasterPin = 2;
const int LED = 10;


int lichtmodus = 0;
int tasterStatus = LOW; 




void setup () {
           Serial.begin(9600);
           pinMode(tasterPin, INPUT);
           pinMode(LED, OUTPUT);

}

void loop () {

  if (tasterStatus == HIGH)
  
{lichtmodus++;
  delay(300);
  
  Serial.println(lichtmodus);
  }


  if (lichtmodus == 0)
  {digitalWrite (LED, 0);
  }

  else if 
   (lichtmodus == 1)
  {digitalWrite (LED, 1);

  }

  else if 
  (lichtmodus == 2)

  {

    digitalWrite (LED, 0);}


  else if 
  (lichtmodus == 3)
  {digitalWrite (LED, 1);

  }

else 
{lichtmodus = 0; 

}

}

Momentan klappt es aber noch nicht so wie ich es möchte.
Die LED leuchtet auf, wenn ich den Taster drücke, geht aber sofort aus, wenn ich wieder runtergehe.
Bräuchte hier schon mal bitte einen Hinweis.

michael_x:
Ich schätze mal, @Ilia will weder doppelklick noch dreifachclick sondern einfach
{ ... - 0 - Links - 0 - Rechts - 0 - Links - ... } usw immer weiterschalten.
Nach reset bei 0 (vor links) anfangen.

Fertig.

Daher braucht sie auch gar nicht zu zählen.

Das Zählen brauch ich tatsächlich nicht.
Möchte nur eine Links- und Rechtsdrehung und dazwischen eine Pause, wobei es durch den Schalter gesteuert werden sollte, oder spät das Muskelpotenzial.

uwefed:
Arduino ist nicht geeignet um Prothesen zu steuern. Sollte Dein Projekt etwas anderes sein dann können wir Dir helfen.
Grüße Uwe

Wieso sollte dies nicht geeignet sein, um ein Prototyp zu bauen?
Es ist ein Projekt, welches ich gerne in einer kleineren Gruppe lösen möchte, und momentan machen wir gute Fortschritte. Potential wird erkannt, (LED leuchtet bei Bewegung), nun müssen wir dazu kommen dieses zu nutzen.

Wenn du den Sketch in Codetags setzt ( Symbol </> oben neben dem fetten B ) und lesbar einrückst, siehst du evtl selber woran es liegt.

Wo wird tasterPin verwendet und wo wird tasterStatus gesetzt ?

Hallo,

/* * Tastendrücke zählen */   
int switchPin = 25;                     // Schalter ist mit Pin 25 verbunden 
int val;                                // Variable für den Pin Zustand 
int buttonState;                        // Variable für den letzten Schalterzustand 
int buttonPresses = 0;                  // Wie oft ist der Schalter gedrückt   


const int LED = 13;
//int zstS1=1;

 


void setup() 

{
pinMode(LED, OUTPUT);

digitalWrite(LED, LOW);

 pinMode(switchPin, INPUT);            // Schalter-Pin ist Input   
Serial.begin(19200);                     // Start der seriellen Kommunikation mit 9600bps 
buttonState = digitalRead(switchPin);   // Anfangszustand lesen
}    
void loop()
{ 
 val = digitalRead(switchPin);           // Eingabewert lesen und in val speichern   
if (val != buttonState) 
{                                       // Der Zustand des Schalters hat sich verändert 
if (val == LOW) 
{                                       // Ist der Schalter gedrückt? 
buttonPresses++;                         // Inkrementieren der Variablen buttonPresses 
Serial.print("Schalter wurde "); 
Serial.print(buttonPresses); 
Serial.println(" gedrueckt"); }
} buttonState = val;  // Den Zustand merken 
if (buttonPresses == 5)
{digitalWrite(LED, HIGH);}
if (buttonPresses == 10)
{digitalWrite(LED, LOW);}
}

Gruß und Spaß
Abdreas

SkobyMobil:

/* * Tastendrücke zählen */   

int switchPin = 25;                    // Schalter ist mit Pin 25 verbunden

[/quote]

Ich verstehe das nicht ganz, wie soll ich das denn schalten?

michael_x:
Wenn du den Sketch in Codetags setzt ( Symbol </> oben neben dem fetten B ) und lesbar einrückst, siehst du evtl selber woran es liegt.

Wo wird tasterPin verwendet und wo wird tasterStatus gesetzt ?

Sry, ich sehs nicht selbst. Kannst du mir evtl. mehr Tipps geben?

Hi

Das lesbar einrücken macht die IDE für Dich (meine, im Sketch-Menü).
Den so formatierten Sketch packst Du in einen Code-Tag.
Wenn Du auf Reply klickst, statt die Schnell-Antwort hier drunter zu schreiben, bekommst Du eine andere Eingabe-Seite, eben mit den ganzen Buttons, wie auch dem Code-Block-Button.

MfG

Danke postmaster-ino,

ich hab das mittlerweile auch gefunden und vorhin schon oben bearbeitet.

Mir gehts eher darum , dass ich nicht weiß was ich am Code ändern soll, damit er so funktioniert, wie ich ihn brauch.

Hallo,
ich schreibe Dir nicht den Code, habe nur gezeigt- wie "TastenDruck" zählen kann.
Gruß und Spaß
Andreas
P.S. Bayern ist weiter- Werder, leider auch.

/*
  State change detection (edge detection)

  Often, you don't need to know the state of a digital input all the time, but
  you just need to know when the input changes from one state to another.
  For example, you want to know when a button goes from OFF to ON. This is called
  state change detection, or edge detection.

  This example shows how to detect when a button or button changes from off to on
  and on to off.

  The circuit:
  - pushbutton attached to pin 2 from +5V
  - 10 kilohm resistor attached to pin 2 from ground
  - LED attached from pin 13 to ground (or use the built-in LED on most
    Arduino boards)

  created  27 Sep 2005
  modified 30 Aug 2011
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ButtonStateChange
*/

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

}

Hallo,
ja , genau. Ich nutze diese Art der TasterAbfrage schon seid 100 Jahren. Funktioniert bei "vernünftigenn"
Tastern ohne Probleme.
Eine Überprüfung des Link würde zu einem positiven Ereignis führen.
Gruß und Spaß
Andreas
n

link.png

Danke schön.

Manchmal klappts mit den Links, manchmal muss ich die nachträglich ändern, kein plan woran es liegt.
An https wahrscheinlich, weiß der Geier.

/*
  State change detection (edge detection)

  Often, you don't need to know the state of a digital input all the time, but
  you just need to know when the input changes from one state to another.
  For example, you want to know when a button goes from OFF to ON. This is called
  state change detection, or edge detection.

  This example shows how to detect when a button or button changes from off to on
  and on to off.

  The circuit:
  - pushbutton attached to pin 2 from +5V
  - 10 kilohm resistor attached to pin 2 from ground
  - LED attached from pin 13 to ground (or use the built-in LED on most
    Arduino boards)

  created  27 Sep 2005
  modified 30 Aug 2011
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ButtonStateChange
*/

// this constant won't change:
const int  buttonPin = 41;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
  Serial.print("läuft"); 
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
      
        if (buttonPushCounter == 0)
  {digitalWrite (ledPin, 0);
  Serial.println("nix");
  }

  else 
  if  (buttonPushCounter == 1)
  {digitalWrite (ledPin, 1);
   Serial.println("lichtmodus == 1");

  }

  else
  if (buttonPushCounter == 2)

  {
   Serial.println("lichtmodus == 2");

    digitalWrite (ledPin, 0);}


  else
  if  (buttonPushCounter == 3)
  {digitalWrite (ledPin, 1);
   Serial.println("lichtmodus == 3");

  }
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Danke.

Mit diesem Scetch geht beim 4. Betätigen des Tasters die LED an, beim 5. aus, usw.

Das ist schon mal gut, aber ich verstehe noch nicht ganz..

Im Scetch steht,
0 Klicks --> off
1 Klick --> on
2 Klick --> off
3 Klick --> on

usw.

In der Praxis geht nur beim 4. mal die LED an.

Kann man nicht jede Zeile anschauen, löschen, umschreiben, auskommentieren?
Dann weiß man irgendwann was wozu gehört, was es tuht oder auch nicht.
Sieh erstmal zu wie du das zählen in den Griff bekommst, oder solls fortlaufend zählen? Oder solls doch nur von 0-3 zählen?

const int tasterPin = 2;
const int LED = 10;


int lichtmodus = 0;
int tasterStatus = LOW;




void setup () {
           Serial.begin(9600);
           pinMode(tasterPin, INPUT);
           pinMode(LED, OUTPUT);

}

void loop () {

  if (tasterStatus == HIGH)
 
{lichtmodus++;				
  delay(300);			// dient dazu, Taster zu entprellen
 
  Serial.println(lichtmodus);
  }


  if (lichtmodus == 0)		// Ohne Klick Lichtmodus 0	
  {digitalWrite (LED, 0);
  }

  else if				// Zählt bis Lichtmodus 1
   (lichtmodus == 1)
  {digitalWrite (LED, 1);

  }

  else if				// Zählt bis Lichtmodus 2	
  (lichtmodus == 2)

  {

    digitalWrite (LED, 0);}


  else if				// Zählt bis Lichtmodus 3
  (lichtmodus == 3)
  {digitalWrite (LED, 1);

  }

else					// Zählt er bis 4, startet er erneut von 0
{lichtmodus = 0;

}

}

Hier nochmal der erste Code von mir, auskommentiert, was ich damit bezwecken wollte.

skorpi080:
Oder solls doch nur von 0-3 zählen?

Er soll von 0-3 zählen und bei 4 nochmal von 0 anfangen.

Bei 0 soll LED aus sein (Motor aus)
Bei 1 LED an (Motor links drehend)
Bei 2 LED aus (Motor in Ruhe)
Bei 3 LED an (Motor rechts drehend)
Bei 4 == 0