Gestionnaire Multi-Source Énergétique

J’ai ajouté les fichiers projet pour le firmware, la sécurité et le bring-up : Firmware Starter, Safety Analysis, Board Bring-Up Plan. La vérification ERC ciblée ne signale plus d’erreurs ou avertissements ouverts sur les contrôles lancés.
Schéma initial réalisé pour le gestionnaire multi-source : ESP32, alimentation isolée, détection présence Eneo 1/Eneo 2/PV, sélecteur 5 positions, commandes contacteurs, voyants de présence/source active/défaut et sirène. J’ai aussi créé les fichiers projet : spécification, firmware, sécurité et bring-up.
Points ouverts :
  • Confirmer la puissance/kVA de la charge.
  • Confirmer si le PV est bien une sortie AC 230 V via onduleur.
  • Confirmer tension/courant des bobines contacteurs et de la sirène.
  • Ajouter idéalement des retours auxiliaires de contacteurs pour savoir quelle source est réellement en charge.
Prochaines étapes suggérées :
  1. Ajouter les retours auxiliaires K1/K2/K3 vers l’ESP32.
  2. Dimensionner protections, contacteurs et alimentation auxiliaire selon la puissance réelle.
  3. Passer ensuite à l’implantation PCB avec séparation stricte secteur/basse tension.
Add contactor feedback
Set power specs
Confirm PV AC
Choose coil voltage
Run full review

Refine this doc
Ask about this doc
Firmware Starter — ESP32-WROOM-32D
Platform & Toolchain
  • MCU: ESP32-WROOM-32D
  • Framework: Arduino via PlatformIO
  • Debug: USB/UART adapter on ESP32 UART0 if broken out externally
Pin Mapping

Table


FunctionGPIONetDirection
Eneo 1 present34SRC_E1_PRESENTInput
Eneo 2 present35SRC_E2_PRESENTInput
PV present32SRC_PV_PRESENTInput
Mode OFF13MODE_OFFInput
Mode AUTO14MODE_AUTOInput
Mode force Eneo 125MODE_FORCE_E1Input
Mode force Eneo 226MODE_FORCE_E2Input
Mode force PV27MODE_FORCE_PVInput
Contactor Eneo 116CMD_K1_E1Output
Contactor Eneo 217CMD_K2_E2Output
Contactor PV18CMD_K3_PVOutput
Siren19CMD_SIRENOutput
LED E1 presence21LED_E1_PRESENTOutput
LED E2 presence22LED_E2_PRESENTOutput
LED PV presence23LED_PV_PRESENTOutput
LED K1 active4LED_K1_ACTIVEOutput
LED K2 active5LED_K2_ACTIVEOutput
LED K3 active2LED_K3_ACTIVEOutput
General fault LED33LED_FAULT_GENERALOutput
E1 fault LED1/TX0LED_FAULT_E1Output
E2 fault LED3/RX0LED_FAULT_E2Output
PV fault LED36/VPLED_FAULT_PVOutput
platformio.ini

Ini


[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
Complete Firmware Source

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);
}
Build & Flash

Bash


pio run
pio run -t upload
pio device monitor
Notes
  • Les entrées de présence et mode sont câblées avec pull-up : actif à LOW.
  • Le firmware impose un temps mort avant fermeture d'un autre contacteur.
  • Ajouter un interverrouillage matériel des contacteurs : le firmware seul n'est pas une protection suffisante.

    Platform & Toolchain

    Pin Mapping

    platformio.ini

    Complete Firmware Source

    Build & Flash

    Notes

Documents

    Firmware Starter — ESP32-WROOM-32D

    Project Specification — Gestionnaire Multi-Source Énergétique

    Board Bring-Up Plan — Gestionnaire Multi-Source Énergétique

    Safety Analysis — Gestionnaire Multi-Source Énergétique

Assets

No assets added.

Gestionnaire Multi-Source Énergétique 528f

Gestionnaire Multi-Source Énergétique 528f thumbnail
Gestionnaire multi-source monophasé ESP32 avec sélection 5 positions, voyants et sirène

Properties

Rotary Switch

Mains

Power Management

WiFi

230

VAC

Pricing & Availability

Distributor

Qty 1

Arrow

$6.09–$8.18

Digi-Key

$1.20–$1.24

HQonline

$2.64–$2.88

LCSC

$10.72–$10.97

Mouser

$8.53

TME

$10.78

Verical

$0.68–$2.69

Controls