Bonjour tous le monde !
J'aurai besoin d'aide car j'essai de faire un petit programme et je débute..
Pour l'instant l'assemblage des exemple de bibliothéque à pas trop mal fonctionner mais la je galère sur plusieurs point..
Ce que je veux faire c'est : Lors de la première utilisation je voudrai lancer wifi manager afin que n'importe quel utilisateur puisse se connecter à son wifi perso.
De la je veux partir sur une page web personnalisée qui contiendrai quelques champs comme qui touche au capteur et un historique des valeurs dans une table..
Les données du capteurs ainsi que les paramètres serai stocké sur la carte micro SD.
Et voici les points ou je galère...
- Conflit des que j'intègre wifi manager..
- Le renvoi des valeurs enregistrer dans la sd vers mes champs html..
- J'aurai voulu savoir si il y a moyen par exemple d'enregistrer dans un dossier un page html qui ce nommerai home.htm et de redirger la dessus
Merci d'avance pour votre temps
/*//////////////
__________ .___ __________ .____ .___ ________ ___________ ___ ___ ___________________ ____ ___ ___________
\______ \| |\______ \| | | |\_____ \ \__ ___/ / | \ \_ _____/\_____ \ | | \\_ _____/
| | _/| | | | _/| | | | / | \ | | / ~ \ | __)_ / / \ \ | | / | __)_
| | \| | | | \| |___ | |/ | \ | | \ Y / | \/ \_/. \| | / | \
|______ /|___| |______ /|_______ \|___|\_______ / |____| \___|_ / /_______ /\_____\ \_/|______/ /_______ /
\/ \/ \/ \/ \/ \/ \__> \/
////////////////*/
#include <WiFiManager.h>
bool WIFI_ACTIF = false;
//Libraries for Bus i2C
#include <Wire.h>
//Libraries for BME280
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
//Libraries for WebServer
#if WIFI_ACTIF == true
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Hash.h>
#endif
//Libraries for microSD card
#include "FS.h"
#include "SD.h"
#include "SPI.h"
//Libraries for NTP
#include <NTPClient.h>
#include <WiFiUdp.h>
/*////////////////////////
____ ____ _____ __________ .___ _____ __________ .____ ___________ _________
\ \ / / / _ \ \______ \| | / _ \ \______ \| | \_ _____/ / _____/
\ Y / / /_\ \ | _/| | / /_\ \ | | _/| | | __)_ \_____ \
\ / / | \ | | \| |/ | \ | | \| |___ | \ / \
\___/ \____|__ / |____|_ /|___|\____|__ / |______ /|_______ \/_______ //_______ /
\/ \/ \/ \/ \/ \/ \/
/////////////////////*/
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
//Week Days
String weekDays[7]={"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
//Month names
String months[12]={"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"};
///////////////////////____________ VARIABLES POUR RECUPERER LA DATE DU JOUR AFIN DE L'ENVOYER SUR LA SD
String DATE_JOUR;
///////////////////////____________ VARIABLES POUR RECUPERER L'ID ESP8266
uint32_t chipID;
///////////////////////____________ VARIABLES LECTEUR SD (Définition des pins utiliser par le lecteur de carte)
const int MOSI_PIN = 13;
const int CS_PIN = 15;
const int MISO_PIN = 12;
const int CLK_PIN = 14;
///////////////////////____________ VARIABLES FICHIERS SD
File fileData;
File fileLogs;
File fileParam;
AsyncWebServer server(80);
///////////////////////____________ VARIABLES WIFI
// REPLACE WITH YOUR NETWORK CREDENTIALS
const char* ssid = "****";
const char* password = "****";
///////////////////////____________ VARIABLES BME280
// #define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
String dataMessage;
float MIN_TEMP;// MIN TEMP
float MAX_TEMP;// MAX TEMP
float MIN_PRES;// MIN PRES
float MAX_PRES;// MAX PRES
float MIN_HUMI;// MIN HUMI
float MAX_HUMI;// MAX HUMI
int ECHANTILLONAGE_SECONDES = 60; // ECHANTILLONAGE_SECONDES (interval)
unsigned long delayTime;
///////////////////////____________ VARIABLES INPUT POUR PAGE HTML
const char* PARAM_IDCHIP = "inputIdChip";
const char* PARAM_MAC = "inputMacAdress";
const char* PARAM_STRING = "inputString";
const char* PARAM_INT = "inputInt";
const char* PARAM_FLOAT = "inputFloat";
// HTML web page to handle 3 input fields (inputString, inputInt, inputFloat)
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
<title>ESP Input Form</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>
function submitMessage() {
alert("Saved value to ESP SPIFFS");
setTimeout(function(){ document.location.reload(false); }, 500);
}
</script></head><body>
<form action="/get" target="hidden-form">
inputIdChip (current value %inputIdChip%): <input type="text" name="inputIdChip" readonly>
</form><br>
<form action="/get" target="hidden-form">
Adresse Mac : <input type="text" name="inputMacAdress" value="%inputMacAdress%" readonly>
</form><br>
<form action="/get" target="hidden-form">
inputString (current value %inputString%): <input type="text" name="inputString">
<input type="submit" value="Submit" onclick="submitMessage()">
</form><br>
<form action="/get" target="hidden-form">
inputInt (current value %inputInt%): <input type="number " name="inputInt">
<input type="submit" value="Submit" onclick="submitMessage()">
</form><br>
<form action="/get" target="hidden-form">
inputFloat (current value %inputFloat%): <input type="number " name="inputFloat">
<input type="submit" value="Submit" onclick="submitMessage()">
</form>
<iframe style="display:none" name="hidden-form"></iframe>
</body></html>)rawliteral";
/*////////////////
_________ ____ ___ ____________________________ _____ ____ ____________ .___ ________
\_ ___ \ | | \ / _____/\__ ___/\_____ \ / \ \ \ / /\_____ \ | |\______ \
/ \ \/ | | / \_____ \ | | / | \ / \ / \ \ Y / / | \ | | | | \
\ \____| | / / \ | | / | \/ Y \ \ / / | \| | | ` \
\______ /|______/ /_______ / |____| \_______ /\____|__ / \___/ \_______ /|___|/_______ /
\/ \/ \/ \/ \/ \/
//////////////*/
///////////////////////____________ INITIALISATION DU CLIENT NTP POUR OBTENIR LA DATE/HEURE/MINUTES ETC...
void INIT_CLIENTNTP(){
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(7200);
}
///////////////////////____________ INITIALISATION DE LA BOUCLE TEMPS
void INIT_NTP_LOOP(){
timeClient.update();
time_t epochTime = timeClient.getEpochTime();
Serial.print("Epoch Time: ");
Serial.println(epochTime);
String formattedTime = timeClient.getFormattedTime();
Serial.print("Heure complète : ");
Serial.println(formattedTime);
int currentHour = timeClient.getHours();
Serial.print("Heure: ");
Serial.println(currentHour);
int currentMinute = timeClient.getMinutes();
Serial.print("Minutes: ");
Serial.println(currentMinute);
int currentSecond = timeClient.getSeconds();
Serial.print("Secondes: ");
Serial.println(currentSecond);
String weekDay = weekDays[timeClient.getDay()];
Serial.print("Jour: ");
Serial.println(weekDay);
//Définition de la structure du temps
struct tm *ptm = gmtime ((time_t *)&epochTime);
int monthDay = ptm->tm_mday;
Serial.print("N° jour : ");
Serial.println(monthDay);
int currentMonth = ptm->tm_mon+1;
Serial.print("N° mois : ");
Serial.println(currentMonth);
String currentMonthName = months[currentMonth-1];
Serial.print("Mois : ");
Serial.println(currentMonthName);
int currentYear = ptm->tm_year+1900;
Serial.print("Année : ");
Serial.println(currentYear);
//Print complete date:
String currentDate = String(currentYear) + "." + String(currentMonth) + "." + String(monthDay);
DATE_JOUR = currentDate; ///////////////////////____________ MISE A JOUR VARIABLE DATE DU JOUR
Serial.print("Date du jour: ");
Serial.println(currentDate);
Serial.println("");
delay(2000);
}
///////////////////////____________
void notFound(AsyncWebServerRequest *request) {
request->send(404, "text/plain", "Not found");
}
///////////////////////____________ CHAMPS HTML
/*
void CustomInput() {
// To access your stored values on inputString, inputInt, inputFloat
String yourInputString = readFile(SPIFFS, "/inputString.txt");
Serial.print("*** Your inputString: ");
Serial.println(yourInputString);
int yourInputInt = readFile(SPIFFS, "/inputInt.txt").toInt();
Serial.print("*** Your inputInt: ");
Serial.println(yourInputInt);
float yourInputFloat = readFile(SPIFFS, "/inputFloat.txt").toFloat();
Serial.print("*** Your inputFloat: ");
Serial.println(yourInputFloat);
delay(5000);
}
*/
///////////////////////____________ LECTURE DE LA SONDE BME280
void BME280Values() {
delay(30000);
ECRITURE_DATA_SD();
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
// Convert temperature to Fahrenheit
/*Serial.print("Temperature = ");
Serial.print(1.8 * bme.readTemperature() + 32);
Serial.println(" *F");*/
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
///////////////////////____________ N° ID et Adresse MAC de l'ESP8266
void SERIAL_CHIP_ID(){
chipID = ESP.getChipId();
Serial.printf(" ESP8266 Chip id = %08X\n", ESP.getChipId());
Serial.print("Mac adresse : ");
Serial.println(WiFi.macAddress());
Serial.println();
}
//////////////////////
///////////////////////____________ INITIALISATION DE LA CARTE MICRO SD
void INIT_SDCARD(){
if (!SD.begin(CS_PIN)){
Serial.println("La carte a échoué ou n'est pas présente !");
return;
}
Serial.println("Carte initialisée !");
}
///////////////////////____________ Créez un nouveau fichier sur la carte microSD dans le dossier DATA appelé DataSensor.txt si il n'existe pas déjà.
void CREATION_FICHIER_DATA_SD(){
File fileData = SD.open("DATA/DataSensor.txt");
if(!fileData) {
Serial.println("fichier n'existe pas !");
Serial.println("Création du fichier.......");
fileData = SD.open("DATA/DataSensor.txt", FILE_WRITE);
if (fileData){
fileData.print("Date");
fileData.print(";");
fileData.print("Heure");
fileData.print(";");
fileData.print("Température [°C]");
fileData.print(";");
fileData.print("Pression [hPa]");
fileData.print(";");
fileData.println("Humidité [%]");
}
}
else {
Serial.println("Le fichier existe déjà !");
}
fileData.close();
}
///////////////////////____________ Créez un nouveau fichier sur la carte microSD dans le dossier DATA appelé DataSensor.txt si il n'existe pas déjà.
void CREATION_FICHIER_LOGS_SD(){
File fileLogs = SD.open("LOGS/AllChange.txt");
if(!fileLogs) {
Serial.println("fichier n'existe pas !");
Serial.println("Création du fichier.......");
fileLogs = SD.open("LOGS/AllChange.txt", FILE_WRITE);
// if (fileLogs){
// fileData.print("Date");
// fileData.print(";");
// fileData.print("Heure");
// fileData.print(";");
// fileData.print("Température [°C]");
// fileData.print(";");
// fileData.print("Pression [hPa]");
// fileData.print(";");
// fileData.println("Humidité [%]");
// }
}
else {
Serial.println("Le fichier existe déjà !");
}
fileLogs.close();
}
///////////////////////____________ Créez un nouveau fichier sur la carte microSD dans le dossier DATA appelé DataSensor.txt si il n'existe pas déjà.
void CREATION_FICHIER_PARAM_SD(){
File fileParam = SD.open("PARAMETRES/");
if(!fileParam) {
Serial.println("fichier n'existe pas !");
Serial.println("Création du fichier.......");
fileParam = SD.open("PARAMETRES/inputIdChip.txt", FILE_WRITE);
fileParam = SD.open("PARAMETRES/inputMacAdress.txt", FILE_WRITE);
fileParam = SD.open("PARAMETRES/inputString.txt", FILE_WRITE);
fileParam = SD.open("PARAMETRES/inputInt.txt", FILE_WRITE);
fileParam = SD.open("PARAMETRES/inputFloat.txt", FILE_WRITE);
// if (fileParam){
// fileParam.print("Date");
// fileData.print(";");
// fileData.print("Heure");
// fileData.print(";");
// fileData.print("Température [°C]");
// fileData.print(";");
// fileData.print("Pression [hPa]");
// fileData.print(";");
// fileData.println("Humidité [%]");
// }
}
else {
Serial.println("Le fichier existe déjà !");
}
fileParam.close();
}
///////////////////////____________ ECRITURE DES DONNEES DU CAPTEUR DANS LA CARTE SD
void ECRITURE_DATA_SD(){
fileData = SD.open("DATA/DataSensor.txt", FILE_WRITE);
// Si le fichier est ouvert, écrit dedans :
if (fileData) {
Serial.print("Ecriture dans le fichier DataSensor.txt...");
fileData.print(DATE_JOUR);
fileData.print(";");
fileData.print(timeClient.getFormattedTime());
fileData.print(";");
fileData.print(bme.readTemperature());
fileData.print(";");
fileData.print(bme.readPressure() / 100.0F);
fileData.print(";");
fileData.println(bme.readHumidity());
fileData.close();
Serial.println("Ecriture OK !");
}
}
///////////////////////____________ INITIALISATION DU WIFI
void INIT_WIFI(){
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("WiFi Failed!");
return;
}
Serial.println();
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
///////////////////////____________ INITIALISATION DU WIFI 2
void INIT_WIFI_2(){
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
// it is a good practice to make sure your code sets wifi mode how you want it.
Serial.begin(115200);
//WiFiManager, Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wm;
bool res;
res = wm.autoConnect();
if(!res) {
Serial.println("Failed to connect");
// ESP.restart();
}
else {
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
WIFI_ACTIF = true;
}
}
///////////////////////____________ INITIALISATION CAPTEUR BME280
void INIT_BME280(){
bool status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1);
}
delayTime = 1000;
Serial.println();
}
/*
void LECTURE_SD(){
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
*/
/*
// Replaces placeholder with stored values
String processor(const String& var){
//Serial.println(var);
if(var == "inputString"){
return readFile(SD, "PARAMETRES/inputString.txt");
}
// else if(var == "inputIdChip"){
// return ESP.getChipId();
//}
else if(var == "inputMacAdress"){
return WiFi.macAddress();
}
else if(var == "inputInt"){
return readFile(SD, "PARAMETRES/inputInt.txt");
}
else if(var == "inputFloat"){
return readFile(SD, "PARAMETRES/inputFloat.txt");
}
return String();
}
*/
/*//////////////////
_________ __
/ _____/ ____ _/ |_ __ __ ______
\_____ \ _/ __ \ \ __\| | \\____ \
/ \\ ___/ | | | | /| |_> >
/_______ / \___ > |__| |____/ | __/
\/ \/ |__|
//////////////////*/
void setup() {
INIT_CLIENTNTP();
INIT_WIFI_2();
INIT_SDCARD();
CREATION_FICHIER_DATA_SD();
CREATION_FICHIER_LOGS_SD();
CREATION_FICHIER_PARAM_SD();
INIT_BME280();
/*
if(!SPIFFS.begin()){
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
*/
/*
// Send web page with input fields to client
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
// Envoyez des requêtes GET à <ESP_IP>/get?inputString=<inputMessage>
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
String inputMessage;
// GET inputString value on <ESP_IP>/get?inputString=<inputMessage>
if (request->hasParam(PARAM_STRING)) {
inputMessage = request->getParam(PARAM_STRING)->value();
ECRITURE_SPIFFS(SPIFFS, "/inputString.txt", inputMessage.c_str());
}
// GET inputInt value on <ESP_IP>/get?inputInt=<inputMessage>
else if (request->hasParam(PARAM_INT)) {
inputMessage = request->getParam(PARAM_INT)->value();
ECRITURE_SPIFFS(SPIFFS, "/inputInt.txt", inputMessage.c_str());
}
// GET inputFloat value on <ESP_IP>/get?inputFloat=<inputMessage>
else if (request->hasParam(PARAM_FLOAT)) {
inputMessage = request->getParam(PARAM_FLOAT)->value();
ECRITURE_SPIFFS(SPIFFS, "/inputFloat.txt", inputMessage.c_str());
}
else {
inputMessage = "No message sent";
}
Serial.println(inputMessage);
request->send(200, "text/text", inputMessage);
});
*/
server.onNotFound(notFound);
server.begin();
}
/*////////////////////////
.____
| | ____ ____ ______
| | / _ \ / _ \ \____ \
| |___ ( <_> )( <_> )| |_> >
|_______ \ \____/ \____/ | __/
\/ |__|
////////////////////////*/
void loop() {
SERIAL_CHIP_ID();
INIT_NTP_LOOP();
// CustomInput();
BME280Values();
delay(delayTime);
}