/* principal.ino
 *  jaravena@yahoo.com
     Muestra grafico de clima en web usando SVG con DOS VARIABLES
     Usa NTP para el tiempo.
  basado en   Rui Santos  https://RandomNerds y otro
 ****************************************************/
//bibliotecas e instancias del web
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <StreamString.h>
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
// datos de la LAN
const char* ssid     = "PONGA SUS DATOS";
const char* password = "PONGA SUS DATOS";
ESP8266WebServer server(80);
//Bibliotecas e instancias del sensor<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include <Wire.h>
#include <BMx280I2C.h>
#define I2C_ADDRESS 0x76
 //create a BMx280I2C object using the I2C interface with I2C Address 0x76
  BMx280I2C bmx280(I2C_ADDRESS);
// Parametros a personalizar segun SENSOR<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
String CPU = "ESP01 BMP280  ";
String titulo = "Clima con BMP280";
String unidad1="pascales";
String unidad2="grados C";
String H1 = "Pascales y grados C";
int lapso=86400; // segundos a medir= 1 dia
float escala1 = 1.005; // margen sobre  maximo y minimo del grafico=+/-escala
float escala2 = 1.1; // margen sobre el maximo y minimo del grafico=+/-escala
//factores para manejar multiplos o submultiplos de las medidas
float rango1 = 1; // segun unidades directas del sensor
float rango2 = 100.; //centesimas de grado

// parametros basicos<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
int sensor1, sensor2; // lecturas del sensor
const int largoH = 720; //largo de la historia a graficar web. Valores mayores, colapsa el ESP01
int cada =int(lapso/largoH); // numero de segundos entre medidas y refresco del web
int historia1[largoH];// almacena historia para web
int historia2[largoH];// almacena historia para web
int alto = 300; // del gráfico svg igual a declaracion <svg... el largo es = 2*largoH
int h = 0; // contador de historia web parte en cero
int maxH1, minH1; // maximo y minimo para graficar la historia con margen
int maxH2, minH2; // maximo y minimo para graficar la historia con margen
int anno, mes, dia, hora, minuto, segundo;// leidos del NTP una sola vez al inicio
int annoi, mesi, diai, horai, minutoi, segundoi;// leidos del NTP una sola vez al inicio

//===Declaracion de Rutinas===
void inisensor();
void getSensorReadings();
void iniwifi();
void fecha();
void calculos();
void handleRoot();
void handleNotFound();
void drawGraph();
static void smartDelay(unsigned long ms);

void setup() {////////////////////////////////
  Serial.begin(115200);
  Serial.print('\n'); Serial.println( __FILE__); //nombre del sketc
  iniwifi();
  inisensor();
  timeClient.begin();
  timeClient.setTimeOffset(-3 * 3600); // Santiago -3 en verano
  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS started");
  }
  server.on("/", handleRoot);
  server.on("/test.svg", drawGraph);
  server.on("/inline", []() {
    server.send(200, "text/plain", "this works");
  });
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP started");
  MDNS.update();
  fecha(); // solo se consulta una vez la fecha
  annoi = anno; mesi = mes; diai = dia; horai = hora; minutoi = minuto; segundoi = segundo; // inicio
  getSensorReadings(); // referencia inicial retorna sensor1 y sensor2

  maxH1 = int(sensor1 * escala1); // rango inicial del gráfico
  minH1 = int(sensor1 / escala1); //

  maxH2 = int(sensor2 * escala2); // rango inicial del gráfico
  minH2 = int(sensor2 / escala2); //

  for( int x=0; x<largoH;x++){// llenado incial de los array
  historia1[x] = sensor1;
  historia2[x] = sensor2; 
}
  //  Serial.println("\n fin setup");
}/////////////////////////////

void loop() {//////////////////////////////
  calculos();
  smartDelay(cada * 1000); // calculo cada x,000 segundos
}///////////////////////////////////////////////////
