/*
* CD74HC4067サンプル
*/
#include <Arduino.h>
/*
// Analog MUX ロータリースイッチテスト
*/
// ----------------------------------------------------------------
// トグルスイッチピン
uint8_t gpio_mux_sig = 8; // To Base 3.3V
uint8_t gpio_mux_en = 3; // To MUX EN
uint8_t gpio_mux_s3 = 7; // To MUX s3
uint8_t gpio_mux_s2 = 6; // To MUX s2
uint8_t gpio_mux_s1 = 5; // To MUX s1
uint8_t gpio_mux_s0 = 4; // To MUX s0
uint8_t mux_channel[16][4] = {
{0, 0, 0, 0}, // 0
{1, 0, 0, 0}, // 1
{0, 1, 0, 0}, // 2
{1, 1, 0, 0}, // 3
{0, 0, 1, 0}, // 4
{1, 0, 1, 0}, // 5
{0, 1, 1, 0}, // 6
{1, 1, 1, 0}, // 7
{0, 0, 0, 1}, // 8
{1, 0, 0, 1}, // 9
{0, 1, 0, 1}, // 10
{1, 1, 0, 1}, // 11
{0, 0, 1, 1}, // 12
{1, 0, 1, 1}, // 13
{0, 1, 1, 1}, // 14
{1, 1, 1, 1} // 15
};
// 点灯秒数設定
uint16_t pw_short = 500; // ms
uint16_t pw_long = 8000; // ms
// ----------------------------------------------------------------
//------------------------------------------------------------------------------------------
// 対象MUX channel設定
bool muxSetChannel(uint8_t _target_ch)
{
uint8_t _control_pin[] = {gpio_mux_s0, gpio_mux_s1, gpio_mux_s2, gpio_mux_s3};
for (uint8_t i = 0; i < 4; i++)
{
digitalWrite(_control_pin[i], mux_channel[_target_ch][i]);
}
Serial.print("MUX Channel Set:");
Serial.println(_target_ch);
return true;
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// ボタンプッシュ
bool muxButtonPush(uint8_t _target_ch, String _push_method)
{
Serial.print("MUX Button Push:");
Serial.print(_target_ch);
Serial.print(" method:");
Serial.println(_push_method);
// 対象MUX channel設定
muxSetChannel(_target_ch);
// EN解除
digitalWrite(gpio_mux_en, LOW);
// ボタンプッシュ
if (_push_method == "long")
{
digitalWrite(gpio_mux_sig, HIGH);
delay(pw_long);
digitalWrite(gpio_mux_sig, LOW);
}
else
{
digitalWrite(gpio_mux_sig, HIGH);
delay(pw_short);
digitalWrite(gpio_mux_sig, LOW);
}
// EN設定
digitalWrite(gpio_mux_en, HIGH);
// 対象MUX COM設定リセット
// uint8_t _reset_ch = 0;
// muxSetChannel(_reset_ch);
muxSetChannel(0);
return true;
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// setup
void setup()
{
// シリアル開始
Serial.begin(115200);
delay(50);
Serial.println("Start!");
// GPIOピンモードを設定 初期設定
// MUX Base 3.3V
pinMode(gpio_mux_sig, OUTPUT);
digitalWrite(gpio_mux_sig, LOW);
// MUX EN
pinMode(gpio_mux_en, OUTPUT);
digitalWrite(gpio_mux_en, HIGH);
// MUX channel gpio
pinMode(gpio_mux_s3, OUTPUT);
pinMode(gpio_mux_s2, OUTPUT);
pinMode(gpio_mux_s1, OUTPUT);
pinMode(gpio_mux_s0, OUTPUT);
digitalWrite(gpio_mux_s3, LOW);
digitalWrite(gpio_mux_s2, LOW);
digitalWrite(gpio_mux_s1, LOW);
digitalWrite(gpio_mux_s0, LOW);
delay(100);
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// main loop
void loop()
{
// シリアルコンソールからトグルスイッチ操作
if (Serial.available())
{
int inputchar = Serial.read();
if (char(inputchar) == '1')
{
muxButtonPush(0, "long");
}
else if (char(inputchar) == '2')
{
muxButtonPush(1, "long");
}
else if (char(inputchar) == '3')
{
muxButtonPush(2, "long");
}
else if (char(inputchar) == '4')
{
muxButtonPush(3, "long");
}
else if (char(inputchar) == 'q')
{
muxButtonPush(0, "short");
}
else if (char(inputchar) == 'w')
{
muxButtonPush(1, "short");
}
else if (char(inputchar) == 'e')
{
muxButtonPush(2, "short");
}
else if (char(inputchar) == 'r')
{
muxButtonPush(3, "short");
}
}
delay(200);
}
//------------------------------------------------------------------------------------------
Loading
cd74hc4067
cd74hc4067