Respuesta rápida:
Respuesta media:
Son 100 los mandos así que puedes usar un punto de acceso wifi que no tenga problema en manejarlos a todos.
La idea es que uses el esp8266 con el firmware NodeMCU (Lua) que ya trae soporte para MQTT. Son 100 nodos más el Nodo del servidor MQTT.
El punto de acceso puede ser al mismo tiempo el servidor MQTT, si usas Raspsberry Pi, Orange Pi o similares. Otro que podría servir también como punto de acceso y servidor MQTT es el AR9331. El AR9331 se usa comúnmente en los Arduinos Yun y traen como Sistema Operativo una versión de OpenWRT (Linux) a la cual le puedes instalar servidores MQTT como mosquitto, y además trae instalado por defecto python, por lo que puedes ejecutar los programas de python desde una SD.
Lo otro es la lógica para determinar quien fue el que oprimió antes el botón y cual fue el botón que presionó. Para eso el mando de control de inicio de pregunta va a mandar un mensaje a todos los nodos a un tópico en común que podría ser /*/question_start en el mensaje tendría el timestamp del servidor principal.
Y también el mando de control de inicio también estaría subscrito al tópico /*/button_pressed.
Así cuando cada nodo envíe el mensaje al tópico /<nodo-uuid>/button_pressed con el mensaje tentativo de
{"server_timestamp_start":xxxxxxxxxx, <- La hora del servidor cuando envió el mensaje
"node_timestamp_start":xxxxxxxxx, <- La hora del nodo cuando recibió el mensaje de inicio de pregunta.
"node_timestamp_response":xxxxxxxxx, <- La hora en que se envió el mensaje de respuesta
"button_pressed": z; <- el ID del botón que se presionó
"time_response_us":yyyyy; <- retardo entra la recepción del mensaje y la detección de flanco (subida o bajada dependiendo del sistema)
}
El sistema sabría diferenciar entre el nodo y cual de ellos tuvo la reacción más rápida. time_response_us se podría cambiar por time_response_ms, ya que el ser humano no tiene reacciones tan rápidas.
Cuando el servidor determine quien fue el que presionó más rápido el botón esté enviaría el mensaje al tópico /<node-uuid>/led donde <node-uuid> es el ID del mando que tuvo la respuesta más rápida, con el mensaje que le permita prender el led.
Para apagar los LEDs de todos los mandos el servidor publicaría al tópico /*/led con el mensaje para apagar todos.