
,
Dependencies: MFRC522 EEPROM4UID
main.cpp@0:5e7ab8dedbe3, 2022-01-23 (annotated)
- Committer:
- anyela
- Date:
- Sun Jan 23 05:03:44 2022 +0000
- Revision:
- 0:5e7ab8dedbe3
,
Who changed what in which revision?
User | Revision | Line number | New 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 | } |