[Conseil - RÉSOLU] - Gestion de lumière et son par site Web...

Bonjour,

Je suis en Terminale STI2D SIN, et bien évidemment je travail sur mon projet pour le BAC. Le principe est simple :

Commander en mode manuel ou automatique des lampes et un son qui passera d’une pièce à une autre en fonction de l’habitant.
Le mode automatique est dépendant de capteurs de présence installés dans les pièces 1 et 2. De cette manière, lorsque l’on change de pièce, la lumière et de la musique nous suivent.
Seulement il y a aussi un autre mode. Le mode manuel consiste en un site web permettant de contrôler à distance la lumière et les hauts-parleurs.

Ma partie dans ce projet à été presque terminée. En effet, je dois m’occuper de tout ce qui a un rapport avec la gestion web du projet. À l’aide d’une carne Arduino Ethernet, j’ai simplement connecté ma carte au réseau du lycée pour pouvoir avoir ce résultat :

J’ai utilisé des LEDs pour simuler les lampes et les Hauts-Parleurs. Seulement voilà, lorsque j’envoie une demande à l’arduino, la LED s’allume puis s’éteind automatiquement après. Ce n’est malheureusement pas ce que j’attendais… Il faudrait que la LED reste allumée tant qu’elle n’a pas reçus de nouvelle commande. mais justement, c’est là où je suis bloqué, je n’arrive pas à trouver la solution à mon problème.

En espérant que quelqu’un puisse me guider vers la bonne voie, je vous laisse mon programme ainsi que quelques informations qui pourraient vous êtres utiles. :slight_smile:

Je travail avec :

• Une carte Adruino Ethernet.
• J’utilise le Shield ThinkerKit.
• Le réseau de mon lycée est un réseau Proxy.

Mon programme :

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xD3, 0xFB }; //Adresse MAC
byte ip[] = { 172, 17, 0, 42 }; // Adresse IP
EthernetServer server(80); //Port du serveur
int ledPin1 = 3; // LED pin
int ledPin2 = 5; // LED pin
int ledPin3 = 6; // LED pin
int ledPin4 = 9; // LED pin
String readString = String(30); //string for fetching data from address
boolean LEDON1 = false; //Pin status flag
boolean LEDON2 = false; //Pin status flag
boolean LEDON3 = false; //Pin status flag
boolean LEDON4 = false; //Pin status flag

void setup(){
//start Ethernet
Ethernet.begin(mac, ip);
//Configurer les 3 Pins de sorties
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);;
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
//Activer la liaison de données Serie
Serial.begin(9600); }

void loop(){
//Créer la connection Client
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 30) {
//store characters to string
readString += c; }
//output chars to serial port
Serial.print(c);
//if HTTP request has ended
if (c == '\n') {
//lets check if LED should be lighted
//Controle Prise 1
if(readString.indexOf("L1=1")>0) {
//Pin mise a ON
digitalWrite(ledPin1, HIGH); // Mettre la Pin a ON
LEDON1 = true;
}else if(readString.indexOf("L1=1")<0){
//Pin mise a OFF
digitalWrite(ledPin1, LOW); // Mettre la Pin a OFF
LEDON1 = false; }
//Controle Prise 2
if(readString.indexOf("L2=1")>0) {
//Pin mise a ON
digitalWrite(ledPin2, HIGH); // Mettre la Pin a ON
LEDON2 = true;
}else if(readString.indexOf("L2=1")<0){
//Pin mise a OFF
digitalWrite(ledPin2, LOW); // Mettre la Pin a OFF
LEDON2 = false; }
//Controle Prise 3
if(readString.indexOf("L3=1")>0) {
//Pin mise a ON
digitalWrite(ledPin3, HIGH); // Mettre la Pin a ON
LEDON3 = true;
}else if(readString.indexOf("L3=1")<0){
//Pin mise a OFF
digitalWrite(ledPin3, LOW); // Mettre la Pin a OFF
LEDON3 = false; }
//Controle Prise 4
if(readString.indexOf("L4=1")>0) {
//Pin mise a ON
digitalWrite(ledPin4, HIGH); // Mettre la Pin a ON
LEDON4 = true;
}else if(readString.indexOf("L4=1")<0){
//Pin mise a OFF
digitalWrite(ledPin4, LOW); // Mettre la Pin a OFF
LEDON4 = false; }
// now output HTML data starting with standart header
client.println("HTTP/1.0 200 OK");
client.println("Content-Type: text/html");
client.println();
//Controle Relais par checkbox
client.println("<html><body>");
client.println("<font color=red><h1 align=center>-Lycee de la Communication - TERMINALE STI2D
<center>MAISON CUBELOFT</center></h1></font>");
client.println("<i><h1 align=center> Domotique : Gestion son et lumière </h1></i>");
client.println("<table border=3 align=center>");
client.println("<form method=get name=Prise>");
client.println("<tr>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L1 value=1><b>Lumiere  1</b>");
client.println("</td>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L2 value=1><b>Lumiere 2</b>");
client.println("</td>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L3 value=1><b>HP 3</b>");
client.println("</td>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L4 value=1><b>HP 2</b>");
client.println("</td>");
client.println("</tr>");
client.println("<tr>");
client.println("<td colspan=4>");
client.println("<p align=center><input type=submit value=Envoyer></p>");
client.println("</td>");
client.println("</tr>");
client.println("</form>");
client.println("</table>");
client.println("<p align=center>");
//Afficher statut prise 1
client.println("Lumiere  1 : ");
if (LEDON1)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
//Afficher statut prise 2
client.println("Lumiere 2 : ");
if (LEDON2)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
//Afficher statut prise 3
client.print("HP 1 : ");
if (LEDON3)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
//Afficher statut prise 4
client.println("HP 2 : ");
if (LEDON4)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
client.println("</p>");
client.println("</body></html>");
//Effacer la chaine pour lecture suivante
readString="";

}

//Arreter le client
client.stop();
}}}}}

Merci d’avance !
Cordialement

bonjour, déjà, ca m'étonnerais que ton code fonctionne à la compile ;) après tu utilise des boolean, donc pourquoi tout mélanger avec des true, high, low, etc...? http://arduino.cc/en/Reference/BooleanVariables

Je ne sais pas pourquoi tout mélanger, je me suis basé sur un programme qu'on avaient en TP :/

Ton problème viens de là:

          if(readString.indexOf("L1=1")>0) {
            //Pin mise a ON
            digitalWrite(ledPin1, HIGH); // Mettre la Pin a ON
            LEDON1 = true;
          }
          else if(readString.indexOf("L1=1")<0){
            //Pin mise a OFF
            digitalWrite(ledPin1, LOW); // Mettre la Pin a OFF
            LEDON1 = false; 
          }

A chaque fois que tu reçois une commande, tu regardes si elle correspond à un message attendu.
Si c’est le cas tu actives la LED
Si ce n’est pas le cas tu éteints la LED

Donc pour la faire courte à chaque fois que tu reçois un message qui ne te dit pas d’allumer la LED tu l’éteints
Je pense que le bon test devrait être quelque chose de ce style là:

          if(readString.indexOf("L1=1")>0) {
            //Pin mise a ON
            digitalWrite(ledPin1, HIGH); // Mettre la Pin a ON
            LEDON1 = true;
          }
          else if(readString.indexOf("L1=0")>0){     // les 2 "gros" changements sont là
            //Pin mise a OFF
            digitalWrite(ledPin1, LOW); // Mettre la Pin a OFF
            LEDON1 = false; 
          }

Donc pour résumer:
si tu reçois L1=1, tu allumes
si tu reçois L1=0 tu éteints
si tu reçois n’importe quoi tu ne fais rien.

Alors j'ai testé ta solution et celle-ci marche :D

Sauf qu'à présent, elles restent allumées et la carte prend en compte celles qui ont déjà étaient allumées et celles qui viennent d'etre demandées. Une idée pour palier au fait? j'avais penser à un reset mais le placer dans void loop faisait clignoter la LED...

Merci d'avance!

Faudrait voir à travailler la clarté. Pour qu'on puisse t'aider: on fait ça, il se passe ça on fait ça il ne se passe rien

Et le code modifié sinon on ne comprends rien.

Lorsque je test le programme modifié, j’envoie une commande à la LED et elle reste allumée.
Mias lorsque je sélectionne d’autres LED, l’état de la LED précédemment sélectionnée ne change pas… :confused:

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xF0, 0xEA}; //Adresse MAC
byte ip[] = { 172,17,2,42}; // Adresse IP
EthernetServer server(80); //Port du serveur
int ledPin1 = 3; // LED pin
int ledPin2 = 5; // LED pin
int ledPin3 = 6; // LED pin
int ledPin4 = 9; // LED pin
String readString = String(30); //string for fetching data from address
boolean LEDON1 = false; //Pin status flag
boolean LEDON2 = false; //Pin status flag
boolean LEDON3 = false; //Pin status flag
boolean LEDON4 = false; //Pin status flag

void setup(){
//start Ethernet
Ethernet.begin(mac, ip);
//Configurer les 3 Pins de sorties
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
//Activer la liaison de données Serie
Serial.begin(9600); }

void loop(){
//Créer la connection Client
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 30) {
//store characters to string
readString += c; }
//output chars to serial port
Serial.print(c);
//if HTTP request has ended
if (c == '\n') {
//lets check if LED should be lighted
//Controle Prise 1
         if(readString.indexOf("L1=1")>0) {
            //Pin mise a ON
            digitalWrite(ledPin1, HIGH); // Mettre la Pin a ON
            LEDON1 = true;
          }
          else if(readString.indexOf("L1=0")>0){     // les 2 "gros" changements sont là
            //Pin mise a OFF
            digitalWrite(ledPin1, LOW); // Mettre la Pin a OFF
            LEDON1 = false; 
          }
//Controle Prise 2
         if(readString.indexOf("L2=1")>0) {
            //Pin mise a ON
            digitalWrite(ledPin2, HIGH); // Mettre la Pin a ON
            LEDON2 = true;
          }
          else if(readString.indexOf("L2=0")>0){     // les 2 "gros" changements sont là
            //Pin mise a OFF
            digitalWrite(ledPin2, LOW); // Mettre la Pin a OFF
            LEDON2 = false; 
          }
//Controle Prise 3
         if(readString.indexOf("L3=1")>0) {
            //Pin mise a ON
            digitalWrite(ledPin3, HIGH); // Mettre la Pin a ON
            LEDON3 = true;
          }
          else if(readString.indexOf("L3=0")>0){     // les 2 "gros" changements sont là
            //Pin mise a OFF
            digitalWrite(ledPin3, LOW); // Mettre la Pin a OFF
            LEDON3 = false; 
          }
//Controle Prise 4
         if(readString.indexOf("L4=1")>0) {
            //Pin mise a ON
            digitalWrite(ledPin4, HIGH); // Mettre la Pin a ON
            LEDON4 = true;
          }
          else if(readString.indexOf("L4=0")>0){     // les 2 "gros" changements sont là
            //Pin mise a OFF
            digitalWrite(ledPin4, LOW); // Mettre la Pin a OFF
            LEDON4 = false; 
          }
// now output HTML data starting with standart header
client.println("HTTP/1.0 200 OK");
client.println("Content-Type: text/html");
client.println();
//Controle Relais par checkbox
client.println("<html><body>");
client.println("<font color=red><h1 align=center>-Lycee de la Communication - STI2D</h1></font>");
client.println("<i><h1 align=center> Domotique : Gestion des prises </h1></i>");
client.println("<table border=3 align=center>");
client.println("<form method=get name=Prise>");
client.println("<tr>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L1 value=1><b>Lumiere 1</b>");
client.println("</td>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L2 value=1><b>Lumiere 2</b>");
client.println("</td>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L3 value=1><b>HP 1</b>");
client.println("</td>");
client.println("<td>");
client.println("<input type=CHECKBOX name=L4 value=1><b>HP 2</b>");
client.println("</td>");
client.println("</tr>");
client.println("<tr>");
client.println("<td colspan=4>");
client.println("<p align=center><input type=submit value=Envoyer></p>");
client.println("</td>");
client.println("</tr>");
client.println("</form>");
client.println("</table>");
client.println("<p align=center>");
//Afficher statut prise 1
client.println("Lumiere 1: ");
if (LEDON1)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
//Afficher statut prise 2
client.println("Lumiere 2: ");
if (LEDON2)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
//Afficher statut prise 3
client.print("HP 1: ");
if (LEDON3)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
//Afficher statut prise 4
client.println("HP 2: ");
if (LEDON4)
client.println("<font color=green>ON</font>
");
else
client.println("<font color=red>OFF</font>
");
client.println("</p>");
client.println("</body></html>");
//Effacer la chaine pour lecture suivante
readString="";
//Arreter le client
client.stop();
}}}}}

merci d’avance!

Il faut détailler plus je n’ai toujours pas compris ce que tu veux :grin:

Et bien lorsque je test le programme, j'envoie une commande à une LED. Qui simule une lumière. Pour le moment tou va pour le mieux, ca marche impec' :

Mais lorsque je décide de donner l'état HAUT à une autre LED, la précédente ne change pas, comme tu peux le voir ci dessous, l'HP 1 est sélectionné mais pas "Lumière 1" et pourtant celle ci reste allumée... :

Merci d'avance

Ok, dans ton code il faut que tu attribue une action à la case décochée.

Je te propose de remplacer:

if(readString.indexOf("L1=1")>0) {
            //Pin mise a ON
            digitalWrite(ledPin1, HIGH); // Mettre la Pin a ON
            LEDON1 = true;
          }
          else if(readString.indexOf("L1=0")>0){     // les 2 "gros" changements sont là
            //Pin mise a OFF
            digitalWrite(ledPin1, LOW); // Mettre la Pin a OFF
            LEDON1 = false; 
          }

Par:

if(readString.indexOf("L1=1")>-1) {
         // the checkbox was clicked, toggle the LED
        if (LEDON1) {
            LEDON1 = 0;
        }
        else {
            LEDON1 = 1;
        }
    } 
  
if (LEDON1) {    // switch LED on
        digitalWrite(2, HIGH);
        // checkbox is checked
        digitalWrite(ledPin1, HIGH); // Mettre la Pin a ON
            LEDON1 = true;
    }
    else {              // switch LED off
         //Pin mise a OFF
            digitalWrite(ledPin1, LOW); // Mettre la Pin a OFF
            LEDON1 = false; 
    }

Après il faut voir si ça fonctionne avec la page html que je ne maitrise pas trop mais le principe est là.

Pour plus de détails il faut voir ici: http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/web-server-LED-control/

;)

Cool merci beaucoup à vous ca me sera d'une grande aide :D