Smart Relay Design Requirements
Table
| Function | GPIO |
|---|---|
| USB D- | GPIO19 |
| USB D+ | GPIO20 |
| CAN TX | GPIO17 |
| CAN RX | GPIO18 |
| DI1..DI4 | GPIO4, GPIO5, GPIO6, GPIO7 |
| DO1..DO4 relay drivers | GPIO8, GPIO9, GPIO10, GPIO11 |
| ADC SPI SCLK/MOSI/CS/MISO | GPIO12, GPIO13, GPIO14, GPIO15 |
Ini
[env:esp32-s3-devkitc-1] platform = espressif32 board = esp32-s3-devkitc-1 framework = arduino monitor_speed = 115200 build_flags = -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1
Cpp
#include <Arduino.h> #include <SPI.h> #define PIN_DI1 4 #define PIN_DI2 5 #define PIN_DI3 6 #define PIN_DI4 7 #define PIN_DO1 8 #define PIN_DO2 9 #define PIN_DO3 10 #define PIN_DO4 11 #define PIN_AI_SCLK 12 #define PIN_AI_MOSI 13 #define PIN_AI_CS 14 #define PIN_AI_MISO 15 #define PIN_CAN_TX 17 #define PIN_CAN_RX 18 SPIClass aiSpi(FSPI); static uint16_t readAd7329Raw(uint8_t channel) { uint16_t command = 0x8000 | ((channel & 0x07) << 10); digitalWrite(PIN_AI_CS, LOW); uint16_t result = aiSpi.transfer16(command); digitalWrite(PIN_AI_CS, HIGH); return result & 0x0FFF; } static void setRelay(uint8_t index, bool on) { const uint8_t pins[] = {PIN_DO1, PIN_DO2, PIN_DO3, PIN_DO4}; if (index < 4) digitalWrite(pins[index], on ? HIGH : LOW); } void setup() { Serial.begin(115200); delay(500); Serial.println("ESP32-S3 Smart Relay starting"); pinMode(PIN_DI1, INPUT); pinMode(PIN_DI2, INPUT); pinMode(PIN_DI3, INPUT); pinMode(PIN_DI4, INPUT); pinMode(PIN_DO1, OUTPUT); pinMode(PIN_DO2, OUTPUT); pinMode(PIN_DO3, OUTPUT); pinMode(PIN_DO4, OUTPUT); setRelay(0, false); setRelay(1, false); setRelay(2, false); setRelay(3, false); pinMode(PIN_AI_CS, OUTPUT); digitalWrite(PIN_AI_CS, HIGH); aiSpi.begin(PIN_AI_SCLK, PIN_AI_MISO, PIN_AI_MOSI, PIN_AI_CS); } void loop() { bool di[4] = {digitalRead(PIN_DI1), digitalRead(PIN_DI2), digitalRead(PIN_DI3), digitalRead(PIN_DI4)}; for (int i = 0; i < 4; ++i) setRelay(i, di[i]); uint16_t ai0 = readAd7329Raw(0); uint16_t ai1 = readAd7329Raw(1); uint16_t ai2 = readAd7329Raw(2); uint16_t ai3 = readAd7329Raw(3); Serial.printf("DI=%d%d%d%d AI=%u,%u,%u,%u\n", di[0], di[1], di[2], di[3], ai0, ai1, ai2, ai3); delay(100); }
Platform
Pin Mapping
platformio.ini
src/main.cpp
Notes