#include <Wire.h>
#define MY_ADDRESS 0x10 // Cambia per ogni Nano: 0x10, 0x11, 0x12, 0x13
#define PHASE_LOW 1 // Fase iniziale gestita da questo slave (1,3,5,7)
#define PHASE_HIGH 2 // Fase finale gestita da questo slave (2,4,6,8)
enum { SLAVE_IDLE, SLAVE_ACTIVE, SLAVE_FAIL };
uint8_t slaveState = SLAVE_IDLE;
uint8_t currentPhase = 0; // Fase attualmente attiva (0 = nessuna)
uint16_t codice = 0; // Codice da inviare (0000-9999)
void setup() {
Wire.begin(MY_ADDRESS);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
resetAllOutputs();
}
void loop() {
if (slaveState == SLAVE_ACTIVE) {
checkPhaseLow();
checkPhaseHigh();
}
delay(10);
}
void receiveEvent(int bytes) {
if (Wire.available() == 0) return;
uint8_t cmd = Wire.read();
switch (cmd) {
case 0x00: // RESET / IDLE
slaveState = SLAVE_IDLE;
currentPhase = 0;
codice = 0;
resetAllOutputs();
break;
case 0x99: // FAIL - tempo scaduto
slaveState = SLAVE_FAIL;
currentPhase = 0;
codice = 0;
failEffects();
break;
default: // Qualsiasi altro comando = ATTIVA
if (slaveState != SLAVE_FAIL) {
slaveState = SLAVE_ACTIVE;
currentPhase = PHASE_LOW;
codice = 0; // Codice iniziale (puoi cambiarlo)
startPhaseLow();
}
break;
}
}
void requestEvent() {
uint8_t response[4];
response[0] = slaveState; // STATO (0=idle, 1=active, 255=fail)
response[1] = currentPhase; // FASE corrente (1-8 o 0)
response[2] = highByte(codice); // CODICE high
response[3] = lowByte(codice); // CODICE low
Wire.write(response, 4);
}
// ================== DA PERSONALIZZARE PER OGNI SLAVE ==================
void checkPhaseLow() {
// Inserisci qui la logica per risolvere la PHASE_LOW
// Esempio semplice (sostituisci con i tuoi sensori):
// if (condizione_risoluzione_fase_bassa) {
// currentPhase = PHASE_HIGH;
// codice = 1234; // Imposta il codice per la prossima fase
// startPhaseHigh();
// }
}
void checkPhaseHigh() {
// Inserisci qui la logica per risolvere la PHASE_HIGH
// Controlla solo se la fase bassa è già stata completata
if (currentPhase != PHASE_HIGH) return;
// Esempio:
// if (condizione_risoluzione_fase_alta) {
// currentPhase = PHASE_HIGH + 1; // Es. 2→3, 4→5, 6→7, 8→9 (il master vedrà 3,5,7,9 e incrementerà)
// codice = 5678; // Codice finale o hint
// successEffects(); // Opzionale
// }
}
void startPhaseLow() {
// Attiva luci, suoni, relè per l'inizio della PHASE_LOW
}
void startPhaseHigh() {
// Attiva nuovi indizi, luci, ecc. per la PHASE_HIGH
}
void resetAllOutputs() {
// Spegni tutti i relè, LED locali, buzzer, ecc.
}
void failEffects() {
// Sirena, luci rosse lampeggianti, blocca tutto
}
void successEffects() {
// Effetti locali di completamento fase (opzionale)
}