assigner des fonctions a des boutons sur serveur arduino [RESOLU]

bonjour,

j ai un projet domotique en cours
je viens d' y ajouter une sonde DHT22
les valeurs son bien afficher temperature et hygrometrie

je voudrais ajouter des boutons
trois pour etre precis
un pour Marche (allume le relais chauffage jusqu'a la temperature de 20 c)
un pour Auto( allume le relais de chauffage en fonction de l heure et de la temperature si <20 c)
un pour Arret (allume le relais et maintien la temperature a 17 c)
pour le moment j ai essayer avec:

client.print("<font color=black>""Chauffage ""
<a href=\"/?Marche\"\"><font color=red> Comfort 
");
client.print("<a href=\"/?Auto\"\"><font color=black> Auto 
<a href=\"/?Arret\"\"><font color=green> Eco </a>
");
          if((readString.indexOf("?Marche") >0) && (DHT.temperature)<=20) 
          {
          digitalWrite(OPTO,LOW);(MARCHE=true);
          }
          else
          {
          digitalWrite(OPTO,HIGH);(MARCHE=false);
          }
          if(((readString.indexOf("?Arret") >0) && (DHT.temperature)<=15)&& (DHT.temperature)<=17)
          {
          digitalWrite(OPTO,LOW);(MARCHE=true);
          }
          else
          {
          digitalWrite(OPTO,HIGH);(MARCHE=false);
          }
          if((((readString.indexOf("?Auto") >0) && (DHT.temperature)>15 && (DHT.temperature)<20) &&(heure)>17) &&(heure)<23)
          {
          digitalWrite(OPTO,LOW);(MARCHE=true);
          }
          else digitalWrite(OPTO,HIGH);(MARCHE=false);
          
          readString="";

(MARCHE) condition servant a l' affichage "Chauffe ou Arret " sur la page web

Merci pour vos retours

Bonjour a tous
je vois que j inspire personne avec mon pb

Je m'y colle alors ...

Ta page web s'affiche correctement j'imagine, mais tes boutons ne réagissent pas ? (enfin ton arduino serveur ne réagit pas aux commandes web ?)

As-tu regardé ce que ton arduino reçoit quand un client se connecte ?

pour les liens d'action je mettrai href ="12.34.56.78:port/?Auto"
avec 12.34.56.78 l'adress ip de ta carte (adresse externe) et port, le n° du port que tu lui as attribué

Bonjour si quand j utlisé juste les fonction marche et arret
cad sur marche relais LOW donc active
et sur Marche relais HIGH donc au repos
tous c'est corsé lorque j ai voulu mettre des contitions d'heure ou de consigne temperature
plus rien
j ai trouvé des exemples avec deux lib differentes pour le DHT22
DHT.h et dht.h et ne sais pas comment les telecharger

et comment tu veux que je devines tes problèmes ?

à priori je traiterai à part les ordres que tu envoies par internet et les actions sur le relai (en fonction de la consigne, de l'heure, de la température et du mode de chauffage)

par exemple j'utiliserai 2 variables : auto et une consigne. ensuite quand tu lis les ordres recu par le web tu fais :
si ordre web = arret : tu actualises la consigne à 17 °C (tu ne touches pas aux relais ici), auto = false
si ordre web = marche : tu actualises la consigne à 20 °C (tu ne touches pas aux relais ici), auto = false
si ordre web = auto : auto = true (consigne = 20 ? a toi de voir, pas touche aux relais ici)

dans ton loop (ou une fonction qui lit la température de ta pièce en continu, disons toutes les 30s) tu gères les relais en fonction du mode et de la consigne
si auto : actionne le relai en fonction de la temp, de la consigne et de l'heure (
sinon : actionne le relai en fonction de la consigne (si T < consigne, relaiOn sinon relaiOff)

que pensez vous de cette nouvelle mouture?

    if(readString.indexOf("?Marche")>0) // Maintien a 20°
          {
          marche = DHT.temperature < 20;
          }
     else if (readString.indexOf("?Arret")> 0) // MAINTIENT A 15°
          {
          arret = DHT.temperature < 15 ;
          }
     else if (readString.indexOf("?Auto")> 0)  
          {
          autom = DHT.temperature < 15 && DHT.temperature < 19 && heure < 17 && heure < 23; 

         // Maintien a 19° de 17 a 23 Heure 

          }
          if ((marche)||(autom)||(arret)== true )
          {
          digitalWrite(OPTO, LOW );
          }
          else 
          {
          digitalWrite(OPTO,HIGH);
         } 
          readString="";
  }}

Plusieurs trucs qui clochent ...

Dans tes tests tu as par expemple if heure < 17 && heure < 23 ... Un des signes est manifestement dans le mauvais sens ... Il y a plusieurs cas comme ça

Ensuite admettons que tu commandes "marche" ... Ton truc se met en marche si t<20 ... Donc ça va chauffer et la température va augmenter ... Mais il s'arrête quand le chauffage et où dans ton programme ??? (La variable marche n'est actualisée que quand tu reçois un ordre web ... Sinon le programme n'entre pas dans le if et marche=temp<20 n'est pas testé)

Comme je te l'ai dit dans ma réponse d'avant ... Tu dois gérer une régulation ailleurs que là où tu interprètes les ordres web sinon ça ne marchera pas.

Tu confonds aussi le mode (marche arrêt auto) avec la régulation ... Sépare tes variables

J'utiliserai une variable mode qui prends 3 valeurs (0 pour arret, 1 pour marche, 2 pour auto). Tu actualises cette variable avec les readstring quand tu envoies une commande web. AILLEURS dans ton programme tu gères la régulation ...

Lire la température ...
Si mode =O (arret)
Si T < 15 allumer= true
Sinon allumer = false
Si mode =1 (marche)
Si T< 20 allumer = truc
Sinon allumer =false
Si mode = 2 (auto)
.... À toi de faire

Si allumer=true digitalWrite(relai,HIGH)
Sinon. DigitalWrite(relai,LOW)

B83s:
Plusieurs trucs qui clochent ...

Dans tes tests tu as par expemple if heure < 17 && heure < 23 ... Un des signes est manifestement dans le mauvais sens ... Il y a plusieurs cas comme ça

Ensuite admettons que tu commandes "marche" ... Ton truc se met en marche si t<20 ... Donc ça va chauffer et la température va augmenter ... Mais il s'arrête quand le chauffage et où dans ton programme ??? (La variable marche n'est actualisée que quand tu reçois un ordre web ... Sinon le programme n'entre pas dans le if et marche=temp<20 n'est pas testé)

oui effectivement c'est if heure > 17 && heure <23 j avais vue apres avoir posté
quand tu parle d'une variable mode je comprends pas ( t as un exemple?) et tu dis

avec les readstring quand tu envoies une commande web.

il en faut plusieurs des readstring?

pour la regule j ai compris .

il en faut plusieurs des readstring?

... À ton avis ? Indice : autant que ce que tu utilises déjà ... Sauf que tu actualiseras la variable mode a 0 1 ou 2

Je ne vais pas t'écrire le programme ... Je t'ai mis le principe de la régulation ... A mettre dans le loop et à effectuer toutes les 30 s ou plus suivant ton chauffage

je te demande pas de m' ecrire le programme
pour la regul j ai compris
ce que j 'ai du mal a comprendre c'est cette fameuse variable mode et pour le moment je n utilise qu'une fois readstring en fin de prog , je debute en prog et bien avant de poste je fais enormement de recherche sauf que je n "arrive pas toujours a trouver ce dont j ' ai besoin , si je sollicite c'est je suis bloqué
tous le monde ne maitrise pas forcement le C ou le html.

Mets ton programme en entier ... Entre les balises </>

///////////////////////////////////////////////////////////////////
// Création page Web client
/////////////////////////////////////////////////////////////////// 
void read_web()
{
    // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    #ifdef message_système_USB    
      Serial.println("new request");
    #endif
    // an http request ends with a blank line
   
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        #ifdef message_système_USB
          Serial.write(c);
        #endif
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
        }
/* if you've gotten to the end of the line (received a newline character) and the line is blank, the http request has ended,so you can send a reply */
         if (c == '\n') {
          // send a standard http response header
          client.println("HTTP/1.1.200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close"); 
          client.println("Refresh: 5");  
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
            client.println("<title>DOMO LA NOUE</title>");
            client.println("<tr>");
            client.println("<body bgcolor=#00C7CC><p align=center>");   
            client.println("
<font color=#FFFFFF><font size=7>Bienvenue
sur</font></p>");
            client.println("<p align=center><font color=black><font size=7>DOMO LA NOUE

");
            client.println("<img src=http://image.noelshack.com/fichiers/2014/50/1418070763-hello-newsletter.gif width=175 height=50></p>
");
          client.println("</font><p align=center><font size=6>");
          client.println("Chauffage  ");
          if (MARCHE==true)
          {
          client.println("Marche ""
");
           }
          else client.println("Arret ""
");
          client.println("Puissance Apparente ""<font color=white>");client.print(PAPP,DEC);client.print("</font><font size=6><font color=black>"" V A""
");
          client.print("Intensite Instantannee ");
                  
                  if ((IINST[0][0])<=10)
                  {
                  client.print("<font color=green>");client.print(IINST[0][0]);client.print("</font><font size=6><font color=black>"" A ""
");
                  }
                  else if (((IINST[0][0])>10)&&((IINST[0][0])<=15))
                  {
                  client.print("<font color=purple>");client.print(IINST[0][0]);client.print("</font><font size=6><font color=black>"" A ""
");
                  }
                  else
                 {  
                 client.print("<font color=red>");client.print(IINST[0][0]);client.print("</font><font size=6><font color=black>"" A ""
");
                 }  
          client.print("Periode Tarifaire En Cours  ");
              
                  if (strncmp("HPJB", PTEC,4)==0)
                  {
                  client.print("<font color=red>""HP Bleu");client.print("</font><font size=6><font color=black>
");
                  }
                  else if (strncmp("HCJB", PTEC,4)==0)
                  {
                  client.print("<font color=blue>""HC Bleu");client.print("</font><font size=6><font color=black>
");
                  }  
                  else if (strncmp("HPJW", PTEC,4)==0)
                  {
                  client.print("<font color=red>""HP Blanc");client.print("</font><font size=6><font color=black>
");
                  }  
                  else if (strncmp("HCJW", PTEC,4)==0)
                  {
                  client.print("<font color=blue>""HC Blanc");client.print("</font><font size=6><font color=black>
");
                  }  
                  else if (strncmp("HPJR", PTEC,4)==0)
                  {
                  client.print("<font color=red>""HP Rouge");client.print("</font><font size=6><font color=black>
");
                  }
                  else if (strncmp("HCJR", PTEC,4)==0)
                  {
                  client.print("<font color=blue>""HC Rouge");client.print("</font><font size=6><font color=black>
");
                  }
                  client.print("Demain  ");
          if (strncmp("BLEU",DEMAIN,4)==0)
          {
          client.println("<font color=blue>""Jour Bleu");
          }
          else if (strncmp("BLAN",DEMAIN,4)==0)
          {
          client.println("<font color=white>""Jour Blanc");
          }
          else if (strncmp("ROUG",DEMAIN,4)==0)
          {
          client.println("<font color=red>""Jour Rouge");
          }
          else client.println("<font color=black>""----");
client.print("<table width=800 border=0><table align=center>");
client.print("<td bgcolor=#00C7CC><font color=black><p align=center><font size=6>"" Hp ""<td bgcolor=#00C7CC><font color=black><p align=center><font size=6>"" Hc ""</p></td></tr>");
client.print("<td bgcolor=blue><font color=black><font size=6>");client.print((INDEX1/1000),DEC);client.print("<td bgcolor=blue><font size=6>");client.print((INDEX2/1000),DEC);client.print("</td>");
client.print("<tr>");
client.print("<td bgcolor=white><font color=black><font size=6>");client.print((INDEX3/1000),DEC);client.print("<td bgcolor=white><font size=6>");client.print((INDEX4/1000),DEC);client.print("</td>");
client.print("<tr>");
client.print("<td bgcolor=red><font color=black><font size=6>");client.print((INDEX5/1000),DEC);client.print("<td bgcolor=red><font size=6>");client.print((INDEX6/1000),DEC);client.print("</td>");
client.print("</tr></table>""</font><p align=center><font size=6>"); 
client.print("<font color=black>""Chauffage ""
<a href=\"/?Marche\"\"><font color=red> Comfort 
");
client.print("<a href=\"/?Auto\"\"><font color=black> Auto </a>
"); 
client.print("<a href=\"/?Arret\"\"><font color=green> Eco </a>
"); 
DHT.read22(SONDE);//lecture des données du capteur
client.print("<font color=black>""Humidite = ");client.print(DHT.humidity);client.print(" % Rh\n""
");
client.print("Temperature = ");client.print(DHT.temperature);client.print(" C \n""

</body></tr></font></p></html>");
      break;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    #ifdef message_système_USB
      Serial.println("client disconnected");
    #endif
///////////////////// control arduino pin /////////////
          if(readString.indexOf("?Marche")>0)// Maintien a 20°
          {
          marche = DHT.temperature < 20;
          }
          else if (readString.indexOf("?Arret")> 0)// MAINTIENT A 15°
          {
          arret = DHT.temperature < 15 ;
          }
          else if (readString.indexOf("?Auto")> 0)  
          {
          autom = DHT.temperature < 15 && DHT.temperature >= 19 && heure > 17 && heure < 23; //   Maintien a 19° de 17 a 23 Heure 
          }
          if ((marche)||(autom)||(arret)== true )
          {
          digitalWrite(OPTO, LOW );
          }
          else 
          {
          digitalWrite(OPTO,HIGH);
         } 
          readString="";
  }}

je n ai pas encore modifier la version avec la regul

ok je te mets une partie du code à intégrer dans ton programme complet ...

avec les commentaires tu devrais comprendre ma logique ... car comme tu le faisais dans ton programme (a priori car je n'ai qu'un petit bout ...) tu allumais le relais seulement dans read_web ... or tu n'entres dans cette fonction que si tu envoies un ordre web

unsigned long next_regulation; // gere le chauffage ttes les 30s 
byte mode;                     // mode du chauffage (à pour arret, 1 marche, 2 auto

void setup() {
  // put your setup code here, to run once:

}


void  read_web() {
  
  // le debut semble ok ... à la fin modifie avec ceci

/////////////////////  ce n'est pas ici qu'il faut gérer physiquement le chauffage /////////////
          if(readString.indexOf("?Marche")>0)       mode = 1; // mode 1 = Maintien a 20
          else if (readString.indexOf("?Arret")> 0) mode = 0; // mode 0 = arret = maintien A 15°
          else if (readString.indexOf("?Auto")> 0)  mode = 2; // mode 2 = auto 
          readString="";
  }}
  
  
void loop() {
  // put your main code here, to run repeatedly:

  boolean allumer;  //true si il faut allumer le chauffage, false sinon
  
  //regarde si il y a un client
  read_web();
  
  //lit un température 
  // je ne me souviens plus, mais tu l'as dans ton programme
  
  //gestion du chauffage chauffage
  //ici on allume ou éteint le chauffage en fonction du mode demandé
  if (millis() > next_regulation) {  //c'est l'heure de réguler
    next_regulation += 30000;  //prochaine régulation dans 30s (a toi de voir suivant ton chauffage)
    
    //allumera ou pas le chauffage en fonction du mode, de la température et de l'heure
    if (mode == 0) { //mode arret (on allume si t < 15, éteint si > 15.5 (hystérésis pour éviter les bascules trop fréquentes 
      if (DHT.temperature < 15) allumer = true; 
      else if (DHT.temperature > 15.5) allumer = false; 
    } else if (mode == 1) { //mode allumage forcé
      if (DHT.temperature < 20) allumer = true; 
      else if (DHT.temperature > 20.5) allumer = false;   
    } else if (mode == 2) { //mode auto, en fonction de la température et de l'heure
      // ici on chauffe à 19° entre 17h et 23h
      // et à 15 en dehors de cette plage horaire
      if (heure >= 17 && heure <= 23) {
         if (DHT.temperature < 20) allumer = true; 
         else if (DHT.temperature > 20.5) allumer = false;    
      } else {
         if (DHT.temperature < 15) allumer = true; 
         else if (DHT.temperature > 15.5) allumer = false; 
      }
    } 
    
    //action sur le relai du chauffage
    if (allumer) digitalWrite(OPTO,LOW); //logique inversée (allumage du chauffage)
    else digitalWrite(OPTO,LOW);          //exctintion du chauffage
  }   //fin de la régulation
  
  //suite du programme
    
      
}

Ok Merci c'est beaucoup plus clair comme cela .
je vais modifier le programme
et modifier l affiche du mode de chauffage et son etat sur la page Web.
te confirmerais le fonctionnement.

bonjour, deux sousis d'erreurs

if (millis() > next_regulation) {  //c'est l'heure de réguler
    next_regulation += 30000;  
 error: expected unqualified-id before 'if'
Erreur lors de la compilation.
if (mode == 0) { //mode arret (on allume si t < 15, éteint si > 15.5 (hystérésis pour éviter les bascules trop fréquentes 
      if (DHT.temperature < 15) allumer = true; 
      else if (DHT.temperature > 15.5) allumer = false; 
    } else if (mode == 1) { //mode allumage forcé
      if (DHT.temperature < 20) allumer = true; 
      else if (DHT.temperature > 20.5) allumer = false;   
    } else if (mode == 2) { //mode auto, en fonction de la température et de l'heure
      // ici on chauffe à 19° entre 17h et 23h
      // et à 15 en dehors de cette plage horaire
      if (heure >= 17 && heure <= 23) {
         if (DHT.temperature < 20) allumer = true; 
         else if (DHT.temperature > 20.5) allumer = false;    
      } else {
         if (DHT.temperature < 15) allumer = true; 
         else if (DHT.temperature > 15.5) allumer = false; 
      }
    } 

domo_12_12.ino:831:5: error: expected unqualified-id before 'if'
domo_12_12.ino:834:7: error: expected unqualified-id before 'else'
domo_12_12.ino:837:7: error: expected unqualified-id before 'else'
Erreur lors de la compilation.

Je ne vois pas d'erreur dans ces lignes ...

bonjour, peut-être qu'il faut initialiser "next_regulation"...

Ça ne donnerait pas ce message d'erreur...

Le pb est avant cette ligne... C'est écrit dans le message d'erreur ... Mais comment la corriger si on n'a rien à ce mettre sous la dent ? :astonished:

Bonjour

//**************** declaration Regulation chauffage ***********
unsigned long next_regulation; // gere le chauffage ttes les 30s 
byte mode;                     // mode du chauffage (à pour arret, 1 marche, 2 auto)
boolean allumer;  //true si il faut allumer le chauffage, false sinon

ne peut pas metrre tout le programe il fait 1034 lignes

//Definition dee modes de chauffage //
                if(readString.indexOf("?Marche")>0) mode = 1; // mode 1 = Maintien a 20
          else if (readString.indexOf("?Arret")> 0) mode = 0; // mode 0 = arret = maintien A 15°
          else if (readString.indexOf("?Auto")> 0)  mode = 2; // mode 2 = auto 
          readString="";