1 de janeiro de 2026

Caixa Eletrônico - Painel de Saldo

Simulando um caixa eletrônico utilizando um LCD como um painel de saldo.


Toda a interação acontece pelo Monitor Serial, onde o usuário digita as operações de depósito e saque.

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