Isto ajuda-te ?
Foi o meu entretem no sabado à tarde(esta a chover ...)
#define RX_PIN 2
#define TX_PIN 3
#define CARD_LENGH 14
#define PIN_RELAY A0
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,20,4);
char cardNumber[CARD_LENGH];
int relayState = 0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 100, 3);
unsigned int localPort = 8888;
int packetSize=0;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
char ReplyBuffer[] = "OK";
EthernetUDP Udp;
SoftwareSerial rfidReader(RX_PIN, TX_PIN); // RX, TX
void setup()
{
Ethernet.begin(mac,ip);
Udp.begin(localPort);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("RFID CONTROLLER");
Serial.begin(9600);
rfidReader.begin(9600);
lcd.setCursor(4,1);
lcd.print("Passe Cartao");
Serial.println("Passe Cartao");
pinMode(PIN_RELAY,OUTPUT);
}
void loop()
{
if(findCard())getCardID();
int packetSize = Udp.parsePacket();
if(packetSize)processUDPData();
}
boolean findCard()
{
if (rfidReader.available()){
unsigned char startByte = rfidReader.read();
if (startByte == '%') return true;
else return false;
}
}
void getCardID()
{
while(rfidReader.available() <=12){};
for(uint8_t i = 0; i<= 12;i++)
{
cardNumber[i] = rfidReader.read();
}
if(cardNumber[12] == '?'){
cardNumber[12] = '\0';
Serial.println(cardNumber);
lcd.setCursor(3,3);
lcd.print(cardNumber);
relayState = !relayState;
digitalWrite(PIN_RELAY,relayState);
Serial.println("Sending ID");
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(cardNumber);
Udp.endPacket();
}
else Serial.println("Cartao Invalido");
}
void processUDPData()
{
Serial.print("Ip do PC e: ");
IPAddress remote = Udp.remoteIP();
for (int i =0; i < 4; i++)
{
Serial.print(remote[i], DEC);
if (i < 3)
{
Serial.print(".");
}
}
Serial.print(", na porta ");
Serial.println(Udp.remotePort());
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
Serial.println("Contents:");
Serial.println(packetBuffer);
int digit = atoi(packetBuffer);
if(digit == 1){Serial.print("Liga");digitalWrite(PIN_RELAY,0);}
if(digit == 0){Serial.print("Desliga");digitalWrite(PIN_RELAY,1);}
Serial.println(digit);
if (digit == '1')
// send a reply, to the IP address and port that sent us the packet we received
Serial.println("Sending");
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
O desafio que me lançaram foi automatizar uma cancela de um parque de uma discoteca.O cliente VIP tem cartoes RFID que pode chegar a entrada da discoteca e passar o cartão na cancela.O arduino envia esse ID do cartao via sockect udp para o servidor da discoteca e ele lê na basedados se esta ou não autorizado a entrar.Se estiver ele envia para o arduino um 1 senao envia 0 e não abre a cancela(ira dar uma info no lcd inda nao implementado )
Em termos prova de conceito em breadboard esta a funcionar, necessita de corrigir umas cenas , mas o código que escrevi pode te dar uma luz para o que queres fazer.Estou a implementar tudo o que necessitas.(RFid Mifare , Lcd, Rele e ethernet shield)
O meu LCD é I2C para poupar no numero de fios, mas podes usar qualquer outro adaptando o codigo.
O código não esta terminado, comentado nem livre de falhas, sim porque as tem 8)
Para testares o socket UDP sacas isto:
Depois na aba UDP Client colocas o ip 192.168.100.3 na porta 8888 e fazes open
Sempre que passes um cartao no leitor devera aparecer no programa e se escreveres 1 e carregares em SEND o rele deve atracar
Enviando um 0 deve desligar
Como te disse retira a idea do meu codigo, nao me peças para eu o alterar para fazer isto ou aquilo pois nao o farei!
Apenas posso ajudar-te com duvidas que tenhas
Podes usa-lo como te der na telha ...