Hey,
I’m currently working on a project where I want to switch the colors of a square in processing through using rfid chips with arduino. So everytime I place a rfid-chip on my rfid-reader, arduino should send the data to processing, and depending on the card-number the color of the square in processing should change.
The connection is working and I cannot switch the colors of the square in processing. I think the problem lays in the processing code.
I use the Arduino Elegoo Uno R3 and the joy-it RFID Reader.
Would love to get some help, how to solve this problem!
Here is the Processing-Code
import processing.serial.*;
Serial myPort; // The serial port
String finalRead = ""; // Variable with final data
String inputRead = ""; // Variable that recieves the data
int state = 0; // Variable to store the program state
void setup() {
size(800, 800); //Size of the program window
background(50, 50, 150); //Background colour
// List all the available serial ports
printArray(Serial.list());
// Open the port you are using at the rate you want:
myPort = new Serial(this, Serial.list()[4], 9600);
// The rectangle will be placed based on it's own center
rectMode(CENTER);
}
void draw() {
/*When the serial port is available the data from the RFID is
loaded into the finalRead variable.*/
while (myPort.available() > 0)
{
//The c variable is updated with the read method
char c=(char)myPort.read();
/*
When processing recieves data from Arduinos println command
it is recieved with a \r in the beginning
and a c\ in the end.
Therefore we add c to inputRead when
we are not encountering \r.
If we encounter \n we know that the string is done reading.
The string is loaded into the finalRead variable and
the data is cleared from inputRead.
*/
if (c=='\n')
{
finalRead = inputRead;
inputRead = "";
println("data: " + finalRead);
} else if (c!='\r')
{
inputRead+=c;
}
}
/*Now the program checks if the data is equal to the data
on a wanted RFID-chip. If thats the case the state of the
program changes. Here you need to fill in data from a specific
RFID-chip*/
if (finalRead.equals("7320574163")) {
state = 1;
}
/*Another RFID-chip if-statement with another state. You can do this with as many RFID-chips you want.*/
if (finalRead.equals("21110723902")) {
state = 2;
}
/*If the state is changed to 1, the colour of the center Rectangle
is changed to red.*/
if (state == 1) {
fill(#ffffff);
}
/*If the state is change to 2, the colour of the center Rectangle is changed to green.*/
if (state == 2) {
fill(#000000);
}
/*The program now draws a rectangle with a fill colour dependent on the state variable*/
rect(width/2, height/2, width-100, height-100);
}
here is the Arduino-Code
/*
* ----------------------------------------------------------------------
* Example program showing how to read new NUID from a PICC to serial.
* ----------------------------------------------------------------------
* https://circuits4you.com
*
* RC522 Interfacing with NodeMCU
*
Typical pin layout used:
* ---------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* ----------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
*/
#include <SPI.h>
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 9; // Configurable, see typical pin layout above
constexpr uint8_t SS_PIN = 10; // Configurable, see typical pin layout above
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;
// Init array that will store new NUID
byte nuidPICC[4];
void setup() {
Serial.begin(9600);
SPI.begin(); // Init SPI bus
rfid.PCD_Init(); // Init MFRC522
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
Serial.println(F("This code scan the MIFARE Classsic NUID."));
Serial.print(F("Using the following key:"));
printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}
void loop() {
// Look for new cards
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Verify if the NUID has been readed
if ( ! rfid.PICC_ReadCardSerial())
return;
Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
Serial.println(rfid.PICC_GetTypeName(piccType));
// Check is the PICC of Classic MIFARE type
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
}
if (rfid.uid.uidByte[0] != nuidPICC[0] ||
rfid.uid.uidByte[1] != nuidPICC[1] ||
rfid.uid.uidByte[2] != nuidPICC[2] ||
rfid.uid.uidByte[3] != nuidPICC[3] ) {
Serial.println(F("A new card has been detected."));
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.println(F("The NUID tag is:"));
Serial.print(F("In hex: "));
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
Serial.print(F("In dec: "));
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
}
else Serial.println(F("Card read previously."));
// Halt PICC
rfid.PICC_HaltA();
// Stop encryption on PCD
rfid.PCD_StopCrypto1();
}
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
/**
* Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], DEC);
}
}