// ------------------------- FIAP -------------------------
// CHECKPOINT 4
// EDGE COMPUTING & COMPUTER SYSTEMS
// Participantes:
// Prof. Paulo Marcotti PF2150
// Felipe Sousa de Oliveira RM559085
// --------------------------------------------------------
// ---------------------- EXPLICAÇÃO ----------------------
// O circuito ao lado controla a frequência e a ativação de um buzzer, 
// utilizando um botão e um potenciômetro. O tom do buzzer é ajustado 
// com base na leitura do potenciômetro, sendo somente ativado com o clique 
// do botão. A cada ciclo, o valor do potenciômetro é lido e mapeado. Quando 
// o botão é pressionado, o buzzer toca a frequência correspondente. Caso 
// contrário, o buzzer permanece desligado. O sistema também imprime no 
// monitor serial o valor do potenciômetro, a frequência calculada, e o 
// estado do botão ("pressionado" ou "não pressionado"). Assim, a interação 
// entre potenciômetro e buzzer é monitorada em tempo real.
// --------------------------------------------------------
const int buzzerPin = 32;  
const int potPin = 13;  
int buttonState = 0;       
boolean soundEnabled = true; 
const int buttonPin = 4;   
void setup() {
  pinMode(buttonPin, INPUT);  
  pinMode(buzzerPin, OUTPUT); 
  Serial.begin(115200); // Inicializa o monitor serial com baud rate do ESP32 de 115200 como orientado em sala de aula
}
void loop() {
  buttonState = digitalRead(buttonPin);  // Leitura do estado do botão
  // Verifica se o botão foi pressionado
  if (buttonState == HIGH) {
    soundEnabled = !soundEnabled;  // ON | OFF
    delay(250);
  }
  // Se o som estiver ativado
  if (soundEnabled) {
    int sensorValue = analogRead(potPin);  // Leitura do valor do potenciômetro
    int frequency = map(sensorValue, 0, 1023, 100, 2000);  // Mapeamento do valor da frequência
    // Imprime a frequência mapeada no monitor serial
    Serial.print("Frequência do buzzer: ");
    Serial.println(frequency);
    tone(buzzerPin, frequency);  // Toca a frequência mapeada no buzzer
    delay(10);
    
    // Média da frequência e Estado do botão (cálculo simples realizado apenas para ilustração, como orientado no CP)
    float media = (float)(frequency + buttonState) / 2;  
    Serial.print("Média (frequência + estado do botão): ");
    Serial.println(media);
  } else {
    noTone(buzzerPin);  // Para o som quando o buzzer estiver desligado
    // Exibe no monitor serial que o som está desligado
    Serial.println("Som desligado");
  }
  // Imprime se o botão está ativado ou não no monitor serial
  if (buttonState == HIGH) {
    Serial.println("Botão pressionado");
  } else {
    Serial.println("Botão não pressionado");
  }
  delay(300); // Pequeno delay de 300 milisegundos
}