DCCpp - Cargar desvios al inicio


Dependiendo del sistema que estemos usando, muchas veces necesitaremos tener definidos los desvíos que tenemos la maqueta. Dependiendo de su número esto puede ser una tarea bastante tediosa.

Dccpp, en cualquiera de sus versiones, nos permite definir estos desvíos desde el void Setup(). Según nos indica la documentación en el archivo Turnout.h.

Primero tenemos que definir el objeto Turnout antes del void Setup() de la siguiente manera:

Turnout T1;


Ya tenemos un desvío, ahora tenemos que inicializar el objeto T1 con la función begin. Esta función tiene 3 atributos, ID, Direccion y Subdirección. Ahora nos situamos dentro del void Setup() y después de DCCpp::begin(); escribimos la linea:

T1.begin(1, 15, 2);


Y con esto se nos iniciará un desvío con la ID: 1, Dirección: 15 y Subdireccion: 2. Con esta acción ya podemos utilizar el comando:

<T1 1> con respuesta <H1 1>
o
<T1 0> con respuesta <H1 0>


Una vez que sabemos como inicializar un desvió, haremos lo mismo pero para un número x de desvíos.

He probado diferentes manera de iniciar el objeto con un bucle for, pero no he podido o, más probablemente, no se como hacerlo. Así que nos queda la manera manual. Pongamos que tenemos 10 desvíos en nuestra maqueta. Primero crearíamos los 10 objetos:

Turnout T1, T2, T3, T4, T5, T5, T6, T7, T8, T9, T10;


En este punto podemos tomar dos opciones la primera es repetir todo el proceso Tx.begin(); con cada uno de las direcciones o crear un array con los datos de los desvíos que queremos tener definidos, con los 3 datos necesarios, ID, dirección, subdirección. En este paso podríamos añadir también un cuarto dato como el estado del desvío, pero para este caso solo vamos a usar los imprescindibles. Este es un ejemplo para 10 desvíos:

int storedata[N_DESVIOS + 1][3]{ {0, 0, 0},
                        {1, 1, 1}, {2, 1, 2}, {3, 1, 3}, {4, 1, 4},
                        {5, 2, 1}, {6, 2, 2}, {7, 2, 3}, {8, 2, 4},
                        {9, 3, 1}, {10, 3, 2}
                        };


Igual que con un solo desvío, los iniciamos de la siguiente manera:


    T1.begin(storedata[1][0], storedata[1][1], storedata[1][2]); // ID - Direccion - Subdireccion
    T2.begin(storedata[2][0], storedata[2][1], storedata[2][2]);
    T3.begin(storedata[3][0], storedata[3][1], storedata[3][2]);
    T4.begin(storedata[4][0], storedata[4][1], storedata[4][2]);
    T5.begin(storedata[5][0], storedata[5][1], storedata[5][2]);
    T6.begin(storedata[6][0], storedata[6][1], storedata[6][2]);
    ......


Una vez inicie el sistema podemos comprobar en el monitor serial que los desvíos están iniciados con el comando 'T':

Listado comantao 'T'

Listado comando 'T'

En un principio no hay diferencia, con el array gastamos algo de memoria incluso. Pero lo tendremos todo mucho mejor organizado y en placas como la Arduino MEGA este gasto de memoria es ínfima.

Este método no almacena los desvíos en la memoria, solo los carga al iniciar el sistema pero a efectos prácticos de uso es lo mismo.