,

Dependencies:   MFRC522 EEPROM4UID

Committer:
anyela
Date:
Sun Jan 23 05:03:44 2022 +0000
Revision:
0:5e7ab8dedbe3
,

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anyela 0:5e7ab8dedbe3 1 ///Test of cheap 13.56 Mhz RFID-RC522 module from eBay
anyela 0:5e7ab8dedbe3 2 //This code is based on Martin Olejar's MFRC522 library. Minimal changes
anyela 0:5e7ab8dedbe3 3 //Adapted for Nucleo STM32 F401RE. Should work on other Nucleos too
anyela 0:5e7ab8dedbe3 4
anyela 0:5e7ab8dedbe3 5
anyela 0:5e7ab8dedbe3 6 //Connect as follows:
anyela 0:5e7ab8dedbe3 7 //RFID pins -> Nucleo header CN5 (Arduino-compatible header)
anyela 0:5e7ab8dedbe3 8 //----------------------------------------
anyela 0:5e7ab8dedbe3 9 //RFID IRQ=pin5 -> Not used. Leave open
anyela 0:5e7ab8dedbe3 10 //RFID MISO=pin4 -> Nucleo SPI_MISO=P12 adaptado para LPC
anyela 0:5e7ab8dedbe3 11 //RFID MOSI=pin3 -> Nucleo SPI_MOSI=P11
anyela 0:5e7ab8dedbe3 12 //RFID SCK=pin2 -> Nucleo SPI_SCK =P13
anyela 0:5e7ab8dedbe3 13 //RFID SDA=pin1 -> Nucleo SPI_CS =PB_6=D10 // para LPC P9
anyela 0:5e7ab8dedbe3 14 //RFID RST=pin7 -> Nucleo =PA_9=D8 // para LPC p28
anyela 0:5e7ab8dedbe3 15 //3.3V and Gnd to the respective pins
anyela 0:5e7ab8dedbe3 16
anyela 0:5e7ab8dedbe3 17
anyela 0:5e7ab8dedbe3 18 #include "mbed.h"
anyela 0:5e7ab8dedbe3 19 #include "MFRC522.h"
anyela 0:5e7ab8dedbe3 20 #include "EthernetInterface.h"
anyela 0:5e7ab8dedbe3 21
anyela 0:5e7ab8dedbe3 22 // Nucleo Pin for MFRC522 reset (pick another D pin if you need D8)
anyela 0:5e7ab8dedbe3 23 #define MF_RESET p8
anyela 0:5e7ab8dedbe3 24
anyela 0:5e7ab8dedbe3 25
anyela 0:5e7ab8dedbe3 26 DigitalOut LedGreen(LED1);
anyela 0:5e7ab8dedbe3 27
anyela 0:5e7ab8dedbe3 28
anyela 0:5e7ab8dedbe3 29 //Serial connection to PC for output
anyela 0:5e7ab8dedbe3 30
anyela 0:5e7ab8dedbe3 31
anyela 0:5e7ab8dedbe3 32
anyela 0:5e7ab8dedbe3 33 //MFRC522 RfChip(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, MF_RESET);
anyela 0:5e7ab8dedbe3 34 MFRC522 RfChip(p11,p12,p13,p9, MF_RESET);
anyela 0:5e7ab8dedbe3 35
anyela 0:5e7ab8dedbe3 36 //********************************************************************
anyela 0:5e7ab8dedbe3 37
anyela 0:5e7ab8dedbe3 38
anyela 0:5e7ab8dedbe3 39 struct node {
anyela 0:5e7ab8dedbe3 40 uint8_t data1;
anyela 0:5e7ab8dedbe3 41 uint8_t data2;
anyela 0:5e7ab8dedbe3 42 uint8_t data3;
anyela 0:5e7ab8dedbe3 43 uint8_t data4;
anyela 0:5e7ab8dedbe3 44 struct node *next;
anyela 0:5e7ab8dedbe3 45 };
anyela 0:5e7ab8dedbe3 46
anyela 0:5e7ab8dedbe3 47 // Se crean las estructuras front, rear y temp
anyela 0:5e7ab8dedbe3 48 struct node* front = NULL; // el puntento front de la estructura front se igual a null
anyela 0:5e7ab8dedbe3 49 struct node* rear = NULL;
anyela 0:5e7ab8dedbe3 50 struct node* temp; // nodo temporal
anyela 0:5e7ab8dedbe3 51 struct node* aux; // nodo auxiliar
anyela 0:5e7ab8dedbe3 52
anyela 0:5e7ab8dedbe3 53
anyela 0:5e7ab8dedbe3 54 void Insert(uint8_t val1, uint8_t val2, uint8_t val3, uint8_t val4)
anyela 0:5e7ab8dedbe3 55 {
anyela 0:5e7ab8dedbe3 56 if (rear == NULL) {
anyela 0:5e7ab8dedbe3 57 rear = new node; // se crea el nodo rear
anyela 0:5e7ab8dedbe3 58 rear->next = NULL; // la direccion del siguiente nodo es a null
anyela 0:5e7ab8dedbe3 59 rear->data1 = val1; // se agregan los datos
anyela 0:5e7ab8dedbe3 60 rear->data2 = val2;
anyela 0:5e7ab8dedbe3 61 rear->data3 = val3;
anyela 0:5e7ab8dedbe3 62 rear->data4 = val4;
anyela 0:5e7ab8dedbe3 63 front = rear; // se igual punto front a rear
anyela 0:5e7ab8dedbe3 64 }
anyela 0:5e7ab8dedbe3 65 else{
anyela 0:5e7ab8dedbe3 66 aux = front;
anyela 0:5e7ab8dedbe3 67 while (aux!= NULL) {
anyela 0:5e7ab8dedbe3 68 if ((aux->data1==val1) && (aux->data2==val2) && (aux->data3==val3) &&(aux->data4==val4)){
anyela 0:5e7ab8dedbe3 69 printf("ID already inserted \n\r");
anyela 0:5e7ab8dedbe3 70 return;
anyela 0:5e7ab8dedbe3 71 }
anyela 0:5e7ab8dedbe3 72 temp = temp->next;
anyela 0:5e7ab8dedbe3 73 }
anyela 0:5e7ab8dedbe3 74
anyela 0:5e7ab8dedbe3 75 temp=new node;
anyela 0:5e7ab8dedbe3 76 rear->next = temp;
anyela 0:5e7ab8dedbe3 77 temp->data1 = val1;
anyela 0:5e7ab8dedbe3 78 temp->data2 = val2;
anyela 0:5e7ab8dedbe3 79 temp->data3 = val3;
anyela 0:5e7ab8dedbe3 80 temp->data4 = val4;
anyela 0:5e7ab8dedbe3 81 temp->next = NULL;
anyela 0:5e7ab8dedbe3 82 rear = temp;
anyela 0:5e7ab8dedbe3 83 }
anyela 0:5e7ab8dedbe3 84 }
anyela 0:5e7ab8dedbe3 85
anyela 0:5e7ab8dedbe3 86 void Display() {
anyela 0:5e7ab8dedbe3 87
anyela 0:5e7ab8dedbe3 88 temp = front;
anyela 0:5e7ab8dedbe3 89 if ((front == NULL) && (rear == NULL)) {
anyela 0:5e7ab8dedbe3 90 printf("Queue is empty");
anyela 0:5e7ab8dedbe3 91 return;
anyela 0:5e7ab8dedbe3 92 }
anyela 0:5e7ab8dedbe3 93 while (temp != NULL) {
anyela 0:5e7ab8dedbe3 94 printf("Queue:\n");
anyela 0:5e7ab8dedbe3 95 printf(" %02X ",temp->data1);
anyela 0:5e7ab8dedbe3 96 printf(" %02X ",temp->data2);
anyela 0:5e7ab8dedbe3 97 printf(" %02X ",temp->data3);
anyela 0:5e7ab8dedbe3 98 printf(" %02X ",temp->data4);
anyela 0:5e7ab8dedbe3 99 printf("\n");
anyela 0:5e7ab8dedbe3 100 temp = temp->next;
anyela 0:5e7ab8dedbe3 101
anyela 0:5e7ab8dedbe3 102 }
anyela 0:5e7ab8dedbe3 103 }
anyela 0:5e7ab8dedbe3 104
anyela 0:5e7ab8dedbe3 105
anyela 0:5e7ab8dedbe3 106 uint32_t UID[4];
anyela 0:5e7ab8dedbe3 107 EthernetInterface net;
anyela 0:5e7ab8dedbe3 108
anyela 0:5e7ab8dedbe3 109 int main(void)
anyela 0:5e7ab8dedbe3 110 {
anyela 0:5e7ab8dedbe3 111 // Bring up the ethernet interface
anyela 0:5e7ab8dedbe3 112 printf("Ethernet socket example\n");
anyela 0:5e7ab8dedbe3 113 net.connect();
anyela 0:5e7ab8dedbe3 114
anyela 0:5e7ab8dedbe3 115 // Show the network address
anyela 0:5e7ab8dedbe3 116 SocketAddress a;
anyela 0:5e7ab8dedbe3 117 net.get_ip_address(&a);
anyela 0:5e7ab8dedbe3 118 printf("IP address: %s\n", a.get_ip_address() ? a.get_ip_address() : "None");
anyela 0:5e7ab8dedbe3 119
anyela 0:5e7ab8dedbe3 120 // Open a socket on the network interface, and create a TCP connection to mbed.org
anyela 0:5e7ab8dedbe3 121 TCPSocket socket;
anyela 0:5e7ab8dedbe3 122 socket.open(&net);
anyela 0:5e7ab8dedbe3 123 a="192.168.0.11";
anyela 0:5e7ab8dedbe3 124
anyela 0:5e7ab8dedbe3 125 //net.gethostbyname("ifconfig.io", &a);
anyela 0:5e7ab8dedbe3 126 a.set_port(80);
anyela 0:5e7ab8dedbe3 127 socket.connect(a);
anyela 0:5e7ab8dedbe3 128
anyela 0:5e7ab8dedbe3 129
anyela 0:5e7ab8dedbe3 130 printf("starting...\n");
anyela 0:5e7ab8dedbe3 131
anyela 0:5e7ab8dedbe3 132 // Init. RC522 Chip
anyela 0:5e7ab8dedbe3 133 RfChip.PCD_Init();
anyela 0:5e7ab8dedbe3 134
anyela 0:5e7ab8dedbe3 135 while (true) {
anyela 0:5e7ab8dedbe3 136
anyela 0:5e7ab8dedbe3 137 LedGreen = 1;
anyela 0:5e7ab8dedbe3 138
anyela 0:5e7ab8dedbe3 139 // Look for new cards
anyela 0:5e7ab8dedbe3 140 if ( ! RfChip.PICC_IsNewCardPresent()) {
anyela 0:5e7ab8dedbe3 141 //wait_ms(500);
anyela 0:5e7ab8dedbe3 142 ThisThread::sleep_for(500ms);
anyela 0:5e7ab8dedbe3 143 continue;
anyela 0:5e7ab8dedbe3 144 }
anyela 0:5e7ab8dedbe3 145
anyela 0:5e7ab8dedbe3 146 // Select one of the cards
anyela 0:5e7ab8dedbe3 147 if ( ! RfChip.PICC_ReadCardSerial()) {
anyela 0:5e7ab8dedbe3 148 //wait_ms(500);
anyela 0:5e7ab8dedbe3 149 ThisThread::sleep_for(500ms);
anyela 0:5e7ab8dedbe3 150 continue;
anyela 0:5e7ab8dedbe3 151 }
anyela 0:5e7ab8dedbe3 152
anyela 0:5e7ab8dedbe3 153 LedGreen = 0;
anyela 0:5e7ab8dedbe3 154
anyela 0:5e7ab8dedbe3 155 printf("New card UID to add: ");
anyela 0:5e7ab8dedbe3 156 for (uint8_t i = 0; i < RfChip.uid.size; i++) {
anyela 0:5e7ab8dedbe3 157 printf(" %02X",RfChip.uid.uidByte[i]);
anyela 0:5e7ab8dedbe3 158 UID[i]=RfChip.uid.uidByte[i];
anyela 0:5e7ab8dedbe3 159 }
anyela 0:5e7ab8dedbe3 160 printf("\n\r");
anyela 0:5e7ab8dedbe3 161
anyela 0:5e7ab8dedbe3 162
anyela 0:5e7ab8dedbe3 163 uint8_t a,b,c,d;
anyela 0:5e7ab8dedbe3 164 a=RfChip.uid.uidByte[0];
anyela 0:5e7ab8dedbe3 165 b=RfChip.uid.uidByte[1];
anyela 0:5e7ab8dedbe3 166 c=RfChip.uid.uidByte[2];
anyela 0:5e7ab8dedbe3 167 d=RfChip.uid.uidByte[3];
anyela 0:5e7ab8dedbe3 168 Insert(a,b,c,d);
anyela 0:5e7ab8dedbe3 169 Display();
anyela 0:5e7ab8dedbe3 170
anyela 0:5e7ab8dedbe3 171 // Send a simple http request
anyela 0:5e7ab8dedbe3 172 //char sbuffer[] = "Hola";
anyela 0:5e7ab8dedbe3 173 //char sbuffer[] = "GET / HTTP/1.1\r\nHost: ifconfig.io\r\n\r\n";
anyela 0:5e7ab8dedbe3 174 int scount = socket.send(UID,4);
anyela 0:5e7ab8dedbe3 175 printf("sent %d [%p]\n",scount,UID);
anyela 0:5e7ab8dedbe3 176
anyela 0:5e7ab8dedbe3 177 // Recieve a simple http response and print out the response line
anyela 0:5e7ab8dedbe3 178 //char rbuffer[64];
anyela 0:5e7ab8dedbe3 179 //int rcount = socket.recv(rbuffer, sizeof rbuffer);
anyela 0:5e7ab8dedbe3 180 //printf("recv %d [%.*s]\n", rcount, strstr(rbuffer, "\r\n") - rbuffer, rbuffer);
anyela 0:5e7ab8dedbe3 181
anyela 0:5e7ab8dedbe3 182 // Close the socket to return its memory and bring down the network interface
anyela 0:5e7ab8dedbe3 183 //socket.close();
anyela 0:5e7ab8dedbe3 184
anyela 0:5e7ab8dedbe3 185 // Bring down the ethernet interface
anyela 0:5e7ab8dedbe3 186 //net.disconnect();
anyela 0:5e7ab8dedbe3 187 printf("Done\n");
anyela 0:5e7ab8dedbe3 188 }
anyela 0:5e7ab8dedbe3 189
anyela 0:5e7ab8dedbe3 190 }
anyela 0:5e7ab8dedbe3 191
anyela 0:5e7ab8dedbe3 192 //algoritmo de busqueda que encuentre un UID;
anyela 0:5e7ab8dedbe3 193
anyela 0:5e7ab8dedbe3 194 void print_dtb(UID* dtb,uint16_t N){
anyela 0:5e7ab8dedbe3 195 for(int i=0; i<N; i++){
anyela 0:5e7ab8dedbe3 196 for(int j=0; j<4;j++)
anyela 0:5e7ab8dedbe3 197 printf("%02x ",dtb.bytes[j]);
anyela 0:5e7ab8dedbe3 198 printf("\n");
anyela 0:5e7ab8dedbe3 199 }
anyela 0:5e7ab8dedbe3 200 }
anyela 0:5e7ab8dedbe3 201
anyela 0:5e7ab8dedbe3 202
anyela 0:5e7ab8dedbe3 203 void EEPROM4UID::updt_nuid(NUID num){ // parea actualizar los uids de la memoria
anyela 0:5e7ab8dedbe3 204 uint8_t initUIDnum[]={num ->uid_hl[0],'\n'};
anyela 0:5e7ab8dedbe3 205 writeStr_EEPROM(0x0000,initUIDnum);
anyela 0:5e7ab8dedbe3 206 }