Iluminación vecindario H0 con Arduino

Muy buenas a todos y todas!
Las luces en una maqueta son algo imprescindible si queremos recrear un maqueta mucho más realista.
Gracias a los decodificadores podemos programar animaciones con leds, en este caso, para una parte de la maqueta.
También podemos añadir al accesorio que creemos en la lista de animaciones de dccppAnimations.infotronikblog.com.
Igual que con el efecto soldador, el resultado en nuestra maqueta será genial!!
Una de las características del programa para hacer los diferentes efectos de luces en casas es que se puede poner en la maqueta sin necesidad de conectarlo a la linea DCC.
Características del decodificador
El programa tiene 3 modos con los diferentes efectos que podemos seleccionar.
La variable mode es la encargada de seleccionar este modo:
// Definimos los modos del decodificador
#define MODE_ALL_ON 1
#define MODE_ALEATORY 2
#define MODE_SECUENCY 3
int mode = MODE_ALEATORY;
- MODE_ALL_ON o Modo On/Off:
Enciende o apaga todas las luces. - MODE_ALEATORY o Modo Aleatorio:
Las luces se encenderán de manera totalmente aleatoria. - MODE_ALEATORY o Modo Secuencia:
Las luces se enciendes o apagan según se define en la variable secuencia[]
Si queremos iniciar el decodificador desde el momento que inicia el microcontrolador tenemos que cambiar la variable acc[ACC_CHANGE_HOUSE_MODE].output a “true” dentro de la función ConfigureFunctionsAndServos():
////////////////
// Dirección 9; Cambia el modo encendido casas ; Dirección 3 Subdirección 0
//
acc[ACC_CHANGE_HOUSE_MODE].direccion = EF_BARRIADA;
acc[ACC_CHANGE_HOUSE_MODE].output = true;
Para la parte de programación vamos a usar la librería DCC_Decoder de Mynabay.
Direcciones DCC :
Para este decodificador usaremos solo dos direcciones, una dirección para las luces de las casas y una segunda dirección para encender la iluminación de las farolas de la calle.
Pines de salidas de Arduino:

Podemos usar todas las salidas disponibles, para esta calle usaremos 8 salidas del microcontrolador, 2 salidas por cada una de las 4 casas.
Y una salida para las farolas que iluminarán la parte exterior de diorama. La salida de las farolas actúa sobre un transistor BC548 que aguanta una corriente 100mA, suficientes para un puñado de LEDs.
- Pin 2 -> Interrupción del decoder
-
Pin 3 -> Salidas farolas
- Pin 4 -> Salida casa1A
-
Pin 5 -> Salida casa1B
- Pin 6 -> Salida casa2A
-
Pin 7 -> Salida casa2B
- Pin 8 -> Salida casa3A
-
Pin 9 -> Salida casa3B
- Pin 10 -> Salida casa4A
- Pin 11 -> Salida casa4B
- Pin 12 -> Salida casa4C
Si necesitas mas pines, también se pueden usar los pines analógicos como pines de salida.
Definición de direcciones:
Primero definimos el accesorio en la función ConfigureFunctionsAndServos():
#define MAX_ACC 2 // Número máximo de accesorios
void ConfigureFunctionsAndServos()
{
// Dirección 2; Luces calles; Dirección 1 Subdirección 1
acc[0].direccion = 2;
acc[0].outputPin0 = PIN_FAROLAS;
acc[0].output = false;
// Dirección 3; Luce encendido casas; Dirección 1 Subdirección 2
acc[1].direccion = 3;
acc[1].output = false;
}
Función Aleatoria:
Esta función le da un autentico realismo a todo el conjunto de casas. Todas las luces funcionan de manera independiente, encendiéndose y apagándose de manera independiente.
En mi opinión personal es la mejor de las tres opciones.
int oldPin = 0;
void Modo_Aleatorio()
{
const unsigned long intervalo = 5000; // Intervalo de 5 segundos
//const unsigned long intervalo = 1000; // Intervalo de 1 segundos
// Verifica si ha pasado el tiempo suficiente
if (millis() - timerModoAleatorio >= intervalo)
{
timerModoAleatorio = millis(); // Actualiza el tiempo anterior
int pinAleatorio = random(4, 13); // Genera un número aleatorio entre 4 y 12
while (pinAleatorio == oldPin)
{
pinAleatorio = random(4, 13); // Genera un número aleatorio entre 4 y 12
}
oldPin = pinAleatorio;
bool estado = random(2); // Genera 0 (apagado) o 1 (encendido)
Función secuencia predeterminada
Con esta opción las luces se encenderán en una secuencia dada por el usuario.
La variable encargada de esta función es la variable int secuencia[]
Una vez terminada el último valor de la secuencia volverá al inicio de la misma.
int secuencia[] = {4, 6, 8, 10, 12, 10, 8, 6};
Descargar Decodificador barriada o edificio
Los archivos para descargar el decodificador están en GitHub
Decodificador de funciones DCC barrio
Recuerda que tienes más decodificadores de accesorios en este mismo blog:

