// This project implements the simulation of the reading a DHT sensor using an ESP32 
// The source code is available on my git repo at : https://github.com/Bamamou/DHT11_ESP32.git
// the only difference is the sensor, Here; we use a DHT11 while in Platform io we use a DHT22
#include <DHT.h>  
#include <LiquidCrystal_I2C.h> // LCD librairy.h>
//===============================================================================
// Set up the DHT sensor  and LCD
const int DHT_Pin =4;                            // The DHT pin 
float temperature ;                             // Sensor temperature
float  humidity;                               // Sensor Humidity
int counter;                                  // Data counter
int totalColumns = 16;                       // number of colums pixels on the LCD
int totalRows = 2;                          // number of rows pixels on the LCD
const int delayTime = 500;                 // delay time on between each iteration
const int scrolling_time = 100;           // Scrolling time of the test
DHT dht(DHT_Pin, DHT22); // If you are using the DHT22, you just need to change the value 11 to 22
LiquidCrystal_I2C lcd(0x27, totalColumns, totalRows);  // Define the lcd object from the liduidCrystal class
String staticMessage = "DHT Tutorial";
String scrollingMessage = "Welcome to ESP32 with DHT11 !";

//=============================================================================
// The below function allow us to scroll a test and it is used to scroll the ouput of data of the sensor
void scrollMessage(int row, String message, int delayTime, int totalColumns) {
  for (int i=0; i < totalColumns; i++) {
    message = " " + message;  
  } 
  message = message + " "; 
  for (int position = 0; position < message.length(); position++) {
    lcd.setCursor(0, row);
    lcd.print(message.substring(position, position + totalColumns));
    delay(delayTime);
  }
}
//=================================================================================
void setup(){
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Hello, ESP32!");
  lcd.init();                        // Initialize the LCD          
  lcd.backlight();                  // Turn on the back light
  lcd.clear();                     // clear everything from the screen
  lcd.setCursor(2, 0);            // set the position of the test
  lcd.print(staticMessage);      // print the static message 
  scrollMessage(1, scrollingMessage, scrolling_time, totalColumns);
}



void loop() {
  // put your main code here, to run repeatedly:
  temperature = dht.readTemperature();       // To store the values of tempreature
  humidity = dht.readHumidity();            // To store the values of Humidity
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("Data: "+ String(counter));   // Print the data index
  // Print the values of Humidity 
  lcd.setCursor(0,1);
  String scrollingMessageHumidity = "Humidity: "+String(humidity);
  scrollMessage(1, scrollingMessageHumidity, scrolling_time, totalColumns);

  // Print he values of Temperature in Celsus
  String scrollingMessageTemperature = "Temperature: "+String(dht.readTemperature(false)) +"C";
  scrollMessage(1, scrollingMessageTemperature, scrolling_time, totalColumns);
  // Print the values of temperature in Fahrenheit
  String scrollingMessageTemperatureFahrenheit = "Temperature: "+String(dht.readTemperature(true)) +"F";
  scrollMessage(1, scrollingMessageTemperatureFahrenheit, scrolling_time, totalColumns);
  // Print the values of the heat Index for both Units
  String scrollingMessageHeatIndexCelsus = "Heat Index In Celsus: "+String(dht.computeHeatIndex(temperature, humidity, false)) +"%";
  scrollMessage(1, scrollingMessageHeatIndexCelsus, scrolling_time, totalColumns);
  String scrollingMessageHeatIndexFahrenheit = "Heat Index In Fahrenheit: "+String(dht.computeHeatIndex(temperature, humidity, true)) +"%";
  scrollMessage(1, scrollingMessageHeatIndexFahrenheit, scrolling_time, totalColumns);
  delay(delayTime);
  counter++;  // update the counbter

}