Bonjour à tous,
Je vous présente vite fait mon projet, celui ci consiste à rendre "connecté" des chauffages électrique :
Le but est d'utiliser le fil pilote pour mettre en marche, eco ou arrêt le chauffage.
Je compte utiliser un ESP8266 qui gérera la commande du fil pilote et embarquera une page web pour régler les périodes de chauffage en fonction d'un planning mais également pouvoir sélectionner le mode de fonctionnement : arrêt complet du chauffage, marche forcée et mode automatique (en fonction du planning).
La gestion de température, je garde celle intégrée au chauffage pour le moment.
J'ai déjà fait une petite page web pour la sélection du mode de chauffe ainsi que le planning, j’arrive a envoyer les données a l’Arduino en incluant toute les datas dans l'URL.
Sauf que je rencontre un problème, j'ai l'impression que la variable _mode et le tableau _prog rentre en conflit ...
D'une part la fin du tableau prend des valeurs autres que 0, 1 ou 2, et lorsque je change certaine valeurs dans le tableau depuis la page web, cela change la valeur de la variable _mode, et inversement, si je change le mode ON, OFF ou AUTO, cela change des valeurs dans le tableau.
Si quelqu'un peu m'orienter vers la résolution de ce problème ...
Voici le code :
#include <Arduino.h>
#include <ESP8266WiFi.h>
// Replace with your network credentials
#define SSID "xxxxx"
#define PASSWORD "xxxxx"
// Set web server port number to 80
WiFiServer server(80);
enum {OFF, ON, ECO, AUTO};
byte _mode;
byte _day, _hour;
byte _prog[7][24];
void setup() {
Serial.begin(115200);
// Connect to Wi-Fi network with SSID and PASSWORD
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address
Serial.println("");
Serial.println("WiFi connected at IP address:");
Serial.println(WiFi.localIP());
// Start Web Server
server.begin();
}
// Main loop
void loop(){
// Create a client and listen for incoming clients
WiFiClient client = server.available();
//Si client connecté
if (client) {
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
if (request.indexOf("/?mode=") != -1) {
Serial.println("MAJ mode & planning");
update_(request, "/?prog=");
}
}
// Display GPIO status
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.print(page_web());
}
//FONCTION MISE A JOUR DONEES
void update_(String val, String valSearch){
//Mise à jour mode
if (val.indexOf("/?mode=off") != -1) _mode = OFF;
else if (val.indexOf("/?mode=on") != -1) _mode = ON;
else if (val.indexOf("/?mode=auto") != -1) _mode = AUTO;
//Mise à jour planning
int index = val.indexOf(valSearch) + valSearch.length();
Serial.print("Index : ");
Serial.println(index);
for (int i = 1; i <= 7; i++){
for (int j = 0; j <= 23; j++){
if (val[index] == '0') _prog[i][j] = OFF;
else if (val[index] == '1') _prog[i][j] = ON;
else if (val[index] == '2') _prog[i][j] = ECO;
index++;
}
}
//DEBUG
for (int i = 1; i <= 7; i++){
Serial.println(i);
for (int j = 0; j <= 23; j++){
Serial.print(_prog[i][j]);
}
Serial.println("");
}
}
//FONCTION GENERATION PAGE WEB
String page_web(){
//Déclaration des variables
String PAGEWEB;
//Génération page WEB :
PAGEWEB += "<!DOCTYPE HTML>";
PAGEWEB += "<html>";
//HEADER
PAGEWEB += "<head>";
PAGEWEB += "<meta charset='utf-8' />";
PAGEWEB += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
PAGEWEB += "<title>CHAUFFAGE : Chambre ~~~</title>";
PAGEWEB += "<link rel='icon' type='image/png' sizes='16x16' href='https://nsa40.casimages.com/img/2021/07/01/21070112422541371.jpg'>"; //https://nsa40.casimages.com/img/2021/06/29//210629010148557539.jpg
PAGEWEB += "<link rel='apple-touch-icon' type='image/png' sizes='16x16' href='https://nsa40.casimages.com/img/2021/07/01/21070112422541371.jpg'>";
//CSS
PAGEWEB += "<style type'text/css'>";
PAGEWEB += "#title {font-family: Calibri; color: white; font-size: 150%; font-weight: bold; text-transform: uppercase;}";
PAGEWEB += "#tab_planning {border-collapse: collapse}";
PAGEWEB += ".cells_planning {border: 0px solid black;font-weight: bold;text-align: center}";
PAGEWEB += ".prog {border: 1px solid black;}";
PAGEWEB += ".div_title {margin-left: auto; margin-right: auto; margin-top: 1px; display: table; width: 505px; height: 50px; background-color: #2196F3; vertical-align:middle;}";
PAGEWEB += ".div_title span{vertical-align:middle; display: table-cell; text-align: center;}";
PAGEWEB += ".div_encadrement {margin: 0 auto; width: 30em; border: 2px solid #333; box-shadow: 3px 3px 1px #444; padding: 8px 12px; background-color: #ffffff;}";
PAGEWEB += ".switch-field {display: flex; margin-top: 10px; margin-bottom: 10px; margin-left: auto; margin-right: auto; overflow: hidden;}";
PAGEWEB += ".switch-field input {position: absolute !important; clip: rect(0, 0, 0, 0); height: 1px; width: 1px; border: 0; overflow: hidden;}";
PAGEWEB += ".switch-field label {background-color: #ffffff; color: black; font-weight: bold; font-size: 14px; line-height: 1; text-align: center; padding: 8px 16px; margin-right: -1px; border: 1px solid rgba(0, 0, 0, 0.2); box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 0.1); transition: all 0.1s ease-in-out;}";
PAGEWEB += ".switch-field input:checked + label {background-color: #2196F3; color: white; font-weight: bold; box-shadow: none;}";
PAGEWEB += ".switch-field label:first-of-type {border-radius: 0px 0 0 0px;}";
PAGEWEB += ".switch-field label:last-of-type {border-radius: 0 0px 0px 0;}";
PAGEWEB += "input {background-color: #2196F3; border-radius: 0px; border: 0px; color: #FFFF; text-align: center; font-weight: bold; padding: 6px 20px; margin: 2px 5px; cursor: pointer; text-transform: uppercase; position: relative;}";
PAGEWEB += "</style>";
PAGEWEB += "</head>";
//BODY
PAGEWEB += "<body>";
//TITTLE
PAGEWEB += "<div class='div_title'>";
PAGEWEB += "<span id='title'>Chauffage connecté</span>";
PAGEWEB += "</div>";
PAGEWEB += "<p> </p>";
//MODE
PAGEWEB += "<div class='div_encadrement'>";
PAGEWEB += "<div class='switch-field'>";
PAGEWEB += "<input type='radio' id='mode_off' name='mode_select' value='off' ";
if (_mode == OFF) PAGEWEB += "checked";
PAGEWEB += "/>";
PAGEWEB += "<label for='mode_off'>OFF</label>";
PAGEWEB += "<input type='radio' id='mode_on' name='mode_select' value='on' ";
if (_mode == ON) PAGEWEB += "checked";
PAGEWEB += "/>";
PAGEWEB += "<label for='mode_on'>ON</label>";
PAGEWEB += "<input type='radio' id='mode_auto' name='mode_select' value='auto' ";
if (_mode == AUTO) PAGEWEB += "checked";
PAGEWEB += "/>";
PAGEWEB += "<label for='mode_auto'>AUTO</label>";
PAGEWEB += "</div>";
//TABLEAU PLANNING
PAGEWEB +="<p id='planning'>Planning</p>";
PAGEWEB +="<table id='tab_planning'>";
PAGEWEB += "<tr class='cells_planning'>";
PAGEWEB += "<td></td>";
//--> Génération ligne heures
for (byte i = 0; i <= 23; i++){
PAGEWEB += "<td id='tab'>";
if (i < 10) PAGEWEB += "0" + String(i);
else PAGEWEB += String(i);
PAGEWEB += "</td>";
}
PAGEWEB += "<tr/>";
//--> Génération lignes jours
String tab_day[] = {"L", "M", "M", "J", "V", "S", "D"};
byte index = 0;
for (byte i = 1; i <= 7; i++){
PAGEWEB += "<tr class='cells_planning'>";
PAGEWEB += "<td>" + tab_day[i-1] + "</td>";
for (byte j = 0; j <= 23; j++){
String color;
if (_prog[i][j] == OFF) color = "#FFFFFF";
else if (_prog[i][j] == ON) color = "#2196F3";
else if (_prog[i][j] == ECO) color = "#FFFF";
PAGEWEB += "<td class='prog' style='color:rgba(1,1,1,0);' onclick='color(" + String(index) + ");' bgColor ='" + color + "'id='" + String(index) + "'>00</td>";
index ++;
}
PAGEWEB += "</tr>";
}
PAGEWEB +="</table></br>";
PAGEWEB +="<a><input type='button' value='Valider' onclick='update_planning();'>";
PAGEWEB +="</a>";
//JAVASCRIPT
PAGEWEB +="<script type='text/javascript'>";
//FUNCTION COLOR
PAGEWEB += "function color(id_prog){";
PAGEWEB += "var colored = document.getElementById(id_prog).bgColor;";
PAGEWEB += "if (colored === '#FFFFFF'){";
PAGEWEB += "colored = '#2196F3';";
PAGEWEB += "}";
PAGEWEB += "else if (colored === '#2196F3'){";
PAGEWEB += "colored = '#FFFF';";
PAGEWEB += "}";
PAGEWEB += "else {";
PAGEWEB += "colored = '#FFFFFF';";
PAGEWEB += "}";
PAGEWEB += "document.getElementById(id_prog).bgColor = colored;";
PAGEWEB += "}";
//FUNCTION UPDATE
PAGEWEB += "function update_planning(){";
PAGEWEB += "var mode = '?mode=';";
PAGEWEB += "var programmation = '/?prog=';";
PAGEWEB += "var data;";
PAGEWEB += "if (document.getElementById('mode_off').checked){";
PAGEWEB += "mode = mode + 'off';";
PAGEWEB += "}";
PAGEWEB += "else if (document.getElementById('mode_on').checked){";
PAGEWEB += "mode = mode + 'on';";
PAGEWEB += "}";
PAGEWEB += "else if (document.getElementById('mode_auto').checked){";
PAGEWEB += "mode = mode + 'auto';";
PAGEWEB += "}";
PAGEWEB += "for (let i = 0; i <= 167; i++) {";
PAGEWEB += "if (document.getElementById(i).bgColor === '#FFFFFF'){";
PAGEWEB += "programmation = programmation + '0';";
PAGEWEB += "}";
PAGEWEB += "else if (document.getElementById(i).bgColor === '#2196F3'){";
PAGEWEB += "programmation = programmation + '1';";
PAGEWEB += "}";
PAGEWEB += "else if (document.getElementById(i).bgColor === '#FFFF'){";
PAGEWEB += "programmation = programmation + '2';";
PAGEWEB += "}";
PAGEWEB += "}";
PAGEWEB += "data = mode + programmation + '/&random=' + Math.trunc(Math.random() * 1000000);";
//PAGEWEB += "data = programmation + '&random=' + Math.trunc(Math.random() * 1000000);";
PAGEWEB += "document.location.href = data;";
PAGEWEB += "}";
PAGEWEB +="</script>";
PAGEWEB += "</body>";
PAGEWEB += "</html>";
return (PAGEWEB);
}
PS: j'ai essayé de commenter toute la page web avec sa variable string, en pensant que cela était du a cette variable qui prend beaucoup de place, mais le problème persiste.
Merci d'avance !