Для примера подключу реле RT314012 к Wemos D1 mini. В документации к релеуказано, что:
- Coil Voltage:12 VDC
- Coil Resistance: 360 Ohms
Если под руками нет документации, можно замерить сопротивление катушки омметром.
При подключении катушки реле к 12 V через неё будет протекать ток:
Iс = 12 V/360 Ohm = 0,0333 A (33 mA) (Формула 1)
Схема
Стандартная схема подключение реле к цифровому порту ESP8266/ESP32/Arduino следющая:
В этой схеме нет гальванической (оптронной) развязки, однако она простая и широко используемая.
Выбор транзистора
При выборе транзистра для схемы руководствуюсь следующими условиями:
- Он должен быть NPN, а не PNP!!
- Паспортный Ic должен превышать расчетное значение полученное по Формуле 1, т.е. 33 мА.
- Vceo должен быть больше напряжения питания (12 V).
Например, транзистор BC548 или 2N2222 по документации имеет следующие параметры:
- Тип NPN (условие выполнено).
- Ic = 600 mA > 33 mA (условие выполнено).
- Vceo= 40 V > 12 V (условие выполнено).
Расчет сопротивления R1
В datasheet указано, что для 2N2222:
hfe = 75 при 10 mA и напряжении 10 V. Это примерное значение из-за разброса параметров транзистора в процессе производства.
hfe = Ic / Ib
Зная hfe и Ic вычислим Ib:
Ib = Ic / hfe = 0.033 A / 75 = 0.00044A = 0.44 mA (Формула 2 для KSP2222).
Максимальное напряжение на цифровом выходе ESP = 3.3 V. По закону Ома:
R1 = U / Ib = 3.3 V / 0.00044 A = 7432 Ohm. (Формула 3)
Особая точность не важна, главное, чтобы сопротивление было не менее указанного, например, 10 кОм.
Максимальный ток для GPIO:
- ESP8266 Imax = 12 mA (datasheet).
- ESP32 Imax = 40 mA. По умолчанию выставлено — 20 mA.
Запас GPIO по току значительный, гораздо выше расчетных 0.44 mA.
Если подключать мощную нагрузку непосредственно к транзистору, можно взять TIP122 с большим hfe. По datasheet hfe = 1000 при Ic = 0,5 A и Uce = 3 V.
Ib = Ic / hfe = 0.033 A / 1000 = 0.000033 A = 0.033 mA (Формула 4 для TIP122).
R1 = U / Ib = 3,3 V / 0.000033 A = 100 000 Ohm. Хотя в статье ниже используют резистор на 1 кОм.
Диод параллельно реле
При разрывании цепи индуктивной нагрузки, в ней возникает обратный ток, немного ниже по величине тока катушки в работе и обратный по полярности . Ток этот порождает напряжение которое зависит от сопротивления нагрузки подключенной параллельно индуктивности. Например, при токе обмотке 1 A, при разрыве, на сопротивлении 1 kOm создаться напряжение в 1000 V.
Поскольку диод подключен обратно, то он будет иметь для такого тока низкое сопротивление, шунтируя индуктивность и препятствуя подаче высокого напряжения на транзистор, который может сгореть, даже имея приличный запас по Vceo.
Диод включается противоположно направлению тока через катушку. Если его включить по направлению тока, то при открывании транзистора через низкое сопротивление открытого диода пойдет значительный ток и он сгорит.
Диод лучше использовать импульсный, например, FR157. Но можно поставить и обычный выпрямительный, например, 1N4007.
Подключение реле через оптронную сборку TLP281-4 рассмотрел в статье.
Подключение реле через транзисторы Дарлингтона
Если нужно подключить к микроконтроллеру несколько реле, то можно использовать матрицу из семи транзисторов Дарлингтона, 500мА, ULN20003A. Помимо транзисторов в сборку уже включены диоды для подавления обратного тока в индуктивной нагрузке.
Можно параллелить выходы для коммутации мощной нагрузки, но лучше не использовать такой способ, а подбирать соответствующие по току тразисторы или использовать реле.
Программа для ESP8266
Код управления реле простейший. Единственный момент,
не используйте GPIO0 (D3) и GPIO2 (D4) для управления реле!
При загрузке на этих PIN-ах выставляется определенное состояние, чтобы ESP8266 корректно загрузился. Если на эти PIN-ы повесить реле, то после reset ESP8266 загрузится некорректно и программа не будет работать.
const int led = 2; //D4 const int relay = 4; //D2 DO NOT USE GPIO0 (D3) and GPIO2 (D4) TO MANAGE THE RELAY void turnOnRelay(bool state) { String st = state ? "ON" : "OFF"; Serial.println("Relay state: " + st); digitalWrite (relay, state); digitalWrite (led, !state); } void setup() { pinMode (led, OUTPUT); pinMode(relay, OUTPUT); turnOnRelay(LOW); Serial.begin (9600); } void loop() { // put your main code here, to run repeatedly: turnOnRelay(HIGH); delay(5000); turnOnRelay(LOW); delay(5000); }