Using MFRC522 and HC-12 (with software Serial) at the same time doesn't work

Hey there,

I am trying to use the MFRC522 RFID-Reader in combination with the HC-12 wireless transreceiver on an Arduino Nano.

The RFID reader works as intended, but the HC-12 does not send or receive anything.

I already checked if the HC-12 is broken. It does function proberly when the MRFC522 library is not used.

Here are the important parts of my code:

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3,4); //RX, TX

void setup() {
  Serial.begin(9600);
  mySerial.begin(2400);
  delay(100);
  SPI.begin();          // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
}

bool testRFID() {
  if(mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()){
    String UID = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) UID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  return false;
}

bool receive(){
  mySerial.listen();
  if(mySerial.available() > 1){
    String input = mySerial.readString();
    input.replace("\n", "");
    return uncode(input);
  }
  return false;
}

void transmit(String msg){
    mySerial.println(msg);
}

All functions below setup() are called from time to time in loop().

The whole code is much longer, so I will attach it at the end. I should have quoted all important parts though.

I have used the HC-12 with software serial in the exact same configuration many times now and it always worked fine until I added the MFRC522...

If you know any solution to this problem, please tell me. I am fine with starting over if it works then...

Here you can see the whole code, which is probably pain to read into:

const String password = "NKHXDFQJ"; //8 characters long!!!
const String mySID = "000"; //Die Sensor ID des aktuellen Sensors. Handelt es sich nicht um einen Sensor, ist sie gleich 000

//Welche Karten alle erlaubt sind:
String allowed[] = {"4BF229AA54880","907155D3","4DE34FD3","C76E55D3"};     

//Nicht ändern
String lastCmd = "000";         //Der letzte dekodierte Befehl
unsigned int lastSID = 99;      //Die letzte empfangene sensor ID
const String endCode = "XX";    //Das Terminator Kürzel fürs Ende eines Datenblocks
const unsigned int set = 2;

//Pin Zuweisungen
const unsigned int LEDg = 5,LEDr = 6,LEDy = 7;
const unsigned int LEDerr = A1;
const unsigned int notknopf = 8;

unsigned int state = 3;                     //0 = off,1 = on,2 = noClue,3 = switching

//Zeithandeling
const unsigned long waitForPing = 120000;   //Wie lange auf einen Ping gewartet wird bevor status = 2
unsigned long lastPing = 0;                 //Wann der letzte Befehl mitgelesen wurde
const unsigned long waitForStatus = 10000;  //How many millis to wait for a status after switching
unsigned long lastStatus = 0;               //Letztes Umschalten
const unsigned long wrongLEDTime = 2000;    //Wie lange die Error LED leuchtet wenn ne falsche Karte gezeigt wurde
unsigned long lastWrong = 0;                //Wann das letzte Mal eine falsche Karte gezeigt wurde

//Blinker
bool blinkAn = false;   //Ob jetzt gerade eine an-Periode ist
const unsigned long blinkDelay = 200; //Halbe Blink-Periode

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

#include <SoftwareSerial.h> //HC Kram
SoftwareSerial mySerial(3,4); //RX, TX

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mySerial.begin(2400);
  delay(100);
  if(Serial){
    Serial.println("Configuration:");
    Serial.print("Password: ");
    Serial.println(password);
    Serial.print("Terminator: ");
    Serial.println(endCode);
    if(mySID != "000") {
      Serial.print("ID: ");
      Serial.println(mySID);
    }
    Serial.println("--- Ende ---\n");
  }

  pinMode(LED_BUILTIN,OUTPUT);
  
  pinMode(set,OUTPUT);
  digitalWrite(set,HIGH);

  SPI.begin();          // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  if(Serial) Serial.println("ready!");

  pinMode(LEDg,OUTPUT);
  pinMode(LEDr,OUTPUT);
  pinMode(LEDy,OUTPUT);
  pinMode(LEDerr,OUTPUT);
  pinMode(notknopf,INPUT_PULLUP);

  transmit(encode("BUS"));
}


void loop() {
  if(!digitalRead(notknopf)){   //Notknopf
    while(!digitalRead(notknopf)) delay(10);
    for(unsigned int i = 0;i < 3;i++){
      transmit(encode("NFK"));
      delay(1500);
    }
  }

  commands();   //Befehle
  
  if(state != 3 && testRFID()){   //Umschalten
    lastStatus = millis();
    switch(state){
      case 0: //Turn on
        transmit(encode("SON"));
        break;
      case 1: //Turn off priority
        transmit(encode("SOP"));
        break;
      case 2:
        transmit(encode("BUS"));
        break;
    }
    state = 3;
  }

  if(state == 3 && millis() - lastStatus > waitForStatus){
    lastStatus = millis();
    transmit(encode("BUS"));
  }
  
  //Blinker
  blinkAn = millis() % (blinkDelay * 2) < blinkDelay;
  
  //LEDs
  digitalWrite(LEDr,state == 0);
  digitalWrite(LEDg,state == 1);
  digitalWrite(LEDy,state == 2 || state == 3 && blinkAn);
  digitalWrite(LEDerr,millis() - lastWrong < wrongLEDTime && lastWrong != 0);
}

void commands(){    //Befehlsverarbeitung
  if(!receive) return;

    if(lastCmd == "PNG"){  //Check for pings
      lastPing = millis();
    }
    if(lastCmd == "ANN"){
      lastPing = millis();
      state = 1;
    }
    if(lastCmd == "AUS"){
      lastPing = millis();
      state = 0;
    }
    if(lastCmd == "ALM"){
      lastPing = millis();
      state = 1;
    }
    if(lastCmd == "LED"){
      for(int i = 0;i < 20;i++){
        digitalWrite(LEDr,i%4 == 0);
        digitalWrite(LEDg,i%4 == 1);
        digitalWrite(LEDy,i%4 == 2);
        digitalWrite(LEDerr,i%4 == 3);
        delay(50);
      }
    }
}

bool testRFID() {   //Teste ob eine gültige Karte vorgelegt ist. Wenn ja, return true. Sonst return false.
  if(mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()){
    String UID = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) UID.concat(String(mfrc522.uid.uidByte[i], HEX));
    UID.toUpperCase();
    if(Serial) Serial.println(UID);
    if(UID == "5B49E243" || UID == "BB385844" || UID == "46A299AA54880" || UID == "4712A9AA54880") return true;
    for(byte i = 0;i < sizeof(allowed)/sizeof(allowed[0]);i++) if(allowed[i] == UID)return true;
  }
  return false;
}



//Teste ob was empfangen werden kann
bool receive(){
  mySerial.listen();
  if(mySerial.available() > 1){
    String input = mySerial.readString();
    input.replace("\n", "");
    if(Serial) Serial.println(input);
    return uncode(input);
  }
  return false;
}

//Sende etwas
void transmit(String msg){
    if(Serial) Serial.println(msg);
    mySerial.println(msg);
}

//Gibt eine Befehlseingabe kodiert zurück
String encode(String cmd,String sID){ //Befehl und Sensor ID
  return password + cmd + sID + endCode;
}
String encode(String cmd){
  return encode(cmd,mySID);
}

//Etwas empfangenes zerpflücken
bool uncode(String msg){
  
  msg.toUpperCase();
  
  //Password test
  String temp = "";
  for(unsigned int i = 0;i < 8;i++){
    temp += msg.charAt(i);
  }
  if (temp != password) {
    Serial.println("Received, but password not matching");
    return false;
  }

  //Terminator test
  temp = "";
  for(unsigned int i = 14;i < 16;i++){
    temp += msg.charAt(i);
  }
  if (temp != endCode) {
    Serial.println("Received, but terminator not matching");
    return false;
  }

  
  temp = ""; //Command
  for(unsigned int i = 8;i < 11;i++){
    temp += msg.charAt(i);
  }
  lastCmd = temp;

  
  temp = ""; //sID
  for(unsigned int i = 11;i < 14;i++){
    temp += msg.charAt(i);
  }
  lastSID = temp.toInt();
  
  return true;
}

Thank you for taking your time :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.