25 de dezembro de 2025

Validador de Datas

Validando se uma data é válida, com o Arduino.

Através do Monitor Serial o usuário digita uma data e o Arduino analisa se é válida ou não, verificando as regras de dia, mês, ano e se o formato está correto.

O foco desse projeto não é a data em si, mas o estudo de lógica de programação, usando o Arduino como a ferramenta para interpretar textos e aplicar as regras. 

O objetivo principal é trabalhar conceitos básicos de programação, como:

  • Manipulação de Strings, extraindo partes do texto digitado
  • Uso do tipo char, validando o formato da data caractere por caractere
  • Conversão de texto para números, transformando dia, mês e ano em valores inteiros

Assim como no projeto Validador de Senhasé para quem está começando e quer entender como o computador lê e interpreta textos, aplicando regras simples para resolver um problema.

👉Compile esse fonte no Arduino, abra o Monitor Serial e digite as datas no formato DD/MM/AAAA para testar a validação.

Mexa no código e adicione as suas validações. Tente validar outros formatos, como o padrão de sistemas AAAA-MM-DD. Faça evoluir para tratar ano bissexto e outras regras.

Segue 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
/*----------------------------------------------------------
  Programa : VALIDADOR DE DATAS (DD/MM/AAAA)
  Autor    : Fellipe Couto [ https://www.efeitonerd.com.br ]
  Data     : 25/12/2025
  ----------------------------------------------------------*/

void setup() {
  //Inicia a comunicação serial
  Serial.begin(115200);

  //Delay para garantir que o Monitor Serial conecte
  delay(1000);

  //Mensagens iniciais
  Serial.println("VALIDADOR DE DATAS");
  Serial.println("www.efeitonerd.com.br");
  Serial.println("\nDigite uma data (ex: 25/12/2025):");
}

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 dataSerial = Serial.readStringUntil('\n');
    dataSerial.trim();  //Remove espaços do início e fim

    //Se o usuário só apertar ENTER, ignora
    if (dataSerial.length() == 0) {
      Serial.println("Nenhuma data foi digitada.");
      return;
    }

    //Valida a data e já imprime o resultado
    validarData(dataSerial);
    delay(1000);

    Serial.println("\nDigite outra data:");
  }
}

void validarData(String data) {
  //Valida do formato - 10 caracteres
  if (data.length() != 10) {
    Serial.println("Data invalida: formato deve ser DD/MM/AAAA");
    return;
  }

  //Valida se as barras estão nas posições corretas
  if (data.charAt(2) != '/' || data.charAt(5) != '/') {
    Serial.println("Data invalida: faltando '/' nas posicoes corretas");
    return;
  }

  //Valida se os demais caracteres são números (tudo exceto posição 2 e 5)
  for (int i = 0; i < data.length(); i++) {
    if (i == 2 || i == 5) continue;  //Pula as barras
    char c = data.charAt(i);

    //char é um número (ASCII). '0' a '9' são valores consecutivos.
    bool isNumero = (c >= '0' && c <= '9');

    if (!isNumero) {
      Serial.println("Data invalida: use apenas numeros e '/' (ex: 25/12/2025)");
      return;
    }
  }

  //Extrai o dia, mês e ano usando substring
  String diaStr = data.substring(0, 2);   // "25"
  String mesStr = data.substring(3, 5);   // "12"
  String anoStr = data.substring(6, 10);  // "2025"

  //Converte para int
  int dia = diaStr.toInt();
  int mes = mesStr.toInt();
  int ano = anoStr.toInt();

  //Valida os intervalos de dia, mês e ano
  if (ano <= 0) {
    Serial.println("Data invalida: ano invalido");
    return;
  }

  if (mes < 1 || mes > 12) {
    Serial.println("Data invalida: mes deve estar entre 01 e 12");
    return;
  }

  if (dia < 1) {
    Serial.println("Data invalida: dia deve ser maior ou igual a 1");
    return;
  }

  //Valida o número de dias de acordo com o mês
  int maxDia = diasNoMes(mes);

  if (dia > maxDia) {
    Serial.print("Data invalida: esse mes vai ate ");
    Serial.println(maxDia);
    return;
  }

  //Aqui passou por todas as validações e a data é válida
  Serial.print("Data valida -> ");
  Serial.println(data);
}

int diasNoMes(int mes) {
  //Meses com 31 dias: 1, 3, 5, 7, 8, 10 e 12
  if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) {
    return 31;
  }

  //Meses com 30 dias: 4, 6, 9 e 11
  if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
    return 30;
  }

  //Fevereiro (2) sem considerar anos bissextos
  return 28;
}

Nenhum comentário:

Postar um comentário