Estaba en la cama sudando una fiebre cuando se me ha venido a la cabeza una solución a este problema, que creo que puede ser válida por sencilla y por barata.
Si no he entendido mal, el objetivo del proyecto es que con un sensor al comienzo (Nodo_A) o al final (Nodo_B) de la escalera, los peldaños comiencen a encenderse paulatinamente uno tras otro hasta el otro extremo de la escalera. Llamemos Tiempo_X al que transcurre entre el encendido de un escalón y el siguiente, y Tiempo_Y al que cada escalón permanecerá encendido hasta finalmente apagarse suavemente. Por último, llamemos Nodo_N a cualquier escalón que no sea ni el primero ni el último.
Con estos condicionantes se me ha ocurrido una solución que permitirá:
- que los nodos sólo tengan un micro de 6 pines sin necesitar un driver de comunicaciones
- que el bus de conexión sólo tenga las dos líneas de alimentación más un tercer hilo que irá de cada escalón hasta el siguiente
- que el modelo sea flexible y sirva para cualquier escalera de cualquier longitud
- que el programa sea único para todos los nodos
La solución sería:
- conectar cada micro a la alimentación
- conectar un pin adicional al sensor de inicio o final de la escalera. Los Nodos_N tendrán ese pin soldado a masa (o a Vdd, es indiferente).
- conectar otro pin del micro al micro del escalón anterior, este pin será N_Anterior. En Nodo_A estará conectado con pulldown a masa.
- y por último, conectar el sexto pin del micro al micro del escalón superior; este pin será N_Posterior. En el Nodo_B estará conectado con pulldown a masa
A nivel firmware tendremos un bucle principal donde se ejecutarán estas tareas:
- los pines N_Anterior y N_Posterior se definen como entradas y se leen continuamente por si alguno se levanta a 1.
- si un nodo recibe una señal del sensor, automáticamente levanta un pulso corto en sus pines N_Anterior y N_Posterior. Esto sólo puede ocurrir en Nodo_A o en Nodo_B, porque los demás tienen el sensor conectado a masa.
- si un nodo recibe un pulso por N_Anterior, enciende el led, pone en marcha un Timer para esperar el Tiempo_X y transcurrido ese tiempo activa su pin N_Posterior. El timer sigue contando hasta que pase el Tiempo_Y, momento en que el led se apagará progresivamente.
- si un nodo recibe un pulso por N_Posterior, enciende el led, pone en marcha un Timer para esperar el Tiempo_X y transcurrido ese tiempo activa su pin N_Anterior. El timer sigue contando hasta que pase el Tiempo_Y, momento en que el led se apagará progresivamente.
Creo que con eso estaría todo resuelto, pero obviamente es una idea que no he llevado a la práctica y habría que probar.