//  Librairie utilisée : DHT sensor library (https://github.com/adafruit/DHT-sensor-library)
#include <DHT.h>
#define brocheDeBranchementDHT 6             // La ligne de communication du DHT22 sera donc branchée sur la pin D6 de l'Arduino
#define typeDeDHT DHT22                      // Ici, le type de DHT utilisé est un DHT22 (que vous pouvez changer en DHT11, DHT21, ou autre, le cas échéant)
DHT dht(brocheDeBranchementDHT, typeDeDHT);  //instanciation de la librairie DHT
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);  // lcd = afficheur 16C 2L à l'adresse 0x27
float temperatureEnCelsius ;
float sommeTemperature = 0;  // initialyse la variable pour tendance température a 0
float sommeHumide = 0;       // initialyse la variable pour tendance humidité a 0
float T1 = 0;                // initialyse la variable mémoire (température) du total de la boucle for i a 0
float H1 = 0;                // initialyse la variable mémoire (humidité) du total de la boucle for i a 0
float T2 = 20;               // température de référence pour tendance au début
float H2 = 50;               // humiditée de référence pour tendance au début
float temperatureMini = 100;
float temperatureMaxi = -100;
int minimax;  //lecture bouton mini_maxi
int raz;  //lecture boton raz
// création dessin des caractères spéciaux
byte Dcelsius[8] = { B11000, B11000, B00000, B00111, B01000, B01000, B01001, B00110 };  // caractère degré celsius
byte Dhaut[8] = { B00111, B00011, B00101, B01000, B10000, B00000, B00000, B00000 };     // caractère flêche haut
byte Dbas[8] = { B00000, B00000, B00000, B10000, B01000, B00101, B00011, B00111 };      // caractère flêche bas
byte Ddroite[8] = { B00000, B00100, B00110, B11111, B00110, B00100, B00000, B00000 };   // caractère flêche à droite
void setup() {
  pinMode(3, INPUT_PULLUP);  //PIN controle mini_maxi
  pinMode(2, INPUT_PULLUP);  //PIN_controle RAZ mini_maxi
  // initialisation des caractères spéciaux (maximum 8 )
  lcd.createChar(0, Dcelsius);
  lcd.createChar(1, Dhaut);
  lcd.createChar(2, Dbas);
  lcd.createChar(3, Ddroite);
  dht.begin();  // Initialisation du DHT22
  lcd.init();       // initialiation du LCD
  lcd.backlight();  // allume le rétro-éclairage
  // texte de présentation
  lcd.setCursor(1, 0);
  lcd.print("Meteo Montauban");
  delay(1000);
  lcd.setCursor(4, 1);
  lcd.print("par F1FRH");
  delay(3000);
  lcd.clear();
}
// =================
// Boucle principale
// =================
void loop() {
  for (int i = 1; i < 31; i++) {
    minimax = digitalRead(3);          // lecture bouton mini_maxi
    if (minimax == 0) { minimaxi(); }  // si bouton sur ON, appel de la fonction "minimaxi()" affichage des températures mini et maxi
    raz = digitalRead(2);  // lecture du bouton raz
    if(raz ==0) { remiseRaz();}  // si bouton sur ON, appel de la fonction "raz()"
    // Lecture des données
    float tauxHumidite = dht.readHumidity();             // Lecture du taux d'humidité (en %)
    float temperatureEnCelsius = dht.readTemperature();  // Lecture de la température, exprimée en degrés Celsius
    sommeTemperature = sommeTemperature + temperatureEnCelsius;  // aditionne les températures lues pedant la durée de la boucle
    sommeHumide = sommeHumide + tauxHumidite;                    // aditionne les taux d'humiditée lues pedant la durée de la boucle
    // TEST MINI_MAXI
    if (temperatureMini > temperatureEnCelsius) {
      temperatureMini = temperatureEnCelsius;
    }
    if (temperatureMaxi < temperatureEnCelsius) {
      temperatureMaxi = temperatureEnCelsius;
    }
    //affichage des valeurs sur le LCD
    lcd.setCursor(0, 0);
    lcd.print("Temp:");
    lcd.setCursor(6, 0);
    lcd.print(temperatureEnCelsius);
    lcd.setCursor(12, 0);
    lcd.print((char)0);
    lcd.setCursor(0, 1);
    lcd.print("Humi:");
    lcd.setCursor(6, 1);
    lcd.print(tauxHumidite);
    lcd.setCursor(12, 1);
    lcd.print("%");
    // Temporisation de 2 secondes (pour rappel : il ne faut pas essayer de faire plus d'1 lecture toutes les 2 secondes, avec le DHT22, selon le fabricant)
    delay(2000);
  }  // fin de boucle
  // tendance température
  T1 = sommeTemperature;  // transfer de "sommeTemperature" dans la variable T1
  if (T1 > T2) {
    lcd.setCursor(14, 0);
    lcd.print(" ");
    lcd.print((char)1);
  }
  if (T1 < T2) {
    lcd.setCursor(14, 0);
    lcd.print(" ");
    lcd.print((char)2);
  }
  if (T1 == T2) {
    lcd.setCursor(14, 0);
    lcd.print(" ");
    lcd.print((char)3);
  }
  T2 = T1;  // transfer de T1 dans T2 pour comparaison a la boucle suivante
  T1 = 0;   // remise a 0 de T1
  H1 = sommeHumide;
  // tendance humiditée
  if (H1 > H2) {
    lcd.setCursor(14, 1);
    lcd.print(" ");
    lcd.print((char)1);
  }
  if (H1 < H2) {
    lcd.setCursor(14, 1);
    lcd.print(" ");
    lcd.print((char)2);
  }
  if (H1 == H2) {
    lcd.setCursor(14, 1);
    lcd.print(" ");
    lcd.print((char)3);
  }
  H2 = H1;  // transfer de H1 dans H2 pour comparaison a la boucle suivante
  H1 = 0;   // remise a 0 de H1
  sommeTemperature = 0;
  sommeHumide = 0;
}
void minimaxi() {  // affiche les températures mini et maxi
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T mini:");
  lcd.setCursor(7, 0);
  lcd.print(temperatureMini);
  lcd.setCursor(13, 0);
  lcd.print((char)0);
  lcd.setCursor(0, 1);
  lcd.print("T maxi:");
  lcd.setCursor(7, 1);
  lcd.print(temperatureMaxi);
  lcd.setCursor(13, 1);
  lcd.print((char)0);
  delay(7000);
  lcd.clear();
}
void remiseRaz(){  // remise a zer0 et affichage des températures mini et maxi
  temperatureEnCelsius=temperatureMini;
 temperatureMaxi=temperatureEnCelsius;
minimaxi();}