#define START_CHAR '*' // Caractère d'entête de message
#define DEVICE_ID 'C' // Identifiant de l'appareil
#define END_CHAR '#' // Caractère de fin de message
// Broches des relais (ajustez selon votre configuration)
const int relayPins[9] = {2, 3, 4, 5, 6, 7, 8, 9, 10};
// Broche de contrôle TX/RX pour RS-485
const int txRxControlPin = 11;
// Fonction d'initialisation
void setup() {
Serial.begin(9600); // Démarrage de la communication série
pinMode(txRxControlPin, OUTPUT); // Configure comme sortie
digitalWrite(txRxControlPin, LOW); // Initialement en mode réception
Serial.println("Matrice 4x2 Version RS485 F1EYG");
// Configuration des broches des relais comme sorties
for (int i = 0; i < 9; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // Relais initialement désactivés
}
}
// Fonction pour envoyer l'état du relais avec le Device ID
void sendRelayStatus(int relayIndex) {
int state = digitalRead(relayPins[relayIndex]); // Lire l'état de l'I/O
char relayNumber = (char)(relayIndex + '1'); // Convertir l'index en numéro de relais
// Créer le message avec le START_CHAR, DEVICE_ID, numéro du relais, état, et END_CHAR
String message = String(START_CHAR) + DEVICE_ID + relayNumber + state + String(END_CHAR);
// Passer en mode transmission pour RS-485
digitalWrite(txRxControlPin, HIGH);
Serial.println(message); // Envoyer le message sur RS-485
// Retour en mode réception après l'envoi
digitalWrite(txRxControlPin, LOW);
}
// Fonction principale de boucle
void loop() {
if (Serial.available() > 0) { // Si des données sont disponibles sur le port série
digitalWrite(txRxControlPin, HIGH); // Passer en mode transmission
String receivedMessage = Serial.readStringUntil(END_CHAR); // Lecture jusqu'au caractère de fin
digitalWrite(txRxControlPin, LOW); // Retour en mode réception
if (receivedMessage.startsWith(String(START_CHAR))) { // Vérifier le caractère d'entête
if (receivedMessage.charAt(1) == DEVICE_ID) { // Vérifier l'identifiant de l'appareil
// Obtenir le numéro du relais
char relayNumber = receivedMessage.charAt(2);
// Obtenir la commande (0, 1 ou 2)
char command = receivedMessage.charAt(3);
if (relayNumber >= '1' && relayNumber <= '9') { // Valider le numéro du relais
int relayIndex = relayNumber - '1'; // Convertir le numéro du relais en index
if (command == '1') { // Activer le relais
digitalWrite(relayPins[relayIndex], HIGH);
if (relayIndex < 3) { // Désactiver le relais n+4 si inférieur à 4
int disableIndex = relayIndex + 4;
digitalWrite(relayPins[disableIndex], LOW);
sendRelayStatus(disableIndex); // Envoyer l'état du relais désactivé
}
if (relayIndex > 3) { // Désactiver le relais n-4 si supérieur à 4
int disableIndex = relayIndex - 4;
digitalWrite(relayPins[disableIndex], LOW);
sendRelayStatus(disableIndex); // Envoyer l'état du relais désactivé
}
sendRelayStatus(relayIndex); // Envoyer l'état du relais activé
} else if (command == '0') { // Désactiver le relais
digitalWrite(relayPins[relayIndex], LOW);
sendRelayStatus(relayIndex); // Envoyer l'état du relais désactivé
} else if (command == '2') { // Activer le relais sans autres actions
digitalWrite(relayPins[relayIndex], HIGH);
sendRelayStatus(relayIndex); // Envoyer l'état du relais activé
}
}
}
}
}
}