Relay Board Schematic Design
Schematic blocks to create 1. AC mains inputText
Control board harness 10x coil drive signals │ ▼ Relay coil interface / flyback protection │ ▼ 10x 24 VDC relay coils AC mains input L / N / PE │ ▼ Main protection ~50 A │ ▼ AC live bus │ ├── CH1 fuse 15 A ─ relay contact ─ output terminal CH1 ├── CH2 fuse 15 A ─ relay contact ─ output terminal CH2 ├── ... └── CH10 fuse 15 A ─ relay contact ─ output terminal CH10 Neutral and protective earth distributed to all output terminals
AC_L_INAC_N_INPE_IN3. Ten relay output channelsText
AC_L_IN → MAIN_FUSE_OR_BREAKER → AC_L_PROTECTED AC_N_IN → AC_N_BUS PE_IN → PE_BUS
HR85AKS-DC24 relayText
AC_L_PROTECTED → CHx_FUSE_15A → relay COM relay NO → CHx_L_OUT AC_N_BUS → CHx_N_OUT PE_BUS → CHx_PE_OUT
Text
+24V_COIL_IN 0V_COIL_IN
Text
+24V_COIL → one side of all relay coils coil low side → harness drive signal / transistor driver return path
COIL_DRV_1COIL_DRV_2COIL_DRV_100V_COIL+24V_COIL if coil power is also delivered through the harnessCOM clamp connection to +24V.ESP32-DEVKITM-1Table
| Function | ESP32 GPIO | Net |
|---|---|---|
| 74HC595 DATA | 23 | SR595_DATA |
| 74HC595 SHIFT CLK | 18 | SR595_CLK |
| 74HC595 LATCH | 5 | SR595_LATCH |
| 74HC165 DATA | 19 | SR165_DATA |
| 74HC165 CLK | 22 | SR165_CLK |
| 74HC165 LOAD | 21 | SR165_LOAD |
| OLED SDA | 26 | I2C_SDA |
| OLED SCL | 27 | I2C_SCL |
| Isolated PT voltage sense ADC | 36 | MAINS_VSENSE_ADC |
0 means the readback switch/button is active/pressed; a logic 1 means inactive/released.Table
| Bit name | Net | 74HC165 input |
|---|---|---|
| CH1_READBACK_N | CH1_READBACK_N | U6 D0 |
| CH2_READBACK_N | CH2_READBACK_N | U6 D1 |
| CH3_READBACK_N | CH3_READBACK_N | U6 D2 |
| CH4_READBACK_N | CH4_READBACK_N | U6 D3 |
| CH5_READBACK_N | CH5_READBACK_N | U6 D4 |
| CH6_READBACK_N | CH6_READBACK_N | U6 D5 |
| CH7_READBACK_N | CH7_READBACK_N | U6 D6 |
| CH8_READBACK_N | CH8_READBACK_N | U6 D7 |
| CH9_READBACK_N | CH9_READBACK_N | U7 D0 |
| CH10_READBACK_N | CH10_READBACK_N | U7 D1 |
| BTN_MENU_N | BTN_MENU_N | U7 D2 |
| BTN_UP_N | BTN_UP_N | U7 D3 |
| BTN_DOWN_N | BTN_DOWN_N | U7 D4 |
| BTN_ENTER_N | BTN_ENTER_N | U7 D5 |
platformio.iniIni
[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino monitor_speed = 115200 lib_deps = adafruit/Adafruit SSD1306@^2.5.13 adafruit/Adafruit GFX Library@^1.11.11
src/main.cppCpp
#include <Arduino.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> constexpr int PIN_595_DATA = 23; constexpr int PIN_595_CLK = 18; constexpr int PIN_595_LATCH = 5; constexpr int PIN_165_DATA = 19; constexpr int PIN_165_CLK = 22; constexpr int PIN_165_LOAD = 21; constexpr int PIN_I2C_SDA = 26; constexpr int PIN_I2C_SCL = 27; constexpr int PIN_MAINS_ADC = 36; constexpr uint8_t OLED_ADDR = 0x3C; constexpr int OLED_WIDTH = 128; constexpr int OLED_HEIGHT = 64; Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, -1); uint16_t channelBits = 0; void writeOutputs(uint16_t bits) { digitalWrite(PIN_595_LATCH, LOW); shiftOut(PIN_595_DATA, PIN_595_CLK, MSBFIRST, highByte(bits)); shiftOut(PIN_595_DATA, PIN_595_CLK, MSBFIRST, lowByte(bits)); digitalWrite(PIN_595_LATCH, HIGH); } uint16_t readInputs() { uint16_t value = 0; digitalWrite(PIN_165_LOAD, LOW); delayMicroseconds(5); digitalWrite(PIN_165_LOAD, HIGH); for (int i = 0; i < 16; i++) { value <<= 1; value |= digitalRead(PIN_165_DATA) ? 1 : 0; digitalWrite(PIN_165_CLK, HIGH); delayMicroseconds(2); digitalWrite(PIN_165_CLK, LOW); delayMicroseconds(2); } return value; } void updateDisplay(uint16_t outputs, uint16_t inputs) { display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("10CH Sequencer LV"); display.print("OUT: 0x"); display.println(outputs, HEX); display.print("IN : 0x"); display.println(inputs, HEX); display.println("Inputs active LOW"); display.display(); } void setup() { Serial.begin(115200); pinMode(PIN_595_DATA, OUTPUT); pinMode(PIN_595_CLK, OUTPUT); pinMode(PIN_595_LATCH, OUTPUT); digitalWrite(PIN_595_CLK, LOW); digitalWrite(PIN_595_LATCH, LOW); writeOutputs(0x0000); pinMode(PIN_165_DATA, INPUT); pinMode(PIN_165_CLK, OUTPUT); pinMode(PIN_165_LOAD, OUTPUT); digitalWrite(PIN_165_CLK, LOW); digitalWrite(PIN_165_LOAD, HIGH); pinMode(PIN_MAINS_ADC, INPUT); Wire.begin(PIN_I2C_SDA, PIN_I2C_SCL); if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { Serial.println("OLED init failed"); } else { display.clearDisplay(); display.display(); } Serial.println("Low-voltage control firmware started"); } void loop() { static uint32_t lastStep = 0; static uint8_t activeChannel = 0; uint32_t now = millis(); if (now - lastStep >= 500) { lastStep = now; channelBits = (1u << activeChannel); writeOutputs(channelBits); activeChannel = (activeChannel + 1) % 10; } uint16_t inputs = readInputs(); int mainsAdcRaw = analogRead(PIN_MAINS_ADC); updateDisplay(channelBits, inputs); Serial.printf("OUT=0x%04X IN=0x%04X MAINS_ADC=%d\n", channelBits, inputs, mainsAdcRaw); delay(200); }
MAINS_ADC is a raw reading from an isolated PT secondary front end. Convert it to RMS mains voltage only after calibrating against the actual PT ratio and a known safe reference voltage.Bash
pio run pio run -t upload pio device monitor
Platform & Toolchain
Pin Mapping
74HC165 Input Map
`platformio.ini`
`src/main.cpp`
Build and flash