const int buttonPin = 8; // タクトスイッチの接続ピン
const int ledPin = 13; // LEDの接続ピン(内蔵LED)
const int buzzerPin = 12; // ブザーの接続ピン
int buttonState = HIGH; // タクトスイッチの現在の状態
int lastButtonState = HIGH; // タクトスイッチの前回の状態
unsigned long lastDebounceTime = 0; // デバウンス処理のための時間記録
unsigned long debounceDelay = 50; // デバウンス時間
String morseCode = ""; // モールス信号の保存用
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // タクトスイッチのピンを入力モードに設定し、プルアップ抵抗を有効にする
pinMode(ledPin, OUTPUT); // LEDのピンを出力モードに設定
pinMode(buzzerPin, OUTPUT); // ブザーのピンを出力モードに設定
Serial.begin(9600); // シリアル通信を開始
Serial.println("***START***");
}
void loop() {
int reading = digitalRead(buttonPin); // タクトスイッチの状態を読み取る
// デバウンス処理
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH); // タクトスイッチが押されたらLEDを点灯
digitalWrite(buzzerPin, HIGH); // タクトスイッチが押されたらブザーを鳴らす
unsigned long pressTime = millis();
while(digitalRead(buttonPin) == LOW) {}
unsigned long releaseTime = millis();
unsigned long pressDuration = releaseTime - pressTime;
if (pressDuration < 200) {
morseCode += "."; // ドット
} else {
morseCode += "-"; // ダッシュ
}
} else {
digitalWrite(ledPin, LOW); // タクトスイッチが離されたらLEDを消灯
digitalWrite(buzzerPin, LOW); // タクトスイッチが離されたらブザーを止める
}
}
}
lastButtonState = reading;
// スペースや文字の区切りを検出(タクトスイッチを押さない時間で判定)
if (buttonState == HIGH && morseCode.length() > 0) {
if ((millis() - lastDebounceTime) > 1000) { // 1秒以上の無操作で1文字の区切りとする
Serial.print(morseToChar(morseCode));
morseCode = ""; // モールス信号をリセット
}
}
}
char morseToChar(String morse) {
if (morse == ".-") return 'A';
if (morse == "-...") return 'B';
if (morse == "-.-.") return 'C';
if (morse == "-..") return 'D';
if (morse == ".") return 'E';
if (morse == "..-.") return 'F';
if (morse == "--.") return 'G';
if (morse == "....") return 'H';
if (morse == "..") return 'I';
if (morse == ".---") return 'J';
if (morse == "-.-") return 'K';
if (morse == ".-..") return 'L';
if (morse == "--") return 'M';
if (morse == "-.") return 'N';
if (morse == "---") return 'O';
if (morse == ".--.") return 'P';
if (morse == "--.-") return 'Q';
if (morse == ".-.") return 'R';
if (morse == "...") return 'S';
if (morse == "-") return 'T';
if (morse == "..-") return 'U';
if (morse == "...-") return 'V';
if (morse == ".--") return 'W';
if (morse == "-..-") return 'X';
if (morse == "-.--") return 'Y';
if (morse == "--..") return 'Z';
return '?'; // 未定義のモールス信号の場合
}