// Load Wi-Fi library
#include "WiFiEsp.h"        // https://github.com/bportaluri/WiFiEsp
#include <LPS22HBSensor.h>
#define I2C2_SCL    PB10
#define I2C2_SDA    PB11

// on défini une 2eme com serie en D2 et D8 pour communiquer avec l'ESP
HardwareSerial ESP(D0, D1); // RX, TX 

char ssid[] = "XXXXX";                        // Votre réseau wifi
char pass[] = "YYYYY";                        // Votre mdp du réseau wifi
int status = WL_IDLE_STATUS;                  // l'état du réseau wifi
const char* serveur_perso = "192.168.0.57";   // adresse ip du serveur distant
const unsigned int httpPort = 80;             // port du serveur distant
WiFiEspServer serveur(80);                    // On definit le serveur web (celui de l'esp) sur le port 80

float pressure, temperature;         // variable pour stocker les datas

LPS22HBSensor *PressTemp;            // On definit la lecture du capteur
TwoWire *dev_i2c;                    // Le port i2c   

unsigned long previousMillis = 0;    // varaible pour millis
const long interval = 10000;         // interval pour millis


void setup() {
  Serial.begin(115200);               // On démmarre la com série avec le pc a 115200 baud
  ESP.begin(115200);                  // On démmarre la com série avec l'ESP a 115200 baud
  WiFi.init(&ESP);                    // On initialisle la connection au réseau  

  // On test si on a le réseau à travers l'esp
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("Je tourve pas l'ESP");    
    while (true);  // On ne continue pas
  }
  
  // On essaye de se connécter au réseau wifi
  while ( status != WL_CONNECTED) {
    Serial.print("J'essaye de me connecter au réseau wifi : ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
  }
  // On affiche les infos de connexions
  Serial.print("Connécté à : ");
  Serial.println(WiFi.SSID());  
  IPAddress ip = WiFi.localIP();
  Serial.print("Mon ip est : ");
  Serial.println(ip);  
  // on démmarre le serveur web
  serveur.begin();
  // Initialize I2C bus.
  dev_i2c = new TwoWire(I2C2_SDA, I2C2_SCL);
  dev_i2c->begin();

  // Initlialize components.
  PressTemp = new LPS22HBSensor(dev_i2c);
  PressTemp->Enable();
}

void loop(){
 meteo();
}

void meteo(){     
    // On stock le temps écoulé depuis le début du programme dans la variable currentMillis
    unsigned long currentMillis = millis();    
    // si le temps actuel - le temps précédent dépasse l'interval       
    if (currentMillis - previousMillis >= interval) { 
      previousMillis = millis();          // On réinitialise le compteur

      // On lit le capteur
      PressTemp->GetPressure(&pressure);
      PressTemp->GetTemperature(&temperature);
  
      Serial.print("Pres[hPa]: ");
      Serial.print(pressure, 2);
      Serial.print(" | Temp[C]: ");
      Serial.println(temperature, 2); 
      
      Serial.print("connection au serveur web : ");
      Serial.print(serveur_perso);
      Serial.print(":");
      // on essaye de se connecter au serveur distant
      WiFiEspClient client = serveur.available();    
        if (!client.connect(serveur_perso, httpPort)) {
          Serial.println("échec de la connexion");
          return;
        }          
      //  on appelle la page meteo.php (qui est dans le dossier test) avec les datas en mémoire
      Serial.println("envoye des data meteo");            
      // Envoi de toutes ces datas par l'URL et par GET au fichier meteo.php sur le serveur (dans le dossier test)
      client.print(String("GET /test/meteo.php?temp=") + String(temperature) + "&pression=" + String(pressure) + " HTTP/1.1\r\n" +               
                              "Host: " + serveur_perso + "\r\n" + "Connection: close\r\n\r\n");            
      Serial.print("datas envoyées : ");
      // on lit le retour de la requète HTTP et on l'affiche dans la com serie du pc
      String line = client.readStringUntil('\r');
      Serial.println(line);      
      // on se deconnecte 
      Serial.println("fermeture de la connection");
      client.stop();
      Serial.println(); 
  }
}