#pragma XOD require "SPI.h"
#pragma XOD require "Adafruit_MCP23X17.h"
// Paramètres inspecteur pour SPI / MCP
input_number CS; // Chip Select SPI
input_number A0; // Adressage matériel MCP
input_number A1;
input_number A2;
input_number SCI; // Clock SPI (optionnel)
input_number SI; // MOSI
input_number SO; // MISO (si nécessaire)
// Commandes relais (16 sorties)
input_bool RELAY0;
input_bool RELAY1;
input_bool RELAY2;
input_bool RELAY3;
input_bool RELAY4;
input_bool RELAY5;
input_bool RELAY6;
input_bool RELAY7;
input_bool RELAY8;
input_bool RELAY9;
input_bool RELAY10;
input_bool RELAY11;
input_bool RELAY12;
input_bool RELAY13;
input_bool RELAY14;
input_bool RELAY15;
// Documentation interne
#pragma XOD doc "Node unique pour piloter 16 relais via MCP23S17 SPI"
#pragma XOD doc "Paramètres SPI et adresse matérielle configurables dans l’inspecteur"
#pragma XOD doc "Chaque RELAYx est une entrée booléenne qui pilote la sortie correspondante"
// MCP object singleton
static Adafruit_MCP23X17 mcp;
static bool init_done = false;
node {
void evaluate(Context ctx) {
if (!init_done) {
SPI.begin(); // Initialisation SPI globale
// Calcul offset adresse
uint8_t addrOffset = (getValue<input_number>(ctx, A0) & 1)
| ((getValue<input_number>(ctx, A1) & 1) << 1)
| ((getValue<input_number>(ctx, A2) & 1) << 2);
// Initialisation MCP23S17 SPI
uint8_t cs = getValue<input_number>(ctx, CS);
if (!mcp.begin_SPI(cs + addrOffset)) {
// Gestion erreur : ici on pourrait renvoyer un warning
}
// Configure toutes les sorties en OUTPUT
for (int i = 0; i < 16; i++) {
mcp.pinMode(i, OUTPUT);
}
init_done = true;
}
// Écriture des relais
mcp.digitalWrite(0, getValue<input_bool>(ctx, RELAY0));
mcp.digitalWrite(1, getValue<input_bool>(ctx, RELAY1));
mcp.digitalWrite(2, getValue<input_bool>(ctx, RELAY2));
mcp.digitalWrite(3, getValue<input_bool>(ctx, RELAY3));
mcp.digitalWrite(4, getValue<input_bool>(ctx, RELAY4));
mcp.digitalWrite(5, getValue<input_bool>(ctx, RELAY5));
mcp.digitalWrite(6, getValue<input_bool>(ctx, RELAY6));
mcp.digitalWrite(7, getValue<input_bool>(ctx, RELAY7));
mcp.digitalWrite(8, getValue<input_bool>(ctx, RELAY8));
mcp.digitalWrite(9, getValue<input_bool>(ctx, RELAY9));
mcp.digitalWrite(10, getValue<input_bool>(ctx, RELAY10));
mcp.digitalWrite(11, getValue<input_bool>(ctx, RELAY11));
mcp.digitalWrite(12, getValue<input_bool>(ctx, RELAY12));
mcp.digitalWrite(13, getValue<input_bool>(ctx, RELAY13));
mcp.digitalWrite(14, getValue<input_bool>(ctx, RELAY14));
mcp.digitalWrite(15, getValue<input_bool>(ctx, RELAY15));
}
}