Gestionnaire Multi-Source Énergétique
Table
| Function | GPIO | Net | Direction |
|---|---|---|---|
| Eneo 1 present | 34 | SRC_E1_PRESENT | Input |
| Eneo 2 present | 35 | SRC_E2_PRESENT | Input |
| PV present | 32 | SRC_PV_PRESENT | Input |
| Mode OFF | 13 | MODE_OFF | Input |
| Mode AUTO | 14 | MODE_AUTO | Input |
| Mode force Eneo 1 | 25 | MODE_FORCE_E1 | Input |
| Mode force Eneo 2 | 26 | MODE_FORCE_E2 | Input |
| Mode force PV | 27 | MODE_FORCE_PV | Input |
| Contactor Eneo 1 | 16 | CMD_K1_E1 | Output |
| Contactor Eneo 2 | 17 | CMD_K2_E2 | Output |
| Contactor PV | 18 | CMD_K3_PV | Output |
| Siren | 19 | CMD_SIREN | Output |
| LED E1 presence | 21 | LED_E1_PRESENT | Output |
| LED E2 presence | 22 | LED_E2_PRESENT | Output |
| LED PV presence | 23 | LED_PV_PRESENT | Output |
| LED K1 active | 4 | LED_K1_ACTIVE | Output |
| LED K2 active | 5 | LED_K2_ACTIVE | Output |
| LED K3 active | 2 | LED_K3_ACTIVE | Output |
| General fault LED | 33 | LED_FAULT_GENERAL | Output |
| E1 fault LED | 1/TX0 | LED_FAULT_E1 | Output |
| E2 fault LED | 3/RX0 | LED_FAULT_E2 | Output |
| PV fault LED | 36/VP | LED_FAULT_PV | Output |
Ini
[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino monitor_speed = 115200
Cpp
#include <Arduino.h> #include <WiFi.h> #define PIN_E1_PRESENT 34 #define PIN_E2_PRESENT 35 #define PIN_PV_PRESENT 32 #define PIN_MODE_OFF 13 #define PIN_MODE_AUTO 14 #define PIN_MODE_E1 25 #define PIN_MODE_E2 26 #define PIN_MODE_PV 27 #define PIN_K1_E1 16 #define PIN_K2_E2 17 #define PIN_K3_PV 18 #define PIN_SIREN 19 #define LED_E1_PRESENT 21 #define LED_E2_PRESENT 22 #define LED_PV_PRESENT 23 #define LED_K1_ACTIVE 4 #define LED_K2_ACTIVE 5 #define LED_K3_ACTIVE 2 #define LED_FAULT_GEN 33 #define LED_FAULT_E1 1 #define LED_FAULT_E2 3 #define LED_FAULT_PV 36 const uint32_t TRANSFER_DEADTIME_MS = 500; enum Source { SRC_NONE, SRC_E1, SRC_E2, SRC_PV }; enum Mode { MODE_INVALID, MODE_OFF, MODE_AUTO, MODE_E1, MODE_E2, MODE_PV }; Source activeSource = SRC_NONE; uint32_t lastTransferMs = 0; bool inputActiveLow(uint8_t pin) { return digitalRead(pin) == LOW; } Mode readMode() { int count = 0; Mode mode = MODE_INVALID; if (inputActiveLow(PIN_MODE_OFF)) { mode = MODE_OFF; count++; } if (inputActiveLow(PIN_MODE_AUTO)) { mode = MODE_AUTO; count++; } if (inputActiveLow(PIN_MODE_E1)) { mode = MODE_E1; count++; } if (inputActiveLow(PIN_MODE_E2)) { mode = MODE_E2; count++; } if (inputActiveLow(PIN_MODE_PV)) { mode = MODE_PV; count++; } return count == 1 ? mode : MODE_INVALID; } void allContactorsOff() { digitalWrite(PIN_K1_E1, LOW); digitalWrite(PIN_K2_E2, LOW); digitalWrite(PIN_K3_PV, LOW); activeSource = SRC_NONE; } void selectSource(Source src) { if (src == activeSource) return; allContactorsOff(); delay(TRANSFER_DEADTIME_MS); if (src == SRC_E1) digitalWrite(PIN_K1_E1, HIGH); if (src == SRC_E2) digitalWrite(PIN_K2_E2, HIGH); if (src == SRC_PV) digitalWrite(PIN_K3_PV, HIGH); activeSource = src; lastTransferMs = millis(); } void setupPins() { pinMode(PIN_E1_PRESENT, INPUT); pinMode(PIN_E2_PRESENT, INPUT); pinMode(PIN_PV_PRESENT, INPUT); pinMode(PIN_MODE_OFF, INPUT); pinMode(PIN_MODE_AUTO, INPUT); pinMode(PIN_MODE_E1, INPUT); pinMode(PIN_MODE_E2, INPUT); pinMode(PIN_MODE_PV, INPUT); const uint8_t outputs[] = {PIN_K1_E1, PIN_K2_E2, PIN_K3_PV, PIN_SIREN, LED_E1_PRESENT, LED_E2_PRESENT, LED_PV_PRESENT, LED_K1_ACTIVE, LED_K2_ACTIVE, LED_K3_ACTIVE, LED_FAULT_GEN, LED_FAULT_E1, LED_FAULT_E2, LED_FAULT_PV}; for (uint8_t p : outputs) { pinMode(p, OUTPUT); digitalWrite(p, LOW); } } void setup() { Serial.begin(115200); setupPins(); allContactorsOff(); WiFi.mode(WIFI_OFF); Serial.println("Gestionnaire multi-source ESP32 demarre"); } void loop() { bool e1 = inputActiveLow(PIN_E1_PRESENT); bool e2 = inputActiveLow(PIN_E2_PRESENT); bool pv = inputActiveLow(PIN_PV_PRESENT); Mode mode = readMode(); digitalWrite(LED_E1_PRESENT, e1); digitalWrite(LED_E2_PRESENT, e2); digitalWrite(LED_PV_PRESENT, pv); Source requested = SRC_NONE; bool fault = false; bool faultE1 = false, faultE2 = false, faultPV = false; if (mode == MODE_INVALID) fault = true; else if (mode == MODE_OFF) requested = SRC_NONE; else if (mode == MODE_AUTO) { if (pv) requested = SRC_PV; else if (e1) requested = SRC_E1; else if (e2) requested = SRC_E2; else fault = true; } else if (mode == MODE_E1) { requested = e1 ? SRC_E1 : SRC_NONE; faultE1 = !e1; } else if (mode == MODE_E2) { requested = e2 ? SRC_E2 : SRC_NONE; faultE2 = !e2; } else if (mode == MODE_PV) { requested = pv ? SRC_PV : SRC_NONE; faultPV = !pv; } fault = fault || faultE1 || faultE2 || faultPV; if (fault) allContactorsOff(); else selectSource(requested); digitalWrite(LED_K1_ACTIVE, activeSource == SRC_E1); digitalWrite(LED_K2_ACTIVE, activeSource == SRC_E2); digitalWrite(LED_K3_ACTIVE, activeSource == SRC_PV); digitalWrite(LED_FAULT_GEN, fault); digitalWrite(LED_FAULT_E1, faultE1); digitalWrite(LED_FAULT_E2, faultE2); digitalWrite(LED_FAULT_PV, faultPV); digitalWrite(PIN_SIREN, fault); delay(50); }
Bash
pio run pio run -t upload pio device monitor
Welcome 👋
Flux helps you build PCBs faster with an AI teammate!
Create your account to collaborate, stay updated, fork your own version, and get instant answers from our AI agent.