/*
* MASTER (Arduino Uno)
* Invia comandi ai Nano slave e riceve risposte
*/
#include <Wire.h>
// Comandi disponibili
#define CMD_START 1
#define CMD_STOP 2
#define CMD_RESET 3
#define CMD_TEST 4
#define CMD_OPEN 5
#define CMD_CLOSE 6
#define CMD_CODE 7
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("=== I2C Master Ready ===");
Serial.println("Comandi: START, STOP, RESET, TEST, OPEN, CLOSE, CODE");
Serial.println("Formato: <indirizzo> <comando>");
Serial.println("Esempio: 8 START");
Serial.println("oppure: ALL START (per tutti gli slave)");
}
void loop() {
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
input.trim();
int spaceIndex = input.indexOf(' ');
if (spaceIndex > 0) {
String targetStr = input.substring(0, spaceIndex);
String cmdStr = input.substring(spaceIndex + 1);
byte command = parseCommand(cmdStr);
if (command > 0) {
if (targetStr.equalsIgnoreCase("ALL")) {
// Invia a tutti gli slave
for (int addr = 8; addr <= 12; addr++) {
sendCommandToSlave(addr, command);
}
} else {
// Invia a uno specifico slave
int address = targetStr.toInt();
if (address >= 8 && address <= 12) {
sendCommandToSlave(address, command);
} else {
Serial.println("Errore: indirizzo non valido (8-12)");
}
}
} else {
Serial.println("Errore: comando non riconosciuto");
}
}
}
}
byte parseCommand(String cmd) {
cmd.toUpperCase();
if (cmd == "START") return CMD_START;
if (cmd == "STOP") return CMD_STOP;
if (cmd == "RESET") return CMD_RESET;
if (cmd == "TEST") return CMD_TEST;
if (cmd == "OPEN") return CMD_OPEN;
if (cmd == "CLOSE") return CMD_CLOSE;
if (cmd == "CODE") return CMD_CODE;
return 0;
}
void sendCommandToSlave(int address, byte command) {
Serial.print("Invio comando a Slave ");
Serial.print(address);
Serial.print(": ");
Serial.println(getCommandName(command));
// Invia il comando
Wire.beginTransmission(address);
Wire.write(command);
Wire.endTransmission();
delay(50); // Attendi che lo slave elabori
// Richiedi la risposta
Wire.requestFrom(address, 32); // Max 32 byte
String response = "";
while (Wire.available()) {
char c = Wire.read();
if (c != '\0') response += c;
}
Serial.print(" Risposta: ");
Serial.println(response);
Serial.println();
}
String getCommandName(byte cmd) {
switch(cmd) {
case CMD_START: return "START";
case CMD_STOP: return "STOP";
case CMD_RESET: return "RESET";
case CMD_TEST: return "TEST";
case CMD_OPEN: return "OPEN";
case CMD_CLOSE: return "CLOSE";
case CMD_CODE: return "CODE";
default: return "UNKNOWN";
}
}