Bonjour,
J'ai un montage à base de Nano, transeivers 433 MHz (émetteur FS1000a / récepteur RXB6) avec la librairie RCSwitch. Tout se passait bien jusqu'à ce que j'ajoute un lecteur RFID géré au travers d'un MAX3232 et la librairie NeoSWSerial.
Les deux marchent bien indépendamment l'un de l'autre, mais si j'active les 2 en même temps, l'arduino fait n'importe quoi voire reboote quand je scanne un tag RFID.
Ca me fait penser à un problème de perturbation/interaction au niveau des interruptions mais ma connaissance s'arrête là. Le lecteur RFID est alimenté indépendamment, donc pas d'incidence à priori sur le montage.
Extrait de la boucle loop qui plante :
Si j'active ce bloc :
// Actions à exécuter tout le temps => réception et traitement de msg 433MHz => commande poulailler
if (receiver_433.available()) {
unsigned long value = receiver_433.getReceivedValue();
if (value == 0) {
Serial.print(F("Unknown encoding"));
} else {
Serial.print(F("Received "));
Serial.print( value );
Serial.print(F(" / "));
Serial.print( receiver_433.getReceivedBitlength() );
Serial.print(F("bit "));
Serial.print(F("Protocol: "));
Serial.println( receiver_433.getReceivedProtocol() );
// Réception signal d'ouverture de porte de Jeedom
if (value == COMMANDE_433_OUVRIR_PORTE) {
if (statutPorte == 2){ // Porte déjà ouverte => renvoie le signal à Jeedom
porteOuverte();
} else { // Porte fermée => ouvre la porte
ouvrePorte();
}
}
// Réception signal de fermeture de porte de Jeedom
if (value == COMMANDE_433_FERMER_PORTE) {
if (statutPorte == 4){ // Porte déjà fermée => renvoie le signal à Jeedom
porteFermee(1);
} else { // Porte fermée => ouvre la porte
fermePorte();
}
}
// Réception autres signals
if (value == COMMANDE_433_ECLAIRAGE_ON) {
digitalWrite(RELAIS_ECLAIRAGE_EXTERIEUR, LOW);
statutEclairage = LOW;
}
if (value == COMMANDE_433_ECLAIRAGE_OFF) {
digitalWrite(RELAIS_ECLAIRAGE_EXTERIEUR, HIGH);
statutEclairage = HIGH;
}
if (value == COMMANDE_433_DETECTEUR_MOUVEMENT_ON) {digitalWrite(RELAIS_DETECTEUR_MOUVEMENT, LOW);}
if (value == COMMANDE_433_DETECTEUR_MOUVEMENT_OFF) {digitalWrite(RELAIS_DETECTEUR_MOUVEMENT, HIGH);}
if (value == COMMANDE_433_LECTEUR_RFID_ON) {RFID_init();}
if (value == COMMANDE_433_LECTEUR_RFID_OFF) {RFID_off();}
}
receiver_433.resetAvailable();
}
Ce bloc là ne fonctionne pas et fait n'importe quoi :
// Traitement communication MAX3232 / RFID
while (RFID.available()) {
delay(1);
byte c = RFID.read();
char buffer[2];
sprintf(buffer,"%.2X", c); // Conversion HEX to string with leading 0
readString += buffer;
}
if (readString != ""){
readString.toUpperCase();
Serial.println(readString);
readString = "";
}
<= Fin du bloc =>
Extrait de la configuration :
/* RF 433MHz Receiver config */
RCSwitch receiver_433 = RCSwitch();
/* MAX3232 RS232 <=> TTL driver pour RFID */
#define RFID_TXD A3
#define RFID_RXD A2
NeoSWSerial RFID(RFID_TXD, RFID_RXD); // MAX3232 TX PIN, MAX3232 RX PIN
//AltSoftSerial RFID(RFID_TXD, RFID_RXD); // MAX3232 TX PIN, MAX3232 RX PIN
Extrait de la void setup :
// Attache l'interruption 0 (pin d2) au recepteur 433MHz
receiver_433.enableReceive(RECEIVER_433);
// Initialisation MAX3232 liaison RFID
RFID_init();
La void RFID_init :
/* Initialisation lecteur RFID */
void RFID_init(){
// Allumage lecteur RFID (switch relais ON)
digitalWrite(RELAIS_LECTEUR_RFID, LOW);
delay(250);
// Initialisation MAX3232 liaison RFID
RFID.begin(9600);
delay(250);
RFID.write(getBasicInfo, sizeof(getBasicInfo));
// RFID.write(set_Close_BuzzerOff_1s, sizeof(set_Close_BuzzerOff_1s));
delay(180);
while (RFID.available()) {
delay(1);
byte c = RFID.read();
char buffer[2];
sprintf(buffer,"%.2X", c); // Conversion HEX to string with leading 0
readString += buffer;
}
if (readString != ""){
readString.toUpperCase();
Serial.println(readString);
if (readString == "CCFFFF8200220A207777772E416F7369642E636F6D200A205056332E36384E6F2E3A0036353533358C"){
Serial.println(F("Lecteur RFID prêt"));
statutLecteurRFID.send(1, 1);
} else {
Serial.println(F("ERREUR !! Lecteur RFID non prêt ! Contrôlez SVP"));
statutLecteurRFID.send(0, 1);
}
readString = "";
}
}
Voici ce que je reçois de la partie NeoSWSerial du lecteur RFID si les deux blocs sont activés :
⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮ |⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2 |⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2⸮⸮ |⸮⸮⸮2⸮⸮⸮⸮⸮⸮|⸮⸮⸮2
⸮⸮
Alors que si je désactive la partie RCSwitch je reçois des données valides du MAX3232 venant du lecteur RFID (valeurs HEX exploitables) :
CCFFFF8200220A207777772E416F7369642E636F6D200A205056332E36384E6F2E3A0036353533358C
Merci du coup de main
JF