my-custom-code

bmatras/my-lib/my-custom-code

No description
my-custom-code
@/my-custom-code
RELAY0boolean
csnumber
RELAY1boolean
A0boolean
RELAY2boolean
A1boolean
RELAY3boolean
A2boolean
RELAY4boolean
RELAY5boolean
RELAY6boolean
RELAY7boolean
RELAY8boolean
RELAY9boolean
RELAY10boolean
RELAY11boolean
RELAY12boolean
RELAY13boolean
RELAY14boolean
RELAY15boolean
my-custom-code
RELAY0
cs
RELAY1
A0
RELAY2
A1
RELAY3
A2
RELAY4
RELAY5
RELAY6
RELAY7
RELAY8
RELAY9
RELAY10
RELAY11
RELAY12
RELAY13
RELAY14
RELAY15
To use the node in your project you should have the bmatras/my-lib library installed. Use the “File → Add Library” menu item in XOD IDE if you don’t have it yet. See Using libraries for more info.

C++ implementation

#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));
    }
}