I use Ethernet shield (W5100) and RC522 on my Arduino Uno. It works 1 or 2 hours (sometimes 15 minutes - sometimes 2 days) After this random time, it stops working. I mean stop with, RC-522 module don't read cards, and ethernet shield can't connect server. When i unplug power (1.5A - 12 V power suply) and re-plug it, it starts working successfully.
I need to this system works forever... This system reads mifare card, and sends to the server, after that it checks reply, and if the reply is "1", it triggers relay. (relay is 5V simple relay)
Some people said "Change your adaptor", and i changed it, nothing changed. Some people said " use 10 microfarad capasitor between rst and gnd pin" and nothing changed. and some people said, "this is arduino dude, it is for just studend give up and use stm32", and i didn't apply this suggestion yet. I want to know why this happens.
#include <SPI.h>
#include <Ethernet.h>
#include <MFRC522.h>
//Mac address of ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEA };
//My Network info, i use static ip
byte ip[] = { 172, 16, 64, 78 };
byte gateway[] = { 172, 16, 64, 1 };
byte myserver[] = { 172, 16, 64, 46 };
byte subnet[] = { 255, 255, 255, 0 };
String CardInfo = "";
EthernetClient client;
String GateNo = "0";
String DeviceNo = "100";
String Answer = "";
MFRC522 mfrc522;
byte Key[] = { 0xff,0xff,0xff,0xff,0xff,0xff };
MFRC522::MIFARE_Key key;
void setup(){
//Disabling SD Card
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
Ethernet.begin(mac, ip, subnet, gateway);
KeyCreate();
mfrc522.PCD_Init(2, 8);
mfrc522.PCD_DumpVersionToSerial();
}
void sendGET()
{
//I used this line to guarantee the disconnect from server
client.stop();
Answer = "";
if (client.connect(myserver, 81)) {
client.println("GET /AccessCheck/CardNo=" + CardInfo + "&GateNo=" + GateNo + "&DeviceNo=" + DeviceNo + " HTTP/1.0");
client.println("Authorization: Basic xxxxxxxxxxxx");
client.println();
}
else {
//Ethernet.begin(mac, ip, subnet, gateway);
return;
}
int connectLoop = 0;
while(client.connected())
{
while(client.available())
{
char c = client.read();
Answer = Answer + c;
connectLoop = 0;
}
delay(1);
connectLoop++;
if(connectLoop > 5000)
{
client.stop();
return;
}
}
client.stop();
}
//This function disables eth and enable rc522 (and reverse)
void Switch(int i)
{
switch (i)
{
case 0:
digitalWrite(10, HIGH);
digitalWrite(2, LOW);
break;
case 1:
digitalWrite(2, HIGH);
digitalWrite(10, LOW);
break;
}
}
void AccessControl()
{
int AnswerLength = Answer.length();
pinMode(5, OUTPUT);
digitalWrite(5, HIGH);
if(Answer[AnswerLength-1] == 49)
{
digitalWrite(5, LOW);
delay(100);
digitalWrite(5, HIGH);
}
pinMode(5, INPUT);
pinMode(6, INPUT);
delay(1000);
}
void ReadCard()
{
byte len = 18;
MFRC522::StatusCode status;
byte MyBuffer[18];
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 10, &key, &(mfrc522.uid));
status = mfrc522.MIFARE_Read(10, MyBuffer, &len);
int counter = 0;
//This line is check for turkish character
if(MyBuffer[0] == 221)
{
CardInfo = "X";
for (int i = 1; i < 16; i++)
{
if (MyBuffer[i] != 32)
{
CardInfo = CardInfo + (char)MyBuffer[i];
}
}
}
else
{
CardInfo = "";
for (int i = 0; i < 16; i++)
{
if (MyBuffer[i] != 32)
{
CardInfo = CardInfo + (char)MyBuffer[i];
}
}
}
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
return;
}
void KeyCreate()
{
for (int i = 0; i < 6; i++)
{
key.keyByte[i] = Key[i];
}
}
void loop(){
Switch(0);
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
ReadCard();
Switch(1);
sendGET();
AccessControl();
}
}
I expect it runs without freezing
Actual result is ethernet shield freezes after a while