Simulando um caixa eletrônico utilizando um LCD como um painel de saldo.
O LCD 16x2 com módulo I2C exibe o saldo atual e informações das operações realizadas. E os dois LEDs ajudam a dar feedback visual: verde para operação realizada com sucesso e vermelho para indicar erro.
O objetivo é praticar conceitos como:
- Variáveis para armazenar o saldo e os valores das operações
- Operações aritméticas, somando valores em depósitos e subtraindo em saques
- Validação de regras, impedindo saques maiores que o saldo disponível
- Leitura e interpretação de comandos digitados pelo usuário
👉 Compile esse fonte no Arduino, abra o Monitor Serial e utilize os comandos de depósito e saque para interagir com o sistema. Observe como o saldo é atualizado no LCD e como os LEDs indicam o resultado de cada operação realizada.
Modifique o código, criando novas regras e novas operações. Vamos usar o Arduino como ferramenta para treinar lógica de programação!
Segue o esquema de ligação e o código fonte com comentários para entendimento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | /*---------------------------------------------------------- Programa : CAIXA ELETRÔNCO - PAINEL DE SALDO Autor : Fellipe Couto [ https://www.efeitonerd.com.br ] Data : 01/01/2026 ----------------------------------------------------------*/ #include <LiquidCrystal_I2C.h> //https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library #define LED_RED 2 #define LED_GREEN 3 LiquidCrystal_I2C lcd(0x3F, 16, 2); //LCD 16x2 no endereço 0x3F float saldo = 0; void setup() { //Configuração dos pinos dos leds pinMode(LED_RED, OUTPUT); pinMode(LED_GREEN, OUTPUT); //Inicia a comunicação serial Serial.begin(115200); //Inicializa o LCD lcd.begin(); //Mensagem inicial na serial Serial.println("CAIXA ELETRONICO - PAINEL DE SALDO"); Serial.println("www.efeitonerd.com.br"); Serial.println("Operacoes: depositar 0,00 | sacar 0,00"); Serial.println("Ex.: depositar 10,50 | sacar 2,00"); Serial.println("\nDigite uma operacao:"); //Exibe o valor do saldo atual no LCD exibirSaldo(); } void loop() { //Verifica se existe algum dado vindo pela Serial if (Serial.available() > 0) { //Lê a linha digitada até o ENTER (\n) e retorna uma string inteira String operacao = Serial.readStringUntil('\n'); //Remove espaços do início e fim operacao.trim(); //Se o usuário só apertar ENTER, ignora if (operacao.length() == 0) return; //Função para processar as operações de depositos e saques processarOperacao(operacao); //Exibe o valor do saldo atual no LCD exibirSaldo(); } } void processarOperacao(String operacao) { //Converte para minúsculo para garantir as comparações operacao.toLowerCase(); //Obtém o valor da operação float valor = extrairValor(operacao); if (valor <= 0) { erro("Valor invalido."); return; } //Verifica qual operação será realizada if (operacao.startsWith("depositar")) { operacaoDeposito(valor); //Exibe a mensagem de deposito no LCD e soma o valor ao saldo } else if (operacao.startsWith("sacar")) { operacaoSaque(valor); //Exibe a mensagem de saque no LCD e subtrai o valor do saldo } else { erro("Op invalida."); //Possui valor mas a operação é inválida } } float extrairValor(String operacao) { int espaco = operacao.indexOf(32); //Espaço na tabela ASCII if (espaco < 0) return 0; //Se não tiver espaço, retorna o valor zero String strValor = operacao.substring(espaco + 1); //Obtém o valor strValor.replace(",", "."); //Troca vírgula por ponto return strValor.toFloat(); //Retorna o valor convertido para o tipo float } void exibirSaldo() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("CAIXA ELETRONICO"); lcd.setCursor(0, 1); lcd.print("Saldo: R$ " + String(saldo)); } void operacaoDeposito(float valor) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Depositando..."); lcd.setCursor(0, 1); lcd.print("R$ " + String(valor)); digitalWrite(LED_GREEN, HIGH); delay(1000); digitalWrite(LED_GREEN, LOW); delay(2000); saldo += valor; //Soma o valor do depósito ao saldo lcd.clear(); lcd.setCursor(3, 0); lcd.print("DEPOSITO"); lcd.setCursor(3, 1); lcd.print("REALIZADO!"); digitalWrite(LED_GREEN, HIGH); delay(4000); digitalWrite(LED_GREEN, LOW); } void operacaoSaque(float valor) { if (valor <= saldo) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Sacando..."); lcd.setCursor(0, 1); lcd.print("R$ " + String(valor)); digitalWrite(LED_GREEN, HIGH); delay(1000); digitalWrite(LED_GREEN, LOW); delay(2000); saldo -= valor; //Subtrai o valor do saldo lcd.clear(); lcd.setCursor(5, 0); lcd.print("SAQUE"); lcd.setCursor(3, 1); lcd.print("REALIZADO!"); digitalWrite(LED_GREEN, HIGH); delay(4000); digitalWrite(LED_GREEN, LOW); } else { erro("Sem saldo."); } } void erro(String erro) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("ERRO:"); lcd.setCursor(0, 1); lcd.print(erro); for (int i = 0; i < 30; i++) { digitalWrite(LED_RED, !digitalRead(LED_RED)); delay(100); } digitalWrite(LED_RED, LOW); } |

Nenhum comentário:
Postar um comentário