Schalter zurücksetzen?

Hallo liebe Community,

ich bin neu im Arduino Bereich. Hab mich bereits ein wenig damit auseinander gesetzt und mir eine Button Box gebastelt wie viele andere auch.

Jedoch stehe ich nun ein wenig an. Ich habe ein paar Taster sowie Schalter. Kopfzerbrechen machen mir momentan die Schalter.

Die Schalter geben ja ein fixes Signal durch sobald sie aktiviert sind (Läuft ja ständig durch) nun wenn ich aber den Schalter abstelle möchte ich das Arduino das erkennt und weiter gibt. Wie könnte ich das bewerkstelligen?

Das wäre mein momentaner Code:

// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick 
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>
#include <Mouse.h>
int horzPin = A0;  // Analog output of horizontal joystick pin
int vertPin = A1;  // Analog output of vertical joystick pin
int selPin = 9;  // select button pin of joystick

int vertZero, horzZero;  // Stores the initial value of each axis, usually around 512
int vertValue, horzValue;  // Stores current analog output of each axis
const int sensitivity = 300;  // Higher sensitivity value = slower mouse, should be <= about 500
int mouseClickFlag = 0;

//int invertMouse = 1;        //Invert joystick based on orientation
int invertMouse = -1;         //Noninverted joystick based on orientation
int invertMouse2 = 1;         //Noninverted joystick based on orientation


Joystick_ Joystick;

void setup() {
  // Initialize Button Pins
  pinMode(horzPin, INPUT);  // Set both analog pins as inputs
  pinMode(vertPin, INPUT);
  pinMode(selPin, INPUT);  // set button select pin as input
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  //pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);    //Schalter 1
  pinMode(11, INPUT_PULLUP);    //Schalter 2
  pinMode(12, INPUT_PULLUP);    //Schalter 3
  pinMode(13, INPUT_PULLUP);    //Schalter 4
  digitalWrite(selPin, HIGH);  // Pull button select pin high
  delay(1000);  // short delay to let outputs settle
  vertZero = analogRead(vertPin);  // get the initial values
  horzZero = analogRead(horzPin);  // Joystick should be in neutral position when reading these

  // Initialize Joystick Library
  Joystick.begin();
  Mouse.begin(); //Init mouse emulation
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 0;

// Last state of the button
int lastButtonState[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0};

void loop() {

  vertValue = analogRead(vertPin) - vertZero;  // read vertical offset
  horzValue = analogRead(horzPin) - horzZero;  // read horizontal offset

  if (vertValue != 0)
    Mouse.move(0, (invertMouse * (vertValue / sensitivity)), 0); // move mouse on y axis
  if (horzValue != 0)
    Mouse.move((invertMouse2 * (horzValue / sensitivity)), 0, 0); // move mouse on x axis

  if ((digitalRead(selPin) == 0) && (!mouseClickFlag))  // if the joystick button is pressed
  {
    mouseClickFlag = 1;
    Mouse.press(MOUSE_LEFT);  // click the left button down
  }
  else if ((digitalRead(selPin)) && (mouseClickFlag)) // if the joystick button is not pressed
  {
    mouseClickFlag = 0;
    Mouse.release(MOUSE_LEFT);  // release the left button
  }

  // Read pin values
  for (int index = 0; index < 14; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

}

Ich wäre über eine Hilfe sehr dankbar :slight_smile:

LG
Sajiki

Zwischen einem Schalter und einem Taster gibt es programmtechnisch keinen Unterschied. Den kannst du genauso ständig abfragen

Pin 0 und 1 sollte man übrigens nicht verwenden wenn es nicht wirklich nötig ist. Daran hängt normal die serielle Schnittstelle. Du kannst auch "Analog"pins digital verwenden. A0 = 14, A1 = 15, etc.

So wie ich es sehe und wenn der kopierte Sketch auch richtig vom TO gezeigt wird, dann verwendet er einen micro und der kann das doch an D0 und D1 ?

Ja, der kann das, weil der ATmega32U4 die USB Hardware integriert hat und darum die serielle Schnittstelle nicht belegt.

@ sajiki
Du mußt auf Pegeländerung kontrollieren?
Siehe zB https://www.arduino.cc/en/tutorial/switch

Grüße Uwe

Die Änderungen von 0/1 und nach 1/0 auswerten und weiterverarbeiten. Dieser Vorgehensweise ist es egal ob ein Taster oder Schalter angeschlossen ist.

Hallo, erstmal danke für eure Antworten :slight_smile:

Verzeihung hab ich vergessen zu erwähnen! Ich nutze den Leonardo für mein vorhaben.

Oh ok das Analogen A0 etc wusste ich nicht bzw das man 0 und 9 vermeiden soll. Habe mich an 9 gerichtet zwecks einem Tutorial für die Maus Steuerung.

@uwefed
Genau, ich will meine Box für ETS und SC nutzen dazu möchte ich eben meinen Schalter bei ETS für den Motorstrom verwenden muss aber den Schalter dann zweimal drücken darum das zurück setzen ^^'

Werde mir deinen Link mal ansehen und mich hoffentlich wieder bei euch melden dürfen. Heute komme ich leider nicht mehr dazu und darum ein wunderschönes Wochenende euch :smiley:

LG
Sajiki

EDIT: Ahh. Ich habe aus Versehen ein Post editiert statt ein neues geschrieben. Hier ist ungefähr was vorher da stand:

Es wäre schön wenn du den Unterschied die Begriffe Tastern und Schalter korrekt verwenden würdest. Das ist extrem verwirrend. Ein Taster gehrt nach dem Betätigen in den Ausgangszustand zurück. Ein Schalter behält seine Position bei.

Ich kenne den Unterschied zwischen Schalter und Tastern ^^

Und genau darum geht es mir, ich habe einen Schalter der aber wie ein Taster agieren soll. Ist dies möglich oder wäre es sinnvoller gleich die Taster zu kaufen?

LG

Dann mußte du die Schaltermechanik umbauen. Der Arduino kennt den Unterschied nicht.
Oder ist das ein Thema für KI?

Du kannst wie bei einem Taster auch erkennen wann der Schalter umgelegt wird. Und entsprechend zu dem Zeitpunkt was machen. Statt während dem gesamten Zustand. Also den Schalter im Programm wie die Taster auch behandeln.

Wenn Du jeden Schalterpositionswechsel als Tasterbetätigung sehen willst, ja das geht.
Praktisch ein L zu H bzw H zu L wechsel in ein L-H-L Impuls ansehen.

Wen Du vor der Wahl stehst einen Taseroder einen Schalter zu kaufen dann würde ich den Taster wählen. Ein Taster ist intuitiver zu bedienen als ein umzulegender Schalter.

Grüße Uwe

Hab mir jetzt neue Taster bestellt die ein Paar Schalter ersetzen sollen.

Jetzt stehe ich aber leider trotzdem vor dem gleichen Problem. Ich habe mich zwar jetzt für eine Button Matrix entschieden und dafür alles umgelötet. Jedoch bin ich wohl zu blöd die Schalter per Script zurück zu schalten (LOW) damit ich beim erneuten drücken also beim Ausschalten sie wieder auf HIGH gehen ^^'

Könnte da mal jemand darüber schauen?

Gibt es ausserdem einen erweiterungsstein für mehr Pins? Habe wie bereits erwähnt das "Leonardo". Da ich gerne noch Leds schalten möchte aber ich hänge momentan sogar beim Auslesen der Schalter/Taster in der Matrix :confused:

#include <Keypad.h>
#include <Joystick.h>

//Maussteuerung Anfang
#include <Mouse.h>
int horzPin = A0;  // Analog output of horizontal joystick pin
int vertPin = A1;  // Analog output of vertical joystick pin
int selPin = 11;  // select button pin of joystick

int vertZero, horzZero;  // Stores the initial value of each axis, usually around 512
int vertValue, horzValue;  // Stores current analog output of each axis
const int sensitivity = 100;  // Higher sensitivity value = slower mouse, should be <= about 500
int mouseClickFlag = 0;

//int invertMouse = 1;        //Invert joystick based on orientation
int invertMouse = -1;         //Noninverted joystick based on orientation
int invertMouse2 = 1;         //Noninverted joystick based on orientation

//Maussteuerung Ende


//DEFINITIONS
#define ENABLE_PULLUPS
#define NUMROTARIES 0 //replace "?" with number of rotary encoders you are using
#define NUMBUTTONS 54 //replace "?"with number of buttong you are using
#define NUMROWS 5 //replace "?" with number of rows you have
#define NUMCOLS 11 //replace "?" with number of columns you have

//BUTTON MATRIX
//first change number of rows and columns to match your button matrix, 
//then replace all "?" with numbers (starting from 0)
byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4,5,6,7,8,9,10},
  {11,12,13,14,15,16,17,18,19,20,21},
  {22,23,24,25,26,27,28,29,30,31,32},
  {33,34,35,36,37,38,39,40,41,42,43},
  {44,45,46,47,48,49,50,51,52,53,54}
  
 
 
};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

//ROTARY ENCODERS
//each line controls a different rotary encoder
//the first two numbers refer to the pins the encoder is connected to 
//the second two are the buttons each click of the encoder wil press 
//do NOT exceed 31 for the final button number
rotariesdef rotaries[NUMROTARIES] {


};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
  // R_CCW_BEGIN
  {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
  // R_CW_BEGIN
  {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
  // R_START_M (11)
  {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
  // R_CW_BEGIN_M
  {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
  // R_CCW_BEGIN_M
  {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
  // R_CW_FINAL
  {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
  // R_CW_BEGIN
  {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
  // R_CW_NEXT
  {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
  // R_CCW_BEGIN
  {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
  // R_CCW_FINAL
  {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
  // R_CCW_NEXT
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

//BUTTON MATRIX PART 2
byte rowPins[NUMROWS] = {A2,A3,A4,A5}; //change "?" to the pins the rows of your button matrix are connected to
byte colPins[NUMCOLS] = {0,1,2,3,4,5,6,7,8,9,10}; //change "?" to the pins the rows of your button matrix are connected to

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

//JOYSTICK SETTINGS
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
  JOYSTICK_TYPE_JOYSTICK,
  54, //number of buttons
  0, //number of hat switches
  //Set as many axis to "true" as you have potentiometers for
  false, // y axis
  false, // x axis
  false, // z axis
  true, // rx axis
  true, // ry axis
  false, // rz axis
  false, // rudder
  false, // throttle
  false, // accelerator
  false, // brake
  false); // steering wheel

const int numReadings = 20;
 
int readings[numReadings];      // the readings from the analog input
int index = 0;              // the index of the current reading
int total = 0;                  // the running total
int currentOutputLevel = 0;

//POTENTIOMETERS PART 1
//add all the axis' which are enabled above
//int zAxis_ = 0;
int RxAxis_ = 0; 
int RyAxis_ = 0;  

               
//POTENTIOMETERS  PART 2
//Which pins are your potentiometers connected to?
int potentiometerPin1 = A0; //Change "?" to the pin your potentiometer is connected to
int potentiometerPin2 = A1;
const bool initAutoSendState = true;


void setup() {
  //Schalter Abschaltung Test
  pinMode(10, INPUT);

  // Initialize Button Pins
  pinMode(horzPin, INPUT);  // Set both analog pins as inputs
  pinMode(vertPin, INPUT);
  pinMode(selPin, INPUT);  // set button select pin as input
  
  Joystick.begin();
  rotary_init();
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
  
  digitalWrite(selPin, HIGH);  // Pull button select pin high
  delay(1000);  // short delay to let outputs settle
  vertZero = analogRead(vertPin);  // get the initial values
  horzZero = analogRead(horzPin);  // Joystick should be in neutral position when reading these

  Mouse.begin(); //Init mouse emulation
}

void loop() {

  if (digitalRead(10) == HIGH){
    digitalWrite(10,LOW);
  }

    vertValue = analogRead(vertPin) - vertZero;  // read vertical offset
  horzValue = analogRead(horzPin) - horzZero;  // read horizontal offset

  if (vertValue != 0)
    Mouse.move(0, (invertMouse * (vertValue / sensitivity)), 0); // move mouse on y axis
  if (horzValue != 0)
    Mouse.move((invertMouse2 * (horzValue / sensitivity)), 0, 0); // move mouse on x axis

  if ((digitalRead(selPin) == 0) && (!mouseClickFlag))  // if the joystick button is pressed
  {
    mouseClickFlag = 1;
    Mouse.press(MOUSE_LEFT);  // click the left button down
  }
  else if ((digitalRead(selPin)) && (mouseClickFlag)) // if the joystick button is not pressed
  {
    mouseClickFlag = 0;
    Mouse.release(MOUSE_LEFT);  // release the left button
  }
  

  CheckAllEncoders();
  CheckAllButtons();
  CheckAllPotentiometers();
 
}

//POTENTIOMETERS PART 3
//change the details to match teh details above for each potentiometer you are using
void CheckAllPotentiometers(){
                           
  //potentiometer 1
  currentOutputLevel = getAverageOutput(potentiometerPin1);
  RxAxis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setRxAxis(RxAxis_); 

  //potentiometer 2
  currentOutputLevel = getAverageOutput(potentiometerPin2);
  RyAxis_ = map(currentOutputLevel,0,1023,0,255);
  Joystick.setRyAxis(RyAxis_);


}

int getAverageOutput(int pinToRead){
  index = 0;
  total = 0; 
 
  while (index < numReadings){
    readings[index] = analogRead(pinToRead);
    total = total + readings[index];
    index = index + 1;
    //delay (1);
  }
  return total / numReadings;
}


void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            switch (buttbx.key[i].kstate) { 
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
}


void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries[i].pin1, HIGH);
      digitalWrite(rotaries[i].pin2, HIGH);
    #endif
  }
}


unsigned char rotary_process(int _i) {
  //Serial.print("Processing rotary: ");
  //Serial.println(_i);
  unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  Serial.println("Checking rotaries");
  for (int i=0;i<NUMROTARIES;i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Serial.print("Rotary ");
      Serial.print(i);
      Serial.println(" <<< Going CCW");
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Serial.print("Rotary ");
      Serial.print(i);
      Serial.println(" >>> Going CW");
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
  Serial.println("Done checking");
}

Besten Grüßen

gemacht und mal ne Frage.
Weisst Du was hier passiert?
Und wenn ja: warum? Wenn nein: warum nicht...

rotariesdef rotaries[NUMROTARIES] {


};

Ist Dir klar, was Du mit den ganzen defines anrichtest?

Hallo @my_xy_projekt

Das war ein fertiges Script das ich aus einem Youtube Video hatte. Ich hatte eher Angst das komplett raus zu nehmen da ich nicht weis ob das Script dann noch Funktionieren würde.

Programmieren war noch nie meine Stärke!
Also bitte kläre mich auf :slight_smile:

LG

Das sollten vielleicht Schule oder Eltern gamacht haben :slight_smile: :slight_smile:

Ne mal kurz.
#define ist böse.
Du kannst irgendwo im Code den Wert überschreiben.
Wenn Du eine Variable deklarierst, deren Inhalt sich nicht verändert, verwende const.

Ich will Dir auch zeigen, wo der Unterschied ist.
Dazu bitte unter DATEI - VOREINSTELLUNGEN - den Haken setzen: Ausführliche Ausgaben bei # KOMPILIERUNG
Und dann darunter die Ausgaben auf ALLE stellen.

Jetzt Code 1:

#define inputPin 2
#define inputPin 10

void setup() 
{
Serial.begin(115200);
Serial.println(F("Start..."));
Serial.print(F("Der inputPin liegt auf PIN: "));
Serial.println(inputPin);
}

void loop() 
{

}

Der Code muss nicht hochgeladen werden - nur einfach kompilieren.
Geht?

Dann den Code 2:

const byte inputPin = 2;
const byte inputPin = 10;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  Serial.print(F("Der inputPin liegt auf PIN: "));
  Serial.println(inputPin);
}

void loop()
{

}

Hm... Wenn Du Dich jetzt fragst, was da passiert, lies Dir die Meldungen durch.
Dann nimm nochmal den Code 1, kompiliere den erneut und scroll dann unten in dem Meldungsfenster weiter hoch.

Was fällt Dir auf?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.