Bonjour,
voila je viens de commencer mon projet.Pour l'instant j'ai réalisé 3 types de cartes:
1 cartes d'entrée ( arduino +mcp2515+mcp2551 + boutons poussoir) pour détecter l'appui sur un bouton poussoir et envoyer un ordre
1 carte type gradateur( arduino +mcp2515+mcp2551+ sorties variables) pour allumer des lampes.
1 carte type mémoire+clock (arduino+mcp251+mcp2551+ds2417+24lc256) pour avoir l'heure et stocker des données non volatiles.
ces cartes sont reliées sur un bus can à 100kbs/s. les trames envoyées sont toutes composées de la façon suivante:
4 bytes--> identifiant
byte 0--> type de carte ciblé (carte interupteur, carte gradateur, carte mémoire....)
byte 1--> commande demandée (exemple allumer lame)
byte 2-->numéro de la carte (permet de différencier 2cartes du même type)
byte 3 -->parametre (variable suivant la commande)
8 bytes -->bytes de données. (variable suivant la commande)
c'est clair? non!!!!
alors un petit exemple.soit la trame suivante:
identifiant donnée
[0x03,0x01,0x09,0b00000011] [0x00,0x00,0x00,0x00;0x00,0x00,0xFF,0xAA]
il faut lire la trame de la façon suivante:
on souhaite envoyer un ordre à une carte de type 0x03 (carte gradateur) une commande d'allumage de lampe (0x01) , la carte gradateur à qui l'ordre est adressé est la carte numéro 9 (0x09). dans le paramétré il est précisé lesquelles des huit lampes (un bit par lampe) doivent changer d'état ( ici bit=0 la lampe conserve son état bit=1 on change l'état de la lampe).
Les bytes de données précise la "luminosité" souhaitée: il faut lire:
les lampes 0-1-2-3-4-5-6 ne change pas d'état (non sélectionnée dans le byte paramètre) , la lampe 6 est allumé au maxi (0xFF), la lampe 7 à une valeur quelconque (0xAA)
j'espère être plus clair. 
J'ai développé mon application de la façon suivante suivante:
un ensemble d'ordres (donc de trame de 12bytes (identifiant 4+8 données)) est stocké en mémoire eeprom sur le 24lc256 de la carte clock+mémoire. des ordres pourront être ajouté ou supprimé dynamiquement (à finir de développer).
Les cartes d'entré (boutons poussoir) sont configurées de la façon suivante: à chaque appui sur un bouton est associé le numéro des ordres préenregistré à exécuter.
exemple de communication pour l'allumage d'une lampe à partir d'un bouton poussoir.
- l'ordre correspondant à l’allumage de la lampe est enregistré dans l'eeprom de la carte mémoire-clock sous l'ordre numéro 1
- le bouton poussoir est configuré pour demandé le lancement de l'odre1 (allumage lampe)
ensuite ce qui ce passe.
j’appuie sur le bouton poussoir-->une trame est envoyée à la carte mémoire-clock qui indique qu'il faut exécuter l'ordre 1
--> la carte mémoire envoie la trame (ordre1) sur le bus permettant l''alumage de la lampe--> le message est reçu par la carte gradateur qui allume la lampe--> un message de retour d'état est retourner pour connaitre l'état des lampes.
Bon pour être plus clair je vous laisse mes bout de code que j'ai commencé à faire:
vous y trouverez les codes pour chaque cartes,
La library can bus que j'utilise ainsi que des fichier texte expliquant les différentes commandes de chaque carte.
ce serait sympa que vous me donniez vos avis sur ce début. Si vous avez des idées améliorations. 
Gromain j'ai vu ton projet qui est super intéressant. j'avais songé à faire le même principe. j'ai été rebouté du fait que la transmission par udp n'est pas sur (risque de perte de message qui peut être génant).
Je me rend compte qu'un avantage de ma solution est que les programmes sont assez light.
version beta.zip (21.6 KB)