Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define Rui
- #define solenoidPin 3
- #define buzzer 14
- #define SS_PIN 10
- #define RST_PIN 9
- #include <EEPROM.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Inicializa o display no endereco 0x27
- #include <SPI.h>
- #include <MFRC522.h>
- MFRC522 rfid(SS_PIN, RST_PIN);
- MFRC522::MIFARE_Key key;
- MFRC522::StatusCode status;
- byte clientesMax = 170;
- byte clienteLgh = 4;
- byte clienteCnt = 0;
- int addr = 0;
- int addrCli = 0;
- bool clientef = false;
- bool clienteNew = false;
- bool erro01 = false;
- byte block;
- byte buffer1[18];
- byte len;
- byte nuidPICC[4];
- byte sensorInterrupt = 0;
- byte flowMeterSensorPin = 2;
- byte fechouConta = 1;
- volatile byte pulseCount;
- float calibrationFactor = 4.5;
- float flowRate;
- float saldoInicial = 0.00; // saldo inicial do cliente, quando ele chega na máquina;
- unsigned int flowMilliLitres;
- unsigned int timerParado = 0;
- unsigned int timerPegarTroco = 0;
- int ledState = LOW;
- unsigned long totalMilliLitres;
- unsigned long previousMillis = 0;
- unsigned long oldTime;
- unsigned long uidCliente = 0;
- long saldo = 0;
- word lastMl = 0;
- long meuSaldo = 0;
- const long interval = 1000;
- //-----------------------------------------------------------------------------
- void setup()
- {
- attachInterrupt(digitalPinToInterrupt(flowMeterSensorPin), pulseCounter, FALLING);
- Serial.begin(115200);
- pinMode(solenoidPin, OUTPUT);
- pinMode(buzzer, OUTPUT);
- digitalWrite(solenoidPin, LOW);
- pinMode(flowMeterSensorPin, INPUT);
- digitalWrite(flowMeterSensorPin, HIGH);
- pulseCount = 0;
- flowRate = 0.0;
- flowMilliLitres = 0;
- totalMilliLitres = 0;
- oldTime = 0;
- SPI.begin();
- rfid.PCD_Init();
- lcd.begin (16, 2);
- lcd.setCursor(0, 0);
- lcd.setBacklight(HIGH);
- lcd.print("INICIALIZANDO");
- lcd.setCursor(0, 1);
- lcd.print("O SISTEMA");
- delay(200);
- bipe(1, 20);
- }
- //-----------------------------------------------------------------------------
- void loop()
- {
- Serial.println("\n\n--- VERIFICAÇÕES INICIAIS ---");
- long transferidor = 0 ;
- if (leCartao() == 0)
- return;
- bipe(1, 20);
- addr = 0;
- findCliente();
- if ( clientef == true)
- {
- EEPROM.get(addr + 4, transferidor );
- }
- for (int i = 3; i > -1; i--)
- {
- saldo = saldo << 8;
- saldo = saldo + (buffer1[i]);
- }
- Serial.print("\nsaldo do Cliente NA TAG: ");
- Serial.println((float)saldo / 100);
- Serial.print("saldo da eeprom: ");
- saldo += transferidor;
- Serial.println((float)transferidor / 100);
- Serial.print("saldoacumulado: ");
- Serial.println((float)saldo / 100);
- zerarSaldo();
- if (erro01) {
- rfid.PICC_HaltA();
- rfid.PCD_StopCrypto1();
- return;
- }
- lcd.clear();
- lcd.print("SALDO: R$ ");
- lcd.print((float)saldo / 100, 2);
- if (saldo > 0)
- digitalWrite(solenoidPin, HIGH);
- else
- {
- Serial.println("CARTÃO SEM SALDO. FIM.");
- fechouConta = 1;
- lcd.setCursor(0, 0);
- lcd.print("FIM DE OPERACAO ");
- lcd.setCursor(0, 1);
- lcd.print("CARTAO SEM SALDO");
- bipe(4, 50);
- rfid.PICC_HaltA(); // Halt PICC
- rfid.PCD_StopCrypto1();
- delay(2000);
- return;
- }
- saldoInicial = saldo;
- fechouConta = 0;
- Serial.println("--- FIM DAS VERIFICAÇÕES INICIAIS ---\n");
- Serial.println("=== INÍCIO DE OPERAÇÃO ===");
- while (fechouConta == 0)
- {
- if ((millis() - oldTime) > 100)
- {
- detachInterrupt(sensorInterrupt);
- flowRate = ((100.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
- oldTime = millis();
- flowMilliLitres = (flowRate / 60) * 100;
- totalMilliLitres += flowMilliLitres;
- if (lastMl != totalMilliLitres) // ===> CLIENTE ESTÁ SE SERVINDO
- {
- fechouConta = 0;
- lastMl = totalMilliLitres;
- saldo = saldo - (long)(lastMl * 0.23);
- if (saldo < 1) // 1 Centavo
- fimDeOperacao();
- }
- else
- timerParado++;
- lcd.setCursor(0, 0);
- lcd.print("CONSUMO: ");
- lcd.print(totalMilliLitres);
- lcd.print("ml ");
- lcd.setCursor(0, 1);
- lcd.print("SALDO: R$ ");
- lcd.print((float)saldo / 100, 2);
- if (timerParado > 40)
- {
- fimDeOperacao();
- }
- pulseCount = 0;
- attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
- } // if((millis() - oldTime) > 100)
- } // while(!fechouConta)
- }
- //--------------------------------------------------------------------------------------
- void fimDeOperacao() // GRAVAR SALDO
- {
- fechouConta = 1;
- timerParado = 0;
- totalMilliLitres = 0;
- attachInterrupt(digitalPinToInterrupt(flowMeterSensorPin), pulseCounter, FALLING);
- digitalWrite(solenoidPin, LOW); // FECHA SOLENOIDE
- for (int i = 0; i < 4; i++) // PISCA SALDO
- {
- lcd.setCursor(0, 1);
- lcd.print(" ");
- delay(200);
- lcd.setCursor(0, 1);
- lcd.print("SALDO: R$ ");
- lcd.print((float)saldo / 100, 2);
- delay(200);
- }
- meuSaldo = (long)(saldo); //(long)(35.27 * 100); // DEBUG
- for (int i = 0; i < 4; i++)
- {
- buffer1[i] = (buffer1[i] << 8) + (meuSaldo & 0xFF);
- meuSaldo = meuSaldo >> 8;
- }
- bipe(3, 20);
- if (saldo < 1) // 1 centavo
- return;
- long uidTroco = 0; // VERIFICA SE A UID DA TAG QUE RECEBE O TROCO É A MESMA QUE SE SERVIU AGORA.
- for (byte i = 0; i < 4; i++)
- {
- nuidPICC[i] = rfid.uid.uidByte[i];
- uidTroco = uidTroco << 8;
- uidTroco = uidTroco + (long)nuidPICC[i];
- }
- // Serial.print("uidCliente: ");
- // Serial.println(uidCliente, HEX);
- // Serial.print("uidTroco: ");
- // Serial.println(uidTroco, HEX);
- // if (uidCliente != uidTroco)
- // {
- // lcd.clear();
- // lcd.print("CARTAO DIFERENTE");
- // lcd.setCursor(0, 1);
- // lcd.print("TROCO ARMAZENADO");
- // delay(2000);
- // rfid.PICC_HaltA();
- // rfid.PCD_StopCrypto1();
- // return;
- // } // FIM VERIFICA SE A UID DA TAG QUE RECEBE O TROCO É A MESMA QUE SE SERVIU AGORA.
- block = 4;
- status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(rfid.uid));
- if (status != MFRC522::STATUS_OK)
- {
- Serial.println("fimDeOperacao: FALHA NA AUTENTICAÇÃO");
- addr = 0;
- if ( clientef == false)
- {
- salvaCliente();
- if ( clienteNew == false)
- Serial.println("Deu merda");
- else
- addr = addrCli;
- }
- long shiftSaldo = saldo;
- byte totalSaldo = 0;
- Serial.print("addr: "); Serial.println(addr);
- for (int i = 0 ; i <= 3; i++)
- {
- totalSaldo = shiftSaldo & 0x000000FF;
- #ifdef Rui
- //EEPROM.update(addr+4 + i, totalSaldo); // <<<------------------------------------------------
- #else
- EEPROM.update(addr + 4 + i, totalSaldo); // <<<------------------------------------------------
- #endif
- shiftSaldo = shiftSaldo >> 8;
- }
- Serial.println("TROCO GRAVADO NA EEPROM.");
- Serial.println("=== OPERAÇÃO FINALIZADA ===\n\n");
- rfid.PICC_HaltA(); // Halt PICC
- rfid.PCD_StopCrypto1(); // Stop encryption on PCD
- return;
- }
- #ifdef Rui
- // status = rfid.MIFARE_Write(block, buffer1, 16); // <<<------------------------------------------------
- #else
- status = rfid.MIFARE_Write(block, buffer1, 16); // <<<------------------------------------------------
- #endif
- if (status != MFRC522::STATUS_OK)
- {
- Serial.print(F("MIFARE_Write() failed: "));
- Serial.println(rfid.GetStatusCodeName(status));
- return;
- }
- else
- {
- for (int i = 0 ; i <= 7; i++)
- {
- #ifdef Rui
- // EEPROM.update(addr + i, 0xFF); // <<<------------------------------------------------
- #else
- EEPROM.update(addr + i, 0xFF); // <<<------------------------------------------------
- #endif
- }
- Serial.println("TROCO GRAVADO DA TAG E EEPROM ZERADA COM SUCESSO.");
- }
- rfid.PICC_HaltA(); // Halt PICC
- rfid.PCD_StopCrypto1(); // Stop encryption on PCD
- saldo = 0;
- lcd.setCursor(0, 0);
- lcd.print ("MUITO OBRIGADO ");
- lcd.setCursor(0, 1);
- lcd.print ("SISTEMA TAPHERR ");
- timerPegarTroco = 0;
- bipe(2, 100);
- Serial.println("=== OPERAÇÃO FINALIZADA ===\n\n");
- delay(3000);
- lcd.clear();
- }
- //------------------------------------------------------------------------
- byte leCartao()
- {
- Serial.println("Aproxime o cartão");
- uidCliente = -1;
- while ((!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()))
- {
- lcd.setCursor(0, 0);
- lcd.print("SISTEMA TAPHERR ");
- lcd.setCursor(0, 1);
- lcd.print("APROXIME CARTAO ");
- if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial())
- {
- break;
- }
- }
- MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
- if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && // CARTÃO É DO TIPO CORRETO?
- piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
- piccType != MFRC522::PICC_TYPE_MIFARE_4K)
- return 0; // CARTÃO NÃO É DO TIPO CORRETO
- for (byte i = 0; i < 4; i++) // GRAVA A UID E NA EEPROM
- {
- nuidPICC[i] = rfid.uid.uidByte[i];
- uidCliente = uidCliente << 8;
- uidCliente = uidCliente + (long)nuidPICC[i];
- }
- for (byte i = 0; i < 6; i++)
- {
- key.keyByte[i] = 0xFF;
- }
- block = 4;
- len = 18;
- status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(rfid.uid)); //line 834 of MFRC522.cpp file
- if (status != MFRC522::STATUS_OK)
- return;
- status = rfid.MIFARE_Read(block, buffer1, &len);
- if (status != MFRC522::STATUS_OK)
- return;
- Serial.print("UID: ");
- Serial.println(uidCliente, HEX);
- return 1;
- }
- //------------------------------------------------------------------------
- void zerarSaldo()
- {
- erro01 = false;
- // meuSaldo = (long)(0);
- for (int i = 0; i < 4; i++)
- {
- buffer1[i] = 0;
- }
- status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(rfid.uid));
- if (status != MFRC522::STATUS_OK)
- {
- erro01 = true;
- Serial.print(F("PCD_Authenticate() failed: "));
- Serial.println(rfid.GetStatusCodeName(status));
- lcd.setCursor(0, 1);
- lcd.print ("FALHA AUTENTICAC ");
- Serial.println("zerarSaldo: FALHA AO AUTENTICAR O CARTÃO");
- delay(1000);
- return;
- } else
- Serial.println("zerarSaldo: AUTENTICADO COM SUCESSO.");
- #ifdef Rui
- //status = rfid.MIFARE_Write(block, buffer1, 16); // <<<------------------------------------------------
- #else
- status = rfid.MIFARE_Write(block, buffer1, 16); // <<<------------------------------------------------
- #endif
- if (status != MFRC522::STATUS_OK)
- {
- erro01 = true;
- Serial.print(F("MIFARE_Write() failed: "));
- Serial.println(rfid.GetStatusCodeName(status));
- lcd.setCursor(0, 1);
- lcd.print ("FALHA ZERAR SALDO");
- Serial.println("zerarSaldo: FALHA AO ESCREVER NO CARTÃO");
- delay(1000);
- return;
- }
- else
- Serial.println("zerarSaldo: CARTÃO ZERADO COM SUCESSO.");
- }
- //------------------------------------------------------------------------
- void pulseCounter()
- {
- pulseCount++;
- fechouConta = 0;
- }
- //------------------------------------------------------------------------
- void bipe(byte bipes, word _delay)
- {
- for (byte i = 1; i < bipes + 1; i++)
- {
- digitalWrite(buzzer, HIGH);
- delay(_delay);
- digitalWrite(buzzer, LOW);
- delay(_delay);
- }
- }
- //--------------------------------------------------------------------------
- void findCliente()
- {
- long compara = 0;
- while (addr < 1024)
- {
- EEPROM.get(addr, compara);
- if ( compara == uidCliente)
- {
- // Serial.print("Cliente encontrado no end. : "); Serial.println(addr);
- clientef = true;
- return;
- }
- addr += 8;
- }
- addr = 0;
- Serial.println("Cliente não encontrado : ");
- clientef = false;
- return;
- }
- //--------------------------------------------------------------------------
- void salvaCliente()
- {
- long NewCliente = 0;
- long procura = 0;
- while (addrCli < 1024)
- {
- EEPROM.get(addrCli, procura);
- if ( procura == 0xFFFFFFFF)
- {
- // Serial.print("Cliente espaço no end. : "); Serial.println(addrCli);
- clienteNew = true;
- long shiftCli = uidCliente;
- for (int i = 0 ; i <= 3; i++)
- {
- NewCliente = shiftCli & 0x000000FF;
- #ifdef Rui
- //EEPROM.update(addrCli + i, NewCliente); // <<<------------------------------------------------
- #else
- EEPROM.update(addrCli + i, NewCliente); // <<<------------------------------------------------
- #endif
- shiftCli = shiftCli >> 8;
- }
- Serial.print(F("NewCliente na EEPROM "));
- return;
- }
- addrCli += 8;
- }
- addrCli = 0;
- Serial.println("Cliente não salvo : ");
- clienteNew = false;
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement