/* Professor Marcelo Fernando Morgantini - FIAP 2024
  Nessa aula teremos alguns conceitos importantes 
  sobre o controle gradual e também a leitura de dados que 
  são recebidos em uma porta analógica
  Todos os comandos utilizados nessa aula estão explicados
  de forma detalhada no site oficial do Arduino (arduino.cc) */

#define entrada A0
#define portaLed 9 /* este comando troca todas as palavras "entrada"
por "A0" antes de enviar o código ao arduino. Assim, não ocupamos 
espaço de memória usando uma variável, como se usássemos
 (int entrada = A0; ou int portaLed = 9;) */

int potenciometro = 0; // cria a variável potenciometro e atribui valor 0
int led = 0; // cria a variável led e atribui valor 0
float voltagemLed = 0; // cria uma variável com duas casas decimais

void setup() {
  // aqui definimos se uma porta é de entrada ou saída
  // não precisamos dessa definição para a porta A0, pois
  // nativamente, todas as portas analógicas são de entrada
  // então não precisa de "pinMode(entrada, INPUT);"
  pinMode(portaLed, OUTPUT);
  // agora vamos habilitar a comunicação entre o Arduino e o PC
  Serial.begin(9600);// 9600 é a velocidade de comunicação
}

void loop() {
  /* Do jeito que ligamos o potenciometro teremos uma tensão na porta
  A0 que varia de 0V até 5V. Este intervalo é transformado em números
  inteiros que vão de 0 (0V) até 1023(5V) */
potenciometro = analogRead(entrada); // guardamos o valor recebido
// na porta A0 na variável potenciometro
led = map(potenciometro, 0, 1023, 255, 0); //valor a ser atribuido à intensidade de
//acionamento do led (0 = 0V - 255 = 5V)
analogWrite(portaLed, led); // comando para acender o LED
Serial.println("Valor do potenciômetro: " + String(potenciometro));
/* Na linha acima "escrevemos" na porta serial o texto entre parenteses
e usamos a função String para converter o valor da variável 
potenciometro em texto.
Não podemos, dentro do mesmo comando Serial.print misturar texto com 
valores.
lembrando que o ln depois do print significa que após a exibição
do dado no monitor serial, uma nova linha é criada.
Uma alternativa ao comando acima seria:
Serial.print("Valor do potenciômetro: ");
Serial.println(potenciometro);*/
Serial.print("Valor PWM indo para o LED: ");
Serial.println(led);
voltagemLed = (led * 0.01953125);
Serial.print("Voltagem indo para o LED: ");
Serial.print(voltagemLed);
Serial.println("V");
delay(1000); // vai esperar 1 segundo pra fazer uma nova leitura
}