Taster

Hallo wie kann ich am geschicktesten 4 Taster abfragen

nur taster1 ist gedrückt tu etwas
nur taster 2 --"---

u.s.w.
klar 4 x if währ möglich ist aber nicht schön

kann ich bei case select auch mit digitalread arbeiten ??

Da digitalRead nur 2 Werte kennt(LOW/HIGH), wie willst Du da 4 Zustände unterscheiden oder hast Du etwas anderes gemeint?

Gruß Tommy

Wenn du mit den 4 Tastern tatsächlich 15 + 1 Zustände einstellen willst und also mit einer Zahl 0 … 15 etwas anfangen kannst:

const byte pins[4] = {3, 4, 5, 6};
byte zustand = 0;
for (byte i = 0; i < 4 ; i++) {
   zustand = (zustand << 1) | digitalRead(pins[i]);
}
Serial.print(zustand, BIN);
Serial.print( " = " );
Serial.println(zustand, HEX);

Hi

Man sollte auch den Port selber auslesen können (sofern die 4 Pins an einem Port hängen), die nicht genutzten Bits ausmaskieren und mit den erhaltenen Zahlen das switch-case füttern.

MfG

nein
die Taster sollen 4 unterschiedlichen "Geschwindigkeiten setzen :

Taster 1 z.b. 1000
Taster 2 2000

u.s.w.

das ganze soll ein Vorschub für eine Fässtisch werden , der braucht eine Vorschub abhängig von Frässerduchmesser und Schnittgeschwindigkeit, wobei etwas zu langsam nicht schlimm ist kosten nur Zeit zu schnell und der Frässer ist kaputt

Hi

Da wäre mein Weg die IFs - mit der langsamsten Geschwindigkeit angefangen und in den ELSE-Zweigen auf die jeweils höheren Geschwindigkeiten testen.
So ist egal, wie viele der Schalter (oder wirklich Taster?) AN sind, Du bekommst halt die kleinste der angewählten Geschwindigkeiten.

Bei Tastern könnte man Diese in einer FOR-Schleife durchrattern, die Taster in eine Array gepackt, und 'bei Fund' die Soll-Geschwindigkeit setzen - Welche dann hinter der Schleife umgesetzt wird (PWM o.Ä.).

Rein Interesse halber ... wie dick, lang, schnell, welches Material fräst Du?
Selber geht zwar auch Stahl auf der kleinen China-CNC (10tel Zustellung ... vll. ...), aber weder die Sauerei noch die Zeit brauche ich Da - dafür hätte ich noch 'ne Paulimot (müsste aber nachschauen Welche, schon lange Nichts mehr mit gemacht).

MfG

… und wenn zwei Taster gleichzeitig gedrückt sind?
… und wie wird ausgeschaltet?

Wenn “der höchste gilt”, geht es z.B. in so einer Schleife:

const byte pins[5] = {2, 3, 4, 5, 6};  // incl. Aus-Taster
const int speeds[]={0, 1000, 2000, 2500, 2900};
int altSpeed=0;

...
void loop() {
   int speed = -1; // Voreinstellung: nichts ändern, wenn kein Taster gedrückt ist
   for (byte i = 0; i < 5 ; i++) 
      if (digitalRead(pins[i]) speed=speeds[i]; 
   if (speed >= 0 && speed != altSpeed) {
      Serial.println(speed);
      machWasDraus(speed);  // z.B. Fräse ansteuern ...
      altSpeed = speed;
  }
  delay(5); // Entprellen  

}

ich habe eine Optimun BF20 L Vario
nein kein CNC nur der Vorschub in X-Richtung , Alu und Stahl max 2mm pro Duchrgang alles andere ist ohne gute Kühlung nicht drin ( gelernter Industriemeister Betriebstechnik)

hier mal mein Code bis jetzt wer lust hat darf mich gerne verbessern :slight_smile:

#include <AccelStepper.h>

#define LINKS_PIN     A0
#define RECHTS_PIN    A1
#define MAN_PIN       A3
#define STOPL_PIN     A4      
#define STOPR_PIN     2
#define RPM1_PIN      3
#define RPM2_PIN      4
#define RPM3_PIN      5   
#define RPM4_PIN      6
#define STEP_PIN      9
#define DIRECTION_PIN 8
#define ENA_PIN       7
#define LED1          10
#define LED2          11
#define LED3          12
#define LED4          13

// Define a stepper and the pins it will use
AccelStepper Motor(AccelStepper::DRIVER, 9, 8);

void setup()
{ 
  digitalWrite(ENA_PIN, HIGH); // Entstufe abgeschaltet
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
 
  Motor.setMaxSpeed(10000);
  Motor.setAcceleration(1000); 

// Set up the button inputs, with pullups
  pinMode(LINKS_PIN, INPUT_PULLUP);
  pinMode(RECHTS_PIN, INPUT_PULLUP);
  pinMode(MAN_PIN, INPUT_PULLUP); 
  pinMode(RPM1_PIN, INPUT_PULLUP);
  pinMode(RPM2_PIN, INPUT_PULLUP);
  pinMode(RPM3_PIN, INPUT_PULLUP);
  pinMode(RPM4_PIN, INPUT_PULLUP);
  pinMode(STOPL_PIN, INPUT_PULLUP);
  pinMode(STOPR_PIN, INPUT_PULLUP); 
}

void loop()
{
  static float current_speed = 0.0;         // Holds current motor speed in steps/second
  static char sign = 0;                     // Holds -1, 1 or 0 to turn the motor on/off and control direction
  if (digitalRead(MAN_PIN)==0){ 
    digitalWrite(ENA_PIN, LOW);
    if (digitalRead(RPM1_PIN)==0 && digitalRead(RPM2_PIN)==1 && digitalRead(RPM3_PIN)==1 && digitalRead(RPM4_PIN)==1){ // Vorschub 1,8 M/min
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, LOW);  
      current_speed = 16000; 
      }
    if (digitalRead(RPM1_PIN)==1 && digitalRead(RPM2_PIN)==0 && digitalRead(RPM3_PIN)==0 && digitalRead(RPM4_PIN)==0){ // Vorschub 3,6 M/min
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, LOW);
      current_speed = 32000;   
      }
    if (digitalRead(RPM1_PIN)==0 && digitalRead(RPM2_PIN)==0 && digitalRead(RPM3_PIN)==1 && digitalRead(RPM4_PIN)==0){ // Vorschub 5,4 M/min
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, LOW);   
      current_speed = 48000;
      }   
    if (digitalRead(RPM1_PIN)==0 && digitalRead(RPM2_PIN)==0 && digitalRead(RPM3_PIN)==0 && digitalRead(RPM4_PIN)==1){ // Vorschub 7,2 M/min
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, HIGH);   
      current_speed = 64000;
      }
   //If a switch is pushed down (low), set the sign value appropriately
      if (digitalRead(LINKS_PIN) == 0 && digitalRead(STOPL_PIN)==0) { // STOPL normaly closed
      sign = 1;
      }
    else if (digitalRead(RECHTS_PIN) == 0&& digitalRead(STOPR_PIN)==0) {  // STOPR normaly closed  
      sign = -1;
      }
    else    sign = 0;
    current_speed = current_speed*sign;
    Motor.setSpeed(current_speed); 
    Motor.run();
    }
 else  digitalWrite(ENA_PIN, HIGH);

}