Микроклимат на Ардуино

Админ

Администратор
Регистрация
24.02.18
Сообщения
1.673
Реакции
444
Архитектура системы (что чем управляет)
🛒 Полный список комплектующих и где искать
На Ozon и WB ищите по точным названиям (прямые ссылки часто «живут» недолго). Высокоточные датчики надёжнее брать в специализированных магазинах.

🧠 Контроллер и датчики

🖥 Пульт и обвязка

  • LCD 2004 I2C: Ozon/WB (LCD 2004 I2C), magazin-elektronika.ru (~703 ₽), iarduino.ru.
  • Кнопки тактовые (4 шт.): Ozon/WB (тактовая кнопка 12x12).
  • Блок питания Mean Well IRM-10-5 (5V/2A): Ozon/WB (Mean Well IRM-10-5), ChipDip, Platan.
  • Корпус G373 IP65: Ozon/WB (корпус G373 IP65).
⚡ Силовая часть и защита

  • SSR-25DA: Ozon/WB (SSR-25DA твердотельное реле), 42unita.ru (~510–579 ₽). Обязательно радиатор.
  • 8-канальный модуль реле (5V, с оптопарой): Ozon/WB (модуль реле 8 каналов 5V опторазвязка).
  • Транзистор PN2222A (2 шт.): Ozon/WB (PN2222A транзистор). Нужен, так как 3.3V не открывает SSR-25DA напрямую.
  • Резисторы 1 кОм и 3.3 кОм: Ozon/WB (резистор 1кОм 0.25Вт, резистор 3.3кОм).
  • Варисторы 07D471K (2–3 шт.): Ozon/WB (варистор 07D471K). Ставятся параллельно контактам реле вентиляторов для гашения дуги.
  • Предохранитель 10A + держатель: Ozon/WB. На линию обогревателя.
  • Клеммники WAGO 221: Ozon/WB. Для силовой разводки 220В.
  • Суперконденсатор 1F 3V (ионистор): Ozon/WB (ионистор 1F 3V).
🔌 Схема соединений (пошагово)
1. Шина I2C (датчики + дисплей)
У ESP32-S3 стандартные пины: GPIO8 (SDA) и GPIO9 (SCL).OpenSourceSimWheelESP32/src/QualityControl/README.md at fa0a4aea8fea83a08b5ee4940eb95fd37ed9918d · afpineda/OpenSourceSimWheelESP32

  • VCC всех устройств → 3.3V ESP32 (подсветку LCD лучше запитать от 5V блока питания, чтобы не перегружать стабилизатор платы).
  • GND → GND.
  • SDA → GPIO8, SCL → GPIO9. Адреса не конфликтуют: SCD41 (0x62), SHT35 (0x44), LCD (0x27/0x3F).
2. Кнопки пульта

  • UP → GPIO4, DOWN → GPIO5, EDIT → GPIO6, BACK → GPIO7.
  • Вторые ножки всех кнопок → GND. В коде включим INPUT_PULLUP.
3. Управление SSR-25DA (обогреватель) — критически важно

  • GPIO (например, GPIO10) → резистор 1 кОм → база PN2222A.
  • Между базой и 3.3V — резистор 3.3 кОм (подтяжка, чтобы SSR гарантированно выключался при сбросе).
  • Эмиттер → GND.
  • Коллектор → вход DC+ SSR-25DA. Вход DC- SSR → GND.
  • Выход SSR (клеммы 1,2) — в разрыв фазного провода 220В к обогревателю. Нужен радиатор.
4. 8-канальный модуль реле (вентиляторы, увлажнитель, заслонки, свет)

  • Питание модуля — от 5V (Mean Well), сигнальные входы — с GPIO ESP32.
  • Варистор 07D471K — параллельно контактам реле, коммутирующим вентиляторы (защита от индуктивных выбросов).
  • Заслонка: если привод реверсивный — два канала (открыть/закрыть). Если с возвратной пружиной — один.
5. Питание
Mean Well IRM-10-5 (5V) → ESP32 (5V/VIN) и модуль реле. Суперконденсатор — параллельно 3.3V и GND на ESP32.

💻 Прошивка: что скачать и как установить
1. Arduino IDE
Скачайте с официального сайта: https://www.arduino.cc/en/software (версия 2.x).

2. Ядро ESP32

3. Библиотеки (Sketch → Include Library → Manage Libraries)

4. Загрузка скетча

  • Подключите ESP32 по USB. Выберите порт.
  • Нажмите Upload. Если появляется Connecting... и загрузка висит: зажмите кнопку BOOT на плате, нажмите Reset, отпустите Reset, затем отпустите BOOT — плата перейдёт в режим загрузчика. После загрузки перезагрузите плату кнопкой Reset (BOOT не трогать).USB CDC and DFU Flashing - - — Arduino ESP32 latest documentation
📝 Полный код (с гистерезисом и блокировкой заслонки)
Замените пины, если использовали другие.


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SparkFun_SCD4x_Arduino_Library.h>
#include <SensirionI2CSht3x.h>
#include <Bounce2.h>

#define I2C_SDA 8
#define I2C_SCL 9
#define BTN_UP 4
#define BTN_DOWN 5
#define BTN_EDIT 6
#define BTN_BACK 7
#define PIN_SSR_HEATER 10
#define PIN_RELAY_EXHAUST 11
#define PIN_RELAY_SUPPLY 12
#define PIN_RELAY_HUMID 13
#define PIN_DAMPER_OPEN 14
#define PIN_DAMPER_CLOSE 15
#define PIN_RELAY_LIGHT 16

LiquidCrystal_I2C lcd(0x27, 20, 4);
SCD4x scd4x;
SensirionI2CSht3x sht3x;
Bounce btnUp = Bounce(), btnDown = Bounce(), btnEdit = Bounce(), btnBack = Bounce();

float SET_TEMP = 24.0; // °C
float SET_HUM = 90.0; // %
int SET_CO2 = 900; // ppm

enum State { MAIN, MENU };
State currentState = MAIN;
int menuIndex = 0;
float temp = 0, hum = 0;
int co2 = 0;

void setup() {
Serial.begin(115200);
Wire.begin(I2C_SDA, I2C_SCL);

btnUp.attach(BTN_UP, INPUT_PULLUP); btnUp.interval(25);
btnDown.attach(BTN_DOWN, INPUT_PULLUP); btnDown.interval(25);
btnEdit.attach(BTN_EDIT, INPUT_PULLUP); btnEdit.interval(25);
btnBack.attach(BTN_BACK, INPUT_PULLUP); btnBack.interval(25);

lcd.init(); lcd.backlight();

scd4x.begin(Wire);
sht3x.begin(Wire);
scd4x.startPeriodicMeasurement();
sht3x.startPeriodicMeasurement();

pinMode(PIN_SSR_HEATER, OUTPUT); digitalWrite(PIN_SSR_HEATER, LOW);
pinMode(PIN_RELAY_EXHAUST, OUTPUT); digitalWrite(PIN_RELAY_EXHAUST, LOW);
pinMode(PIN_RELAY_SUPPLY, OUTPUT); digitalWrite(PIN_RELAY_SUPPLY, LOW);
pinMode(PIN_RELAY_HUMID, OUTPUT); digitalWrite(PIN_RELAY_HUMID, LOW);
pinMode(PIN_DAMPER_OPEN, OUTPUT); digitalWrite(PIN_DAMPER_OPEN, LOW);
pinMode(PIN_DAMPER_CLOSE, OUTPUT); digitalWrite(PIN_DAMPER_CLOSE, LOW);
pinMode(PIN_RELAY_LIGHT, OUTPUT); digitalWrite(PIN_RELAY_LIGHT, LOW);
}

void loop() {
btnUp.update(); btnDown.update(); btnEdit.update(); btnBack.update();

static unsigned long lastRead = 0;
if (millis() - lastRead > 2000) { readSensors(); lastRead = millis(); }

handleButtons();
controlAll();
updateDisplay();
}

void readSensors() {
uint16_t co2Val; float t, h;
if (scd4x.readMeasurement(co2Val, t, h)) co2 = co2Val;
float shtT, shtH;
if (sht3x.getTemperatureHumidity(shtT, shtH) == 0) { temp = shtT; hum = shtH; }
}

void updateChannel(int pin, float value, float setpoint, float hysteresis, bool heating) {
static bool states[20] = {false};
int idx = pin % 20;
bool shouldOn;
if (heating) shouldOn = (value < setpoint - hysteresis);
else shouldOn = (value > setpoint + hysteresis);
if (shouldOn != states[idx]) { states[idx] = shouldOn; digitalWrite(pin, shouldOn ? HIGH : LOW); }
}

void controlAll() {
updateChannel(PIN_SSR_HEATER, temp, SET_TEMP, 0.5, true);
updateChannel(PIN_RELAY_HUMID, hum, SET_HUM, 3.0, true);

static bool ventOn = false; static bool damperMoving = false; static unsigned long tmr = 0;
bool needVent = (co2 > SET_CO2 + 150);

if (needVent && !ventOn && !damperMoving) {
digitalWrite(PIN_DAMPER_OPEN, HIGH); digitalWrite(PIN_DAMPER_CLOSE, LOW);
damperMoving = true; tmr = millis();
}
if (damperMoving && millis() - tmr > 8000) {
digitalWrite(PIN_DAMPER_OPEN, LOW); damperMoving = false;
ventOn = true;
digitalWrite(PIN_RELAY_EXHAUST, HIGH); digitalWrite(PIN_RELAY_SUPPLY, HIGH);
}
if (!needVent && ventOn) {
digitalWrite(PIN_RELAY_EXHAUST, LOW); digitalWrite(PIN_RELAY_SUPPLY, LOW); ventOn = false;
delay(10000); // вентиляторы останавливаются
digitalWrite(PIN_DAMPER_CLOSE, HIGH); delay(8000); digitalWrite(PIN_DAMPER_CLOSE, LOW);
}
if (co2 < SET_CO2 - 150 && !ventOn) { }

unsigned long hour = (millis() / 3600000) % 24;
digitalWrite(PIN_RELAY_LIGHT, (hour >= 6 && hour < 18) ? HIGH : LOW);
}

void handleButtons() {
if (btnEdit.fell()) { currentState = (currentState == MAIN) ? MENU : MAIN; }
if (btnBack.fell()) currentState = MAIN;
if (currentState == MENU) {
if (btnUp.fell()) menuIndex = (menuIndex - 1 + 3) % 3;
if (btnDown.fell()) menuIndex = (menuIndex + 1) % 3;
}
}

void updateDisplay() {
lcd.clear();
if (currentState == MAIN) {
lcd.setCursor(0,0); lcd.print("T="); lcd.print(temp,1); lcd.print("C");
lcd.setCursor(0,1); lcd.print("H="); lcd.print(hum,1); lcd.print("%");
lcd.setCursor(0,2); lcd.print("A="); lcd.print(co2); lcd.print("ppm");
lcd.setCursor(0,3); lcd.print(digitalRead(PIN_DAMPER_OPEN) ? "ЗАСЛОНКА: ОТКР" : "ЗАСЛОНКА: ЗАКР");
} else {
lcd.setCursor(0,0); lcd.print("> НАСТРОЙКИ <");
lcd.setCursor(0,1); lcd.print(menuIndex==0?">":" "); lcd.print("Температура");
lcd.setCursor(0,2); lcd.print(menuIndex==1?">":" "); lcd.print("Влажность");
lcd.setCursor(0,3); lcd.print(menuIndex==2?">":" "); lcd.print("CO2");
}
}

⚠ Финальный чек-лист перед включением 220В
  • □
    Обогреватель подключён только через SSR-25DA и радиатор.
  • □
    Вентиляторы подключены через реле модуля, параллельно контактам стоят варисторы.
  • □
    На линии обогревателя есть предохранитель 10A.
  • □
    Корпус и все металлические части заземлены.
  • □
    Транзисторный ключ собран по схеме (1кОм на базу, 3.3кОм подтяжка).
  • □
    В коде проверены пины и адрес LCD (0x27 или 0x3F).
Схема 1. Общая блок-схема (кто с кем связан)
Код:
 ┌─────────────────────┐ │ 220В сеть │ └──────────┬──────────┘ │ ┌────────────────┼────────────────┐ │ │ │ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │ Автомат │ │ Автомат │ │ Автомат │ │ 10A (ТЭН) │ │ 6A (вент.)│ │ 2A (БП) │ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │ │ │ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │Предохр.10A│ │ Реле 8-кан│ │Mean Well │ │ + SSR │ │ (вентилят,│ │IRM-10-5 │ │ 25DA │ │ увлажн, │ │ 5V / 2A │ └─────┬─────┘ │ заслонки, │ └─────┬─────┘ │ │ свет) │ │ ┌─────▼─────┐ └─────┬─────┘ │ │ Обогрева- │ │ │ │ тель (ТЭН)│ │ │ └───────────┘ │ │ │ │ ┌──────────┴────────────────┴──────────┐ │ ESP32-S3 DevKitC-1 │ │ GPIO10 → транз.ключ → SSR (ТЭН) │ │ GPIO11-16 → 8-кан. модуль реле │ │ GPIO4-7 → кнопки │ │ GPIO8/9 → I2C (SCD41, SHT35, LCD) │ └───────────────────────────────────────┘
🔌 Схема 2. Шина I2C (датчики + дисплей)
Код:
 ESP32-S3 ┌──────────┐ │ │ │ 3.3V ───┼──────┬──────────┬──────────┐ │ GND ───┼──────┼──────────┼──────────┤ │ GPIO8 ──┼──SDA─┼──────────┼──────────┤ │ GPIO9 ──┼──SCL─┼──────────┼──────────┤ └──────────┘ │ │ │ │ │ │ ┌─────▼────┐ ┌───▼─────┐ ┌──▼──────┐ │ SCD41 │ │ SHT35 │ │ LCD 2004│ │ (CO2) │ │(T/RH) │ │ I2C │ │ адрес │ │ адрес │ │ адрес │ │ 0x62 │ │ 0x44 │ │ 0x27 │ └──────────┘ └─────────┘ └─────────┘
Примечание: подсветку LCD (пин LED/BL) лучше запитать от 5V
блока Mean Well, а не от 3.3V ESP32 — иначе стабилизатор
платы будет перегреваться.
Примечание: подсветку LCD (пин LED/BL) лучше запитать от 5V
блока Mean Well, а не от 3.3V ESP32 — иначе стабилизатор
платы будет перегреваться.
🔘 Схема 3. Кнопки пульта
Код:
 ESP32-S3 ┌──────────┐ │ GPIO4 ──┼──────┬───[UP]───────┐ │ GPIO5 ──┼──────┼───[DOWN]─────┤ │ GPIO6 ──┼──────┼───[EDIT]─────┤ │ GPIO7 ──┼──────┼───[BACK]─────┤ │ GND ──┼──────┴──────────────┘ └──────────┘
Все кнопки — между GPIO и GND.
В коде: pinMode(pin, INPUT_PULLUP).
Нажатие = LOW. Внешние резисторы НЕ нужны.
⚡ Схема 4. Управление SSR-25DA через транзисторный ключ
Код:
 3.3V ──────────┐ │ [3.3 кОм] ← подтяжка базы (важно!) │ GPIO10 ───[1 кОм]───┐ │ ┌──┴──┐ │ B │ ┌────┤PN2222A├────┐ │ │ E │ C │ │ └──┬──┘──┬──┘ │ │ │ GND GND │ │ ┌───────┴───────┐ │ SSR-25DA │ │ ┌─────────┐ │ │ │ DC+ DC-│ │ │ └──┬───┬──┘ │ │ │ │ │ │ (C) GND │ │ │ │ 1 ─── 2 │ ← силовые клеммы └───────┬───────┘ │ Фаза 220В → ТЭН → Ноль 220В
ВАЖНО: SSR-25DA ставится на радиатор!
Без радиатора при токе >5A — перегрев и отказ.

🔀 Схема 5. 8-канальный модуль реле (вентиляторы, увлажнитель, заслонки, свет)
Код:
 ESP32-S3 8-канальный модуль реле ┌──────────┐ ┌──────────────────────┐ │ GPIO11 ─┼────────────┤ IN1 → Вытяжной вент. │ │ GPIO12 ─┼────────────┤ IN2 → Приточной вент.│ │ GPIO13 ─┼────────────┤ IN3 → Увлажнитель │ │ GPIO14 ─┼────────────┤ IN4 → Заслонка ОТКР │ │ GPIO15 ─┼────────────┤ IN5 → Заслонка ЗАКР │ │ GPIO16 ─┼────────────┤ IN6 → Освещение │ │ GPIO17 ─┼────────────┤ IN7 → Резерв │ │ │ │ IN8 → Резерв │ │ GND ───┼────────────┤ GND │ │ 5V ───┼────────────┤ VCC (от Mean Well!) │ └──────────┘ └──────────────────────┘
Схема одного канала с варистором (для вентиляторов): ┌─── Реле NO ───┬─────────────── Фаза к мотору │ │ │ [Варистор 07D471K] │ │ └───────────────┴─────────────── Ноль к мотору
Варистор ставится параллельно контактам реле
(между NO и фазой нагрузки) — гасит дугу при
отключении индуктивной нагрузки.

🔌 Схема 6. Силовая часть 220В (что куда на клеммниках)
Код:
 ┌─────────────┐ Ввод 220В ─────┤ Автомат C16 ├─── Фаза (L) └─────────────┘ ┌─────────────┐ Ввод 220В ─────┤ Автомат C16 ├─── Ноль (N) └─────────────┘ ┌─────────────┐ Ввод 220В ─────┤ Заземление ├─── PE (обязательно!) └─────────────┘
Разводка фазного провода: ┌──────────────┐ L ─────────────┤ WAGO 221 (5) │ └──┬───┬───┬───┘ │ │ │ ┌────────────┘ │ └────────────┐ │ │ │ ┌────▼─────┐ ┌────▼─────┐ ┌─────▼────┐ │ Автомат │ │ Автомат │ │ Автомат │ │ C10 (ТЭН)│ │ C6 (вент)│ │ C2 (БП) │ └────┬─────┘ └────┬─────┘ └─────┬────┘ │ │ │ ┌────▼─────┐ ┌────▼─────┐ ┌─────▼────┐ │ Предохр. │ │ 8-кан. │ │Mean Well │ │ 10A │ │ модуль │ │IRM-10-5 │ └────┬─────┘ │ реле │ │ 5V │ │ └────┬─────┘ └─────┬────┘ ┌────▼─────┐ │ │ │ SSR-25DA │ Нагрузки: │ │ (на │ - Вытяжка На ESP32, │ радиаторе│ - Приток 8-кан. модуль, └────┬─────┘ - Увлажнитель LCD (подсветка) │ - Заслонка ┌────▼─────┐ - Свет │ ТЭН │ │ (обогрев)│ └────┬─────┘ │ N (ноль) ──── обратно на WAGO N
🔋 Схема 7. Питание логики (5V и 3.3V)
Код:
 Mean Well IRM-10-5 ┌─────────────────┐ │ AC/L DC+ 5V ├──┬───────────────► ESP32 (пин 5V/VIN) │ AC/N DC- GND├──┼───────────────► ESP32 (GND) │ │ │ └─────────────────┘ ├───────────────► 8-кан. модуль реле (VCC) │ ├───────────────► LCD 2004 (подсветка LED/BL) │ └──[ионистор 1F 3V]──► ESP32 (пин 3.3V)
Ионистор: плюсом к 3.3V, минусом к GND.
Держит ESP32 живым 2–3 сек при пропадании сети,
чтобы он успел выключить реле.
📋 Итоговая таблица всех пинов (для перепроверки)


GPIOНазначениеКуда идёт
GPIO4Кнопка UPGND через кнопку
GPIO5Кнопка DOWNGND через кнопку
GPIO6Кнопка EDITGND через кнопку
GPIO7Кнопка BACKGND через кнопку
GPIO8I2C SDASCD41 + SHT35 + LCD
GPIO9I2C SCLSCD41 + SHT35 + LCD
GPIO10Сигнал SSRЧерез 1кОм на базу PN2222A
GPIO11Реле вытяжкиIN1 модуля реле
GPIO12Реле притокаIN2 модуля реле
GPIO13Реле увлажнителяIN3 модуля реле
GPIO14Реле заслонки «открыть»IN4 модуля реле
GPIO15Реле заслонки «закрыть»IN5 модуля реле
GPIO16Реле светаIN6 модуля реле
GPIO17РезервIN7 модуля реле
3.3VПитание датчиковSCD41, SHT35, ионистор
5V/VINПитание платыMean Well DC+
GNDОбщий минусВсё, включая реле и SSR-
⚠ Перед включением
  • □
    SSR-25DA на радиаторе.
  • □
    Варисторы параллельно контактам реле вентиляторов.
  • □
    Заземление корпуса и всех металлических частей.
  • □
    Подтяжка 3.3кОм на базе транзистора — обязательна.
  • □
    Автомат на каждый канал нагрузки.
  • □
    Ионистор плюсом к 3.3V.
Если хотите, могу перерисовать любую из схем в формате для Fritzing (текстовый .fzz-макет не передам, но могу дать точную раскладку по макетной плате) или подготовить чертёж корпуса с расположением компонентов. Скажите, что нужно.
 
Последнее редактирование:

Админ

Администратор
Регистрация
24.02.18
Сообщения
1.673
Реакции
444
Точная раскладка по макетной плате (breadboard + переход на плату)
Ниже — раскладка для стандартной макетной платы 830 точек (полуразмер, 2 шины питания по краям). Если у вас полноразмерная 1660 точек — всё то же самое, просто больше свободного места. Раскладка дана так, чтобы потом можно было перенести на паечную плату (перфоборд) без перерисовки.

Важно: ESP32-S3 DevKitC-1 имеет два ряда по 22 пина (шаг 2.54 мм), поэтому она вставляется через центральный разрыв макетки. Перед втыканием проверьте распиновку своей платы — у некоторых клонов порядок пинов отличается (особенно 3.3V/GND/5V).

Код:
1. Общая карта макетной платы (вид сверху)
text ШИНА + (5V) ───────────────────────────────────────────── ШИНА − (GND) ───────────────────────────────────────────── a b c d e f g h i j a b c d e f g h i j ┌─────────────────────┐ ┌─────────────────────┐ 1 │ . . . . . . . . . │ │ . . . . . . . . . │ 2 │ . . . . . . . . . │ │ . . . . . . . . . │ 3 │ . . . . . . . . . │ │ . . . . . . . . . │ 4 │ . . . . . . . . . │ │ . . . . . . . . . │ 5 │ . . . . . . . . . │ │ . . . . . . . . . │ 6 │ . . . . . . . . . │ │ . . . . . . . . . │ 7 │ . . . . . . . . . │ │ . . . . . . . . . │ 8 │ . . . . . . . . . │ │ . . . . . . . . . │ 9 │ . . . . . . . . . │ │ . . . . . . . . . │
10 │ . . . . . . . . . │ │ . . . . . . . . . │
11 │ . . . . . . . . . │ │ . . . . . . . . . │
12 │ . . . . . . . . . │ │ . . . . . . . . . │
13 │ . . . . . . . . . │ │ . . . . . . . . . │
14 │ . . . . . . . . . │ │ . . . . . . . . . │
15 │ . . . . . . . . . │ │ . . . . . . . . . │ └─────────────────────┘ └─────────────────────┘ ШИНА + (5V) ───────────────────────────────────────────── ШИНА − (GND) ─────────────────────────────────────────────
ESP32-S3 вставляется в центральный разрыв так, чтобы её левый ряд пинов попал в колонки e, а правый — в f. Нумерация рядов (1–15) — условная, отсчитывайте от верхнего края.
2. Раскладка ESP32-S3 (центральный разрыв)
Возьмём типовую распиновку DevKitC-1 (левый ряд — USB сверху). Сверьте с вашей платой!
text ЛЕВЫЙ РЯД (e) ПРАВЫЙ РЯД (f) ряд пин ряд пин 1 3.3V 1 5V (VIN) 2 EN 2 GND 3 GPIO4 → кнопка UP 3 GPIO43 (TX) 4 GPIO5 → кнопка DOWN 4 GPIO44 (RX) 5 GPIO6 → кнопка EDIT 5 GPIO1 6 GPIO7 → кнопка BACK 6 GPIO2 7 GPIO8 → I2C SDA 7 GPIO42 8 GPIO9 → I2C SCL 8 GPIO41 9 GPIO10 → SSR (через ключ) 9 GPIO40 10 GPIO11 → реле вытяжки 10 GPIO39 11 GPIO12 → реле притока 11 GPIO38 12 GPIO13 → реле увлажнителя 12 GPIO37 (PSRAM!) 13 GPIO14 → заслонка ОТКР 13 GPIO36 (PSRAM!) 14 GPIO15 → заслонка ЗАКР 14 GPIO35 (PSRAM!) 15 GPIO16 → реле света 15 GPIO0 (strapping)
⚠️ Не занимайте GPIO35–37 (на N16R8 это Octal PSRAM — плата не загрузится). GPIO0, 3, 45, 46 — strapping, тоже не трогаем.
3. Шина I2C: SCD41, SHT35, LCD (все параллельно)
Все три устройства висят на GPIO8 (SDA) и GPIO9 (SCL). На макетке удобно развести «гребёнкой» справа от ESP32.
text ESP32 SCD41 SHT35 LCD 2004 e7 GPIO8 (SDA) ──┬── SDA ──────── SDA ─────────── SDA │ e8 GPIO9 (SCL) ──┼── SCL ──────── SCL ─────────── SCL │ e1 3.3V ─────────┼── VCC ──────── VCC ─────────── VCC (логика) │ f2 GND ──────────┴── GND ──────── GND ─────────── GND Подсветка LCD (пин LED/BL) ──► ШИНА + (5V), НЕ 3.3V! (иначе стабилизатор ESP32 перегреется)
Практическая раскладка на макетке:
SCD41 ставим в колонки a–e, ряды 1–4 (правый блок).
SHT35 — в колонки a–e, ряды 6–9.
LCD подключаем проводами (DuPont «мама-папа»), а не втыкаем в макетку — он тяжёлый и вырвет контакты.
Линии SDA/SCL ведём витой парой (два скрученных провода), если длина >10 см — иначе помехи от реле.
4. Кнопки (4 шт.)
Каждая кнопка — между GPIO и GND. Внутренняя подтяжка в коде (INPUT_PULLUP), внешние резисторы не нужны.
text ESP32 Кнопка (4 ножки) e3 GPIO4 ────┬── ножка 1 ┐ │ ├─ (замыкаются при нажатии) ШИНА − GND ───┴── ножка 2 ┘ e4 GPIO5 ────┬── ножка 1 ┐ ШИНА − GND ───┴── ножка 2 ┘ e5 GPIO6 ────┬── ножка 1 ┐ ШИНА − GND ───┴── ножка 2 ┘ e6 GPIO7 ────┬── ножка 1 ┐ ШИНА − GND ───┴── ножка 2 ┘
Раскладка: кнопки ставим в левый блок макетки, ряды 1–4, колонки a–d (каждая кнопка занимает 2 колонки). Ножки 1 и 2 — это диагональные пары у тактовой кнопки 12×12 (проверьте мультиметром: при нажатии должно быть ~0 Ом).
5. Транзисторный ключ для SSR-25DA (GPIO10)
Это самый ответственный узел. Собираем на отдельном участке макетки, подальше от I2C-линий.
text 3.3V (e1) ──────┐ │ [3.3 кОм] ← подтяжка базы │ GPIO10 (e9) ──[1 кОм]──┐ │ ┌──┴──┐ │ B │ ┌────┤PN2222A├────┐ │ │ E │ C │ │ └──┬──┘──┬──┘ │ │ │ GND ───────┘ │ │ ┌────────┴────────┐ │ SSR-25DA │ │ DC+ ← коллектор│ │ DC− ← GND │ └─────────────────┘
Раскладка на макетке (правый блок, ряды 10–14):
Резистор 1 кОм: между e9 (GPIO10) и a11.
Резистор 3.3 кОм: между e1 (3.3V) и a11 (та же точка — база).
PN2222A: база (средняя ножка) → a11; эмиттер (со стрелкой) → a12 → шина GND; коллектор → a13.
Провод от a13 → клемма DC+ SSR-25DA.
Провод от шины GND → клемма DC− SSR-25DA.
⚠️ SSR-25DA НЕ втыкается в макетку — он силовой, подключается проводами 1.5 мм² и обязательно на радиатор.
6. 8-канальный модуль реле
Модуль тоже не втыкается в макетку (тяжёлый, 220В рядом). Подключаем проводами DuPont:
text ESP32 Модуль реле (входы) e10 GPIO11 ──────── IN1 (вытяжка) e11 GPIO12 ──────── IN2 (приток) e12 GPIO13 ──────── IN3 (увлажнитель) e13 GPIO14 ──────── IN4 (заслонка ОТКР) e14 GPIO15 ──────── IN5 (заслонка ЗАКР) e15 GPIO16 ──────── IN6 (свет) — GPIO17 ──────── IN7 (резерв) [свободный пин, если есть] ШИНА − GND ───────── GND ШИНА + 5V ───────── VCC ← от Mean Well, НЕ от ESP32!
⚠️ Критично: питание VCC модуля реле — отдельный провод от блока Mean Well 5V, не от пина 5V ESP32. Иначе при срабатывании нескольких реле просядет питание платы.
7. Питание (Mean Well IRM-10-5)
text Mean Well IRM-10-5 ┌──────────────────┐ │ AC/L ← 220В L │ │ AC/N ← 220В N │ │ DC+ 5V ──┬───────┼──► ШИНА + (5V) макетки │ DC− GND ─┼───────┼──► ШИНА − (GND) макетки └──────────┘ │ └──► ESP32 f1 (5V/VIN)
На макетке: красный провод от DC+ → шина «+»; чёрный от DC− → шина «−». ESP32 питается от этих же шин (пин 5V → шина +, GND → шина −).
Ионистор 1F 3V: плюсом к шине 3.3V (не 5V!), минусом к GND. На макетке — между e1 и f2 (рядом с ESP32). Полярность! Длинная ножка — плюс.
8. Итоговая карта рядов (шпаргалка)
Ряд Левый блок (a–e) Правый блок (f–j)
1 Кнопка UP (ножка 1) ESP32 5V → шина +
2 Кнопка UP (ножка 2) → GND ESP32 GND → шина −
3 Кнопка DOWN SCD41 (ряды 1–4)
4 Кнопка DOWN → GND SCD41
5 Кнопка EDIT SCD41
6 Кнопка EDIT → GND SHT35 (ряды 6–9)
7 Кнопка BACK SHT35
8 Кнопка BACK → GND SHT35
9 GPIO10 → резистор 1к —
10 Резистор 3.3к → 3.3V —
11 База PN2222A —
12 Эмиттер → GND —
13 Коллектор → SSR DC+ —
14 — —
15 — —
9. Переход на паечную плату (перфоборд)
Когда макетка заработает — переносите один в один:
Резать дорожки не нужно — используйте перфоборд с металлизацией (двусторонний).
Порядок пайки: сначала низкопрофильные (резисторы, диоды), потом транзистор, потом ESP32 в панельку (не паяйте плату напрямую — сгорит один раз, менять неудобно).
I2C-линии — витой парой, экран на GND.
Силовую часть (SSR, реле) — на отдельной плате, соединённой с логикой только проводами управления. Не размещайте 220В и I2C на одном перфоборде.
Ионистор — держателем, а не пайкой (со временем деградирует).
⚠️ Чек-лист перед первым включением
□ Мультиметром: между шиной +5V и GND нет короткого (сопротивление >1 кОм).
□ ESP32 вставлена правильно (не смещена на один пин).
□ Подтяжка 3.3 кОм на базе PN2222A стоит (иначе SSR может самопроизвольно включаться).
□ Подсветка LCD на 5V, логика на 3.3V.
□ Ионистор полярностью правильно.
□ SSR и реле не на макетке, а на проводах.
□ 220В пока не подключено — сначала прошейте и проверьте показания датчиков в Serial Monitor.
Если после сборки дисплей молчит — крутите потенциометр контраста на I2C-модуле и проверьте адрес (0x27/0x3F). Если SCD41 не виден на шине — проверьте, что VCC именно 3.3V, а не 5V (SCD41 толерантен к 5V на некоторых breakout, но не на всех).
 
Сверху Снизу