const float LOWER_THRESHOLD = 1.0;   // Limiar inferior para codificar como '0'
const float UPPER_THRESHOLD = 3.5;   // Limiar superior para codificar como '1'

void setup() {
  Serial.begin(9600);
  
  // Configura as 8 portas digitais como saída (para controlar os LEDs)
  for (int i = 2; i <= 9; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  int inputValues[5];  // Vetor para armazenar os valores 
                       //das entradas
  char encodedLetter;  // Letra correspondente à entrada

  // Leitura das 5 entradas analógicas e codificação
  for (int i = 0; i < 5; i++) {
    int analogValue = analogRead(i);
    if (analogValue < LOWER_THRESHOLD / 5 * 1023) {
      inputValues[i] = 0;
    } else if (analogValue > UPPER_THRESHOLD / 5 * 1023) {
      inputValues[i] = 1;
    } else {
      Serial.println("Erro: Valor analógico fora da faixa válida.");
      return;  // Sair se o valor estiver fora da faixa válida
    }
  }

  // Convertendo os valores para um único byte
  //poner código expandido
  byte encodedByte = 0;bool encoByte[5];
  for (int i = 0; i < 5; i++) {
  //  encodedByte |= inputValues[i] << (4 - i);
    int shiftedValue = inputValues[i] << (4 - i);
    encodedByte |= shiftedValue;
  }


// Mapeamento para a letra correspondente
  if (encodedByte == 0x0F) {
    encodedLetter = ' ';  // Espaço
  } else {
    // Mapeamento de '0001' -> 'A', '0010' -> 'B', ...
    encodedLetter = 'A' + encodedByte - 1;  
  }
  Serial.print(encodedByte, BIN);
  Serial.print(" -> ");
  Serial.println(encodedLetter);
  

  //Criptografo meus dados
 byte resultByte = 4 * encodedByte;
//Serial.println(" Serial.print = ");
//Serial.println((resultByte));


  // Realiza a operação e separa por bits
for (int i = 0; i < 8; i++) {
  // Extrai o i-ésimo bit da resposta e envia para a porta digital correspondente
  /*int bitValue = (resultByte & (1 << (7 - i))) ? HIGH : LOW;
  digitalWrite(2 + i, bitValue);*/
  
    int bitShift = 7 - i;// Valor mais representativo da mascara
    int mask = 1 << bitShift;//Mascara de deslocamento
    
    int bitValue;
    if (resultByte & mask) {
        bitValue = HIGH;
    } else {
        bitValue = LOW;
    }

    int pin = 2 + i;
    digitalWrite(pin, bitValue);

  // Exibe o valor enviado para a porta digital
  Serial.print("Porta ");
  Serial.print(i + 2);  // Para exibir a porta correspondente (2 a 9)
  Serial.print(": ");
  Serial.println(bitValue == HIGH ? "HIGH" : "LOW");
  delay(500);
}
  
  // Envio do código e letra correspondente
  //Serial.print("0000");  // Indicando início de transmissão de uma letra

  

  delay(2000);  // Aguarda um segundo antes de ler a próxima letra
}