Buzzer SOS Signal (copy) — Arduino Uno simulation

Proyek buzzer yang memainkan pola Morse SOS menggunakan tone()

An interactive Arduino Uno circuit simulation you can run free in your browser on Velxio, by belvaclairina006.

Components

Sketch code

// Konfigurasi Pin
const int buzzerPin   = 8;
const int ledRedPin   = 13;
const int ledGreenPin = 12;
const int buttonPin   = 2;
const int potPin      = A0;

// Variabel State
bool alarmActive = false;
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledRedPin, OUTPUT);
  pinMode(ledGreenPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  
  Serial.begin(9600);
}

void loop() {
  // 1. Logika Tombol (Toggle On/Off) dengan Debounce
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading == LOW && !alarmActive) {
      alarmActive = true;
      Serial.println("Alarm AKTIF!");
      delay(200); // Mencegah pemicu ganda
    } else if (reading == LOW && alarmActive) {
      alarmActive = false;
      Serial.println("Alarm MATI (Standby)");
      // Matikan semua output saat standby
      noTone(buzzerPin);
      digitalWrite(ledRedPin, LOW);
      delay(200);
    }
  }
  lastButtonState = reading;

  // 2. Logika Berdasarkan Status
  if (alarmActive) {
    digitalWrite(ledGreenPin, LOW); // Matikan standby
    
    // Baca potensiometer untuk mengatur kecepatan (100ms - 600ms)
    int potValue = analogRead(potPin);
    int dotDuration = map(potValue, 0, 1023, 100, 600);
    
    playSOS(dotDuration);
  } else {
    digitalWrite(ledGreenPin, HIGH); // Nyalakan indikator standby
  }
}

// Fungsi pembantu untuk membunyikan sinyal
void beepAndFlash(int duration) {
  if (!alarmActive) return; // Berhenti jika tombol ditekan saat loop
  
  tone(buzzerPin, 1000, duration);
  digitalWrite(ledRedPin, HIGH);
  delay(duration);
  noTone(buzzerPin);
  digitalWrite(ledRedPin, LOW);
}

void playSOS(int dotDuration) {
  int dashDuration = dotDuration * 3;
  int gap = dotDuration;

  // S (...)
  for (int i = 0; i < 3 && alarmActive; i++) {
    beepAndFlash(dotDuration);
    checkButtonMidLoop();
    delay(gap);
  }
  
  // O (---)
  delay(dotDuration * 2);
  for (int i = 0; i < 3 && alarmActive; i++) {
    beepAndFlash(dashDuration);
    checkButtonMidLoop();
    delay(gap);
  }

  // S (...)
  delay(dotDuration * 2);
  for (int i = 0; i < 3 && alarmActive; i++) {
    beepAndFlash(dotDuration);
    checkButtonMidLoop();
    delay(gap);
  }
  
  delay(1000); // Jeda antar siklus SOS
}

// Fungsi untuk mengecek tombol di tengah-tengah delay panjang
void checkButtonMidLoop() {
  if (digitalRead(buttonPin) == LOW) {
    alarmActive = false;
  }
}

More projects by belvaclairina006