ESP32 电池切换控制
3V3 rail.Cpp
#include <Arduino.h> #include <Wire.h> #define PIN_I2C_SDA 1 #define PIN_I2C_SCL 2 #define PIN_SR_SER 4 #define PIN_SR_CLK 5 #define PIN_SR_LATCH 6 #define PIN_SR_OE_N 7 #define PIN_MUX_S0 8 #define PIN_MUX_S1 9 #define PIN_MUX_S2 10 #define PIN_MUX_EN_N 11 static bool oneHotOrZero(uint8_t m) { return m == 0 || (m & (m - 1)) == 0; } static void latch(uint8_t m) { shiftOut(PIN_SR_SER, PIN_SR_CLK, MSBFIRST, m); digitalWrite(PIN_SR_LATCH, HIGH); digitalWrite(PIN_SR_LATCH, LOW); } static void safeInit() { pinMode(PIN_SR_OE_N, OUTPUT); digitalWrite(PIN_SR_OE_N, HIGH); pinMode(PIN_SR_SER, OUTPUT); digitalWrite(PIN_SR_SER, LOW); pinMode(PIN_SR_CLK, OUTPUT); digitalWrite(PIN_SR_CLK, LOW); pinMode(PIN_SR_LATCH, OUTPUT); digitalWrite(PIN_SR_LATCH, LOW); pinMode(PIN_MUX_EN_N, OUTPUT); digitalWrite(PIN_MUX_EN_N, HIGH); pinMode(PIN_MUX_S0, OUTPUT); pinMode(PIN_MUX_S1, OUTPUT); pinMode(PIN_MUX_S2, OUTPUT); digitalWrite(PIN_MUX_S0, LOW); digitalWrite(PIN_MUX_S1, LOW); digitalWrite(PIN_MUX_S2, LOW); latch(0x00); Wire.begin(PIN_I2C_SDA, PIN_I2C_SCL); } static bool writeRelayMask(uint8_t mask, bool safetyOK) { if (!safetyOK || !oneHotOrZero(mask) || (mask & 0xC0)) return false; digitalWrite(PIN_SR_OE_N, HIGH); latch(0x00); delay(250); // verify/tune against relay release time latch(mask); digitalWrite(PIN_SR_OE_N, LOW); return true; } void setup() { safeInit(); } void loop() { delay(1000); }
Fixed Super Mini orientation and GPIO map
Compileable Arduino starter
Build