Estructura de control

Bueno comentarles que tengo una pagina web en la que tengo seis botones la idea es que al presionar el botón X se encienda el led X y si vuelvo a presionar el mismo boton se debe apagar el led, el problema lo tengo en el codigo de arduino porque en la programacion web no tengo ningun inconveniente

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


int led3=3;
int led5=5;
int led6=6;
int led7=7;
int led8=8;
int led9=9;

byte mac[] = {0x00,0x01,0x02,0x03,0x04,0x05};
byte myIP[] = {192,168,20,21};
EthernetServer server = EthernetServer(80);
void setup()
{
  Serial.begin(9600);

  pinMode(led3, OUTPUT);
    pinMode(led5, OUTPUT);
    pinMode(led6, OUTPUT);
    pinMode(led7, OUTPUT);
    pinMode(led8, OUTPUT);
    pinMode(led9, OUTPUT);

    digitalWrite(led3, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);

   Ethernet.begin(mac,myIP);
   
   server.begin();
   Serial.print(Ethernet.localIP());
}
void loop()
{
 
 EthernetClient client = server.available();
 if(client)
    {     
 switch (client.read())
 { 
    case '1':
            if(led3==LOW){
                digitalWrite(led3, HIGH);
             }else{
                digitalWrite(led3, LOW);
             }
      break;
        case '2':
        if(led5==LOW){
                digitalWrite(led5, HIGH);
             }else{
                digitalWrite(led5, LOW);
             }
         break;
    case '3':
            if(led6==LOW){
                digitalWrite(led6, HIGH);
             }else{
                digitalWrite(led6, LOW);
             }
      break;
    case '4':
            if(led7==LOW){
                digitalWrite(led7, HIGH);
             }else{
                digitalWrite(led7, LOW);
             }
      break;
        case '5':
            if(led8==LOW){
                digitalWrite(led8, HIGH);
             }else{
                digitalWrite(led8, LOW);
             }
          break;
        case '6':
            if(led9==LOW){
                digitalWrite(led9, HIGH);
             }else{
                digitalWrite(led9, LOW);
             }
          break;  
    default:
      delay(1000);
 }
 }
  client.stop();    
}

Mira este tutorial : Arduino AJAX Web Serverque tiene varias secciones, busca la apropiada a tu caso. Te será muy útil.

Veo que has leído las normas pero has confundido donde plantear tu consulta.
Si te tomas el tiempo, verás que consultas de software (como ésta) van en la sección Software.
Proyectos es para trabajos que involucran tiempo.... de parte del interesado.
Movido a Software.

El “problema” es que creo que estás confundiendo el concepto. Voy a tratar de explicarlo con led3, pero es extensible a todos los demás.

En teoría, viendo el código tal cual lo tienes, led3 es una variable en la que se está guardando el número del pin al que está conectado uno de los LEDs que quieres controlar. Y más exactamente que se apague y se encienda cuando recibe el carácter 1. Así que la variable led3 la deberías de usar únicamente para hacer referencia al pin al que tienes conectado el LED cuando vas a cambiar su estado. Pero estás usando directamente la variable led3 para saber en qué estado tienes el LED, pero es que en led3 no guardas el estado del LED, sino dónde está conectado el LED. Podrías usar una nueva variable, por ejemplo estado3, con la que controlas en qué estado tienes el LED, que se podía declarar así:

byte estado3 = LOW; // Con un byte tenemos suficiente (el int son dos bytes)

… y usarla así:

           case '1':
                if (estado3 == LOW) {
                        estado3 = HIGH;
                        digitalWrite(led3, HIGH);
                } else {
                        estado3 = LOW;
                        digitalWrite(led3, LOW);
                }
                break;

Pero ya puestos, si en estado3 tiene el valor que se le pasa el digitalWrite, usemos ese valor y ahorrémonos código:

           case '1':
                if (estado3 == LOW) {
                        estado3 = HIGH;
                } else {
                        estado3 = LOW;
                }
                digitalWrite(led3, estado3);
                break;

Hay que saber que, en Arduino, LOW realmente es el valor cero y HIGH vale uno. Y no sólo eso, digitalWrite te pone a nivel bajo la salida si le pones un cero (el famoso LOW) y pone a nivel alto la salida si le mandas cualquier valor distinto de cero (HIGH, 8 u 80, da igual). En C/C++ se considera como falso el valor cero y como verdadero cualquier valor distinto de cero. Parece entonces que digitalWrite espera algo que le diga si es verdadero o falso que se quiere el pin a nivel alto.

Otra cosa que hay es que si niegas con el operador ! (exclamación) el valor cero (falso) te da uno (verdadero). Mientras que si niegas un valor distinto de cero (verdadero) te da cero (falso). Así que podemos hacer esto:

           case '1':
                estado3 = !estado3;
                digitalWrite(led3, estado3);
                break;

Y ahora, para rematar la faena, resulta que si tienes configurado el pin como salida y aún así te empeñas en leerlo con digitalRead como si estuviera configurado como entrada (que no lo está) te da como resultado cero (LOW) si la salida está a nivel bajo y uno (HIGH) si la salida está a nivel alto. Con lo que nos podemos ahorrar la variable estado3 porque leemos el estado directamente con digitalRead, invertirlo después con el operador de negación ! (la exclamación) y asignarle ese valor al pin con digitalWrite, quedando entonces el fragmento de código tal que así:

           case '1':
                digitalWrite(led3, !digitalRead(red3));
                break;

Aunque esto último es viable, yo no recomiendo hacerlo así porque puede que algún día nos encontremos con un Ardunio que no tenga el ese comportamiento con el digitalRead.

Otra cosa, en lugar de variables, yo definiría como constantes a pin3 y el resto de sus compañeras (pinX), ya que ahorra RAM (que vamos a usar para las variables estadoX) y no van a cambiar de valor en ningún momento.

Así que el código lo dejaría asi:

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


const int led3=3; // <--- Las definimos como constantes ya que no cambian y encima no gastan RAM
const int led5=5;
const int led6=6;
const int led7=7;
const int led8=8;
const int led9=9;

byte estado3=0;  // <--- Inicializamos los estados como que los LEDs están apagados
byte estado5=0;
byte estado6=0;
byte estado7=0;
byte estado8=0;
byte estado9=0;

byte mac[] = {0x00,0x01,0x02,0x03,0x04,0x05};
byte myIP[] = {192,168,20,21};
EthernetServer server = EthernetServer(80);
void setup()
{
    Serial.begin(9600);

    pinMode(led3, OUTPUT);
    pinMode(led5, OUTPUT);
    pinMode(led6, OUTPUT);
    pinMode(led7, OUTPUT);
    pinMode(led8, OUTPUT);
    pinMode(led9, OUTPUT);

    digitalWrite(led3, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);

    Ethernet.begin(mac,myIP);
        
    server.begin();
    Serial.print(Ethernet.localIP());
}
void loop()
{
        
    EthernetClient client = server.available();
    if(client)
    {     
        switch (client.read())
        {       
            case '1':
                estado3 = !estado3;
                digitalWrite(led3, estado3);
                break;
            case '2':
                estado5 = !estado5;
                digitalWrite(led5, estado5);
                break;
            case '6':
                estado6 = !estado6;
                digitalWrite(led6, estado6);
                break;
            case '4':
                estado7 = !estado7;
                digitalWrite(led7, estado7);
                break;
            case '5':
                estado8 = !estado8;
                digitalWrite(led8, estado8);
                break;
            case '6':
                estado9 = !estado9;
                digitalWrite(led9, estado9);
                break;
            default:
                delay(1000);
        }
    }
    client.stop();   
}

No descarto que gran parte de lo que he dicho ya lo supieras, pero no está de más explicarlo para aquellos que son nuevos en esto de la programación en C/C++.

Nota: no he podido compilar y probar el código. Así que espero que funcione. Ya me dirás, si lo pruebas, si te da problemas.