/* Codigo adaptado com auxílio da IA CHATGPT*/

//BIBLIOTECA, VARIÁVEIS e DEFINIÇÕES-----------------------------------------------------------------------------

// Inclusão de bibliotecas
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <SoftwareSerial.h> //Para os pinos do Esp32 funcionar como porta serial
#include <TinyGPS++.h>
#include <Pushbutton.h> //Configuração dos botões
 
//Bibliotecas e definições GPS
#define GPS_RX 16
#define GPS_TX 17
#define GPS_Serial_Baud 9600
SoftwareSerial gpsSerial(GPS_RX, GPS_TX); //Rx=16 e Tx=17
TinyGPSPlus gps;

//Variáveis GPS
int k,kr, //Variáveis relógio
		HHGST,MMGST,SSGST,HLST,HLT,HL,HH,MM,DL,Seg,DJ,Ano3; //Variáveis da Hora Sideral
char c;
long satelites;
bool recebido = false;
unsigned long hora1,Dia,Mes,Ano,Mes2,Ano2;
float longit,MM1,SS1,mn2,Dia2,GMTh,EsteDia,GMST,Mes3,
      Hora,Minuto,Segundo,s2,
      regis_Z; //Variável da inclinação

int satelitesant = 0, ano;
int AA;
double t,passo1,passo2,passo3,to,n1,h1,n2,latitude, longitude, altitude, curso, lat, lon;
long chs,a,b;
unsigned long data,horaRE;
byte mes, dia, hora, minuto, segundo, centesimo, horalocal;
float altitudeGPS, lat1, long1, lat2, long2, s;
float mn,hora2,d;
int Cg; //Curso geografico - dado pelo GPS
int Pg; //Posicao geografica - calculado
long lat3,lon3,latAnt=0,lonAnt=0; //Latitude e longitude
int ValorAlinha=0;
bool recCg = false;

//Variáveis e definições do Sensor BME 280
#define SEALEVELPRESSURE_HPA (1013.25) //necessário para a leitura da altitude
Adafruit_BME280 bme;
bool status;  // Cria uma variável status de iniciação do sensor BME

// Definição da Altura e largura do display OLED 
#define SCREEN_WIDTH 128 // Largura display, em pixels 
#define SCREEN_HEIGHT 64 // Altura display, em pixels
// Declaração pino reset para I2C do display OLED
#define OLED_RESET 	-1 // Será o mesmo reset da placa
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Criação objeto display

// Variáveis Sensor de UV
int UVSensorPin = 2;// Conectado ao pino A0 (GPIO2)
float sensorValue;
int sensorUV;
int nivelUV;

//Biblioteca, variáveis e definições dos botões
#define BUTTON_NAV 18     // Botão para navegação
#define BUTTON_SELECT 19  // Botão para seleção

// Variáveis do Menu
int menuIndex = 0;
unsigned long ultimaLeitura = 0;
const unsigned long debounceDelay = 200;
static bool ultimaNaveg = HIGH;  //Botão de navegalção recebe  alto
static bool ultimaSelec = HIGH; //Botão de seleção recebe  alto

// Pino analógico que recebe a tensão da bateria (via divisor de tensão, ex: GPIO 34)
#define VBAT_PIN 34
// Tensão máxima e mínima da CR2032
#define VBAT_MAX 3.0
#define VBAT_MIN 2.0

//Declarações das Funções
void medUv(); //Função que mede o UV
void GPS(); //Função GPS
void medTPU(); //Função Temperatura,Pressão e Umidade
void DataHora(); //Função Data e Hora
void Menu(); //Função Menu
void gpsLoop(); //Função de verificação de conexão com GPS


//SETUP-------------------------------------------------------------------------------------------------------
void setup(){
	Serial.begin(115200); //Inicia a cominicação serial
  
  gpsSerial.begin(GPS_Serial_Baud); //Inicia a conexão com gps

  pinMode(BUTTON_NAV, INPUT_PULLUP); //Aloca os botões
  pinMode(BUTTON_SELECT, INPUT_PULLUP);
	
	if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { //Inicia OLED
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }

  status = bme.begin(0x76, &Wire); //Inicia o sensor TPU. Endereço 0x76
	
}
//LOOP------------------------------------------------------------------------------------------------- 
void loop(){
  
  gpsLoop();
  Menu();
 
  switch (menuIndex) {
    case 0:
      medUV();
      break;
    case 1:
      medTPU();
      break;
    case 2:
      DataHora();
      break;
    case 3:
      GPS();
      break;
  }
  	  
}