Advertisement
RuiViana

GravarTagV01.ino

Nov 4th, 2018
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.27 KB | None | 0 0
  1. #define Rui
  2.  
  3. #define solenoidPin  3
  4. #define buzzer      14
  5. #define SS_PIN      10
  6. #define RST_PIN      9
  7.  
  8. #include <EEPROM.h>
  9. #include <Wire.h>
  10. #include <LiquidCrystal_I2C.h>
  11. LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Inicializa o display no endereco 0x27
  12. #include <SPI.h>
  13. #include <MFRC522.h>
  14. MFRC522 rfid(SS_PIN, RST_PIN);
  15. MFRC522::MIFARE_Key key;
  16. MFRC522::StatusCode status;
  17.  
  18. byte  block;
  19. byte  buffer1[18];
  20. byte  len;
  21. byte  nuidPICC[4];
  22. int ledState = LOW;
  23. unsigned long uidCliente = 0;
  24. long saldo           = 0;
  25. long meuSaldo   = 0;
  26. bool creditado = false;
  27. //-----------------------------------------------------------------------------
  28. void setup()
  29. {
  30.  
  31.   Serial.begin(115200);
  32.   pinMode(solenoidPin,    OUTPUT);
  33.   pinMode(buzzer,         OUTPUT);
  34.   digitalWrite(solenoidPin,   LOW);
  35.  
  36.   SPI.begin();
  37.   rfid.PCD_Init();
  38.   lcd.begin (16, 2);
  39.   lcd.setCursor(0, 0);
  40.   lcd.setBacklight(HIGH);
  41.   lcd.print("INICIALIZANDO");
  42.   lcd.setCursor(0, 1);
  43.   lcd.print("O SISTEMA");
  44.   delay(200);
  45.   bipe(1, 20);
  46. }
  47. //-----------------------------------------------------------------------------
  48. void loop()
  49. {
  50.   if (leCartao() == 0)
  51.     return;
  52.   bipe(1, 20);
  53.   Serial.println(" Digite o Valor" );
  54.   while (creditado == false)
  55.   {
  56.     if (Serial.available() > 0)
  57.     {
  58.       saldo = Serial.parseInt();
  59.       fimDeOperacao();
  60.     }
  61.   }
  62. }
  63. //--------------------------------------------------------------------------------------
  64. void fimDeOperacao()                                                                    // GRAVAR SALDO
  65. {
  66.   digitalWrite(solenoidPin,   LOW);                                            // FECHA SOLENOIDE
  67.   for (int i = 0; i < 4; i++)                                                   // PISCA SALDO
  68.   {
  69.     lcd.setCursor(0, 1);
  70.     lcd.print("                ");
  71.     delay(200);
  72.     lcd.setCursor(0, 1);
  73.     lcd.print("SALDO: R$ ");
  74.     lcd.print((float)saldo / 100, 2);
  75.     delay(200);
  76.   }
  77.   meuSaldo = (long)(saldo);                                     //(long)(35.27 * 100);       // DEBUG
  78.   for (int i = 0; i < 4; i++)
  79.   {
  80.     buffer1[i] = (buffer1[i] << 8) + (meuSaldo & 0xFF);
  81.     meuSaldo = meuSaldo >> 8;
  82.   }
  83.   bipe(3, 20);
  84.   if (saldo < 1)  // 1 centavo
  85.     return;
  86.   unsigned long uidTroco = 0;         // VERIFICA SE A UID DA TAG QUE RECEBE O TROCO É A MESMA QUE SE SERVIU AGORA.
  87.   for (byte i = 0; i < 4; i++)
  88.   {
  89.     nuidPICC[i] = rfid.uid.uidByte[i];
  90.     uidTroco = uidTroco << 8;
  91.     uidTroco = uidTroco + (long)nuidPICC[i];
  92.   }
  93.   //  Serial.print("uidCliente: ");
  94.   //  Serial.println(uidCliente, HEX);
  95.   //  Serial.print("uidTroco: ");
  96.   //  Serial.println(uidTroco, HEX);
  97.   //  if (uidCliente != uidTroco)
  98.   //  {
  99.   //    lcd.clear();
  100.   //    lcd.print("CARTAO DIFERENTE");
  101.   //    lcd.setCursor(0, 1);
  102.   //    lcd.print("TROCO ARMAZENADO");
  103.   //    delay(2000);
  104.   //    rfid.PICC_HaltA();
  105.   //    rfid.PCD_StopCrypto1();
  106.   //    return;
  107.   //  }            // FIM VERIFICA SE A UID DA TAG QUE RECEBE O TROCO É A MESMA QUE SE SERVIU AGORA.
  108.   block = 4;
  109.   Serial.println(F("Authenticating using key A..."));
  110.   status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(rfid.uid));
  111.   if (status != MFRC522::STATUS_OK)
  112.   {
  113.     Serial.print(F("PCD_Authenticate() failed: "));
  114.     Serial.println(rfid.GetStatusCodeName(status));
  115.     rfid.PICC_HaltA();                                                          // Halt PICC
  116.     rfid.PCD_StopCrypto1();                                                     // Stop encryption on PCD
  117.     return;
  118.   }
  119. #ifdef Rui
  120.   Serial.print ("Rui 2");
  121.   //status = rfid.MIFARE_Write(block, buffer1, 16);       // <<<------------------------------------------------
  122.   creditado = true;
  123. #else
  124.   status = rfid.MIFARE_Write(block, buffer1, 16);         // <<<------------------------------------------------
  125.   creditado = true;
  126. #endif
  127.   if (status != MFRC522::STATUS_OK)
  128.   {
  129.     Serial.print(F("MIFARE_Write() failed: "));
  130.     Serial.println(rfid.GetStatusCodeName(status));
  131.     return;
  132.   }
  133.   else
  134.   {
  135.     Serial.println(F("MIFARE_Write() success: "));
  136.   }
  137.   rfid.PICC_HaltA();                                                          // Halt PICC
  138.   rfid.PCD_StopCrypto1();                                                     // Stop encryption on PCD
  139.   saldo       = 0;
  140.   lcd.setCursor(0, 0);
  141.   lcd.print  ("MUITO OBRIGADO  ");
  142.   lcd.setCursor(0, 1);
  143.   lcd.print  ("SISTEMA TAPHERR ");
  144.   bipe(2, 100);
  145.  
  146.   delay(3000);
  147.   lcd.clear();
  148. }
  149. //------------------------------------------------------------------------
  150. byte leCartao()
  151. {
  152.   creditado = false;
  153.   Serial.println("Aproxime o cartão");
  154.   uidCliente = -1;
  155.   while ((!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()))
  156.   {
  157.     lcd.setCursor(0, 0);
  158.     lcd.print("SISTEMA TAPHERR ");
  159.     lcd.setCursor(0, 1);
  160.     lcd.print("APROXIME CARTAO ");
  161.     if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial())
  162.     {
  163.       break;
  164.     }
  165.   }
  166.   MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  167.   if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&                           // CARTÃO É DO TIPO CORRETO?
  168.       piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
  169.       piccType != MFRC522::PICC_TYPE_MIFARE_4K)
  170.     return 0;                                                                 // CARTÃO NÃO É DO TIPO CORRETO
  171.   for (byte i = 0; i < 4; i++)                                                // GRAVA A UID E NA EEPROM
  172.   {
  173.     nuidPICC[i] = rfid.uid.uidByte[i];
  174.     uidCliente = uidCliente << 8;
  175.     uidCliente = uidCliente + (long)nuidPICC[i];
  176.   }
  177.   for (byte i = 0; i < 6; i++)
  178.   {
  179.     key.keyByte[i] = 0xFF;
  180.   }
  181.   block = 4;
  182.   len = 18;
  183.   status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(rfid.uid)); //line 834 of MFRC522.cpp file
  184.   if (status != MFRC522::STATUS_OK)
  185.     return;
  186.   status = rfid.MIFARE_Read(block, buffer1, &len);
  187.   if (status != MFRC522::STATUS_OK)
  188.     return;
  189.   Serial.print("UID: ");
  190.   Serial.println(uidCliente, HEX);
  191.   return 1;
  192. }
  193. //------------------------------------------------------------------------
  194. void bipe(byte bipes, word _delay)
  195. {
  196.   for (byte i = 1; i < bipes + 1; i++)
  197.   {
  198.     digitalWrite(buzzer, HIGH);
  199.     delay(_delay);
  200.     digitalWrite(buzzer, LOW);
  201.     delay(_delay);
  202.   }
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement