#include <Encoder.h>
#include <U8g2lib.h>

// Definir pines para componentes
#define LDR_PIN A7
#define SHUTTER_ENCODER_A_PIN D5
#define SHUTTER_ENCODER_B_PIN D4
#define APERTURE_ENCODER_A_PIN D3
#define APERTURE_ENCODER_B_PIN D2
#define BUTTON_PIN D11
#define OLED_SCL_PIN D8
#define OLED_SDA_PIN D7

// Definir límites de medición
int light_min = 0;
int light_max = 1023;
int shutter_min = 1;
int shutter_max = 4000;
int aperture_min = 1;
int aperture_max = 22;

// Crear objetos para encoders
Encoder shutter_encoder(SHUTTER_ENCODER_A_PIN, SHUTTER_ENCODER_B_PIN);
Encoder aperture_encoder(APERTURE_ENCODER_A_PIN, APERTURE_ENCODER_B_PIN);

// Crear objeto para pantalla OLED
U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, OLED_SCL_PIN, OLED_SDA_PIN);

void setup() {
  // Inicializar pines de entrada y salida
  pinMode(LDR_PIN, INPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  // Inicializar pantalla OLED
  oled.begin();
  oled.clearBuffer();
  oled.setFont(u8g2_font_6x10_tf);
  oled.drawStr(0, 10, "Fotometro");
  oled.sendBuffer();
}

void loop() {
  // Leer valor del LDR
  int light_value = analogRead(LDR_PIN);

  // Leer posiciones de encoders
  int shutter_value = shutter_encoder.read();
  int aperture_value = aperture_encoder.read();

  // Ajustar límites de medición con encoders
  if (shutter_value < shutter_min) shutter_min = shutter_value;
  if (shutter_value > shutter_max) shutter_max = shutter_value;
  if (aperture_value < aperture_min) aperture_min = aperture_value;
  if (aperture_value > aperture_max) aperture_max = aperture_value;

  // Comprobar si la medición está dentro de los límites
  if (light_value >= light_min && light_value <= light_max) {
    // Encender LED verde
    digitalWrite(LED_GREEN_PIN, HIGH);
    digitalWrite(LED_RED_PIN, LOW);
    digitalWrite(LED_YELLOW_PIN, LOW
      } else if (light_value < light_min) {
    // Encender LED rojo
    digitalWrite(LED_GREEN_PIN, LOW);
    digitalWrite(LED_RED_PIN, HIGH);
    digitalWrite(LED_YELLOW_PIN, LOW);
  } else if (light_value > light_max) {
    // Encender LED amarillo
    digitalWrite(LED_GREEN_PIN, LOW);
    digitalWrite(LED_RED_PIN, LOW);
    digitalWrite(LED_YELLOW_PIN, HIGH);
  }

  // Leer estado del botón
  int button_state = digitalRead(BUTTON_PIN);

  // Comprobar si el botón ha sido presionado
  if (button_state == LOW) {
    // Cambiar entre modos de medición
    // (por ejemplo, velocidad de obturación, apertura de diafragma, ISO)
    // ... código para cambiar entre modos
  }

  // Mostrar información en pantalla OLED
  oled.clearBuffer();
  oled.drawStr(0, 10, "Luz: " + String(light_value));
  oled.drawStr(0, 20, "Velocidad: " + String(shutter_value));
  oled.drawStr(0, 30, "Apertura: " + String(aperture_value));
  oled.sendBuffer();

  // Esperar antes de volver a medir
  delay(100);
}