// PINES PANTALLA LCD - digitales
#define EN 13
//      RW GND 
#define RS 12
#define D7 11
#define D6 10
#define D5 8
#define D4 7
// PINES LED RGB - digitales
#define RPIN 9
#define GPIN 6
#define BPIN 5
// PINES COMUNICACION SERIAL
#define TX 1
#define RX 0
// PINES SENSOR RADIACION SOLAR - analogos
//Vin = 3.3V
#define UVOUT  A0
//      EN = 3.3V
#define REF_3V3 A1
#define FIXED_3V3 A2
// PIN SENSOR INTENSIDAD LUMINICA - analogos
#define LIGHTSENSORPIN A3
// PINES SENSOR TEMP-HUM-PRES - analogos
#define SCL A4    // Ya implementado en la libreria I2C Wire.h 
#define SDA A5    // Ya implementado en la libreria I2C Wire.h
// PIN RELE - analogos
#define RELAYPIN A6

#define SAMPLE_TIME 1000
#define LCD_TIME 5000
#define ADDRI2C 0x76
#define SEALEVELPRESSURE_HPA (1013.25)

#include <LiquidCrystal.h>      // Libreria para pantalla LCD
#include <Wire.h>               // Libreria para sensor de temp-hum-presion at.
#include <Adafruit_Sensor.h>    // Libreria para sensor de temp-hum-presion at.
#include <Adafruit_BME280.h>    // Libreria para sensor de temp-hum-presion at.
#include <ML8511.h>             // Libreria para sensor de radiacion solar
#include "TEMT6000.h"           // Libreria para sensor de luz
#include "RGBled.h"             // Libreria para led RGB
#include "RELAY.h"              // Libreria para relay

LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);            // Pantalla LCD
Adafruit_BME280 bme;                                  // Sensor de temp-hum-presion at.
ML8511 uvSensor(UVOUT, REF_3V3);                      // Sensor de radiacion solar
TEMT6000 lightSensor(LIGHTSENSORPIN);                 // Sensor de luz
RGBled led(RPIN, GPIN, BPIN);                         // LED RGB
RELAY relay(RELAYPIN);                                // Rele

unsigned long lcdTimer = 0;
unsigned long sampleTimer = 0;

void setup(){
  Serial.begin(9600);         // Inicio comunicacion serial.
  lcd.begin(16, 2);           // Inicio pantalla LCD.
  if(!bme.begin(ADDRI2C, &Wire)){
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  pinMode(FIXED_3V3, OUTPUT);
  analogWrite(FIXED_3V3, 168);
  uvSensor.begin();           // Inicio sensor UV.
  lightSensor.begin();        // Inicio sensor de luz.
  led.begin();                // Inicia LED RGB.
  relay.begin();              // Inicia el rele.
  // Imprimir por pantalla un mensaje de inicio.
  lcd.setCursor(0, 0);
  lcd.print("INICIANDO");
  delay(1000);
  lcd.clear();
}

void loop(){
  led.RED();
  Serial.println("===============================");
  // Lectura sensor de temperatura, humedad y presion ambiental
  float ambTemp = bme.readTemperature();
  float ambHum = bme.readHumidity();
  float ambPres = bme.readPressure() / 100.0F;
  // Lectura sensor de altura de agua
  float uvRad = uvSensor.readSensor();
  // Lectura sensor de luz
  float lightInt = lightSensor.getLightIntensity();
  led.YELLOW();
  // Envio de datos de temperatura, humedad y presion ambiental
  Serial.println("Sensor BME:");
  Serial.print("Temperatura ambiental = ");
  Serial.print(ambTemp);
  Serial.println(" °C");
  Serial.print("Humedad relativa = ");
  Serial.print(ambHum);
  Serial.println(" %");
  Serial.print("Presion atmosferica = ");
  Serial.print(ambPres);
  Serial.println(" hPa");
  // Envio de datos de radiacion solar
  Serial.println("Sensor ML8511:");
  Serial.print("Intesidad de radiacion: ");
  Serial.print(uvRad);
  Serial.println(" [W/m^2]");
  // Envio de datos de intensidad de luz
  Serial.println("Sensor TEMT6000:");
  Serial.print("Intesidad de luz: ");
  Serial.print(lightInt);
  Serial.println(" [algo]");
  // Acciones de pantalla LCD
  sampleTimer = millis();
  while(millis () - sampleTimer < SAMPLE_TIME){


    
    led.GREEN();
    lcd.setCursor(0, 0);
    lcd.print("Temp. amb.-*C:");
    lcd.setCursor(0, 1);
    lcd.print(ambTemp);
    lcdTimer = millis();
    while(millis() - lcdTimer <  LCD_TIME){
      // Nada
    }
    lcd.clear();
    if(millis () - sampleTimer > SAMPLE_TIME) 
      break;
    lcd.setCursor(0, 0);
    lcd.print("Humedad rel.-%:");
    lcd.setCursor(0, 1);
    lcd.print(ambHum);
    lcdTimer = millis();
    while(millis() - lcdTimer <  LCD_TIME){
      // Nada
    }
    lcd.clear();
    if(millis () - sampleTimer > SAMPLE_TIME) 
      break;
    lcd.setCursor(0, 0);
    lcd.print("Presion.at.-hPa:");
    lcd.setCursor(0, 1);
    lcd.print(ambPres);
    lcdTimer = millis();
    while(millis() - lcdTimer <  LCD_TIME){
      // Nada
    }
    lcd.clear();
    if(millis () - sampleTimer > SAMPLE_TIME) 
      break;
    lcd.setCursor(0, 0);
    lcd.print("Alt.estanque-cm:");
    lcd.setCursor(0, 1);
    lcdTimer = millis();
    while(millis() - lcdTimer <  LCD_TIME){
    }
    lcd.clear();
  }
}
