21ani

emoney_merchant_lcd

Jul 12th, 2020
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.44 KB | None | 0 0
  1. /*
  2.  * Peringatan : Data akan di simpan pada RFID Card pada sector #1 (blocks #4).
  3.  *
  4.  * tytomulyono.com
  5.  * Typical pin layout used:
  6.  * --------------------------------------
  7.  *             MFRC522      Arduino      
  8.  *             Reader/PCD   Uno/101      
  9.  * Signal      Pin          Pin          
  10.  * --------------------------------------
  11.  * RST/Reset   RST          9            
  12.  * SPI SS      SDA(SS)      10            
  13.  * SPI MOSI    MOSI         11 / ICSP-4  
  14.  * SPI MISO    MISO         12 / ICSP-1  
  15.  * SPI SCK     SCK          13 / ICSP-3  
  16.  * tytomulyono.com
  17.  */
  18.  
  19. #include <SPI.h>
  20. #include <MFRC522.h>
  21. #include <Wire.h>
  22. #include <LiquidCrystal_I2C.h>
  23.  
  24. LiquidCrystal_I2C lcd(0x27, 16, 2);
  25.  
  26. #define RST_PIN         9
  27. #define SS_PIN          6
  28.  
  29. MFRC522 mfrc522(SS_PIN, RST_PIN);
  30.  
  31. MFRC522::MIFARE_Key key;
  32.  
  33. long tagihan = 400;            // isikan tagihan merchant kelipatan 1000, max 255rb
  34.  
  35. bool notif = true;
  36.  
  37. long saldo;
  38. int digit;
  39.  
  40. long OLDsaldo;
  41. int OLDdigit;
  42.  
  43. void setup() {
  44.     Serial.begin(9600);
  45.     SPI.begin();        
  46.     mfrc522.PCD_Init();
  47.  
  48.     for (byte i = 0; i < 6; i++) {
  49.         key.keyByte[i] = 0xFF;
  50.     }
  51.  
  52.     Serial.println("EMONEY Tanpa Server - Merchant");
  53.     Serial.println();
  54.     Serial.println("Peringatan : Data akan di simpan pada RFID Card pada sector #1 (blocks #4)");
  55.     Serial.println();
  56.  
  57.     lcd.begin();
  58.     lcd.home ();
  59.     lcd.setCursor(0,0);
  60.     lcd.print("EMONEY - ADI");  
  61.    
  62.     if (tagihan > 255000){
  63.       while(1){
  64.         Serial.println("ERROR - Tagihan merchant lebih dari 255rb");
  65.       }
  66.     }
  67.  
  68.     Serial.print("Tagihan Merchant : ");
  69.     Serial.println(tagihan);
  70.  
  71.     lcd.setCursor(0,1);
  72.     lcd.print("Harga ");
  73.     lcd.print(tagihan);
  74.    
  75.     digit = tagihan/1000;
  76.     //Serial.println(digit);
  77. }
  78.  
  79. void loop() {
  80.   if (notif){
  81.     notif = false;
  82.     Serial.println();
  83.     Serial.println("________________________________________________________________________________");
  84.     Serial.println("Silahkan tap kartu");
  85.     Serial.print("Setiap TAP, saldo berkurang sebesar ");
  86.     Serial.println(tagihan);
  87.   }
  88.   if ( ! mfrc522.PICC_IsNewCardPresent()){
  89.       return;
  90.   }
  91.  
  92.   if ( ! mfrc522.PICC_ReadCardSerial()){
  93.       return;
  94.   }
  95.  
  96.   Serial.println();
  97.   Serial.print("Card UID:");
  98.   dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  99.  
  100.   Serial.println();
  101.   Serial.print("Tipe Kartu : ");
  102.   MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  103.   Serial.println(mfrc522.PICC_GetTypeName(piccType));
  104.  
  105.   // Cek kesesuaian kartu
  106.   if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
  107.       &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
  108.       &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
  109.       Serial.println(F("Kode ini hanya dapat digunakan pada MIFARE Classic cards 1KB - 13.56MHz."));
  110.       notif = true;
  111.       delay(2000);
  112.       resetReader();
  113.       return;
  114.   }
  115.  
  116.   // that is: sector #1, covering block #4 up to and including block #7
  117.   byte sector         = 1;
  118.   byte blockAddr      = 4;
  119.  
  120.   MFRC522::StatusCode status;
  121.   byte buffer[18];
  122.   byte size = sizeof(buffer);
  123.  
  124.   //Serial.println("Current data in sector:");
  125.   mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
  126.   Serial.println();
  127.  
  128.   // Baca Saldo yang ada dari RFID Card
  129.   status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  130.   if (status != MFRC522::STATUS_OK) {
  131.       Serial.println("Gagal Baca Kartu RFID");
  132.       //Serial.println(mfrc522.GetStatusCodeName(status));
  133.       resetReader();
  134.       return;
  135.   }
  136.   OLDdigit = buffer[0];
  137.   OLDsaldo = OLDdigit;
  138.   OLDsaldo *= 1000;
  139.   Serial.print("Saldo Kartu Sebelumnya : ");
  140.   Serial.println(OLDsaldo);
  141.   Serial.println();
  142.   lcd.setCursor(0,2);
  143.   lcd.print("Saldo Kartu");
  144.   lcd.setCursor(0,3);
  145.   lcd.print(OLDsaldo);
  146.   delay(2000);
  147.   lcd.setCursor(0,2);
  148.   lcd.print("                   ");
  149.   lcd.setCursor(0,3);
  150.   lcd.print("                   ");
  151.  
  152.   // Kurangi Saldo sebesar tagihan merchant
  153.   if (OLDdigit < digit){
  154.     Serial.println("Saldo belum di kurangi, saldo tidak cukup, silahkan isi saldo terlebih dahulu");
  155.     Serial.println("GAGAL bayar merchant");
  156.     lcd.setCursor(0,2);
  157.     lcd.print("GAGAL Bayar");
  158.     lcd.setCursor(0,3);
  159.     lcd.print("Saldo Kurang");
  160.     delay(2000);
  161.     lcd.setCursor(0,2);
  162.     lcd.print("                   ");
  163.     lcd.setCursor(0,3);
  164.     lcd.print("                   ");
  165.  
  166.     resetReader();
  167.     return;
  168.   }
  169.  
  170.   OLDdigit -= digit;
  171.  
  172.   byte dataBlock[]    = {
  173.       //0,      1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15
  174.       OLDdigit, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  175.   };
  176.   status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
  177.   if (status != MFRC522::STATUS_OK) {
  178.       Serial.println("GAGAL Write Saldo pada Kartu RFID");
  179.       //Serial.println(mfrc522.GetStatusCodeName(status));
  180.   }
  181.   Serial.println();
  182.  
  183.   status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  184.   if (status != MFRC522::STATUS_OK) {
  185.       Serial.println("Gagal Baca Kartu RFID");
  186.       //Serial.println(mfrc522.GetStatusCodeName(status));
  187.   }
  188.  
  189.   Serial.println();
  190.  
  191.   Serial.println("Mengurangi Saldo...");
  192.   if (buffer[0] == dataBlock[0]){
  193.     saldo = buffer[0];
  194.     saldo *= 1000;
  195.     //Serial.print("data digit ke 0 : ");
  196.     //Serial.println(buffer[0]);
  197.     Serial.print("======================>>>>>> Saldo kartu sekarang : ");
  198.     Serial.println(saldo);
  199.     Serial.println("_________ Berhasil bayar Merchant ___________");
  200.     lcd.setCursor(0,2);
  201.     lcd.print("BERHASIL Bayar");
  202.     lcd.setCursor(0,3);
  203.     lcd.print("Sisa Saldo ");
  204.     lcd.print(saldo);
  205.     delay(2000);
  206.     lcd.setCursor(0,2);
  207.     lcd.print("                   ");
  208.     lcd.setCursor(0,3);
  209.     lcd.print("                   ");
  210.   }else{
  211.     Serial.println("------------ GAGAL bayar Merchant --------------");
  212.   }
  213.  
  214.   Serial.println();
  215.  
  216.   // Dump the sector data
  217.   //Serial.println("Current data in sector:");
  218.   //mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
  219.   Serial.println();
  220.  
  221.   resetReader();
  222. }
  223.  
  224. void dump_byte_array(byte *buffer, byte bufferSize) {
  225.     for (byte i = 0; i < bufferSize; i++) {
  226.         Serial.print(buffer[i] < 0x10 ? " 0" : " ");
  227.         Serial.print(buffer[i], HEX);
  228.     }
  229. }
  230.  
  231. void resetReader(){
  232.   // Halt PICC
  233.   mfrc522.PICC_HaltA();
  234.   // Stop encryption on PCD
  235.   mfrc522.PCD_StopCrypto1();
  236.  
  237.   notif = true;
  238. }
Add Comment
Please, Sign In to add comment