74HC595 シフトレジスターを使用したスイッチランプ(LED)

スイッチを入れたら点灯する白いランプ、LEDランプ内臓のスイッチがあれば最高ですが高い。私はスイッチの上でLEDを点灯させるようにしています。
しかし、LEDが多いとすぐにピンが不足してしまいます。その時この74HC595のシフトレジスタを使うとピンをいくらでも増やせて便利です。下の回路では3個使っています。
Teensyのピンは3つ使用して、24個のLEDを使用できるということになります。私の場合は実際には5個まで使用、問題なく動作しています。

このスイッチランプは、スイッチを入れたら点灯という簡単なものではなく、datarefから数値を読みとっているので、他のスイッチとも連動して点灯したり、消灯したりします。
実際にX-Planeを動作させながら、その動きをよく観察してスケッチを完成する必要があり、意外と大変な作業になります。X-Planeの画面で点灯/消灯は確認できるので無理してこれを実装する必要はないのかもしれませんが、これが全て完璧に点灯・消灯をするとやったーという感じになります。ぜひ挑戦してみてください。
これがその全てのランプ位置になります。

B747-400 SPDスイッチのLEDランプ(74HC595をTeensyに繋ぐとき、スケッチで3本のピンを指定します。ピンはどれでもOKです。)
このスイッチランプが確認し易いので最初に持ってきています。X-Planeのスイッチを押すと点灯します。
//74HC595 シフトレジスタを使用してLEDをON/OFF
int SER_dataPin = 43; //Teensyピン 43 に繋ぐ
int RCLK_latchPin = 44; //Teensyピン 44
int SRCLK_clockPin = 45; //Teensyピン 45
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int SPD_74HC595_Pin= 1;
FlightSimInteger SPDswLED; //X-PlaneのLEDと接続
void setup(){
SPDswLED = XPlaneRef("sim/cockpit/autopilot/airspeed_mode");
SPDswLED.onChange(updateSPDswLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
}
void updateSPDswLED(long value) {
if (value == 13) {
setRegisterPin(SPD_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(SPD_74HC595_Pin, LOW); //消灯
}
}
B747-400 THRスイッチ LEDランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43;
int RCLK_latchPin = 44;
int SRCLK_clockPin = 45;
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins];
const int THR_74HC595_Pin = 0;
FlightSimInteger THPswLED;
void setup(){
THPswLED = XPlaneRef("sim/cockpit2/autopilot/autothrottle_on");
THPswLED.onChange(updateTHPswLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
clearRegisters();
writeRegisters();
}
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
void setRegisterPin(int index, int value){
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters();
}
void updateTHPswLED(long value) {
if (value == 0) {
setRegisterPin(THR_74HC595_Pin, LOW);
} else {
setRegisterPin(THR_74HC595_Pin, HIGH);
}
}
B747-400 L NAVとLOCスイッチ LEDランプ(連携しているのでまとめたスケッチ)
//74HC595 シフトレジスタ
//LNAVとLOCは連携しているので、個別に作成せずここでまとめている。
//===============================================================================================
///////////(74HC595)LED用 共通スクリプト //////////////////
//===============================================================================================
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
#define number_of_74hc595s 3 //シフトレジスタの数
#define numOfRegisterPins number_of_74hc595s * 8 //ここは触れないでください
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
//===============================================================================================
/////////// LNAV(74HC595)LED //////////////////
//===============================================================================================
const int LNAV_74HC595_Pin= 2;
FlightSimInteger LNAV_LED;
//===============================================================================================
/////////// LOC(74HC595)LED //////////////////
//===============================================================================================
const int LOC_74HC595_Pin = 8;
FlightSimInteger LOC_LED; //X-PlaneのLEDと接続
FlightSimInteger NAV_ChengeSW;
//===============================================================================================
/////////// NAV chengeSW モードカウント用 //////////////////条件によってLNAVとLOCを切り替える
//===============================================================================================
enum Modes {
Mode_FMC_LR, // Nav1モード
Mode_CDU,
Mode_CDU_C, // Com1モード
Mode_Count // これで自動的に2つのモードを持つことになる
};
int mode = 0;
void setup(){
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
//===============================================================================================
/////////// setup内 LNAV(74HC595)LED //////////////////
//===============================================================================================
LNAV_LED = XPlaneRef("sim/cockpit/autopilot/mode_hnav");
//===============================================================================================
/////////// setup内 LOC(74HC595)LED //////////////////ここでは2つのdatarefを比較して動作させている
//===============================================================================================
LOC_LED = XPlaneRef("sim/cockpit/autopilot/mode_hnav");
NAV_ChengeSW = XPlaneRef("sim/cockpit/avidyne/src");
}
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//===============================================================================================
/////////// loop内 LNAV (74HC595)LED ////// これだけはonChangeが使えないので、特別にloop内に入れている
//===============================================================================================
if ((LNAV_LED == 21 || LNAV_LED == 22) && NAV_ChengeSW == 4) {
setRegisterPin(LNAV_74HC595_Pin, HIGH);
} else {
setRegisterPin(LNAV_74HC595_Pin, LOW);
}
//===============================================================================================
/////////// loop内 LOC (74HC595)LED //////// これだけはonChangeが使えないので、特別にloop内に入れている
//===============================================================================================
if ((LOC_LED == 21 || LOC_LED == 22) && NAV_ChengeSW == 0) {
setRegisterPin(LOC_74HC595_Pin, HIGH);
} else {
setRegisterPin(LOC_74HC595_Pin, LOW);
}
}
B747-400 V NAVスイッチ LEDランプ(実際に動作させていない)
これスイッチが入りません。色々やっては見たがどうしても動作しませんのでスケッチは掲載しません。もし動作する方法を知っている場合は、他のスケッチと同じですのでdatarefを入れ変えて試してみてください。
B747-400 FL CHスイッチ LEDランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int FLCH_74HC595_Pin = 4;
FlightSimInteger FLCHswLED; //X-PlaneのLEDと接続
void setup(){
FLCHswLED = XPlaneRef("sim/cockpit/autopilot/airspeed_mode");
FLCHswLED.onChange(updateFLCHswLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
}
void updateFLCHswLED(long value) {
if (value == 13) {
setRegisterPin(FLCH_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(FLCH_74HC595_Pin, LOW); //点灯
}
}
B747-400 HOLD(HDG)スイッチ LEDランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int HdgHold_74HC595_Pin = 5;
FlightSimInteger HdgHoldSwLED; //X-PlaneのLEDと接続
void setup(){
HdgHoldSwLED = XPlaneRef("sim/cockpit/autopilot/heading_mode");
HdgHoldSwLED.onChange(updateHdgHoldSwLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
//set all register pins to LOW
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
}
void updateHdgHoldSwLED(long value) {
if (value == 9) {
setRegisterPin(HdgHold_74HC595_Pin, HIGH); //消灯
}
else if (value == 11) {
setRegisterPin(HdgHold_74HC595_Pin, HIGH); //消灯
}
else {
setRegisterPin(HdgHold_74HC595_Pin, LOW); //点灯
}
}
B747-400 V/Sスイッチ LEDランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int VS_74HC595_Pin = 6;
FlightSimInteger VSswLED; //X-PlaneのLEDと接続
void setup(){
VSswLED = XPlaneRef("sim/cockpit/autopilot/altitude_mode");
VSswLED.onChange(updateVSswLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
//set all register pins to LOW
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
}
void updateVSswLED(long value) {
if (value == 14) {
setRegisterPin(VS_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(VS_74HC595_Pin, LOW); //点灯
}
}
B747-400 HOLD(ALT) LED 白色ランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int AltHold_74HC595_Pin = 7;
FlightSimInteger AltHoldSwLED; //X-PlaneのLEDと接続
void setup(){
AltHoldSwLED = XPlaneRef("sim/cockpit/autopilot/altitude_mode");
AltHoldSwLED.onChange(updateAltHoldSwLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
}
void updateAltHoldSwLED(long value) {
if (value == 16) {
setRegisterPin(AltHold_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(AltHold_74HC595_Pin, LOW); //点灯
}
}
B747-400 HOLD(ALT) LED オレンジ色ランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int AltHold_OrengeLED_74HC595_Pin = 11;
FlightSimInteger AltHoldSwOrengeLED; //X-PlaneのLEDと接続
void setup(){
AltHoldSwOrengeLED = XPlaneRef("sim/cockpit/autopilot/altitude_mode");
AltHoldSwOrengeLED.onChange(updateAltHoldSwOrengeLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
}
void updateAltHoldSwOrengeLED(long value) {
if (value == 14) {
setRegisterPin(AltHold_OrengeLED_74HC595_Pin, HIGH); //LOWの設定もあり?
}
else if (value == 15) {
setRegisterPin(AltHold_OrengeLED_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(AltHold_OrengeLED_74HC595_Pin, LOW); //点灯
}
}
B747-400 APP LEDランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int APP_74HC595_Pin = 9;
FlightSimInteger APPswLED;
void setup(){
APPswLED = XPlaneRef("sim/cockpit/autopilot/mode_gls");
APPswLED.onChange(updateAPPswLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
}
void updateAPPswLED(long value) {
if (value == 23) {
setRegisterPin(APP_74HC595_Pin, HIGH); //点灯
}
else if (value == 24) {
setRegisterPin(APP_74HC595_Pin, HIGH); //点灯
} else {
setRegisterPin(APP_74HC595_Pin, LOW); //消灯
}
}
B747-400 A/P ENGAGE LEDランプ
//74HC595 シフトレジスタ
int SER_dataPin = 43; //pin 14(DS-data) on the 75HC595
int RCLK_latchPin = 44; //pin 12(ST_CP-latch) on the 75HC595
int SRCLK_clockPin = 45; //pin 11(SH_CP-clock) on the 75HC595
//シフトレジスタの数
#define number_of_74hc595s 3
//ここは触れないでください
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins]; //上のレジスタの数を反映させる
const int APEngage_74HC595_Pin = 10;
FlightSimInteger APEngageSwLED; //X-PlaneのLEDと接続
void setup(){
APEngageSwLED = XPlaneRef("sim/cockpit2/autopilot/flight_director_mode");
APEngageSwLED.onChange(updateAPEngageSwLED);
pinMode(SER_dataPin, OUTPUT);
pinMode(RCLK_latchPin, OUTPUT);
pinMode(SRCLK_clockPin, OUTPUT);
//すべてのレジスタピンをリセット
clearRegisters();
writeRegisters();
}
// LOWにすべてのレジスタの端子を設定
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
// ディスプレイレジスタのセット
//すべての値は希望の方法を設定した後にのみ呼び出す(そうでなければ遅い)
void writeRegisters(){
digitalWrite(RCLK_latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_clockPin, LOW);
int val = registers[i];
digitalWrite(SER_dataPin, val);
digitalWrite(SRCLK_clockPin, HIGH);
}
digitalWrite(RCLK_latchPin, HIGH);
}
// 個々のピンをHIGかLOWに設定する
void setRegisterPin(int index, int value){ //indexでピン位置、valueでLOWかHIGH
registers[index] = value;
}
void loop(){
FlightSim.update();
writeRegisters(); //変更内容を表示するために呼び出さなければなりません
//必要な値が設定された後に一度だけ呼び出します。
}
void updateAPEngageSwLED(long value) {
if (value == 2) {
setRegisterPin(APEngage_74HC595_Pin, HIGH); //消灯
} else {
setRegisterPin(APEngage_74HC595_Pin, LOW); //点灯
}
}