const int AC_IN_ZERO = 2; // Kesme Pini 0 (Pin 2) const int triac = 10; const int POT_PIN = A1; // Potansiyometre pini // Volatile değişkenler kesme rutininde kullanılacağı için tanımlanır volatile int pot_value = 0; volatile unsigned long zero_cross_count = 0; // --- Üstel Yumuşatma Filtresi Değişkenleri --- float smoothed_analog_value = 0; const float ALPHA = 0.08; // Seri port yazdırma kontrolü için unsigned long lastPrintTime = 0; const long printInterval = 200; // Triyak tetiklemesini sıfır geçişinden sonra yöneten fonksiyon void triac_trigger() { // 1. Gecikme (Güç Ayarı) delayMicroseconds(pot_value); // 2. Tetikleme Darbesi digitalWrite(triac, HIGH); delayMicroseconds(50); digitalWrite(triac, LOW); } // SIFIR GEÇİŞ KESMESİ (Interrupt Service Routine - ISR) void zero_cross_interrupt() { zero_cross_count++; triac_trigger(); } void setup() { Serial.begin(9600); Serial.println("--- Triyak Dimmer Kontrol Sistemi Baslatildi (%15 - %100 Araligi) ---"); Serial.println("Kesme Tipi: FALLING | INPUT_PULLUP"); Serial.println("Gecikme (us) | Guc (%) | Filtrelenmis Pot | Zero Cross Sayaci (200ms)"); pinMode(AC_IN_ZERO, INPUT_PULLUP); // PC814A uyumlu pinMode(triac, OUTPUT); pinMode(POT_PIN, INPUT); digitalWrite(triac, LOW); smoothed_analog_value = (float)analogRead(POT_PIN); attachInterrupt(digitalPinToInterrupt(AC_IN_ZERO), zero_cross_interrupt, FALLING); } void loop() { // 1. Analog Okuma ve Üstel Yumuşatma int analog_read_value = analogRead(POT_PIN); smoothed_analog_value = ALPHA * analog_read_value + (1.0 - ALPHA) * smoothed_analog_value; int filtered_analog_value = (int)round(smoothed_analog_value); // 2. Gecikme Değerini Güncelleme (%15 - %100 Aralığı) // Pot 0'dayken %15 güç (Gecikme: 8300us) // Pot 1023'teyken %100 güç (Tam Açık: 0us) const int MAX_DELAY_US = 8300; // %15 Güç Sınırı const int MIN_DELAY_US = 0; // %100 Güç (Tam Açık) int new_pot_value = map(filtered_analog_value, 0, 1023, MAX_DELAY_US, MIN_DELAY_US); // Histerezis (Kararlılık Bölgesi) if (abs(new_pot_value - pot_value) > 5) { pot_value = new_pot_value; } // 3. Seri Port İzleme (200ms'de bir) if (millis() - lastPrintTime >= printInterval) { // Güç Yüzdesi Hesaplaması float power_percentage = 100.0 * (1.0 - (float)pot_value / 9750.0); // Yüzde sınırlarını %15 ile %100 arasında tut if (power_percentage > 100.0) power_percentage = 100.0; if (power_percentage < 15.0) power_percentage = 15.0; noInterrupts(); unsigned long current_count = zero_cross_count; zero_cross_count = 0; interrupts(); Serial.print(pot_value); Serial.print(" us \t | "); Serial.print(power_percentage, 1); Serial.print(" % \t | "); Serial.print(filtered_analog_value); Serial.print(" \t | "); Serial.println(current_count); lastPrintTime = millis(); } }