Parçalar · 11 dk okuma

Optokuplör Nedir? PC817 ve 4N35 ile Arduino'da Galvanik İzolasyon

Optokuplör nedir, nasıl çalışır? PC817 ve 4N35 pinleri, CTR ve direnç hesabı, 12/24 V sinyal okuma, 220 V algılama (H11AA1), röle modülü ve MOC3021 notları.

Optokuplör (optocoupler, optoizolatör ya da foto kuplör), iki devre arasında elektrik bağlantısı kurmadan, yalnızca ışıkla sinyal taşıyan küçük bir entegredir. İçinde bir kızılötesi LED ve onun karşısında duran bir fototransistör bulunur: bir taraftaki devre LED'i yakınca diğer taraftaki transistör iletime geçer. İki taraf arasında tek bir kablo bile olmadığı için 24 V'luk bir endüstriyel sensörü, bir otomobilin 12 V hattını ya da bir motor sürücüsünü Arduino'na bağlarken oluşabilecek gerilim sıçramaları ve parazitler mikrodenetleyicine ulaşamaz.

Bu yazıda optokuplörün içinde ne olduğunu, galvanik izolasyonun neden önemli olduğunu, en yaygın iki model olan PC817 ve 4N35'in pinlerini ve değerlerini, CTR kavramını ve direnç hesabını adım adım öğreneceksin. Ardından Arduino çıkışını yalıtmayı, 12/24 V sinyalleri güvenle okumayı, ESP32 ve Raspberry Pi Pico ile kullanımı, 220 V algılamanın (H11AA1) güvenlik kurallarını, röle modüllerindeki optokuplörü ve MOC3021 ile triyak sürmeyi göreceksin.

Optokuplör nedir, nasıl çalışır?

Optokuplörün kılıfının içinde birbirine bakan iki yonga vardır. Giriş tarafında, normal bir LED gibi akımla çalışan kızılötesi bir LED bulunur. Çıkış tarafında ise beyzi ışığa duyarlı bir fototransistör vardır; beyz ucuna akım vermek yerine ışık düşürülür. İki yonganın arasında saydam ama elektriksel olarak yalıtkan bir plastik katman yer alır. Bu katman binlerce volta dayanacak şekilde tasarlanmıştır.

  1. Giriş tarafındaki devre, LED'den bir direnç üzerinden birkaç miliamper akım geçirir.
  2. LED kızılötesi ışık yayar; bu ışık yalıtkan katmanı geçip fototransistörün üzerine düşer.
  3. Işık, fototransistörün beyz akımı gibi davranır ve kolektör ile emetör arasından akım akmasını sağlar; transistör bir anahtar gibi kapanır.
  4. LED sönünce ışık kesilir, transistör yalıtıma geçer ve çıkış devresi açılır. Sinyal böylece kablosuz, yalnızca ışıkla karşıya geçmiş olur.

Çıkış tarafında hangi elemanın olduğuna göre optokuplörlerin farklı türleri vardır. Hobi projelerinde en çok fototransistörlü modeller kullanılır; ama AC sinyal algılamak, triyak tetiklemek ya da hızlı veri hattını yalıtmak için özel türler gerekir:

TürÖrnek modellerÇıkışTipik kullanım
FototransistörlüPC817, EL817, 4N35, 4N25NPN fototransistörDijital sinyal yalıtımı, 12/24 V giriş okuma, röle modülleri
Darlington çıkışlı4N33, H11B1Darlington transistörÇok düşük LED akımıyla yüksek çıkış akımı (ama daha yavaş)
AC girişliH11AA1, PC814Ters paralel iki LED + fototransistör220 V şebeke algılama, sıfır geçiş tespiti
Triyak çıkışlıMOC3021, MOC3041, MOC3063Foto triyakTriyak tetikleme, AC yük kontrolü, SSR'ler
Yüksek hızlı lojik6N137, 6N138Fotodiyot + lojik kapı ya da transistörMIDI, UART ve hızlı dijital hat yalıtımı

Galvanik izolasyon neden gerekir?

Galvanik izolasyon, iki devrenin arasında doğrudan iletken bir yol olmaması demektir: ortak GND yoktur, ortak kablo yoktur, enerji ve bilgi başka bir yolla (ışık, manyetik alan) aktarılır. Arduino'nun pinleri en fazla 5 V'a (ESP32 ve Pico'da 3,3 V) dayanır. Bir endüstriyel sensörün 24 V'u, bir motorun anahtarlama sırasında ürettiği yüzlerce voltluk kısa sıçramalar ya da uzun kablolara indüklenen parazitler, ortak GND üzerinden doğrudan mikrodenetleyiciye ulaşabilir. Optokuplör bu yolu fiziksel olarak keser.

  • Koruma: Yüksek gerilim tarafında bir arıza olsa bile hasar optokuplörde kalır; Arduino, bilgisayarın USB portu ve sen güvende olursun.
  • Parazit ve toprak döngüsü: Motorlar, röleler ve uzun kablolar GND hattında gürültü oluşturur. Topraklar ayrı olduğunda bu gürültü sinyal hattına karışmaz; ortak toprak konusunu GND ve ortak toprak yazısında ayrıntılı anlatıyoruz.
  • Farklı gerilim seviyeleri: Çıkış transistörü dışarıdan beslendiği için 24 V'luk bir sinyal 3,3 V'a, 5 V'luk bir sinyal 12 V'a kolayca dönüşür. Optokuplör aynı zamanda yavaş ama sağlam bir seviye dönüştürücüdür.
  • Güvenlik standartları: Şebeke gerilimine bağlı cihazlarda kullanıcı tarafının şebekeden yalıtılması zorunludur; PC817 gibi parçalar 5000 V rms yalıtım testinden geçer.
İzolasyon yalnızca iki tarafın GND'si birbirinden ayrı kaldığında işe yarar. 24 V tarafının eksisini "olsun" diye Arduino'nun GND'sine bağlarsan optokuplör yalnızca pahalı bir kablo olur; koruma tamamen kaybolur. Giriş tarafını kendi kaynağı, çıkış tarafını Arduino beslesin.

PC817 ve 4N35 pinleri ve teknik değerleri

PinPC817 (DIP-4)4N35 (DIP-6)
1Anot (LED +)Anot (LED +)
2Katot (LED −)Katot (LED −)
3EmetörBoş (bağlantı yok)
4KolektörEmetör
5YokKolektör
6YokBeyz (genelde boş bırakılır)
ÖzellikPC8174N35
LED ileri gerilimi (VF)Tipik 1,2 V, en fazla 1,4 V (20 mA'de)Yaklaşık 1,2–1,3 V
LED en büyük akımı50 mA60 mA
LED ters gerilimiEn fazla 6 VEn fazla 6 V
CTR%50–600 (5 mA, 5 V'ta; sınıfa göre)En az %100 (10 mA, 10 V'ta)
Kolektör-emetör gerilimi (VCEO)35 V70 V
Kolektör akımıEn fazla 50 mAEn fazla 50 mA
Anahtarlama süresiTipik 3–4 µs (düşük yük direnciyle)Yaklaşık 10 µs
Yalıtım gerilimi5000 V rms5000 V rms

PC817'nin üzerinde 1 numaralı pin bir noktayla işaretlidir; kılıf üzerinde "PC817" yazısından sonra gelen A, B, C ya da D harfi CTR sınıfını gösterir. EL817, LTV817 ve KP1010 gibi parçalar PC817 ile pin uyumlu muadillerdir. 4N35 ise altı bacaklı olduğu için beyz ucu dışarı çıkar; bu ucu genelde boş bırakırsın, çok gürültülü ortamlarda beyz ile emetör arasına yüksek değerli bir direnç (ör. 1 MΩ) konarak kapanma hızlandırılabilir.

CTR nedir ve direnç nasıl hesaplanır?

CTR (Current Transfer Ratio, akım aktarım oranı), çıkış transistöründen akabilecek kolektör akımının LED akımına oranıdır: CTR = IC / IF × %100. Örneğin CTR'si %100 olan bir optokuplörde LED'den 5 mA geçirirsen çıkıştan en fazla yaklaşık 5 mA akım çekebilirsin. CTR sıcaklıkla değişir, LED yaşlandıkça yıllar içinde düşer ve aynı modelin parçaları arasında bile büyük fark gösterir. Bu yüzden tasarımda her zaman veri sayfasındaki en düşük değeri esas alırsın.

PC817 sınıfıCTR aralığı (IF = 5 mA)5 mA LED akımında çıkış akımı
PC817A%80–1604–8 mA
PC817B%130–2606,5–13 mA
PC817C%200–40010–20 mA
PC817D%300–60015–30 mA
Harf yok%50–6002,5–30 mA (en kötüsünü varsay)

LED direnci: Giriş tarafı tam bir LED gibi hesaplanır: R = (Vkaynak − VF) / IF. Arduino Uno'nun 5 V pininden 10 mA geçirmek için (5 − 1,2) / 0,010 = 380 Ω bulunur; standart 330 Ω yaklaşık 11,5 mA, 390 Ω yaklaşık 9,7 mA verir. ESP32'de (3,3 − 1,2) / 0,010 = 210 Ω, yani 220 Ω kullanırsın. Raspberry Pi Pico'nun pinleri varsayılan olarak 4 mA sürme gücüyle ayarlıdır; burada 470 Ω ile yaklaşık 4,5 mA yeterlidir. Hesabı elle yapmak istemezsen LED Direnci aracını kullanabilirsin.

Çıkış (pull-up) direnci: Transistörün tam iletime (doyuma) girmesi için pull-up direncinin çektiği akım, CTR'nin izin verdiğinden küçük olmalıdır. 5 V'a bağlı 10 kΩ pull-up yalnızca 0,5 mA ister. Harfsiz bir PC817'de en kötü CTR %50 olduğundan 0,5 mA için LED'den 1 mA geçmesi yeterdi; 5–10 mA vererek en az beş kat pay bırakmış olursun. Arduino'nun dahili pull-up direnci (yaklaşık 20–50 kΩ) de bu iş için idealdir. Pull-up küçüldükçe sinyal hızlanır ama gereken akım artar; büyüdükçe akım azalır ama transistörün kapanması yavaşlar.

DurumKaynak gerilimiHedef LED akımıÖnerilen dirençDirenç gücü
Arduino Uno pininden sürme5 V~10 mA330 Ω1/4 W yeterli
ESP32 pininden sürme3,3 V~10 mA220 Ω1/4 W yeterli
Raspberry Pi Pico pininden sürme3,3 V~4,5 mA470 Ω1/4 W yeterli
12 V sinyal okuma12 V~5 mA2,2 kΩ1/4 W (0,05 W harcar)
24 V sinyal okuma24 V~5 mA4,7 kΩ1/4 W (0,11 W harcar)
12 V ve 24 V'u aynı girişte okuman gerekiyorsa 4,7 kΩ seç: 24 V'ta yaklaşık 4,8 mA, 12 V'ta yaklaşık 2,3 mA akar. %50 CTR ile bile 2,3 mA, dahili pull-up'ın istediği 0,1–0,25 mA'nın çok üstündedir; aynı devre iki gerilimde de güvenle çalışır.

Bağlantı tablosu: Arduino Uno, ESP32 ve Raspberry Pi Pico

PC817 piniGöreviArduino UnoESP32Raspberry Pi Pico
1 (Anot), çıkış yalıtımıKart LED'i sürerD9 → 330 Ω → pin 1GPIO 25 → 220 Ω → pin 1GP15 → 470 Ω → pin 1
2 (Katot), çıkış yalıtımıLED dönüşüGNDGNDGND
4 (Kolektör), giriş okumaKart sinyali okurD2 (INPUT_PULLUP)GPIO 27 (INPUT_PULLUP)GP14 (PULL_UP)
3 (Emetör), giriş okumaOkuma tarafı GNDGNDGNDGND
1 ve 2, giriş okumaDış sinyal (12/24 V)Dış kaynağa bağlanır, karta değilDış kaynağa bağlanır, karta değilDış kaynağa bağlanır, karta değil
En sık yapılan hata LED'i dirençsiz bağlamaktır: 5 V'u doğrudan pin 1 ve 2'ye vermek LED'i saniyeler içinde yakar. İkinci sık hata ise pinleri ters takmaktır; LED ters gerilime yalnızca 6 V dayanır, 12 V ya da 24 V ters bağlanırsa bozulur. Girişe ters yönde (katottan anoda) bir 1N4148 diyot eklemek bu riski ortadan kaldırır.

Arduino çıkışını yalıtmak

Bu kullanımda Arduino, optokuplörün LED'ini yakar; çıkıştaki transistör ise başka bir devrenin girişini bir anahtar gibi kısa devre eder. Örneğin bir 12 V cihazın "tetik" girişini, bir fotoğraf makinesinin uzaktan deklanşör girişini, bir PLC girişini ya da farklı gerilimde çalışan başka bir mikrodenetleyiciyi bu yolla güvenle sürebilirsin. Çıkış transistörünün sınırları 35 V ve 50 mA olduğu için bir röle bobinini, motoru ya da LED şeridi doğrudan süremez; böyle yükler için karşı tarafta bir transistör ya da MOSFET kullanırsın.

C++ (Arduino IDE)
1// PC817 ile yalıtılmış çıkış / Isolated output with a PC817
2// D9 -> 330 ohm -> PC817 pin 1 (anot / anode), pin 2 (katot / cathode) -> Arduino GND
3// Pin 4 ve 3 diğer devrenin girişini kısa devre eder (kuru kontak gibi)
4// Pins 4 and 3 short the other circuit's input (like a dry contact)
5const int OPTO_LED_PIN = 9;
6const unsigned long ON_MS = 2000;
7const unsigned long OFF_MS = 3000;
8
9bool isOn = false;
10unsigned long lastSwitch = 0;
11
12void setup() {
13  pinMode(OPTO_LED_PIN, OUTPUT);
14  digitalWrite(OPTO_LED_PIN, LOW);
15}
16
17void loop() {
18  unsigned long waitTime = isOn ? ON_MS : OFF_MS;
19  if (millis() - lastSwitch >= waitTime) {
20    lastSwitch = millis();
21    isOn = !isOn;
22    digitalWrite(OPTO_LED_PIN, isOn ? HIGH : LOW);   // HIGH: optokuplör iletir / HIGH: optocoupler conducts
23  }
24}

Çıkış tarafında kolektörü (pin 4) karşı devrenin artı tarafına ya da girişine, emetörü (pin 3) o devrenin GND'sine bağlarsın; kutup ters olursa transistör iletmez. PC817 ile sinyalin açılıp kapanması birkaç ile birkaç on mikrosaniye sürdüğü için optokuplörden geçen PWM sinyali birkaç kHz'in üstünde bozulmaya başlar. Hızlı sinyaller (UART, MIDI, yüksek frekanslı PWM) için 6N137 gibi yüksek hızlı optokuplörler ya da dijital izolatör entegreleri tercih edilir.

12/24 V sinyali güvenle okumak

Endüstriyel endüktif sensörler, PLC çıkışları, kapı kontakları, araç kontak anahtarı ya da 12 V'luk bir zil butonu gibi kaynaklardan gelen sinyalleri doğrudan Arduino pinine bağlayamazsın. Çözüm, sinyali optokuplörün LED'inden geçirmektir: 24 V için LED'e seri 4,7 kΩ, 12 V için 2,2 kΩ direnç koyarsın; çıkış transistörü ise Arduino'nun dahili pull-up direnciyle çalışır. Gerilim geldiğinde LED yanar, transistör iletir ve Arduino pini LOW okur. Yani mantık terstir; kodda bunu dikkate alırsın.

  1. 24 V kaynağın artısını 4,7 kΩ direnç üzerinden PC817'nin 1 numaralı pinine (anot) bağla.
  2. Sinyal kaynağının eksisini (24 V GND) 2 numaralı pine (katot) bağla. Bu GND'yi Arduino'ya bağlama.
  3. İsteğe bağlı olarak 1 ve 2 numaralı pinlere ters yönde bir 1N4148 diyot ekle (katodu pin 1'e); ters bağlantıya karşı korur.
  4. PC817'nin 4 numaralı pinini (kolektör) Arduino'nun D2 pinine, 3 numaralı pinini (emetör) Arduino GND'sine bağla.
  5. Aşağıdaki kodu yükle ve Seri Monitörü 9600 baud'da aç. 24 V uyguladığında "24V VAR" yazısını görmelisin.
C++ (Arduino IDE)
1// PC817 ile 12/24 V sinyal okuma / Reading a 12/24 V signal with a PC817
2// PC817 pin 4 (kolektör / collector) -> D2, pin 3 (emetör / emitter) -> Arduino GND
3const int OPTO_PIN = 2;
4const unsigned long DEBOUNCE_MS = 20;    // kontak sıçramasına karşı / against contact bounce
5
6int lastReading = HIGH;
7int stableState = HIGH;
8unsigned long lastChange = 0;
9unsigned long pulseCount = 0;
10
11void setup() {
12  Serial.begin(9600);
13  pinMode(OPTO_PIN, INPUT_PULLUP);       // dahili pull-up yeterli / internal pull-up is enough
14}
15
16void loop() {
17  int reading = digitalRead(OPTO_PIN);
18  if (reading != lastReading) {          // değişim var, zamanı başlat / change seen, start the timer
19    lastChange = millis();
20    lastReading = reading;
21  }
22  if (millis() - lastChange > DEBOUNCE_MS && reading != stableState) {
23    stableState = reading;
24    // Mantık ters: 24 V varsa LED yanar, transistör iletir, pin LOW olur
25    // Inverted logic: with 24 V present the LED is on, the transistor conducts, the pin reads LOW
26    if (stableState == LOW) {
27      pulseCount++;
28      Serial.print("24V VAR / present, sayac / count: ");
29      Serial.println(pulseCount);
30    } else {
31      Serial.println("24V YOK / absent");
32    }
33  }
34}

Kod, 20 ms boyunca değişmeyen okumaları kabul eden basit bir debounce (sıçrama önleme) içerir; mekanik kontak ya da rölelerden gelen sinyallerde bu şarttır. Okumayı delay() yerine millis() ile yaptığımız için Arduino bu sırada başka işler de yapabilir. Araç elektriğinde 12 V hattı motor çalışırken 14,4 V'a çıkar ve kısa süreli yüksek sıçramalar görülür; burada direnci 3,3 kΩ'a çıkarmak ve girişe bir TVS diyot eklemek iyi bir önlemdir.

ESP32 ve Raspberry Pi Pico ile optokuplör

ESP32 ve Pico 3,3 V ile çalıştığı için 5 V'luk sinyallere bile doğrudan bağlanmamalıdır. Optokuplörün güzelliği şudur: çıkış transistörü açık kolektördür, yani çıkış gerilimini yalnızca pull-up direncinin bağlı olduğu gerilim belirler. Dahili pull-up kullandığında çıkış otomatik olarak 3,3 V seviyesinde kalır; giriş tarafında 24 V olsa bile ESP32'ye en fazla 3,3 V ulaşır. Aşağıdaki ESP32 kodu 24 V'luk bir endüktif sensörden ya da debimetreden gelen darbeleri kesmeyle (interrupt) sayar:

C++ (Arduino IDE)
1// ESP32: 24 V endüstriyel sensörden darbe sayma / counting pulses from a 24 V industrial sensor
2// PC817 pin 4 -> GPIO 27, pin 3 -> ESP32 GND
3const int OPTO_PIN = 27;
4
5volatile unsigned long pulseCount = 0;
6volatile unsigned long lastPulseUs = 0;
7
8void IRAM_ATTR onPulse() {
9  unsigned long now = micros();
10  if (now - lastPulseUs > 2000) {        // 2 ms'den kısa parazitleri yok say / ignore glitches shorter than 2 ms
11    pulseCount++;
12    lastPulseUs = now;
13  }
14}
15
16void setup() {
17  Serial.begin(115200);
18  pinMode(OPTO_PIN, INPUT_PULLUP);
19  attachInterrupt(digitalPinToInterrupt(OPTO_PIN), onPulse, FALLING);   // 24 V gelince pin düşer / pin falls when 24 V arrives
20}
21
22void loop() {
23  static unsigned long lastPrint = 0;
24  if (millis() - lastPrint >= 1000) {
25    lastPrint = millis();
26    noInterrupts();
27    unsigned long count = pulseCount;
28    pulseCount = 0;
29    interrupts();
30    Serial.printf("Saniyedeki darbe / Pulses per second: %lu\n", count);
31  }
32}

Kesme fonksiyonunun önündeki IRAM_ATTR, kodun hızlı belleğe konmasını sağlar; ESP32'de kesme fonksiyonlarında kullanılması önerilir. 2 ms'lik filtre, optokuplörün yavaş kapanmasından ya da kablo parazitinden doğan sahte darbeleri eler. Kesmelerin ayrıntısı için Arduino interrupt yazısına göz atabilirsin. Raspberry Pi Pico'da aynı işi MicroPython ile şöyle yaparsın; bu örnek girişi okurken ikinci bir PC817 ile karşı tarafa yalıtılmış bir sinyal de gönderir:

MicroPython
1# Raspberry Pi Pico: PC817 ile yalıtılmış giriş / isolated input with a PC817
2# PC817 pin 4 -> GP14, pin 3 -> Pico GND, LED sürme / LED drive: GP15 -> 470 ohm -> pin 1
3from machine import Pin
4import time
5
6opto_in = Pin(14, Pin.IN, Pin.PULL_UP)     # dahili pull-up / internal pull-up
7opto_out = Pin(15, Pin.OUT)                # ikinci PC817'nin LED'i / LED of a second PC817
8
9last_state = opto_in.value()
10while True:
11    state = opto_in.value()
12    if state != last_state:
13        time.sleep_ms(20)                  # sıçramayı bekle / wait out the bounce
14        state = opto_in.value()
15        if state != last_state:
16            last_state = state
17            if state == 0:                 # ters mantık: 0 = gerilim var / inverted: 0 = voltage present
18                print("24V VAR / present")
19                opto_out.value(1)          # karşı tarafa yalıtılmış sinyal / isolated signal to the other side
20            else:
21                print("24V YOK / absent")
22                opto_out.value(0)
23    time.sleep_ms(5)

220 V algılama: H11AA1 ve güvenlik

220 V şebeke gerilimi öldürücüdür. Deneyimin yoksa şebekeye bağlı devreyi kendin kurma; hazır, kapalı kutulu ve sertifikalı AC algılama modülleri kullan. Şebeke tarafını asla breadboard'a takma, devre enerjiliyken hiçbir yere dokunma ve tüm devreyi yalıtkan bir kutuya, sigortayla birlikte yerleştir.

Bir prizde ya da lamba hattında gerilim olup olmadığını, ya da şebekenin sıfır geçiş anlarını tespit etmek için H11AA1 gibi AC girişli optokuplörler kullanılır. İçinde ters paralel bağlı iki LED vardır; bu yüzden alternatif akımın her iki yarım dalgasında da ışık üretir ve ters gerilim sorunu yaşamaz. 230 V rms için girişe seri olarak iki adet 47 kΩ direnç konur: toplam 94 kΩ'dan yaklaşık 2,4 mA rms (tepe değerde 3,5 mA) akar ve her direnç yaklaşık 0,28 W harcar. Bu yüzden en az 0,5 W, tercihen 1 W direnç seçilir; iki direnç kullanmak her birinin üzerindeki gerilimi de yarıya indirir. Çıkış tarafında 5 V'a bağlı 10 kΩ pull-up ile transistör, gerilim varken çoğunlukla iletimdedir; yalnızca sıfır geçişlerinin yakınında LED'ler sönünce kısa bir HIGH darbesi oluşur. 50 Hz şebekede saniyede yaklaşık 100 darbe görürsün.

C++ (Arduino IDE)
1// H11AA1 ile şebeke gerilimi var mı? / Is mains voltage present? (H11AA1)
2// H11AA1 pin 5 (kolektör / collector) -> D2, pin 4 (emetör / emitter) -> GND, 10k pull-up -> 5V
3const int AC_PIN = 2;
4const unsigned long TIMEOUT_MS = 40;     // 50 Hz'de 2 tam periyot / 2 full cycles at 50 Hz
5
6volatile unsigned long pulses = 0;
7unsigned long lastLowSeen = 0;
8unsigned long lastReport = 0;
9
10void onZeroCross() {
11  pulses++;                              // her sıfır geçişinde bir darbe / one pulse per zero crossing
12}
13
14void setup() {
15  Serial.begin(9600);
16  pinMode(AC_PIN, INPUT);                // harici 10k pull-up kullanılıyor / external 10k pull-up in use
17  attachInterrupt(digitalPinToInterrupt(AC_PIN), onZeroCross, RISING);
18}
19
20void loop() {
21  if (digitalRead(AC_PIN) == LOW) {
22    lastLowSeen = millis();              // gerilim varken çıkış çoğunlukla LOW / output is mostly LOW while voltage is present
23  }
24  bool mainsOn = (millis() - lastLowSeen) < TIMEOUT_MS;
25
26  if (millis() - lastReport >= 1000) {   // saniyede bir rapor / report once per second
27    lastReport = millis();
28    noInterrupts();
29    unsigned long count = pulses;
30    pulses = 0;
31    interrupts();
32    Serial.print(mainsOn ? "Sebeke VAR / Mains ON" : "Sebeke YOK / Mains OFF");
33    Serial.print("  sifir gecisi / zero crossings: ");
34    Serial.print(count);                 // 50 Hz'de yaklaşık 100 / about 100 at 50 Hz
35    Serial.print("  frekans / frequency: ");
36    Serial.print(count / 2);
37    Serial.println(" Hz");
38  }
39}

Kod iki bilgi verir: son 40 ms içinde çıkış en az bir kez LOW olduysa şebeke vardır; kesme ile sayılan darbelerin yarısı da şebeke frekansını verir. Hazır modüllerde ve kendi kartında dikkat etmen gereken noktalar şunlardır: şebeke tarafındaki iletken yollar ile düşük gerilim tarafı arasında en az 6–8 mm boşluk (kaçak yolu) bırak, şebeke girişine bir sigorta koy, optokuplörün iki tarafı arasından hiçbir iz geçirme ve devreyi kapalı bir kutu içinde kullan.

Röle modüllerindeki optokuplör ve JD-VCC jumper'ı

Optokuplör girişli röle modülü
Birçok röle modülünün giriş tarafında bir PC817 optokuplör bulunur; tam izolasyon için JD-VCC jumper'ının çıkarılması gerekir.

Piyasadaki 1, 2, 4 ve 8 kanallı röle modüllerinin çoğunda her kanalın girişinde bir PC817 vardır. VCC pininden gelen akım bir direnç ve gösterge LED'inden geçip optokuplörün LED'ine gider; IN pini LOW yapıldığında devre tamamlanır ve röle çeker. Bu yüzden bu modüller genelde aktif LOW çalışır. Ancak fabrikadan çıktığı haliyle JD-VCC jumper'ı takılıdır ve röle bobini de aynı VCC ve GND'den beslenir: optokuplör orada durur ama izolasyon yoktur. Röle modülünün temellerini Röle Modülü Nedir? yazısında bulabilirsin.

AyarBağlantıİzolasyon
JD-VCC jumper'ı takılıArduino 5V → VCC, GND → GND, pin → INYok; röle bobininin gürültüsü Arduino'nun beslemesine karışır
Jumper çıkarılmışArduino 5V → VCC, pin → IN; Arduino GND bağlanmaz. Ayrı 5 V kaynak → JD-VCC ve GNDTam; iki tarafın tek ortak noktası optokuplördeki ışıktır

MOC3021 ile triyak sürme notu

Röle yerine sessiz ve kıvılcımsız bir AC anahtar istiyorsan bir triyak (ör. BT136) ve onu süren bir triyak çıkışlı optokuplör kullanılır. MOC3021 rastgele fazlıdır: LED yandığı anda triyakı tetikler, bu yüzden bir sıfır geçiş algılayıcıyla birlikte dimmer (parlaklık ayarı) yapımına uygundur. MOC3041 ve MOC3063 ise sıfır geçiş devreli modellerdir; yalnızca gerilim sıfırdan geçerken tetiklerler, aç-kapa uygulamalarında daha az parazit üretirler ama dimmer için kullanılamazlar. MOC3021'in LED'i tetikleme için en fazla 15 mA isteyebilir; 5 V'ta 220 Ω (yaklaşık 17 mA) uygun bir değerdir, 330 Ω bazı parçalarda yetersiz kalabilir. Triyak kapısı ile MOC3021 arasına veri sayfalarındaki gibi yaklaşık 360 Ω direnç konur, motor gibi endüktif yüklerde de triyakın uçlarına bir RC söndürücü (snubber) eklenir. Hazır SSR (katı hal rölesi) modüllerinin içinde de tam olarak bu yapı vardır.

Optokuplör ile proje fikirleri

  • Endüstriyel sensör okuyucu: 24 V endüktif yaklaşım sensörüyle bir konveyördeki ürünleri say ve LCD ekranda göster.
  • Araç kontak algılayıcı: Kontak açıldığında ESP32'yi uyandır ve araçtaki kamerayı ya da kayıt cihazını başlat.
  • Elektrik kesintisi alarmı: Hazır bir AC algılama modülüyle şebeke kesilince buzzer çal ya da telefona bildirim gönder.
  • Kapı zili yakalayıcı: Mevcut 12 V zil hattını yalıtılmış olarak oku ve zil çaldığında bildirim gönder.
  • Yalıtılmış röle kartı: JD-VCC jumper'ını çıkarıp ayrı bir kaynakla beslediğin röle modülüyle 220 V lamba kontrolü yap.
  • MIDI girişi: Bir 6N138 ile elektronik müzik aletinden gelen MIDI notalarını Arduino'da oku.

Sık yapılan hatalar ve çözümleri

BelirtiOlası sebepÇözüm
Çıkış hiç değişmiyorLED ters bağlı ya da dirençsiz bağlanıp yanmışPin 1'in noktayla işaretli olduğunu kontrol et; LED'i multimetrenin diyot kademesinde ölç
Mantık ters çalışıyorGerilim gelince pin LOW olur, bu normaldirKodda LOW'u "var" olarak yorumla
Çıkış tam LOW'a inmiyor (1–2 V'ta kalıyor)LED akımı düşük, CTR yetersiz ya da pull-up çok küçükLED direncini küçült ya da pull-up'ı büyüt (ör. 10 kΩ)
PWM sinyali bozuluyorPC817 birkaç kHz'in üstünde yavaş kalıyorPull-up'ı küçült ya da 6N137 gibi hızlı bir optokuplör kullan
İzolasyona rağmen Arduino resetleniyorİki tarafın GND'si birleştirilmişGiriş tarafının GND'sini Arduino'dan ayır; röle modülünde JD-VCC jumper'ını çıkar
Rastgele sahte tetiklemelerUzun kablo, parazit, kontak sıçramasıYazılımda debounce uygula, kabloyu kısalt, LED uçlarına 100 nF kondansatör ekle
Bir optokuplörü test etmenin en kolay yolu: LED tarafına 5 V ve 330 Ω ile akım ver, multimetreyi direnç kademesinde kolektör ile emetör arasına bağla. LED yanarken düşük, sönükken çok yüksek direnç görmelisin. Bu basit testle bozuk parçayı devreye takmadan ayırırsın.

Optokuplör, bir Arduino projesini masadan alıp gerçek dünyanın 12 V, 24 V ve 220 V'luk sinyalleriyle güvenle konuşturmanın en ucuz yoludur: birkaç kuruşluk bir parça, kartını ve bilgisayarını yüksek gerilimden ayırır. BlueGrays uygulamasında röle ile 220 V ampul kontrolü, akıllı aydınlatma ve sulama projelerini devre şemaları ve kodlarıyla adım adım bulabilirsin.

Sıkça sorulan sorular

Optokuplör ne işe yarar?

Optokuplör iki devre arasında elektrik bağlantısı olmadan, ışıkla sinyal taşır. Böylece yüksek gerilimli ya da gürültülü bir devreyi Arduino gibi hassas bir mikrodenetleyiciden yalıtır. Endüstriyel sensör okuma, röle modülleri ve şebeke algılama devrelerinde kullanılır.

PC817 hangi pin nedir?

PC817 dört bacaklıdır: noktalı köşedeki 1 numaralı pin LED'in anodu, 2 numaralı pin katodudur. Karşı taraftaki 3 numaralı pin fototransistörün emetörü, 4 numaralı pin kolektörüdür.

Optokuplör için kaç ohm direnç kullanılmalı?

Direnç R = (kaynak gerilimi − 1,2 V) / LED akımı formülüyle bulunur. Arduino'nun 5 V pini için 330 Ω, ESP32 için 220 Ω, 12 V sinyal için 2,2 kΩ ve 24 V sinyal için 4,7 kΩ iyi başlangıç değerleridir.

CTR nedir?

CTR (akım aktarım oranı), çıkış transistöründen geçebilecek akımın LED akımına oranıdır. CTR'si %100 olan bir optokuplörde LED'den 5 mA geçerse çıkıştan en fazla yaklaşık 5 mA çekilebilir. Tasarımda veri sayfasındaki en düşük CTR esas alınmalıdır.

PC817 ile 4N35 arasındaki fark nedir?

İkisi de fototransistör çıkışlı optokuplördür. PC817 dört bacaklı ve ucuzdur, CTR'si sınıfına göre %50–600 arasındadır. 4N35 altı bacaklıdır, beyz ucu dışarı çıkar ve 70 V'a kadar kolektör gerilimine dayanır.

Optokuplör ile 220 V algılanabilir mi?

Evet, H11AA1 gibi AC girişli optokuplörler ve uygun güçte seri dirençlerle şebeke gerilimi ve sıfır geçişleri algılanabilir. Ancak 220 V öldürücüdür; deneyimin yoksa hazır, kapalı kutulu AC algılama modülleri kullanmalısın.

Tüm projeleri gör
220V Ampülü Buton(Push) İle Yakma
#19İleri
Premium

220V Ampülü Buton(Push) İle Yakma

Butona bastığın sürece 220 voltluk gerçek bir ampul yanar, bıraktığın anda söner. Arduino'nun küçük sinyali ampulü doğrudan yakamaz; araya röle denen elektrikli bir anahtar girer ve ampulün devresini

4.4(30)
38
220V Ampülü Buton(On-Off) İle Yakma
#20İleri
Premium

220V Ampülü Buton(On-Off) İle Yakma

Evdeki gerçek bir ampulü küçük bir butonla açıp kapatmak ister misin? Butona her bastığında Arduino röleyi çevirir ve ampul yanar, bir daha basınca söner. Röle, kartın zayıf sinyaliyle şebeke elektriğ

4.5(33)
44
220V Ampülü Uzaktan Kumanda İle Yakma
#21İleri
Premium

220V Ampülü Uzaktan Kumanda İle Yakma

Kanepeden kalkmadan, televizyon kumandasıyla evdeki gerçek bir ampulü yakıp söndür. Arduino kumandadan gelen görünmez ışık sinyalini okur; açma tuşuna basınca röleyi çekip ampulü yakar, sessiz tuşuna

4.4(22)
30
Akıllı Merdiven ve Koridor Aydınlatması
#82Orta
Premium

Akıllı Merdiven ve Koridor Aydınlatması

Merdivene ya da koridora adım attığında ışıklar senin gittiğin yönde, basamak basamak yanar. Girişte ve çıkışta birer mesafe sensörü vardır; hangisinin önünden geçersen sekiz LED o uçtan başlayarak ya

5.0(35)
51
ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)
#141İleri
Premium

ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)

ESP32, PIR hareket sensörü, LDR ışık sensörü ve röle modülü ile evinin koridorunu, tuvaletini veya kilerini akıllı aydınlatmaya dönüştürüyoruz. Klasik "karanlıkta hareket algılanınca ışık yansın" senaryosunu inşa ediyoruz — ortam aydınlıksa hareket olsa bile ışık yanmaz, böylece gündüz gereksiz yere yanmaz ve enerji tasarrufu sağlanır. Işık 30 saniye yanık kalır; hareket devam ederse timer otomatik sıfırlanır ve süre uzar. SSD1306 OLED ekranda büyük fontlarla durum (AÇIK / GÜNDÜZ / BEKLE), geri

4.3(6)
11
Akıllı Sulama İstasyonu
#83İleri
Premium

Akıllı Sulama İstasyonu

Tatile gidince çiçeklerin kurumasın diye kendi kendine sulayan bir bahçıvan. Toprak nem sensörü toprağın ne kadar ıslak olduğunu ölçer; toprak kuruyunca Arduino su pompasını birkaç saniye çalıştırır v

5.0(42)
57
ESP32 PIR Hareket Sensörü ile Otomatik Aydınlatma
#121Orta
Premium

ESP32 PIR Hareket Sensörü ile Otomatik Aydınlatma

Bu projede HC-SR501 PIR hareket sensörü ile odaya giren kişiyi algılayıp LED'i otomatik olarak yakacağız. LED'in açık kalma süresini millis() ile izleyeceğiz; sensör HIGH okundukça son hareket zamanı yenilenecek ve son HIGH okumasından en az 10 saniye sonra LED sönecek. Mevcut kod ayrıca her döngüde delay(50) ile 50 ms beklediğinden uygulama döngüsü tamamen bloklamayan bir yapıda değildir. Gerçek hayatta merdiven, koridor, banyo veya dolap içi aydınlatmalarda kullanılabilir.

4.4(24)
38