Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Keypad.h" // Biblioteca para controle do teclado de matrizes.
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
- //#include <LiquidCrystal.h>
- //LiquidCrystal lcd(6, 7, 5, 4, 3, 2);
- #include <SPI.h>
- #include <MFRC522.h>
- //Pinos Reset e SS modulo MFRC522
- #define SS_PIN 10
- #define RST_PIN 9
- MFRC522 mfrc522(SS_PIN, RST_PIN);
- MFRC522::MIFARE_Key key;
- char compra[30];
- float convFloat;
- char credito[30];
- float debito;
- float saldo;
- //============================== INICIO DECLARACOES TECLADO ====================================
- //composi��o do teclado 4x4
- const byte ROWS = 4; // Quatro linhas
- const byte COLS = 4; // Quatro colunas.
- int cont = 0;
- // Define o Keypad (mapa do circuito do teclado).
- char keys[ROWS][COLS] = {
- {'1', '2', '3', 'A'},
- {'4', '5', '6', 'B'},
- {'7', '8', '9', 'C'},
- {'*', '0', '#', 'D'}
- };
- // Conecta o teclado matricial em linha 0, linha 1, linha 2, linha 3 e linha 4 dos pinos do arduino.
- byte rowPins[ROWS] = {7, 6, 5, 4};
- // Conecta o teclado matricial em coluna 0, coluna 1, coluna 2, coluna 3 e coluna 4 do arduino.
- byte colPins[COLS] = {3, 2, 14, 15};
- // Cria um objeto Keypad.
- Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
- //Variaveis globais
- float tecConvFloat;
- float tecsaldo;
- byte buffer[34];
- long lidoTeclado = 0;
- long lidoCartao = 0;
- long acumulado = 0;
- //=============================== FIM DECLARACOES TECLADO =====================================
- void setup()
- {
- Serial.begin(9600); //Inicia a serial
- //=============================== INICIO SETUP TECLADO ======================================
- keypad.addEventListener(keypadEvent);
- keypad.setDebounceTime(100); //Tempo para digitar o pr�ximo digito
- //================================= FIM SETUP TECLADO =======================================
- SPI.begin(); //Inicia SPI bus
- mfrc522.PCD_Init(); //Inicia MFRC522
- //Inicializa o LCD 20x4
- lcd.begin(20, 4);
- tecmensageminicial();
- //Prepara chave - padrao de fabrica = FFFFFFFFFFFFh
- for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
- }
- void loop()
- {
- keypad.getKey();
- }
- // ============================ FIM DO LOOP / INICIO DAS FUNCOES ============================
- void mensagem_inicial_cartao()
- {
- lcd.clear();
- lcd.print(" Aproxime o seu");
- lcd.setCursor(0, 1);
- lcd.print("cartao do leitor");
- }
- void modo_leitura()
- {
- mensagem_inicial_cartao();
- int cont = 0;
- while ( ! mfrc522.PICC_IsNewCardPresent())//Aguarda cartao
- {
- lcd.setCursor(0, 2);
- lcd.print("Aguardando 5 seg: ");
- lcd.print(cont);
- if (cont == 6) {
- cont = 0;
- tecmensageminicial();
- break;
- }
- delay(1000);
- cont++;
- }
- if ( ! mfrc522.PICC_ReadCardSerial())
- {
- return;
- }
- //Mostra UID na serial
- //lcd.clear();
- //lcd.print("UID do Cartao:"); //Dump UID
- for (byte i = 0; i < mfrc522.uid.size; i++)
- {
- //lcd.setCursor(cont, 1);
- //lcd.print(mfrc522.uid.uidByte[i] < 0x10 ? "0" : " ");
- //lcd.setCursor(cont, 2);
- //lcd.print(mfrc522.uid.uidByte[i], HEX);
- //cont = cont + 2;
- }
- delay(2000);
- //Obtem os dados do setor 0, bloco 1 = Compra
- byte sector = 0;
- byte blockAddr = 1;
- byte trailerBlock = 3;
- byte status;
- byte buffer[18];
- byte size = sizeof(buffer);
- //Autenticacao usando chave A
- status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
- if (status != MFRC522::STATUS_OK)
- {
- //lcd.clear();
- //lcd.setCursor(0, 1);
- //lcd.print("PCD_Authenticate() failed:");
- //lcd.setCursor(0, 2);
- //lcd.print(mfrc522.GetStatusCodeName(status));
- return;
- }
- status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
- if (status != MFRC522::STATUS_OK)
- {
- //lcd.clear();
- //lcd.setCursor(0, 1);
- //lcd.print("MIFARE_Read() failed:");
- //lcd.setCursor(0, 2);
- //lcd.print(mfrc522.GetStatusCodeName(status));
- }
- //Transfere os dados byte armazenados no BUFFER para char em COMPRA
- for (byte i = 0; i < 16; i++)
- {
- compra[i] = buffer[i];
- }
- convFloat = atof (compra); //Converte os dados char em float
- lidoCartao = (long)convFloat;
- // Halt PICC
- mfrc522.PICC_HaltA();
- // Stop encryption on PCD
- mfrc522.PCD_StopCrypto1();
- tecmensageminicial();
- }
- //-------------------------------------------------------------
- void modo_gravacao()
- {
- mensagem_inicial_cartao();
- //Aguarda cartao
- int cont = 0;
- while ( ! mfrc522.PICC_IsNewCardPresent()) {
- lcd.setCursor(0, 2);
- lcd.print("Aguardando 5 seg: ");
- lcd.print(cont);
- if (cont == 6) {
- cont = 0;
- tecmensageminicial();
- break;
- }
- delay(1000);
- cont++;
- }
- if ( ! mfrc522.PICC_ReadCardSerial()) return;
- //Mostra UID na serial
- //lcd.clear();
- //lcd.print("UID do Cartao:"); //Dump UID
- //int cont;
- for (byte i = 0; i < mfrc522.uid.size; i++)
- {
- //lcd.setCursor(cont, 1);
- //lcd.print(mfrc522.uid.uidByte[i] < 0x10 ? "0" : " ");
- //lcd.setCursor(cont, 2);
- //lcd.print(mfrc522.uid.uidByte[i], HEX);
- //cont = cont + 2;
- }
- //Mostra o tipo do cartao
- byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
- //lcd.setCursor(0, 3);
- //lcd.print(mfrc522.PICC_GetTypeName(piccType));
- //delay(2000);
- byte block;
- byte status, len;
- block = 1;
- //Autenticacao usando chave A
- status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
- if (status != MFRC522::STATUS_OK) {
- //lcd.clear();
- //lcd.setCursor(0, 0);
- //lcd.print("PCD_Authent.()failed");
- //lcd.setCursor(0, 1);
- //lcd.print(mfrc522.GetStatusCodeName(status));
- return;
- }
- //Grava no bloco 1
- status = mfrc522.MIFARE_Write(block, buffer, 16);
- if (status != MFRC522::STATUS_OK) {
- //lcd.clear();
- //lcd.setCursor(0, 0);
- //lcd.print("MIFARE_Write()failed");
- //lcd.setCursor(0, 1);
- //lcd.println(mfrc522.GetStatusCodeName(status));
- return;
- }
- else
- {
- lcd.clear();
- lcd.setCursor(0, 1);
- lcd.print("Gravado com Sucesso!");
- }
- mfrc522.PICC_HaltA(); // Halt PICC
- mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
- delay(1000);
- tecmensageminicial();
- }
- //====================== INICIO FUNCAO MENSAGEM INICIAL TECLADO ===============================
- void tecmensageminicial() {
- lcd.clear(); //Limpa do buffer do LCD
- lcd.setCursor(0, 0);
- lcd.print("Digite A-Apagar");
- lcd.setCursor(0, 1);
- lcd.print("valor B-Banco");
- lcd.setCursor(0, 2);
- lcd.print(" e/ou C-Credito");
- lcd.setCursor(0, 3);
- lcd.print("opcao D-Debito");
- }//========================== FIM FUNCAO MENSAGEM INICIAL TECLADO =============================
- //================================ INICIO FUNCAO TECLADO ======================================
- void keypadEvent(KeypadEvent eKey)
- {
- switch (keypad.getState())
- { // Condicao switch...
- case PRESSED://Se precionado algum botao... Aparecera no Serial Monitor o valor Digitado
- if (isDigit(eKey)) // testa se o valor E um DIGITO/NUMERO
- {
- if (cont == 0) {
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Digitando valor");
- lcd.setCursor(0, 1);
- lcd.print("R$: ");
- }
- Serial.print (eKey); //Armazena numero digitado na variavel eKey.
- lcd.setCursor(4 + cont, 1);
- lcd.print(eKey);
- Serial.println(eKey);
- isDigit(eKey);
- buffer[cont] = eKey;
- credito[cont] = eKey;
- tecConvFloat = atof (credito);
- cont = cont + 1;
- Serial.print("Testando a conversao teste: ");
- Serial.println(tecConvFloat);
- lidoTeclado = (long)tecConvFloat;
- }
- else
- {
- switch (eKey)
- {
- tecConvFloat = 0;
- case 'A':
- lcd.clear();
- lcd.setCursor(0, 1);
- lcd.print(" LIMPANDO TELA...");
- delay(2000);
- eKey = "";
- tecmensageminicial();
- cont = 0;
- break;
- case 'B':
- modo_leitura();
- saldoCartao();
- Serial.print("\nsaldo anterior no cartao: ");
- Serial.println(saldo);
- delay(2000);
- tecmensageminicial();
- cont = 0;
- break;
- case 'C':
- /*DESENVOLVER FORMULA QUE VERIFICA SALDO E ADICIONA CREDITO
- =>Verificar saldo existente no cartao
- =>SOMAR com o valor digitado
- =>Gravar o novo valor/saldo*/
- modo_leitura();
- Serial.print("\nValor no BUFFER NA LEITURA do catao: ");
- Serial.println(compra);//buffer[34]
- saldoCartao();
- Serial.print("saldo anterior no cartao: ");
- Serial.println(saldo);
- acumulado = lidoCartao + lidoTeclado;
- Serial.print("Saldo Final = ");
- Serial.println(acumulado);
- Serial.print("Valor no BUFFER para gravar no catao: ");
- Serial.println(acumulado);
- ltoa(acumulado, buffer, 10);
- for (int i = 0; i < 4 ; i++)
- {
- Serial.println(buffer[i], HEX);
- }
- modo_gravacao();
- acumulado = 0;
- lidoCartao = 0;
- lidoTeclado = 0;
- convFloat = 0;
- tecConvFloat = 0;
- saldo = 0;
- cont = 0;
- break;
- case 'D':
- //DESENVOLVER FORMULA QUE VERIFICA SE EXISTE SALDO SUFICIENTE
- //=>Verificar saldo existente no cartao
- //=>SUBTRAIR pelo valor digitado
- //=>Gravar o novo saldo
- if (tecsaldo < tecConvFloat) {
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("SLD.INSUFICIENTE");
- lcd.setCursor(0, 1);
- lcd.print("TRANS. ABORTADA");
- delay(2000);
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print(" SALDO ATUAL");
- lcd.print(" R$: ");
- lcd.print(tecsaldo);
- }
- else
- {
- //DESENVOLVER FORMULA DO CREDITO RESTANTE
- }
- modo_leitura();
- saldoCartao();
- delay(2000);
- tecmensageminicial();
- break;
- }
- }
- }
- }
- //===================================== FIM FUNCAO TECLADO ===================================
- void limpaBuffer()
- {
- for (byte i = 0; i < 34; i++) buffer[i] = ' ';
- }
- //-------------------------------------------------------------------
- void saldoCartao() {
- saldo = convFloat;
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print(" CONSULTA DE SALDO");
- lcd.setCursor(1, 2);
- lcd.print("Saldo R$: ");
- lcd.print(saldo);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement