Компоненты · 11 мин чтения

Что такое оптопара? Гальваническая развязка на PC817 и 4N35 с Arduino

Что такое оптопара и как она работает? Распиновка PC817 и 4N35, CTR и расчёт резисторов, чтение сигналов 12/24 V, контроль сети (H11AA1), реле и MOC3021.

Оптопара (её также называют оптроном или оптоизолятором) — это маленькая микросхема, которая передаёт сигнал между двумя цепями только с помощью света, без электрического соединения между ними. Внутри стоят инфракрасный светодиод и фототранзистор напротив него: когда цепь с одной стороны зажигает светодиод, транзистор на другой стороне открывается. Между сторонами нет ни одного провода, поэтому при подключении к Arduino промышленного датчика на 24 V, бортовой сети автомобиля на 12 V или драйвера мотора выбросы напряжения и помехи не доходят до микроконтроллера.

В этой статье шаг за шагом разберём, что находится внутри оптопары, зачем нужна гальваническая развязка, выводы и параметры двух самых популярных моделей — PC817 и 4N35, что такое CTR и как рассчитать резисторы. Затем посмотрим, как развязать выход Arduino, безопасно читать сигналы 12/24 V, работать с ESP32 и Raspberry Pi Pico, какие правила безопасности действуют при контроле сети (H11AA1), где оптопара прячется в релейных модулях и как управлять симистором через MOC3021.

Что такое оптопара и как она работает?

В корпусе оптопары друг напротив друга стоят два кристалла. Со стороны входа — инфракрасный светодиод, который питается током, как обычный светодиод. Со стороны выхода — фототранзистор, база которого чувствительна к свету: вместо того чтобы подавать ток в базу, на неё светят. Между кристаллами находится слой прозрачного, но электрически изолирующего пластика. Он рассчитан на тысячи вольт.

  1. Цепь на входной стороне пропускает через светодиод несколько миллиампер через резистор.
  2. Светодиод излучает инфракрасный свет; свет проходит сквозь изолирующий слой и падает на фототранзистор.
  3. Свет действует как ток базы фототранзистора и позволяет току течь между коллектором и эмиттером: транзистор замыкается, как ключ.
  4. Когда светодиод гаснет, свет пропадает, транзистор снова закрывается и выходная цепь размыкается. Сигнал перешёл на другую сторону без проводов, только благодаря свету.

В зависимости от того, что стоит на выходе, оптопары бывают разных типов. В любительских проектах чаще всего используют модели с фототранзистором, но для контроля переменного сигнала, управления симистором или развязки быстрой линии данных нужны особые типы:

ТипПримеры моделейВыходТипичное применение
С фототранзисторомPC817, EL817, 4N35, 4N25NPN-фототранзисторРазвязка цифровых сигналов, чтение входов 12/24 V, релейные модули
С выходом Дарлингтона4N33, H11B1Транзистор ДарлингтонаБольшой выходной ток при очень малом токе светодиода (но медленнее)
С входом переменного токаH11AA1, PC814Два встречно-параллельных светодиода + фототранзисторКонтроль сети, детектор перехода через ноль
С симисторным выходомMOC3021, MOC3041, MOC3063ФотосимисторЗапуск симистора, управление нагрузкой переменного тока, твердотельные реле
Быстродействующие логические6N137, 6N138Фотодиод + логический элемент или транзисторРазвязка MIDI, UART и быстрых цифровых линий

Зачем нужна гальваническая развязка?

Гальваническая развязка означает, что между двумя цепями нет прямого проводящего пути: нет общей GND, нет общего провода, а энергия и информация передаются иначе (светом, магнитным полем). Пины Arduino выдерживают не больше 5 V (у ESP32 и Pico — 3,3 V). 24 V промышленного датчика, короткие выбросы в сотни вольт, которые мотор создаёт при переключении, или помехи, наведённые в длинных кабелях, могут попасть прямо в микроконтроллер через общую GND. Оптопара физически разрывает этот путь.

  • Защита: даже если на высоковольтной стороне что-то выйдет из строя, повреждение останется в оптопаре; Arduino, USB-порт компьютера и ты в безопасности.
  • Помехи и земляные петли: моторы, реле и длинные кабели создают помехи на линии GND. Когда земли разделены, эти помехи не попадают в сигнальную линию; подробно об общей земле — в статье GND и общая земля.
  • Разные уровни напряжения: выходной транзистор питается снаружи, поэтому сигнал 24 V легко превращается в 3,3 V, а сигнал 5 V — в 12 V. Оптопара — ещё и медленный, но надёжный преобразователь уровней.
  • Стандарты безопасности: в устройствах, подключённых к сети, сторона пользователя должна быть изолирована от сети; детали вроде PC817 проходят испытание изоляции на 5000 V rms.
Развязка работает только тогда, когда GND двух сторон остаются раздельными. Если «на всякий случай» соединить минус стороны 24 V с GND Arduino, оптопара превратится в дорогой кусок провода, и от защиты ничего не останется. Пусть входная сторона питается от своего источника, а выходная — от Arduino.

Распиновка и параметры PC817 и 4N35

ВыводPC817 (DIP-4)4N35 (DIP-6)
1Анод (светодиод +)Анод (светодиод +)
2Катод (светодиод −)Катод (светодиод −)
3ЭмиттерНе подключён
4КоллекторЭмиттер
5НетКоллектор
6НетБаза (обычно остаётся свободной)
ПараметрPC8174N35
Прямое напряжение светодиода (VF)Тип. 1,2 V, макс. 1,4 V (при 20 mA)Около 1,2–1,3 V
Максимальный ток светодиода50 mA60 mA
Обратное напряжение светодиодаМакс. 6 VМакс. 6 V
CTR50–600% (при 5 mA, 5 V; зависит от группы)Не менее 100% (при 10 mA, 10 V)
Напряжение коллектор-эмиттер (VCEO)35 V70 V
Ток коллектораМакс. 50 mAМакс. 50 mA
Время переключенияТип. 3–4 µs (с небольшим нагрузочным резистором)Около 10 µs
Напряжение изоляции5000 V rms5000 V rms

У PC817 вывод 1 отмечен точкой; буква A, B, C или D после «PC817» на корпусе показывает группу по CTR. Детали вроде EL817, LTV817 и KP1010 — аналоги PC817 с той же распиновкой. У 4N35 шесть ножек, поэтому вывод базы выведен наружу; обычно его оставляют свободным, а в очень шумной обстановке высокоомный резистор (например, 1 MΩ) между базой и эмиттером может ускорить закрывание.

Что такое CTR и как рассчитать резисторы?

CTR (Current Transfer Ratio, коэффициент передачи по току) — это отношение тока коллектора, который может пропустить выходной транзистор, к току светодиода: CTR = IC / IF × 100%. Например, у оптопары с CTR 100% при токе светодиода 5 mA с выхода можно взять не больше примерно 5 mA. CTR меняется с температурой, падает с годами по мере старения светодиода и сильно различается даже у деталей одной модели. Поэтому расчёт всегда ведут по наименьшему значению из даташита.

Группа PC817Диапазон CTR (IF = 5 mA)Выходной ток при токе светодиода 5 mA
PC817A80–160%4–8 mA
PC817B130–260%6,5–13 mA
PC817C200–400%10–20 mA
PC817D300–600%15–30 mA
Без буквы50–600%2,5–30 mA (рассчитывай на худший случай)

Резистор светодиода: входная сторона рассчитывается точно так же, как обычный светодиод: R = (Vпит − VF) / IF. Чтобы пропустить 10 mA от пина 5 V Arduino Uno, получается (5 − 1,2) / 0,010 = 380 Ω; стандартный 330 Ω даёт около 11,5 mA, а 390 Ω — около 9,7 mA. Для ESP32 (3,3 − 1,2) / 0,010 = 210 Ω, поэтому берут 220 Ω. Пины Raspberry Pi Pico по умолчанию настроены на нагрузочную способность 4 mA; здесь достаточно около 4,5 mA с резистором 470 Ω. Если не хочется считать вручную, воспользуйся калькулятором резистора для светодиода.

Выходной (подтягивающий) резистор: чтобы транзистор открылся полностью (вошёл в насыщение), ток через подтяжку должен быть меньше того, что позволяет CTR. Подтяжке 10 kΩ к 5 V нужно всего 0,5 mA. У PC817 без буквы худший CTR — 50%, значит, для 0,5 mA хватило бы 1 mA через светодиод; если дать ему 5–10 mA, остаётся как минимум пятикратный запас. Встроенная подтяжка Arduino (около 20–50 kΩ) тоже идеально подходит для этой задачи. Меньший подтягивающий резистор делает сигнал быстрее, но требует больше тока; больший требует меньше тока, но транзистор закрывается медленнее.

СлучайНапряжение питанияНужный ток светодиодаРекомендуемый резисторМощность резистора
Управление от пина Arduino Uno5 V~10 mA330 ΩХватит 1/4 W
Управление от пина ESP323,3 V~10 mA220 ΩХватит 1/4 W
Управление от пина Raspberry Pi Pico3,3 V~4,5 mA470 ΩХватит 1/4 W
Чтение сигнала 12 V12 V~5 mA2,2 kΩ1/4 W (рассеивает 0,05 W)
Чтение сигнала 24 V24 V~5 mA4,7 kΩ1/4 W (рассеивает 0,11 W)
Если на одном входе нужно читать и 12 V, и 24 V, выбирай 4,7 kΩ: при 24 V течёт около 4,8 mA, а при 12 V — около 2,3 mA. Даже при CTR 50% ток 2,3 mA намного больше тех 0,1–0,25 mA, которые нужны встроенной подтяжке, так что одна и та же схема надёжно работает при обоих напряжениях.

Таблица подключения: Arduino Uno, ESP32 и Raspberry Pi Pico

Вывод PC817НазначениеArduino UnoESP32Raspberry Pi Pico
1 (анод), развязка выходаПлата управляет светодиодомD9 → 330 Ω → вывод 1GPIO 25 → 220 Ω → вывод 1GP15 → 470 Ω → вывод 1
2 (катод), развязка выходаОбратный провод светодиодаGNDGNDGND
4 (коллектор), чтение входаПлата читает сигналD2 (INPUT_PULLUP)GPIO 27 (INPUT_PULLUP)GP14 (PULL_UP)
3 (эмиттер), чтение входаGND читающей стороныGNDGNDGND
1 и 2, чтение входаВнешний сигнал (12/24 V)Идёт к внешнему источнику, не к платеИдёт к внешнему источнику, не к платеИдёт к внешнему источнику, не к плате
Самая частая ошибка — подключить светодиод без резистора: 5 V напрямую на выводы 1 и 2 сжигают светодиод за секунды. На втором месте — деталь, вставленная задом наперёд: светодиод выдерживает в обратном направлении всего 6 V, так что 12 V или 24 V в неправильной полярности его уничтожат. Диод 1N4148, включённый встречно параллельно входу (катодом к аноду), снимает этот риск.

Развязка выхода Arduino

В этой схеме Arduino зажигает светодиод оптопары, а выходной транзистор, как ключ, замыкает вход другой цепи. Так можно безопасно управлять входом «запуск» устройства на 12 V, входом дистанционного спуска фотоаппарата, входом ПЛК или другим микроконтроллером, работающим от другого напряжения. Выходной транзистор ограничен 35 V и 50 mA, поэтому он не потянет напрямую катушку реле, мотор или светодиодную ленту; для таких нагрузок на другой стороне ставят транзистор или MOSFET.

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}

На выходной стороне коллектор (вывод 4) подключают к плюсу или входу другой цепи, а эмиттер (вывод 3) — к GND этой цепи; при обратной полярности транзистор не откроется. PC817 включается и выключается за время от нескольких до нескольких десятков микросекунд, поэтому ШИМ-сигнал, пропущенный через него, начинает искажаться уже выше нескольких kHz. Для быстрых сигналов (UART, MIDI, высокочастотный ШИМ) предпочитают быстродействующие оптопары вроде 6N137 или микросхемы цифровых изоляторов.

Безопасное чтение сигналов 12/24 V

Сигналы промышленных индуктивных датчиков, выходов ПЛК, дверных контактов, замка зажигания автомобиля или кнопки звонка на 12 V нельзя подключать напрямую к пину Arduino. Решение — пропустить сигнал через светодиод оптопары: последовательно со светодиодом ставят резистор 4,7 kΩ для 24 V и 2,2 kΩ для 12 V, а выходной транзистор работает со встроенной подтяжкой Arduino. Когда напряжение есть, светодиод светится, транзистор открывается, и пин Arduino читает LOW. То есть логика инвертирована, и это учитывают в коде.

  1. Подключи плюс источника 24 V через резистор 4,7 kΩ к выводу 1 (анод) PC817.
  2. Подключи минус источника сигнала (GND 24 V) к выводу 2 (катод). Эту GND к Arduino не подключай.
  3. По желанию поставь диод 1N4148 встречно между выводами 1 и 2 (катодом к выводу 1): он защищает от неправильной полярности.
  4. Подключи вывод 4 (коллектор) PC817 к пину D2 Arduino, а вывод 3 (эмиттер) — к GND Arduino.
  5. Загрузи код ниже и открой монитор порта на скорости 9600 бод. При подаче 24 V должна появиться надпись «24V VAR / present» (напряжение есть).
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}

В коде есть простой антидребезг, который принимает только показания, не менявшиеся 20 мс; для сигналов с механических контактов или реле это обязательно. Чтение идёт через millis(), а не delay(), поэтому Arduino может параллельно заниматься другими делами. В бортовой сети автомобиля при работающем двигателе напряжение линии 12 V поднимается до 14,4 V и появляются короткие высокие выбросы; здесь стоит увеличить резистор до 3,3 kΩ и добавить на входе TVS-диод.

Оптопары с ESP32 и Raspberry Pi Pico

ESP32 и Pico работают от 3,3 V, поэтому их не стоит подключать напрямую даже к сигналам 5 V. Вот в чём прелесть оптопары: выходной транзистор — с открытым коллектором, поэтому выходное напряжение определяется только тем, к какому напряжению подключена подтяжка. Со встроенной подтяжкой выход автоматически остаётся на уровне 3,3 V: даже если на входной стороне 24 V, до ESP32 доходит не больше 3,3 V. Код для ESP32 ниже считает импульсы от индуктивного датчика на 24 V или расходомера с помощью прерывания:

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}

IRAM_ATTR перед функцией прерывания размещает код в быстрой памяти; для функций прерываний на ESP32 так делать рекомендуется. Фильтр на 2 мс убирает ложные импульсы, вызванные медленным закрыванием оптопары или помехами в кабеле. Подробнее о прерываниях — в статье Прерывания в Arduino. На Raspberry Pi Pico то же самое делается на MicroPython так; в этом примере, помимо чтения входа, через второй PC817 на другую сторону отправляется развязанный сигнал:

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)

Контроль сети: H11AA1 и безопасность

Сетевое напряжение 230 V может убить. Без опыта не собирай схемы, подключённые к сети, своими руками; используй готовые, закрытые и сертифицированные модули контроля переменного напряжения. Никогда не размещай сетевую часть на макетной плате, ничего не трогай, пока схема под напряжением, и помести всю схему в изолирующий корпус вместе с предохранителем.

Чтобы определить, есть ли напряжение в розетке или цепи лампы, или найти моменты перехода сетевого напряжения через ноль, используют оптопары с входом переменного тока, например H11AA1. Внутри у неё два светодиода, включённых встречно-параллельно, поэтому свет появляется на обоих полупериодах переменного тока и проблемы с обратным напряжением нет. Для 230 V rms последовательно со входом ставят два резистора по 47 kΩ: через суммарные 94 kΩ течёт около 2,4 mA rms (3,5 mA в пике), и каждый резистор рассеивает около 0,28 W. Поэтому выбирают резисторы минимум на 0,5 W, а лучше на 1 W; два резистора к тому же вдвое снижают напряжение на каждом. На выходной стороне с подтяжкой 10 kΩ к 5 V транзистор, пока напряжение есть, почти всё время открыт; только около переходов через ноль, когда светодиоды гаснут, появляется короткий импульс HIGH. В сети 50 Hz это примерно 100 импульсов в секунду.

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}

Код даёт две вещи: если за последние 40 мс выход хотя бы раз уходил в LOW, сеть есть; а половина импульсов, посчитанных прерыванием, даёт частоту сети. На что обратить внимание в готовых модулях и на собственной плате: между сетевыми дорожками и низковольтной стороной должно быть не меньше 6–8 мм (путь утечки), на сетевом входе нужен предохранитель, никогда не проводи дорожку между двумя сторонами оптопары и используй схему только в закрытом корпусе.

Оптопара в релейных модулях и перемычка JD-VCC

Релейный модуль с оптопарой на входе
Во многих релейных модулях на входной стороне стоит оптопара PC817; для полной развязки перемычку JD-VCC нужно снять.

В большинстве 1-, 2-, 4- и 8-канальных релейных модулей из магазинов на входе каждого канала стоит PC817. Ток с пина VCC проходит через резистор и индикаторный светодиод к светодиоду оптопары; когда пин IN притягивают к LOW, цепь замыкается и реле щёлкает. Поэтому такие модули обычно работают с активным LOW. Однако с завода перемычка JD-VCC установлена, и катушка реле питается от тех же VCC и GND: оптопара есть, а развязки нет. Основы релейных модулей — в статье Что такое релейный модуль?.

НастройкаПодключениеРазвязка
Перемычка JD-VCC установленаArduino 5V → VCC, GND → GND, пин → INНет; помехи от катушки реле попадают в питание Arduino
Перемычка снятаArduino 5V → VCC, пин → IN; GND Arduino не подключена. Отдельный источник 5 V → JD-VCC и GNDПолная; единственное, что объединяет две стороны, — свет внутри оптопары

Заметка об управлении симистором через MOC3021

Если вместо реле нужен бесшумный переключатель переменного тока без искр, используют симистор (например, BT136) и оптопару с симисторным выходом для управления им. MOC3021 — со случайной фазой включения: она открывает симистор в тот же момент, когда загорается светодиод, поэтому вместе с детектором перехода через ноль подходит для диммера. MOC3041 и MOC3063 — модели со схемой перехода через ноль: они срабатывают только тогда, когда напряжение проходит через ноль, создают меньше помех при простом включении и выключении, но для диммирования не годятся. Светодиоду MOC3021 для срабатывания может понадобиться до 15 mA; при 5 V подходит 220 Ω (около 17 mA), а 330 Ω для некоторых экземпляров может не хватить. Как и в даташитах, между управляющим электродом симистора и MOC3021 ставят резистор около 360 Ω, а для индуктивных нагрузок вроде моторов параллельно симистору добавляют RC-снаббер. Готовые модули SSR (твердотельные реле) устроены именно так.

Идеи проектов с оптопарой

  • Считыватель промышленного датчика: считай изделия на конвейере индуктивным датчиком приближения на 24 V и выводи счёт на LCD.
  • Детектор зажигания автомобиля: буди ESP32 при включении зажигания и запускай автомобильную камеру или регистратор данных.
  • Сигнализация отключения электричества: с готовым модулем контроля переменного напряжения включай зуммер или отправляй уведомление на телефон, когда пропадает сеть.
  • Ловец дверного звонка: читай уже существующую линию звонка 12 V через развязку и отправляй уведомление, когда звонят.
  • Развязанная релейная плата: управляй лампой на 230 V через релейный модуль со снятой перемычкой JD-VCC и отдельным источником питания.
  • Вход MIDI: читай на Arduino ноты MIDI с электронного инструмента с помощью 6N138.

Частые ошибки и как их исправить

СимптомВероятная причинаРешение
Выход никогда не меняетсяСветодиод подключён наоборот или без резистора и сгорелПроверь, что вывод 1 — тот, что отмечен точкой; проверь светодиод мультиметром в режиме проверки диодов
Логика работает наоборотПин уходит в LOW, когда напряжение есть; это нормальноСчитай в коде LOW состоянием «есть напряжение»
Выход не опускается до LOW полностью (остаётся на 1–2 V)Слишком малый ток светодиода, недостаточный CTR или слишком малый подтягивающий резисторУменьши резистор светодиода или увеличь подтягивающий резистор (например, до 10 kΩ)
ШИМ-сигнал искажаетсяPC817 слишком медленная выше нескольких kHzУменьши подтягивающий резистор или возьми быструю оптопару, например 6N137
Arduino перезагружается, несмотря на развязкуGND двух сторон соединеныОтдели GND входной стороны от Arduino; сними перемычку JD-VCC на релейном модуле
Случайные ложные срабатыванияДлинный кабель, помехи, дребезг контактовПрограммный антидребезг, более короткий кабель, конденсатор 100 nF параллельно светодиоду
Самый простой способ проверить оптопару: подай на сторону светодиода 5 V через 330 Ω и подключи мультиметр в режиме измерения сопротивления между коллектором и эмиттером. Пока светодиод горит, сопротивление должно быть низким, а когда он погашен, — очень высоким. Этот простой тест отсеет неисправную деталь ещё до того, как она попадёт в схему.

Оптопара — самый дешёвый способ снять проект на Arduino со стола и дать ему безопасно общаться с сигналами реального мира на 12 V, 24 V и 230 V: деталь, которая стоит копейки, отделяет плату и компьютер от высокого напряжения. В приложении BlueGrays есть проекты управления лампой на 230 V через реле, умного освещения и полива — пошагово, со схемами подключения и кодом.

Частые вопросы

Для чего нужна оптопара?

Оптопара передаёт сигнал между двумя цепями светом, без электрического соединения. Так высоковольтная или зашумлённая цепь изолируется от чувствительного микроконтроллера вроде Arduino. Её используют для чтения промышленных датчиков, в релейных модулях и в схемах контроля сети.

Какая распиновка у PC817?

У PC817 четыре ножки: вывод 1 в углу с точкой — анод светодиода, вывод 2 — катод. С противоположной стороны вывод 3 — эмиттер фототранзистора, а вывод 4 — коллектор.

Какой резистор нужен для оптопары?

Резистор находят по формуле R = (напряжение питания − 1,2 V) / ток светодиода. Хорошие начальные значения: 330 Ω для пина 5 V Arduino, 220 Ω для ESP32, 2,2 kΩ для сигнала 12 V и 4,7 kΩ для сигнала 24 V.

Что такое CTR у оптопары?

CTR (коэффициент передачи по току) — это отношение тока, который может пропустить выходной транзистор, к току светодиода. У оптопары с CTR 100% при 5 mA через светодиод с выхода можно взять не больше примерно 5 mA. Всегда рассчитывай схему по наименьшему CTR из даташита.

Чем PC817 отличается от 4N35?

Обе — оптопары с фототранзисторным выходом. У PC817 четыре ножки, она дешёвая, а CTR в зависимости от группы — 50–600%. У 4N35 шесть ножек, вывод базы выведен наружу, и она выдерживает напряжение на коллекторе до 70 V.

Может ли оптопара определить сетевое напряжение 230 V?

Да, оптопары с входом переменного тока, такие как H11AA1, с последовательными резисторами подходящей мощности могут определять наличие сетевого напряжения и переходы через ноль. Но сетевое напряжение может убить; без опыта используй готовые модули контроля переменного напряжения в закрытом корпусе.

Все проекты
Включение лампы 220V кнопкой (удержание)
#19Продвинутый
Premium

Включение лампы 220V кнопкой (удержание)

Пока ты держишь кнопку, горит настоящая лампа на 220 вольт, а как только отпустишь — гаснет. Слабый сигнал Arduino не может зажечь лампу напрямую, поэтому между ними стоит реле — выключатель с электри

4.4(30)
38
Включение лампы 220V кнопкой (вкл/выкл)
#20Продвинутый
Premium

Включение лампы 220V кнопкой (вкл/выкл)

Хочешь включать и выключать настоящую бытовую лампу крошечной кнопкой? При каждом нажатии кнопки Arduino переключает реле, и лампа загорается; нажмёшь снова — гаснет. Реле — посредник, который позволя

4.5(33)
44
Включение лампы 220V пультом
#21Продвинутый
Premium

Включение лампы 220V пультом

Включай и выключай настоящую лампу у себя дома пультом от телевизора, не вставая с дивана. Arduino читает невидимый световой сигнал пульта; кнопка питания щёлкает реле и включает лампу, а кнопка отклю

4.4(22)
30
Умное освещение лестницы и коридора
#82Средний
Premium

Умное освещение лестницы и коридора

Ступи на лестницу или в коридор, и свет загорается ступенька за ступенькой в ту сторону, куда ты идёшь. На каждом конце стоит датчик расстояния; мимо какого ни пройдёшь, восемь светодиодов загораются

5.0(35)
51
Умное освещение на ESP32 (PIR + LDR + реле + OLED)
#141Продвинутый
Premium

Умное освещение на ESP32 (PIR + LDR + реле + OLED)

Сделай умное освещение для коридора, ванной или кладовки на ESP32! С PIR-датчиком движения, датчиком освещённости LDR и модулем реле собирается классический сценарий «свет включается при движении в темноте»: если вокруг уже светло, движение свет НЕ включает, и днём энергия экономится. Свет горит 30 секунд; если движение продолжается, таймер сбрасывается, и свет горит дольше. OLED SSD1306 крупно показывает состояние (ON / DAYTIME / WAITING) и обратный отсчёт.

4.3(6)
11
Умная станция полива
#83Продвинутый
Premium

Умная станция полива

Садовник, который сам поливает растения, чтобы они не засохли, пока ты в отпуске. Датчик влажности почвы измеряет, насколько влажная земля; когда она сохнет, Arduino на несколько секунд включает водян

5.0(42)
57
Автоматическое освещение с PIR-датчиком движения на ESP32
#121Средний
Premium

Автоматическое освещение с PIR-датчиком движения на ESP32

В этом проекте PIR-датчик движения HC-SR501 замечает, что кто-то вошёл в комнату, и автоматически включает светодиод. Время свечения отслеживается через millis(); каждое показание HIGH обновляет время последнего движения, и светодиод гаснет не раньше чем через 10 секунд после последнего HIGH. Текущий код ещё и ждёт 50 ms на каждом цикле через delay(50), поэтому цикл не полностью неблокирующий. Подходит для освещения лестниц, шкафов и ванной.

4.4(24)
38