#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int trigPin = 9;    // Pin para el Trig
const int echoPin = 10;   // Pin para el Echo
const int redPin = 6;    // Pin para el componente rojo del LED RGB
const int greenPin = 5;  // Pin para el componente verde del LED RGB
const int bluePin = 3;   // Pin para el componente azul del LED RGB
const int buzzerPin = 11;  // Pin para el zumbador

long duracion;
int distancia;
int ultimaDistancia = 0;

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
}

void cambiarColorRGB(int distancia)
{
  // Invierte el mapeo para que el color verde sea más intenso a distancias mayores
  int rojo = constrain(map(distancia, 0, 400, 255, 0), 0, 255);
  int verde = constrain(map(distancia, 0, 400, 0, 255), 0, 255);
  int azul = 0;  // No cambia el componente azul

  analogWrite(redPin, rojo);
  analogWrite(greenPin, verde);
  analogWrite(bluePin, azul);

  // Genera un tono en el zumbador
  int frecuencia = map(distancia, 0, 400, 1760, 440);
  tone(buzzerPin, frecuencia);
}

void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duracion = pulseIn(echoPin, HIGH);
  distancia = (duracion * 0.034) / 2;

  Serial.println(distancia);

  if (distancia != ultimaDistancia)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Distancia: ");
    lcd.print(distancia);
    lcd.print("cm");
    ultimaDistancia = distancia;

    cambiarColorRGB(distancia);
  }

  delay(500);
}