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