jmavros
Published

FSX switches, rotary encoders & continues buttons

Arduino reads on / off switches, rotary encoders and buttons when pressing continues I use this code to read switches for FSX

BeginnerProtip1,183
FSX switches, rotary encoders & continues buttons

Things used in this project

Story

Read more

Schematics

schematic_yBffllcRIC.JPG

Code

Code read all input switches, rotary encoders etc

C#
Arduino code to read switches, rotary encoders etc
//FSX Arduino connect with FSXAmphiConnect application
//
//ARDUINO No A
//
//digital switches and rotary encoder switches / buttons inputs

const String ArduinoName = "A";
const int StartDigitalPin = 2;
const int EndDigitalPin = 70;
const int EncoderPinRotary38 = 38;
const int EncoderPinRotary44 = 44;
const int EncoderPinRotary42 = 42;
const int EncoderPinRotary43 = 43;
const int ContinuesButtonsPressed66 = 66;
const int ContinuesButtonsPressed69 = 69;

int LastButtonState[EndDigitalPin + EndDigitalPin];
int EncoderRotaryReaderState[EndDigitalPin + EndDigitalPin];
int ShowOnceNumberWhereIsNoPressed[EndDigitalPin + EndDigitalPin];

void setup() 
{
  for (int DigitalOutPin = StartDigitalPin; DigitalOutPin <= EndDigitalPin; DigitalOutPin++)  
  {
    pinMode(DigitalOutPin, INPUT);
    digitalWrite(DigitalOutPin, HIGH);
    LastButtonState[DigitalOutPin] = HIGH;  
    ShowOnceNumberWhereIsNoPressed[DigitalOutPin] = LOW;    
  }
  
  Serial.begin(115200);
}

void loop() 
{
  for (int DigitalOutPin = StartDigitalPin; DigitalOutPin <= EndDigitalPin; DigitalOutPin++)  
  { 
    //Encoder switch 38 or 44, 42 or 43
    if (DigitalOutPin == EncoderPinRotary38 || DigitalOutPin == EncoderPinRotary44 || 
        DigitalOutPin == EncoderPinRotary42 || DigitalOutPin == EncoderPinRotary43) 
    {
      //Encoder Rotary
      ReadEncoderRotaryPin(DigitalOutPin);
    }
    else    
    {
      if (DigitalOutPin == ContinuesButtonsPressed66 || DigitalOutPin == ContinuesButtonsPressed69)
      {
        //Switch Continues Buttons Pressed
        ReadContinuesButtonsPressedPin(DigitalOutPin, digitalRead(DigitalOutPin), LOW);
      }
      else
      {
        //Switch Buttons on/off
        ReadSwitchPin(DigitalOutPin, digitalRead(DigitalOutPin));
      }
    }
  }   
}

void ReadEncoderRotaryPin(int SwitchPin)
{
  int LastButtonStateNumber = SwitchPin;
  int EncoderPinRotaryA;
  int EncoderPinRotaryB;

  if (SwitchPin == EncoderPinRotary38 || SwitchPin == EncoderPinRotary44)
  {
    EncoderPinRotaryA = EncoderPinRotary38;
    EncoderPinRotaryB = EncoderPinRotary44;
  }
  if (SwitchPin == EncoderPinRotary42 || SwitchPin == EncoderPinRotary43)
  {
    EncoderPinRotaryA = EncoderPinRotary42;
    EncoderPinRotaryB = EncoderPinRotary43;
  }
  
  EncoderRotaryReaderState[SwitchPin] = digitalRead(EncoderPinRotaryA);
        
  if ((LastButtonState[SwitchPin] == HIGH) && (EncoderRotaryReaderState[SwitchPin] == LOW))
  {
    if (digitalRead(EncoderPinRotaryB) == LOW)
    {
      PrintSwitchPinCode(EncoderPinRotaryB, 0);
      delay(0);
    }
    else
    {
      PrintSwitchPinCode(EncoderPinRotaryA, 0);
      delay(0);
    }
  }
  LastButtonState[SwitchPin] = EncoderRotaryReaderState[SwitchPin];
}

void ReadSwitchPin(int SwitchPin, int ButtonState)
{ 
  if (LastButtonState[SwitchPin] == LOW && ButtonState == HIGH)
  {    
    LastButtonState[SwitchPin] = ButtonState; 
    PrintSwitchPinCode(SwitchPin, ButtonState);
    delay(150);
  }
  else
  {
    if (LastButtonState[SwitchPin] == HIGH && ButtonState == LOW)
    {
      LastButtonState[SwitchPin] = ButtonState; 
      PrintSwitchPinCode(SwitchPin, ButtonState);
      delay(150);
    }
  }
}

void ReadContinuesButtonsPressedPin(int SwitchPin, int ButtonState, int NumberWhereIsNoPressed)
{
  if (NumberWhereIsNoPressed == LOW && ButtonState == HIGH)
  {  
    ShowOnceNumberWhereIsNoPressed[SwitchPin] = HIGH;
    PrintSwitchPinCode(SwitchPin, ButtonState);
    delay(10);
  }
  if (ShowOnceNumberWhereIsNoPressed[SwitchPin] == HIGH && ButtonState == LOW)
  {
    ShowOnceNumberWhereIsNoPressed[SwitchPin] = LOW;
    PrintSwitchPinCode(SwitchPin, ButtonState);
    delay(100);
  }
}

void PrintSwitchPinCode(int SwitchPin, int ButtonState)
{
  int PinLength = String(SwitchPin).length();
  
  Serial.print (ArduinoName); 
  if (PinLength == 1)
  {
    Serial.print ("0");
  }      
  Serial.print (SwitchPin);           //Print the digital number
  Serial.println (ButtonState);       //Print the state after the digital number 
}

Credits

jmavros
0 projects • 1 follower

Comments