Controller un relai via Internet et bouton

Bonjour à tous, j’ai une petit soucis avec mon code, j’aimerai actionner un relai grace à une requête (/cloture1=ON) , mais également avec un bouton.
Pour controler le relais uniquement par internet, ou uniquement par bouton, pas de soucis, par contre avec les 2 ensemble, ça ne fonctionne plus.
C’est le bouton qui est prioritaire, et quand je lance le ma requête, le relai s’actionne, puis change immediatement d’état.
J’aimerai pouvoir allumer et éteindre mon relai avec le bouton, mais surtout, si le bouton a allumé le relai, pouvoir l’éteindre par internet.
j’imagine qu’il y a un état du relai à prendre en compte, mais je ne sais pas trop comment faire.

Merci d’avance pour votre aide

// ---------------------------------------------------------------------------------------------------------
// zimmermann frédéric
// Arduino + ethernet shield control by iOS
// Mai 2015
// ----------------------------------------------------------------------------------------------------------

#include <LiquidCrystal.h>
#include <Ethernet.h>
#include <SPI.h>

// Ethernet shield settings
// Change the MAC in hex, your IP, Gateway, subnet mask and webport
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};        // MAC
byte ip[] = {192, 168, 0, 93};                         // Shield IP
byte gateway[] = {192, 168, 0, 1};                      // Gateway
byte subnet[] = {255, 255, 255, 0};                       // Subnet mask
int port = 85;                                            // Webport
// ---------------------------------------------------------------------

EthernetServer server(port);
LiquidCrystal lcd(9,8, 5, 4, 3, 2);

int Cloture1 = 30;
int led = 22;
int bouton = 6;
int etatbouton = 0;
int val= 0;
int precedetat= 0;


int etatled = LOW;


// Serial speed
int speedSerial = 9600;

// Buffer size
int sizeString = 80;
String stringInput = String(sizeString);

// Setup
void setup()  {
  
  
   lcd.begin(16,2);
  
  // Digital Pins 10, 11, 12 i 13 utilisé par le shield ethernet
  pinMode(Cloture1, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(Cloture1, OUTPUT);
  


  
  // Start ethernet shield webserver
  Serial.begin(speedSerial);
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  
}  // Setup end

// loop Start
void loop()  { 
   // Gestion de l'appui sur le bouton
   val = digitalRead(bouton);
   
  if ((val  == HIGH) && (precedetat == LOW)) {
   etatbouton = 1 - etatbouton;
   delay(10);
}
 precedetat = val;
 
if (etatbouton == 0) {
  
            digitalWrite (led, HIGH);
            digitalWrite (Cloture1, HIGH);
            lcd.setCursor(0, 1);
            lcd.print("Clot1. ON.Bouton  ");
            delay(400);
		   
             }
            

else { 
     digitalWrite (led, LOW);
    
    digitalWrite (Cloture1, LOW);
    lcd.setCursor(0, 1);
    lcd.print("Clot1.OFF.Bouton  ");
}
 Serial.begin(9600);  //Connection série à 9600 baud
    
    
  EthernetClient client = server.available();
  if (client)  {
    
    boolean currentLineIsBlank = true;
    stringInput = "";
    
    if (client.connected())  {
      while (client.available())  {

        char c = client.read();
        
        if(stringInput.length() < sizeString)  {
          stringInput.concat(c);
          
        }
        
        if (c == '\n' && currentLineIsBlank)  {

          client.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
          
            client.println("<agridomotique>");
            
          // Pin 30 Cloture1
          
          client.print("<Pin>");
          client.print("<namePin>Cloture1</namePin>");
            client.print("<digitalPin>");
            // Digital pin to control
             client.print(Cloture1);
            client.print("</digitalPin>");
              client.print("<Estado>");
              client.print(digitalRead(Cloture1));
             client.print("</Estado>");
          client.print("</Pin>");
          
          
          
          
          
          client.println("</agridomotique>");
          break; 
         }
        
        if (c == '\n')  {
          
          Serial.print(stringInput);
          Serial.println();
          
          if(stringInput.indexOf("GET") !=-1)  {
             
            

            // si iphone ON 
            if (stringInput.indexOf("Cloture1=ON") != -1){
                digitalWrite (Cloture1, HIGH);
                
             lcd.setCursor(0, 1);
              lcd.print("Clot1: ON ---Iph. ");
              digitalWrite (led, HIGH);
              
            }
            // si off iphone 
            if (stringInput.indexOf("Cloture1=OFF") != -1) { 
              digitalWrite (Cloture1, LOW);
               
             lcd.setCursor(0, 1);
              lcd.print("Clot1: OFF---Iph. ");
              digitalWrite (led, LOW);
              
                            
            }  
            
            
            
          }
          currentLineIsBlank = true;
          stringInput = "";
        } 
        else if (c != '\r')  {
          
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  
   }
}

/code]

Salut,

si (boutonAppuyé && flag == false) {

flag = true;

}

si(boutonRequete==ouverture && flag==false) {

flag=true;


}

si(boutonRequete==fermeture && flag==true) {

flag=false;

}

si(flag) {
ouverture()
} else {
fermeture
}

Merci beaucoup, je vais tester ça ce soir

Merci encore pour ton aide, je n'ai pas eu le temps de tester, je ferai ça demain matin , mais pourrais tu m'expliquer a quoi correspond le boolean falg ainsi que les fonctions ouverture et fermeture . Tu parles peut être de l'état de mon relai ( HIGH ou LOW). Peux tu m'expliquer ton code STP !

Merci encore

C'est bon , jai reussi en ajoutant une variable de type booléen qui se vérifie quand la requête est lancé avec l'iPhone

Merci encore à toi BATTO