//*********
Rui Santos
Détail Complet du Projet à https://RandomNerdTutorials.com
*********/
// Importer les bibliothèques requises
#ifdef ESP32
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#else
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#endif
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Fil de données connecté à GPIO 4
#define ONE_WIRE_BUS 4
// Configure une instance oneWire pour communiquer avec n’importe quel appareil OneWire
OneWire oneWire(ONE_WIRE_BUS);
// Passe la référence oneWire au capteur de température de Dallas
DallasTemperature sensors(&oneWire);
// Définir le client NTP pour obtenir le temps
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
//jours ouvrables
String weekDays[7]={"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
//Mois
String months[12]={"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
//Variables pour Gestion du Temps
int monthDay;
int currentMonth;
int currentYear;
String currentMonthName;
String weekDay;
String formattedTime;
// Variables pour stocker les valeurs de température
String temperatureF = "";
String temperatureC = "";
String MaxT = "";
String MinT = "";
// Variables pour Calculer la Température Moyenne
float TemperatureActuel;
float MoytemperatureC = 0;
float MoyTStock = 0;
int CompteMoyT = 0;
boolean FlagCompteMoyT = true;
// Variables pour Stocker la Température Moyenne Hier
String HMaxT = "";
String HMinT = "";
String HMoytemperatureC = "";
boolean FlagHierT = true;
// Variables de minuterie
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// Identifiants Réseau
const char* ssid = "Commissariat-2";
const char* password = "=F<^A3.Esy";
// Créer un objet AsyncWebServer sur le port 257
// Redirection du Port Figurant dans Configuration Freebox - Gestion des Ports, Adrresse LAN du port
AsyncWebServer server(257);
String readDSTemperatureC() {
// Appelle capteurs.requestTemperatures() pour émettre une température globale et des demandes à tous les appareils sur le bus
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
if(tempC == -127.00) {
Serial.println("Echec de lecture du capteur DS18B20");
return "--";
} else {
Serial.print("Temperature Celsius: ");
Serial.println(tempC);
}
return String(tempC);
}
//Création du Texte de la Page WEB
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<style>
html {
font-family: Arial;
display: inline-block;
margin: 0px auto;
text-align: center;
}
h2 { font-size: 3.0rem; }
p { font-size: 1.5rem; }
.units { font-size: 1rem; }
.ds-labels{
font-size: 1.5rem;
vertical-align:middle;
padding-bottom: 15px;
}
</style>
</head>
<body>
<h2> Maison</h2>
<p>
<span id="weekDay">%WEEKDAY%</span>
<span id="monthDay">%MONTHDAY%</span>
<span id="currentMonthName">%CURRENTMONTHDAY%</span>
<span id="currentYear">%CURRENTYEAR%</span>
<p>
<span id="formattedTime">%FORMATTETIME%</span>
<p>
<i class="fas fa-thermometer-half" style="color:Fuchsia;"></i>
<span class="ds-labels">Salle </span>
<span id="temperaturec">%TEMPERATUREC%</span>
<sup class="units">°C</sup>
<p>
<i class='fas fa-thermometer-full' style='font-size:24px;color:red'></i>
<span class="ds-labels">Max </span>
<span id="MaxT">%MAXT%</span>
<sup class="units">°C</sup>
<span class="ds-labels">Hier </span>
<span id="HMaxT">%HMAXT%</span>
<sup class="units">°C</sup>
<p>
<i class="fas fa-thermometer-half" style="color:Orange"></i>
<span class="ds-labels">Moy</span>
<span id="MoytemperatureC">%MOYTEMPERATUREC%</span>
<sup class="units">°C</sup>
<span class="ds-labels">Hier</span>
<span id="HMoytemperatureC">%HMOYTEMPERATUREC%</span>
<sup class="units">°C</sup>
<p>
<i class='fas fa-thermometer-quarter' style='font-size:24px;color:blue'></i>
<span class="ds-labels">Min </span>
<span id="MinT">%MINT%</span>
<sup class="units">°C</sup>
<span class="ds-labels">Hier </span>
<span id="HMinT">%HMINT%</span>
<sup class="units">°C</sup>
</p>
</body>
<script>
//Mise à Jour des Données de la Page Web
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("temperaturec").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperaturec", true);
xhttp.send();
}, 10000) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
//document.getElementById("temperaturec").innerHTML = this.responseText;
//document.getElementById("MinT").innerHTML = this.responseText;
//document.getElementById("MaxT").innerHTML = this.responseText;
document.getElementById("formattedTime").innerHTML = this.responseText;
}
};
//xhttp.open("GET", "/temperaturec", true);
//xhttp.open("GET", "/MinT", true);
//xhttp.open("GET", "/MaxT", true); formattedTime
xhttp.open("GET", "/formattedTime", true);
xhttp.send();
}, 10000) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("MaxT").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/MaxT", true);
xhttp.send();
}, 10000) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("MinT").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/MinT", true);
xhttp.send();
}, 10000) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("MoytemperatureC").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/MoytemperatureC", true);
xhttp.send();
}, 10000) ;
/*setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("temperaturef").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperaturef", true);
xhttp.send();
}, 10000) ;*/
</script>
</html>)rawliteral";
// Remplace l’espace réservé par les valeurs Définies
String processor(const String& var){
//String MoyenneT = (String)MoytemperatureC; //Convertion Variable int en String
//Serial.println(var);
if(var == "TEMPERATUREC"){
return temperatureC;
}
else if(var == "MOYTEMPERATUREC"){
return (String)MoytemperatureC;
}
else if(var == "HMOYTEMPERATUREC"){
return (String)HMoytemperatureC;
}
else if(var == "MAXT"){
return MaxT;
}
else if(var == "HMAXT"){
return HMaxT;
}
else if(var == "MINT"){
return MinT;
}
else if(var == "HMINT"){
return HMinT;
}
else if(var == "WEEKDAY"){
return weekDay;
}
else if(var == "MONTHDAY"){
return (String)monthDay;
}
else if(var == "CURRENTMONTHDAY"){
return (String)currentMonthName;
}
else if(var == "CURRENTYEAR"){
return (String)currentYear;
}
else if(var == "FORMATTETIME"){
return (String)formattedTime;
}
/*else if(var == "TEMPERATUREF"){
return temperatureF;
}*/
return String();
}
void setup(){
// Port série à des fins de débogage
Serial.begin(115200);
Serial.println();
// Démarrer la bibliothèque DS18B20
sensors.begin();
temperatureC = readDSTemperatureC(); // Lecture Température en Mode String par l'Intermédiare de la Fonction readDSTemperatureC()
MaxT = temperatureC;
MinT = temperatureC;
TemperatureActuel = sensors.getTempCByIndex(0); // Lecture Température en Mode foat
MoytemperatureC = TemperatureActuel;
//MoyTStock = TemperatureActuel;
// Connecte au Wi-Fi
WiFi.begin(ssid, password);
Serial.println("Connecter au WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
// Print ESP Local IP Address
Serial.println(WiFi.localIP());
// Itinéraire pour la page racine/Web
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", temperatureC.c_str());
});
server.on("/formattedTime", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", formattedTime.c_str());
});
server.on("/MaxT", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", MaxT.c_str());
});
server.on("/MinT", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", MinT.c_str());
});
/* server.on("/(String)MoytemperatureC", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", (String)MoytemperatureC.c_str());
});*/
// Démarre le serveur
server.begin();
// Initialiser un NTPClient pour obtenir le temps
timeClient.begin();
// Set offset time in seconds to adjust for your timezone, for example:
// GMT +1 = 3600
// GMT +8 = 28800
// GMT -1 = -3600
// GMT 0 = 0
timeClient.setTimeOffset(3600);
}
void loop(){
/* float MoytemperatureC = 0;
float MoyTStock = 0;
byte CompteMoyT;
float TemperatureActuel; */
if ((millis() - lastTime) > timerDelay) {
temperatureC = readDSTemperatureC();
lastTime = millis();
}
if (temperatureC > MaxT) MaxT = temperatureC;
if (temperatureC < MinT) MinT = temperatureC;
Serial.print("Max Temperature = ");
Serial.println(MaxT);
Serial.print("Min Temperature = ");
Serial.println(MinT);
timeClient.update();
time_t epochTime = timeClient.getEpochTime();
//Mise à jour Heure Actuelle au Format HH:MN:SE
formattedTime = timeClient.getFormattedTime();
Serial.print("Heure Actuelle : ");
Serial.println(formattedTime);
//Mise à jour Heure
int currentHour = timeClient.getHours();
Serial.print("Heure : ");
Serial.println(currentHour);
//Mise à jour Minute
int currentMinute = timeClient.getMinutes();
Serial.print("Minutes: ");
Serial.println(currentMinute);
//Mise à jour Seconde
int currentSecond = timeClient.getSeconds();
Serial.print("Secondes: ");
Serial.println(currentSecond);
//Calcul de la Température Moyenne Toutes les Demie Heure
//if ( currentMinute == 30 || currentMinute == 0 && currentSecond == 1 && FlagCompteMoyT == true){
if ( currentSecond == 1 && FlagCompteMoyT == true){
CompteMoyT = CompteMoyT + 1;
TemperatureActuel = sensors.getTempCByIndex(0);
MoyTStock = MoyTStock + TemperatureActuel;
MoytemperatureC = MoyTStock / CompteMoyT;
FlagCompteMoyT = false;
}
Serial.print("Temperature Moyenne = ");
Serial.println(MoytemperatureC);
if (currentSecond == 2 && FlagCompteMoyT == false) FlagCompteMoyT = true;
if (currentHour == 0 && currentSecond == 1 && FlagHierT == true) {
//if (currentMinute == 25 && currentSecond == 1 && FlagHierT == true) {
HMaxT = MaxT;
HMinT = MinT;
HMoytemperatureC = MoytemperatureC;
FlagHierT = false;
}
if (currentHour == 1 && currentSecond == 2 && FlagHierT == false) {
//if (currentMinute == 26 && currentSecond == 2 && FlagHierT == false) {
MaxT = temperatureC;
MinT = temperatureC;
MoytemperatureC = sensors.getTempCByIndex(0);
MoyTStock = 0;
CompteMoyT = 0;
FlagHierT = true;
}
Serial.print("Moyenne Temperature Stock : ");
Serial.println(MoyTStock);
Serial.print("Compteur Moyenne Temperature Stock : ");
Serial.println(CompteMoyT);
Serial.print("Flag Compteur Moyenne Temperature Stock : ");
Serial.println(FlagCompteMoyT);
//Obtenir une structure temporelle
struct tm *ptm = gmtime ((time_t *)&epochTime);
//Date Complète
weekDay = weekDays[timeClient.getDay()];
monthDay = ptm->tm_mday;
currentMonth = ptm->tm_mon+1;
currentMonthName = months[currentMonth-1];
currentYear = ptm->tm_year+1900;
String currentDate = String(weekDay)+ " "+ String(monthDay) + "-" + String(currentMonthName) + "-" + String(currentYear);
Serial.print("Date Courante : ");
Serial.println(currentDate);
}