はじめに
今回は、スイッチを2秒間長押しすることで、Arduinoの出力をON/OFFできる回路を作成してみました。
「長押ししたときだけ」状態を切り替えるようにすることで、誤操作を防ぐことができます。
家電製品などでもよく見られますね!
この記事を読んでわかること
- Arduinoを使ったスイッチ回路の作り方
- 2秒長押しによるON/OFF制御のプログラム
- 電子工作の面白さと応用のアイデア
使用パーツ
- タクトスイッチ ×1
- Arduino
- LED(確認用)×1
- 抵抗×5(100k × 3、39k × 1、1k × 1)
- Pch FET:2sj681
- Nch FET:2sk4017
- トランジスタ:2sc1815
- ブレッドボードとジャンパワイヤ
回路図と部品構成の解説
今回の回路では、スイッチの長押しで電源ON/OFFを制御できるように、トランジスタとFETを組み合わせた構成になっています。
Arduinoとの接続は以下の通りです。
- D10ピン:Pch FET(2SJ681)のソースへ接続
- D11ピン:Nch FET(2SK4017)のゲートへ接続
- D12ピン:トランジスタ(2SC1815)のベース抵抗を経由して接続
回路図

各部品の役割
部品 | 型番 | 役割 |
---|---|---|
タクトスイッチ | ― | 押すとHIGHを入力。2秒間長押しで反応 |
トランジスタ | 2SC1815 (Q1) | Pch FETを駆動するためのスイッチング制御 |
Pch FET | 2SJ681 (U2) | 電源ラインをON/OFFする主スイッチ素子 |
Nch FET | 2SK4017 (U1) | Pch FETを駆動するためのスイッチング制御 |
LED + 抵抗 | D1 + R1(1kΩ) | 出力状態の確認用(ON状態で点灯) |
プログラム
プログラム全体の動作説明
このプログラムは、**2つのスイッチ(ON・OFF)**によって、Arduinoのデジタル出力を制御します。特徴は、スイッチを2秒以上長押しすることでON/OFFを切り替える点です。
主な動作の流れ
- 初期状態:Tr_ONピンはLOW(電源OFF状態)
- スイッチ(ピン10)を2秒間押し続けると:
Tr_ONピン
がHIGH
になり、電源ON状態になります。- この状態を記録するために
trOnState = true
となります。
- スイッチを離すまで再度ONにできないようにする:
onReleased
フラグを使って、押されたままの状態では再トリガーしないように防止。
- OFFスイッチ(ピン11)を2秒間押し続けると:
Tr_ONピン
がLOW
になり、電源OFF状態になります。trOnState = false
に戻ります。
- 1秒ごとにスイッチ状態と出力状態をシリアルモニタに出力:
- 動作のデバッグや確認がしやすくなっています。
プログラムコード
// ピンの定義
const int On_Read_pin = 10; // ONスイッチの入力ピン
const int OFF_Read_pin = 11; // OFFスイッチの入力ピン
const int Tr_ON = 12; // トランジスタ制御出力ピン(リレーなどの制御)
// スイッチが押され始めた時間の記録用変数
unsigned long onStartTime = 0;
unsigned long offStartTime = 0;
// 出力状態とスイッチ状態の管理
bool trOnState = false; // 出力の現在状態(true = ON、false = OFF)
bool onReleased = true; // ONスイッチを離した状態かどうか(再トリガー防止)
bool offReleased = true; // OFFスイッチを離した状態かどうか(再トリガー防止)
void setup() {
pinMode(On_Read_pin, INPUT); // ONスイッチを入力に設定
pinMode(OFF_Read_pin, INPUT); // OFFスイッチを入力に設定
pinMode(Tr_ON, OUTPUT); // 出力ピンを出力に設定
digitalWrite(Tr_ON, LOW); // 初期状態ではOFF(LOW)
Serial.begin(9600); // シリアル通信開始(デバッグ用)
}
void loop() {
int onState = digitalRead(On_Read_pin); // ONスイッチの状態を読み取り
int offState = digitalRead(OFF_Read_pin); // OFFスイッチの状態を読み取り
unsigned long currentTime = millis(); // 現在の時間を取得(ms単位)
// —– ONスイッチ処理 —–
if (!trOnState) { // 現在OFFのときだけON動作を処理
if (onState == HIGH && onReleased) {
if (onStartTime == 0) {
onStartTime = currentTime; // 押し始めた時刻を記録
} else if (currentTime – onStartTime >= 2000) {
// 2秒以上押し続けていたらONにする
trOnState = true;
digitalWrite(Tr_ON, HIGH); // 出力ON
onReleased = false; // 押されたままでは再実行しない
onStartTime = 0;
}
} else if (onState == LOW) {
// スイッチを離したのでリセット
onStartTime = 0;
onReleased = true;
}
}
// —– OFFスイッチ処理 —–
if (trOnState) { // 現在ONのときだけOFF動作を処理
if (offState == HIGH && offReleased) {
if (offStartTime == 0) {
offStartTime = currentTime; // 押し始めた時刻を記録
} else if (currentTime – offStartTime >= 2000) {
// 2秒以上押し続けていたらOFFにする
trOnState = false;
digitalWrite(Tr_ON, LOW); // 出力OFF
offReleased = false;
offStartTime = 0;
}
} else if (offState == LOW) {
// スイッチを離したのでリセット
offStartTime = 0;
offReleased = true;
}
}
// —– シリアル出力 —–
static unsigned long lastPrint = 0;
if (currentTime – lastPrint >= 1000) {
// 1秒ごとに状態をシリアル出力(デバッグ表示)
Serial.print(“On_Read_pin: “);
Serial.print(onState);
Serial.print(” | OFF_Read_pin: “);
Serial.print(offState);
Serial.print(” | Tr_ON: “);
Serial.println(trOnState ? “HIGH” : “LOW”);
lastPrint = currentTime;
}
}
実際の動作動画
シリアルモニタでの確認結果
シリアルモニタでトランジスタやスイッチ、LEDの状態を確認できます。

まとめ
今回は、2秒以上の長押しで状態を切り替えるスイッチ制御回路をArduinoで実装してみました。
このような長押し処理は、誤動作を防ぐために家電や電子機器ではよく使われています。Arduinoなら簡単に再現できるので、ぜひ応用してみてください!
コメント