MOSFET и Arduino: IRLZ44N для светодиодной ленты 12 V, моторов и насосов
Как подключить MOSFET к Arduino: IRLZ44N с логическим уровнем против IRF520, резистор затвора и стягивающий резистор, обратный диод, код ШИМ для светодиодной ленты 12 V, моторов и насосов.
Схема Arduino MOSFET — самый эффективный способ коммутировать нагрузки, которые потребляют несколько ампер (светодиодную ленту 12 V, DC-мотор, водяной насос или соленоидный замок), с пинов Arduino, способных выдать всего около 20 mA. MOSFET — это электронный ключ, управляемый напряжением: подай 5 V на затвор, и участок между стоком и истоком превращается почти в провод с нулевым сопротивлением, а при 0 V он полностью закрыт. Правильно подобранный MOSFET с логическим уровнем управления лишь слегка нагревается, пропуская 3 A без радиатора.
В этом руководстве разберём, как работает MOSFET, почему не каждый MOSFET подходит для Arduino (разница между IRLZ44N и IRF520), зачем нужны резистор затвора, стягивающий резистор и обратный диод и как настраивать скорость и яркость через ШИМ (PWM). Дальше тебя ждут готовые скетчи для светодиодной ленты 12 V, DC-мотора, насоса и соленоида, примеры для ESP32 и Raspberry Pi Pico, расчёт нагрева и радиатора, а также таблица сравнения MOSFET, транзистора и реле.
Что такое MOSFET и как он работает?
MOSFET (Metal Oxide Semiconductor Field Effect Transistor, МОП-транзистор) — полевой транзистор с тремя выводами: затвор (gate), сток (drain) и исток (source). Затвор отделён от остальной структуры тонким слоем оксида, поэтому постоянный ток в него не течёт и он ведёт себя как маленький конденсатор. Когда напряжение между затвором и истоком (VGS) превышает определённый порог, между стоком и истоком образуется проводящий канал, и через него течёт ток нагрузки. Классический биполярный транзистор (BJT) управляется током базы, а MOSFET — напряжением: пин Arduino отдаёт ток только в течение тех нескольких микросекунд, за которые затвор заряжается и разряжается.
В проектах на Arduino почти всегда используют N-канальный MOSFET, установленный со стороны минуса нагрузки (GND); это называется ключом в нижнем плече (low-side switching). Плюсовой вывод нагрузки идёт прямо на плюс внешнего источника питания, минусовой — на сток MOSFET, а исток подключается к GND. Так напряжение затвор–исток просто равно напряжению на пине Arduino. Вот какие значения нужно проверить в даташите:
| Параметр | Что означает | Значение для IRLZ44N |
|---|---|---|
| VDS | Максимальное напряжение, которое выдерживает участок сток–исток; должно быть минимум в 1,5–2 раза выше напряжения питания | 55 V |
| ID | Длительный ток стока; верен только при температуре корпуса 25 °C, на практике используется намного меньше | 47 A (VGS = 10 V) |
| VGS(th) | Напряжение на затворе, при котором канал только начинает проводить (течёт всего 250 µA); это не напряжение полного открытия | 1,0–2,0 V |
| RDS(on) | Сопротивление сток–исток в полностью открытом состоянии; от него зависит нагрев, и очень важно, при каком VGS его измеряли | 22 mΩ (10 V), 25 mΩ (5 V), 35 mΩ (4 V) |
| VGS (макс.) | Максимальное напряжение, которое можно подать на затвор; при превышении слой оксида пробивается | ±16 V |
| Qg | Заряд, нужный для полного открытия затвора; чем он больше, тем медленнее переключение | 48 nC |
| Встроенный диод | Диод внутри структуры, направленный от истока к стоку; индуктивные нагрузки он не защищает | Есть (в любом силовом MOSFET) |
MOSFET с логическим уровнем управления: IRLZ44N, IRF520 и другие
Самая частая ошибка — посмотреть на VGS(th) и решить: «порог 4 V, Arduino выдаёт 5 V, значит, заработает». Порог — это точка, в которой канал пропускает всего 250 µA; чтобы MOSFET проводил несколько ампер с малым сопротивлением, напряжение на затворе должно быть заметно выше порога. Правильный вопрос звучит так: при каком VGS даташит гарантирует RDS(on)? Если значение указано для 4,5 V или 5 V, MOSFET полностью открывается от 5-вольтовой Arduino, и его называют MOSFET с логическим уровнем управления (logic level). Если оно указано только для 10 V, это стандартный MOSFET, и пин Arduino откроет его лишь наполовину. В обозначениях International Rectifier (сейчас Infineon) детали, начинающиеся на IRL (IRLZ44N, IRLB8721, IRL540N), имеют логический уровень, а IRFZ44N, IRF520 и IRF540N — стандартные.
| Модель (корпус) | VDS | Длительный ID | RDS(on) (условие измерения) | VGS(th) | Arduino Uno (5 V) | ESP32 / Pico (3,3 V) |
|---|---|---|---|---|---|---|
| IRLZ44N (TO-220) | 55 V | 47 A | 25 mΩ (VGS = 5 V) | 1,0–2,0 V | Отлично; до 3 A без радиатора | Обычно до 2–3 A, без гарантии |
| IRLB8721 (TO-220) | 30 V | 62 A | 16 mΩ (VGS = 4,5 V) | 1,35–2,35 V | Отлично | Обычно до 2–3 A, без гарантии |
| AO3400A (SOT-23, SMD) | 30 V | 5,7 A | 48 mΩ (VGS = 2,5 V) | 0,65–1,45 V | Хорошо; небольшие нагрузки (≈2 A) | Отлично; гарантирован даже при 2,5 V |
| IRFZ44N (TO-220) | 55 V | 49 A | 17,5 mΩ (только при VGS = 10 V) | 2,0–4,0 V | Не подходит, открывается наполовину | Не используй |
| IRF520 и модуль на нём (TO-220) | 100 V | 9,2 A | 0,27 Ω (только при VGS = 10 V) | 2,0–4,0 V | Только до ≈1 A | Не используй |
| IRF540N (TO-220) | 100 V | 33 A | 44 mΩ (только при VGS = 10 V) | 2,0–4,0 V | Не подходит, открывается наполовину | Не используй |
Вывод из таблицы простой: для 5-вольтовых плат, таких как Uno, Nano и Mega, выбирай MOSFET, у которого RDS(on) указан при 4,5 V или 5 V. С 3,3-вольтовыми платами вроде ESP32 и Pico сложнее: даташиты популярных MOSFET в корпусе TO-220, таких как IRLZ44N и IRLB8721, не гарантируют никаких значений при 3,3 V; к этому вернёмся в разделе про ESP32. Не выбирай и по корпусу: IRLZ44N и IRFZ44N выпускаются в одинаковом корпусе с почти одинаковой маркировкой, но одна-единственная буква (L) для Arduino меняет всё. Порядок выводов можно проверить в утилите распиновки транзисторов; у MOSFET в корпусе TO-220, если повернуть их маркировкой к себе, слева направо идут затвор, сток, исток, а металлический фланец соединён со стоком.
Подключение MOSFET к Arduino: резистор затвора, стягивающий резистор и общая земля
Базовая схема состоит из пяти частей: MOSFET, резистора затвора, стягивающего резистора, обратного диода для индуктивных нагрузок и внешнего источника питания. В таблице ниже показано подключение для трёх плат; нагрузка в примере — светодиодная лента или мотор на 12 V. Весь код в этой статье использует эти пины.
| Подключение | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Управляющий пин → резистор затвора → затвор | D9 (PWM), 220 Ω | GPIO 25, 100 Ω | GP15, 100 Ω |
| Стягивающий резистор между затвором и GND | 10 kΩ | 10 kΩ | 10 kΩ |
| Исток (source) | GND | GND | GND |
| Сток (drain) | Минусовой (−) вывод нагрузки | Минусовой (−) вывод нагрузки | Минусовой (−) вывод нагрузки |
| Плюсовой (+) вывод нагрузки | Плюс блока питания 12 V | Плюс блока питания 12 V | Плюс блока питания 12 V |
| Минус (−) блока питания 12 V | GND Arduino (общая земля) | GND ESP32 (общая земля) | GND Pico (общая земля) |
| Рекомендуемый MOSFET | IRLZ44N | IRLZ44N (до 2–3 A) или AO3400A | IRLZ44N (до 2–3 A) или AO3400A |
Резистор затвора (100–220 Ω) ограничивает кратковременный ток, который берётся с пина, пока заряжается ёмкость затвора. Входная ёмкость IRLZ44N — около 1700 pF; без резистора пин при каждом переключении на мгновение видит почти короткое замыкание, а в цепи затвора возникает звон (ringing). С 220 Ω пиковый ток не превышает 5 / 220 ≈ 23 mA, а затвор всё равно заряжается за несколько микросекунд. Стягивающий резистор (pull-down, 10 kΩ) не даёт затвору «висеть в воздухе», пока пин работает как вход, а так бывает, когда Arduino запускается, перезагружается или принимает новый скетч. «Висящий» затвор может нахватать помех и зарядиться наполовину; тогда MOSFET остаётся приоткрытым, мотор начинает самопроизвольно крутиться, а транзистор быстро перегревается. Ставь стягивающий резистор со стороны MOSFET относительно резистора затвора, прямо между затвором и истоком: так MOSFET останется закрытым, даже если управляющий провод отвалится. Два резистора образуют небольшой делитель напряжения, но его влияние ничтожно: на затвор приходит 5 × 10 000 / 10 220 ≈ 4,89 V.
Обратный диод: зачем он нужен моторам, насосам и соленоидам

Индуктивные нагрузки — моторы, насосы, соленоиды, катушки реле и вентиляторы — сопротивляются резкому прекращению тока. В момент, когда MOSFET закрывается, магнитная энергия, накопленная в катушке, выходит в виде выброса напряжения на стоке, который намного превышает напряжение питания (V = L × di/dt). Такой выброс может превысить допустимое VDS и пробить MOSFET или создать помехи, из-за которых Arduino перезагрузится. Решение — диод, подключённый в обратном направлении параллельно нагрузке: катод (конец с полоской) — к плюсу питания, анод — к стоку. В обычном режиме диод смещён в обратном направлении и ток не проводит; когда MOSFET закрывается, ток катушки замыкается через диод и плавно затухает. Встроенный диод MOSFET эту работу не выполнит, потому что он стоит между истоком и стоком, а не параллельно нагрузке. Подробнее — в статье Что такое диод?.
| Нагрузка и режим управления | Рекомендуемый диод | Почему? |
|---|---|---|
| Соленоид, катушка реле (только вкл/выкл) | 1N4007 (1 A, 1000 V) | Медленный диод, но для редких переключений его достаточно |
| Небольшой насос или мотор с ШИМ (до 1 A) | Диод Шоттки 1N5819 (1 A, 40 V) | Быстрый; проводит в каждом периоде ШИМ |
| Мотор побольше с ШИМ (1–3 A) | Диод Шоттки 1N5822 или SS34 (3 A, 40 V) | Пока ШИМ в паузе, через диод идёт весь ток мотора |
| Светодиодная лента 12 V, резистивный нагреватель | Не нужен | Катушки нет, значит, нет и выброса напряжения |
Пошагово: регулировка яркости светодиодной ленты 12 V с Arduino
- Подготовь детали: Arduino Uno, IRLZ44N, резисторы 220 Ω и 10 kΩ, потенциометр 10 kΩ, светодиодная лента 12 V и блок питания 12 V, способный отдать ток ленты.
- Рассчитай ток ленты: лента 5050 с 60 светодиодами на метр потребляет около 14,4 W на метр, то есть 1,2 A при 12 V. Двум метрам нужно 2,4 A; блок питания выбирай с запасом 20% (минимум 3 A).
- Установи MOSFET: исток IRLZ44N подключи к шине GND, затвор — к D9 через 220 Ω, а между затвором и GND поставь 10 kΩ.
- Подключи нагрузку: провод +12V ленты идёт на плюс блока питания, минусовой провод — на сток MOSFET. Контакты макетной платы выдерживают около 1 A; при большем токе используй винтовые клеммы или припаяй провода нагрузки.
- Подключи потенциометр: крайние выводы — к 5V и GND, средний — к A0.
- Объедини земли и проверь: соедини минус блока питания с GND Arduino, загрузи код, а потом включи блок питания в розетку.
1// IRLZ44N ile 12 V LED şerit parlaklık kontrolü / 12 V LED strip dimming with an IRLZ44N
2const int STRIP_PIN = 9; // PWM pini, 220 Ω ile gate'e / PWM pin, to the gate via 220 Ω
3const int POT_PIN = A0; // potansiyometre orta ucu / potentiometer wiper
4
5void setup() {
6 pinMode(STRIP_PIN, OUTPUT);
7 digitalWrite(STRIP_PIN, LOW); // açılışta kapalı / off at startup
8 Serial.begin(9600);
9}
10
11void loop() {
12 int pot = analogRead(POT_PIN); // 0–1023
13 float x = pot / 1023.0; // 0.0–1.0
14 int duty = (int)(x * x * 255.0 + 0.5); // basit gama düzeltmesi / simple gamma correction
15 analogWrite(STRIP_PIN, duty); // D9'da 490 Hz PWM / 490 Hz PWM on D9
16 Serial.print("Parlaklik / Brightness: %");
17 Serial.println(duty * 100 / 255);
18 delay(50);
19}analogWrite() формирует на пине 9 сигнал ШИМ, который включается и выключается примерно 490 раз в секунду; 0 означает «полностью выключено», 255 — «полностью включено». ШИМ-пины Uno — 3, 5, 6, 9, 10 и 11; на пинах 5 и 6 частота около 980 Hz. Глаз воспринимает яркость нелинейно, поэтому возведение значения потенциометра в квадрат (простая гамма-коррекция) даёт гораздо более плавную регулировку на малой яркости. Подробно о ШИМ — в статье Что такое PWM?. Проверим и нагрев: при 2,4 A IRLZ44N рассеивает P = I² × RDS(on) = 2,4² × 0,025 ≈ 0,14 W, так что на ощупь он едва тёплый. Для сравнения, светодиодная лента при этом потребляет 28,8 W; потери в MOSFET — меньше одного процента от общей мощности.
Регулировка скорости DC-мотора и насоса через ШИМ

Мотор или насос управляется той же схемой, что и светодиодная лента; разница лишь в том, что параллельно нагрузке добавляется обратный диод. У моторов есть ещё и пусковой ток: неподвижный мотор в первый момент может потреблять в 3–8 раз больше рабочего тока. Поэтому подбирай MOSFET и источник питания по току при заторможенном валу и используй плавный старт вместо резкого скачка от 0 до 255. Погружные мини-насосы потребляют около 0,1–0,3 A при 3–6 V, а мембранные насосы на 12 V обычно 0,5–1 A; IRLZ44N справляется с обоими с большим запасом. Только питай мини-насос от источника с его собственным напряжением (5–6 V), а не от блока питания 12 V; схема с MOSFET остаётся той же. О выборе насоса и поливе читай в статье Мини-насос для воды.
1// IRLZ44N ile motor/pompa hız kontrolü ve yumuşak kalkış / Motor or pump speed control with soft start (IRLZ44N)
2const int MOTOR_PIN = 9; // 220 Ω ile gate'e / to the gate via 220 Ω
3const int POT_PIN = A0; // hız ayarı / speed setting
4const int MIN_DUTY = 60; // bunun altında motor yalnızca vızıldar / below this the motor only hums
5
6int current = 0; // şu anki PWM değeri / current PWM value
7
8void setup() {
9 pinMode(MOTOR_PIN, OUTPUT);
10 digitalWrite(MOTOR_PIN, LOW);
11 // TCCR1B = (TCCR1B & 0b11111000) | 0x02; // isteğe bağlı: D9/D10 PWM ≈3,9 kHz / optional: D9/D10 PWM ≈3.9 kHz
12}
13
14void loop() {
15 int target = map(analogRead(POT_PIN), 0, 1023, 0, 255);
16 if (target < MIN_DUTY) target = 0; // çok düşük hızda tamamen durdur / stop completely at very low speed
17
18 if (current < target) current++; // yavaşça hızlan / speed up gently
19 else if (current > target) current--; // yavaşça yavaşla / slow down gently
20
21 analogWrite(MOTOR_PIN, current);
22 delay(8); // 0→255 yaklaşık 2 s / 0→255 takes about 2 s
23}Код каждые 8 мс делает один шаг к целевой скорости, считанной с потенциометра, поэтому мотор разгоняется от 0 до полной скорости примерно за 2 секунды, и пусковой ток не «проваливает» источник питания. MIN_DUTY — наименьшее значение ШИМ, при котором мотор начинает вращаться; подбери его опытным путём для своего мотора. ШИМ на 490 Hz вызывает слышимый писк мотора. Закомментированная строка TCCR1B поднимает частоту на D9 и D10 примерно до 3,9 kHz; библиотека Servo тоже использует Timer1, поэтому вместе их не применяй. Поднять частоту ещё выше заманчиво, но пину Arduino нужно несколько микросекунд, чтобы при каждом переключении зарядить затвор крупного MOSFET, поэтому потери на переключение растут с частотой: около 20 kHz даже мотор на 2 A может дать больше 1 W потерь в MOSFET. На таких частотах применяют драйвер затвора, например TC4427.
Соленоидные замки и кратковременные нагрузки
Соленоидные дверные замки на 12 V потребляют 0,5–1 A, и большинство из них не рассчитано на постоянное включение: если долго держать их под напряжением, катушка нагревается. Поэтому код должен держать замок открытым всего несколько секунд. Соленоид не управляется ШИМ, а просто включается и выключается, поэтому в качестве обратного диода достаточно 1N4007. В примере ниже нажатие кнопки на D2 открывает замок на 3 секунды, после чего он закрывается, даже если кнопку всё ещё держат. Чтобы открывать замок RFID-считывателем карт или матричной клавиатурой, достаточно поменять условие if; о типах замков и их поведении при отключении электричества читай в статье Соленоидный замок.
1// Butonla 3 saniyelik solenoid kilit açma / Open a solenoid lock for 3 seconds with a button
2const int LOCK_PIN = 9; // 220 Ω ile IRLZ44N gate'ine / to the IRLZ44N gate via 220 Ω
3const int BUTTON_PIN = 2; // buton D2 ile GND arasında / button between D2 and GND
4const unsigned long OPEN_MS = 3000; // kilidin açık kalma süresi / how long the lock stays open
5
6void setup() {
7 pinMode(LOCK_PIN, OUTPUT);
8 digitalWrite(LOCK_PIN, LOW); // kilit kapalı / locked
9 pinMode(BUTTON_PIN, INPUT_PULLUP); // basılınca LOW / LOW when pressed
10}
11
12void loop() {
13 if (digitalRead(BUTTON_PIN) == LOW) {
14 digitalWrite(LOCK_PIN, HIGH); // solenoid çeker, kilit açılır / solenoid pulls in, lock opens
15 delay(OPEN_MS);
16 digitalWrite(LOCK_PIN, LOW); // bobini soğumaya bırak / let the coil cool down
17 while (digitalRead(BUTTON_PIN) == LOW) {} // buton bırakılana kadar bekle / wait until released
18 delay(50); // buton zıplamasını süz / debounce
19 }
20}Почему модулю IRF520 не хватает 5 V
MOSFET-модуль IRF520, очень распространённый в стартовых наборах, — это маленькая плата с винтовыми клеммами, которую продают с характеристиками вроде «24 V, 5 A». Кроме MOSFET, на ней есть несколько резисторов и сигнальный светодиод; обратного диода в большинстве версий нет. Проблема именно в MOSFET: IRF520 — стандартный MOSFET с порогом 2–4 V, и его RDS(on) 0,27 Ω гарантирован только при VGS = 10 V. По типовым графикам из даташита при напряжении на затворе 5 V IRF520 начинает ограничивать ток примерно на 2 A; у экземпляра с высоким порогом этот предел опускается ниже 1 A. В этот момент MOSFET ведёт себя не как ключ, а как переменный резистор.
Пример: допустим, мотор на 12 V, потребляющий 2 A, управляется модулем IRF520. Если на MOSFET падает 1,5 V, он рассеивает P = 1,5 × 2 = 3 W. При тепловом сопротивлении корпуса TO-220 без радиатора 62 °C/W это примерно на 186 °C выше температуры окружающей среды: MOSFET быстро перегреется и выйдет из строя, а в лучшем случае мотор будет вращаться медленно. 5 A на этикетке модуля справедливы только при 10 V на затворе. Вот выводы модуля и их подключение:
| Вывод модуля | Куда подключать | Примечание |
|---|---|---|
| SIG | ШИМ-пин Arduino (например, D9) | Сигнал затвора; с 3,3-вольтовыми платами MOSFET почти не открывается |
| VCC | 5V Arduino | В большинстве версий ни к чему не подключён; ток нагрузки здесь не течёт |
| GND (штыревой разъём) | GND Arduino | Нужен для общей земли |
| VIN и GND (винтовая клемма) | + и − внешнего источника питания | Питание нагрузки; модуль продаётся с рабочим напряжением до 24 V |
| V+ и V− (винтовая клемма) | + и − нагрузки | Для моторов и насосов добавь диод между V+ и V− (катодом к V+) |
- Замени MOSFET: выпаяй IRF520 из модуля и впаяй на его место IRLZ44N с тем же порядком выводов (G-D-S); плата работает точно так же, но теперь полностью открывается от 5 V.
- Возьми модуль с логическим уровнем: готовые модули на MOSFET AOD4184A (D4184) обеспечивают RDS(on) не более 9,5 mΩ при 4,5 V и спокойно работают с 5-вольтовой Arduino.
- Управляй затвором более высоким напряжением: драйвер затвора вроде TC4427 с питанием от 12 V превращает сигнал Arduino 5 V или 3,3 V в 12 V на затворе, и IRF520 выходит на свои реальные возможности. Не выходи за пределы напряжения затвора: ±20 V для IRF520, ±16 V для IRLZ44N.
- Для малых нагрузок используй как есть: при токе ниже 1 A (короткая светодиодная лента, мини-насос) модуль IRF520 работает от 5 V с приемлемым нагревом; если MOSFET так горячий, что его не удержать пальцами, уменьши нагрузку.
MOSFET с ESP32 и Raspberry Pi Pico (3,3 V)
Пины ESP32 и Pico выдают 3,3 V, поэтому правильный выбор MOSFET здесь ещё важнее. Даташит IRLZ44N указывает RDS(on) вплоть до 4 V; по типовым графикам и около 3 V он спокойно пропускает несколько ампер, но для экземпляра с высоким порогом это не гарантировано. Практическое правило: на 3,3-вольтовых платах используй IRLZ44N или IRLB8721 до 2–3 A, при работающей нагрузке измерь мультиметром напряжение сток–исток и рассчитай рассеиваемую мощность по формуле P = VDS × I; для TO-220 без радиатора держись ниже 1 W. Для больших токов используй драйвер, поднимающий напряжение затвора до 5–12 V, а для небольших нагрузок — AO3400A, у которого RDS(on) гарантирован при 2,5 V. На ESP32 выбирай для MOSFET пины вроде GPIO 25, 26, 27, 32 или 33: GPIO 0, 2, 5, 12 и 15 — пины конфигурации при старте (strapping), а GPIO 1, 3, 5, 14 и 15 при включении могут ненадолго переходить в HIGH или выдавать ШИМ. На этих пинах нагрузка может неожиданно включиться при старте, а стягивающий резистор — помешать запуску платы.
Код для ESP32 ниже через MOSFET с плавным стартом включает насос, когда датчик влажности почвы сообщает, что земля сухая, поливает 5 секунд и затем плавно останавливает его. Для ШИМ используются функции ledcAttach() и ledcWrite() из ядра ESP32 Arduino 3.x; в старых версиях 2.x вместо них были ledcSetup() и ledcAttachPin(), а в ledcWrite() передавался номер канала, а не пин. Строки #if в коде выбирают нужные вызовы для установленного ядра, поэтому код компилируется на обеих версиях. Затвор управляется напряжением 3,3 V через 100 Ω, поэтому частота оставлена на 1 kHz, и потери на переключение остаются ничтожными. Измерь значения датчика для сухой и влажной почвы в своём грунте, как в статье Датчик влажности почвы, и настрой по ним порог DRY_LEVEL.
1// ESP32 + MOSFET ile otomatik sulama pompası / Automatic watering pump with ESP32 + MOSFET
2const int PUMP_PIN = 25; // 100 Ω ile gate'e, gate–GND 10 kΩ / to the gate via 100 Ω, 10 kΩ gate–GND
3const int SOIL_PIN = 34; // toprak nem sensörü, ADC1 / soil moisture sensor, ADC1
4const int DRY_LEVEL = 2800; // üstü kuru sayılır, kalibre et / above this counts as dry, calibrate
5const unsigned long WATER_MS = 5000; // sulama süresi / watering time
6
7void pumpWrite(int duty) { // 0–255 PWM, iki çekirdek sürümünde / on both core versions
8#if ESP_ARDUINO_VERSION_MAJOR >= 3
9 ledcWrite(PUMP_PIN, duty); // 3.x: pin numarasıyla / 3.x: by pin number
10#else
11 ledcWrite(0, duty); // 2.x: kanal 0 ile / 2.x: by channel 0
12#endif
13}
14
15void pumpRamp(int from, int to) { // yumuşak hız değişimi / smooth speed change
16 int step = (to > from) ? 5 : -5;
17 for (int d = from; d != to; d += step) {
18 pumpWrite(d);
19 delay(20);
20 }
21 pumpWrite(to);
22}
23
24void setup() {
25 Serial.begin(115200);
26#if ESP_ARDUINO_VERSION_MAJOR >= 3
27 ledcAttach(PUMP_PIN, 1000, 8); // 1 kHz, 8 bit (0–255); çekirdek 3.x / core 3.x
28#else
29 ledcSetup(0, 1000, 8); // çekirdek 2.x: kanal 0 / core 2.x: channel 0
30 ledcAttachPin(PUMP_PIN, 0);
31#endif
32 pumpWrite(0); // pompa kapalı / pump off
33}
34
35void loop() {
36 int soil = analogRead(SOIL_PIN); // 0–4095
37 Serial.printf("Toprak / Soil: %d\n", soil);
38 if (soil > DRY_LEVEL) {
39 pumpRamp(0, 255); // yaklaşık 1 s'de tam hıza / full speed in about 1 s
40 delay(WATER_MS);
41 pumpRamp(255, 0); // yumuşakça dur / stop gently
42 delay(60000); // suyun toprağa yayılmasını bekle / let the water soak in
43 }
44 delay(1000);
45}На Raspberry Pi Pico для генерации ШИМ в MicroPython достаточно класса machine.PWM; duty_u16() принимает значение от 0 до 65535. Код ниже создаёт плавный эффект «дыхания» для светодиодной ленты 12 V, подключённой через MOSFET к GP15. Как и в примере для Arduino, значение возводится в квадрат для простой гамма-коррекции, поэтому переход от темноты к яркому свету выглядит естественно. Пины Pico тоже выдают 3,3 V, так что правила выбора MOSFET, приведённые для ESP32, действуют и здесь.
1# Pico + MOSFET ile 12 V LED şerit nefes efekti / 12 V LED strip breathing effect with Pico + MOSFET
2from machine import Pin, PWM
3import time
4
5strip = PWM(Pin(15)) # 100 Ω ile gate'e, gate–GND 10 kΩ / to the gate via 100 Ω, 10 kΩ gate–GND
6strip.freq(1000) # 1 kHz: titreme görünmez / 1 kHz: no visible flicker
7
8def set_level(x): # x: 0.0–1.0
9 strip.duty_u16(int(x * x * 65535)) # basit gama düzeltmesi / simple gamma correction
10
11while True:
12 for i in range(101): # yavaşça aydınlan / fade in
13 set_level(i / 100)
14 time.sleep_ms(20)
15 for i in range(100, -1, -1): # yavaşça sön / fade out
16 set_level(i / 100)
17 time.sleep_ms(20)
18 time.sleep_ms(500)Нагрев, расчёт мощности и выбор радиатора
Нагрев полностью открытого MOSFET описывается одной формулой: P = I² × RDS(on). Помни о двух вещах. Во-первых, RDS(on) растёт с температурой: у IRLZ44N при 100 °C оно примерно в 1,5 раза больше, чем при 25 °C, поэтому реалистичнее считать с 38 mΩ, а не с 25 mΩ. Во-вторых, корпус может отдать в воздух лишь ограниченное количество тепла: тепловое сопротивление TO-220 без радиатора (RθJA) составляет 62 °C/W, то есть каждый ватт поднимает температуру кристалла на 62 °C выше окружающей. В таблице ниже показано, как греется IRLZ44N при 5 V на затворе без радиатора:
| Ток нагрузки | Рассеиваемая мощность (при 38 mΩ) | Рост температуры (без радиатора) | Рекомендация |
|---|---|---|---|
| 1 A | 0,04 W | ≈ 2 °C | Радиатор не нужен |
| 3 A | 0,34 W | ≈ 21 °C | Радиатор не нужен, тёплый на ощупь |
| 5 A | 0,95 W | ≈ 59 °C | На пределе; поставь небольшой радиатор |
| 8 A | 2,4 W | ≈ 150 °C | Радиатор обязателен |
| 10 A | 3,8 W | ≈ 236 °C | Нужны ребристый радиатор и термопаста |
Радиатор рассчитывается по той же логике: Tj = Tокр + P × (RθJC + RθCS + RθSA). Если при 10 A рассеивается 3,8 W и нужно удержать температуру кристалла на уровне 100 °C в комнате с 30 °C, общее тепловое сопротивление не должно превышать (100 − 30) / 3,8 ≈ 18 °C/W. Тепловое сопротивление переход–корпус у IRLZ44N — 1,4 °C/W, контакт с термопастой — около 0,5 °C/W, поэтому на радиатор остаётся не больше 16 °C/W; это соответствует небольшому, но ребристому радиатору для TO-220. Металлический фланец MOSFET соединён со стоком; если ставишь несколько MOSFET на один радиатор, используй изолирующие прокладки из слюды или силикона и пластиковые втулки для винтов. Второй источник нагрева при ШИМ — потери на переключение; на 490 Hz они ничтожны, но растут с повышением частоты.
MOSFET, транзистор или реле
| Характеристика | MOSFET с логическим уровнем (IRLZ44N) | Биполярный транзистор (2N2222A / TIP120) | Реле (модуль 5 V) |
|---|---|---|---|
| Как управляется? | Напряжением; постоянного тока затвора нет | Током; ток базы течёт постоянно (2–10 mA) | Током катушки (≈70 mA); её включает транзистор на модуле |
| Потери во включённом состоянии | I² × RDS(on): ≈ 0,2–0,3 W при 3 A | VCE(sat) × I: у TIP120 до 2 V при 3 A, ≈ 6 W | Почти ноль на контактах |
| Допустимый ток | Десятки ампер (с радиатором) | 2N2222A 0,6 A, TIP120 5 A | Обычно 10 A (по контактам) |
| ШИМ: скорость и яркость | Да, в диапазоне kHz | Да | Нет, только вкл/выкл |
| Переменное / сетевое напряжение | Нет, только постоянный ток | Нет, только постоянный ток | Да, с гальванической развязкой |
| Шум и ресурс | Бесшумно, без износа | Бесшумно, без износа | Щёлкает; ресурс контактов около 100 000 переключений |
| Лучше всего подходит для | Светодиодные ленты, моторы, насосы, соленоиды (1–10 A, постоянный ток) | Малые нагрузки (до 1 A), катушки реле, зуммеры | Лампы, розетки, приборы на переменном токе |
Коротко: если нужно управлять нагрузкой постоянного тока быстро, бесшумно и с ШИМ, бери MOSFET; если коммутируешь лампу или розетку от сети 220 V, используй модуль реле. Для небольших нагрузок в несколько сотен миллиампер справится и дешёвый биполярный транзистор; расчёт базового резистора есть в статье Что такое транзистор?. Если один и тот же мотор должен вращаться в обе стороны, одного MOSFET мало: нужен H-мост из четырёх ключей, поэтому используй драйвер моторов L298N или модуль H-моста на MOSFET.
Идеи проектов с MOSFET
- Автоматическая подсветка шкафа или лестницы: когда PIR-датчик замечает движение, плавно зажигай светодиодную ленту 12 V через ШИМ и выключай её через некоторое время.
- Лампа «Закат»: с помощью фоторезистора (LDR) постепенно повышай яркость ленты по мере того, как в комнате темнеет.
- Умный вентилятор: увеличивай скорость компьютерного вентилятора на 12 V по мере роста температуры, измеренной DHT11.
- Автополив растений: поливай горшки автоматически с помощью датчика влажности почвы и насоса, управляемого через MOSFET; для каждого насоса используй отдельный MOSFET.
- Дверной замок по карте: открывай соленоидный замок 12 V на 3 секунды, когда RFID RC522 считывает нужную карту.
- Умная теплица: собери умную теплицу, в которой вентилятор, насос и нагреватель управляются отдельными MOSFET.
Частые ошибки и как их исправить
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Нагрузка вообще не работает | Нет общего GND или неверный порядок G-D-S | Соедини минус блока питания с GND Arduino и проверь порядок выводов |
| Нагрузка работает постоянно и не выключается | Перепутаны сток и исток (проводит встроенный диод) или MOSFET пробит | Исправь подключение; если сток–исток прозванивается как короткое замыкание в обе стороны, замени MOSFET |
| MOSFET сильно греется, а нагрузка работает слабо | Стандартный MOSFET (IRF520, IRFZ44N) открыт лишь наполовину при 5 V или 3,3 V | Используй MOSFET с логическим уровнем, например IRLZ44N, или драйвер затвора |
| Мотор самопроизвольно крутится при включении или во время загрузки кода | Затвор «висит в воздухе», нет стягивающего резистора | Поставь 10 kΩ между затвором и GND |
| Arduino перезагружается, когда мотор останавливается | Нет обратного диода, или мотор и Arduino питаются от одного слабого источника | Поставь диод Шоттки в обратном направлении параллельно мотору и питай мотор от отдельного источника |
| Мотор громко пищит при ШИМ | Частота ШИМ 490 Hz попадает в слышимый диапазон | Подними её до 3,9 kHz; выше 20 kHz используй драйвер затвора |
| Нагрузка работает слабо, если N-канальный MOSFET стоит на стороне плюса | Исток поднимается вместе с нагрузкой, и VGS уменьшается | Оставь N-канальный MOSFET на стороне GND; для ключа в верхнем плече используй P-канальный MOSFET с NPN-драйвером |
MOSFET — самый аккуратный способ подключить Arduino к мощным нагрузкам реального мира: с правильно подобранной деталью с логическим уровнем, резистором затвора, стягивающим резистором и диодом для индуктивных нагрузок можно бесшумно и эффективно управлять любой нагрузкой постоянного тока, от светодиодной ленты до насоса. В приложении BlueGrays есть такие проекты, как плавное зажигание светодиода через ШИМ, регулировка яркости потенциометром, умная станция полива и умное освещение, с пошаговыми схемами подключения и кодом, так что схему с MOSFET из этой статьи можно сразу превратить в настоящий проект.
Частые вопросы
Какой MOSFET использовать с Arduino?
Для 5-вольтовых Arduino Uno, Nano или Mega выбирай N-канальный MOSFET с логическим уровнем управления, у которого RDS(on) гарантирован при 4,5 V или 5 V. Самый распространённый — IRLZ44N: он выдерживает 55 V и имеет сопротивление всего 25 mΩ при 5 V на затворе. IRLB8721 тоже хороший вариант, а стандартным MOSFET вроде IRFZ44N, IRF520 и IRF540N для полного открытия нужно 10 V.
Работает ли модуль IRF520 с Arduino?
Работает, но с ограничениями. IRF520 — стандартный MOSFET, и при 5 V на затворе он обычно начинает ограничивать ток примерно на 2 A, поэтому при нагрузках больше 1 A быстро нагревается. Для малых нагрузок его хватает; для больших замени MOSFET на модуле на IRLZ44N или возьми модуль с логическим уровнем.
Какой резистор затвора нужен для MOSFET?
С Arduino хорошо работает резистор затвора 100–220 Ω; 220 Ω ограничивает кратковременный ток с пина примерно до 23 mA при 5 V. Также поставь стягивающий резистор 10 kΩ между затвором и GND: он не даёт MOSFET самопроизвольно открыться при включении и во время загрузки кода.
Можно ли коммутировать сетевое переменное напряжение с помощью MOSFET?
В проектах на Arduino используй MOSFET только для нагрузок постоянного тока. Сетевое переменное напряжение нельзя безопасно коммутировать одним N-канальным MOSFET, а такая схема не имеет гальванической развязки, что делает её опасной. Для сетевой лампы или розетки используй модуль реле, твердотельное реле (SSR) или схему на симисторе с управлением через оптопару.
Как управлять MOSFET с ESP32?
Пины ESP32 выдают 3,3 V, поэтому выбирай MOSFET, который хорошо открывается при низком напряжении на затворе. IRLZ44N обычно нормально работает при 3,3 V до 2–3 A; для малых нагрузок надёжнее AO3400A, гарантированный при 2,5 V, а для больших токов — драйвер, поднимающий напряжение затвора до 12 V. Для ШИМ используй ledcAttach() и ledcWrite() и выбирай пины, которые при включении остаются «тихими», например GPIO 25, 26, 27, 32 или 33.
Почему греется MOSFET?
Нагрев полностью открытого MOSFET равен P = I² × RDS(on); IRLZ44N при 3 A рассеивает всего 0,2–0,3 W. Если MOSFET сильно греется, обычно напряжения на затворе не хватает и он открыт лишь наполовину; самые частые причины — стандартный MOSFET, управление от 3,3-вольтовой платы и слишком высокая частота ШИМ. Если на TO-220 без радиатора рассеивается больше 1 W, поставь радиатор.
Что собрать после прочтения
Все проекты
Ночник на LDR
Маленький ночник, который сам включается, когда темнеет, и гаснет, когда наступает утро. Датчик освещённости измеряет, насколько светло в комнате, и Arduino включает светодиод, когда достаточно темно,

Плавное затухание светодиода с PWM на ESP32
Плавное изменение яркости светодиода от 0 до максимума и от максимума до 0. PWM управляется через analogWrite(), как в Arduino, — тот же синтаксис без проблем работает в ESP32 Arduino Core 3.0+. Достаточно определения пина, pinMode и analogWrite.

Регулировка яркости светодиода потенциометром на ESP32 (аналог → PWM)
В этом проекте яркость светодиода плавно регулируется потенциометром. Пин АЦП ESP32 читает напряжение 0–3,3V с потенциометра, затем это значение превращается в сигнал PWM (широтно-импульсная модуляция) и подаётся на светодиод. В результате при повороте потенциометра светодиод постепенно становится ярче или тусклее. В Arduino Core 3.0+ можно сразу использовать analogWrite(); на ESP32-S2/S3 разрешение АЦП фиксировано — 12 бит.

Плавное затухание светодиода с PWM на Pico (эффект дыхания)
Светодиод больше не просто мигает — он дышит! С помощью PWM (широтно-импульсной модуляции) Raspberry Pi Pico яркость светодиода медленно растёт и медленно падает, как огонёк спящего MacBook. Изучи класс machine.PWM, duty_u16() (16-битная яркость 0–65535), частоту PWM (freq(1000) — 1000 циклов вкл/выкл в секунду, мерцания не видно), циклы range() с шагом (вверх и вниз) и почти аналоговый выход с цифрового пина.

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

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

Умное освещение лестницы и коридора
Ступи на лестницу или в коридор, и свет загорается ступенька за ступенькой в ту сторону, куда ты идёшь. На каждом конце стоит датчик расстояния; мимо какого ни пройдёшь, восемь светодиодов загораются
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

