Manejo de dos led desde arduino y pc

Hola
A ver si por favor alguien puede ayudarme a solucionar este problema.

Quiero manejar dos led desde arduino mediante dos interruptores, y que tambien pueda manejarlos desde el pc.

El problema que me encuentro es que desde los interruptores funcionan perfectos, pero cuando intento encenderlos desde el pc al instante se me apagan.

En el codigo que pongo a continuacion, cuando cierro el interruptor1 y su valor es HIGH se establece el valor de m = false, luego para apagarlo le pongo la condicion de que el interruptor1 sea LOW (y) que m sea false, lo apaga perfectamente y establezco el valor de m en true

Lo que no entiendo es por que cuando despues de esto enciendo el led desde el pc automaticamente se apaga, cuando m esta establecido en true. ya no se cumplen las dos condiciones de apagado que le pido de que interruptor1 sea LOW y m sea false.

#define interruptor1 A4
#define interruptor2 A3

#define led1 A1
#define led2 A2

void setup() 
{
  pinMode(interruptor1, INPUT);
  pinMode(interruptor2, INPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  Serial.begin(9600);

}

void loop() 
{
  //Codigo para los interruptores de los led

 int valor1 = digitalRead(interruptor1);
 int valor2 = digitalRead(interruptor2);
 bool m;
 bool n;
 
 if (valor1 == HIGH)
 {
  digitalWrite(led1, HIGH);
  m = false;
 }

 if ((valor1 == LOW) && (m == false))
 {
  digitalWrite(led1, LOW);
  m = true; 
 }
 
 if (valor2 == HIGH)
 {
  digitalWrite(led2, HIGH);
  n = false;
 }

 if ((valor2 == LOW) && (n == false))
 {
  digitalWrite(led2, LOW);
   n = true; 
 }



 //Codigo para manejo desde el pc

 if (Serial.available() > 0)
   {
      int pc = Serial.read();
 
 if (pc == 'h')
    {
      digitalWrite(led1, HIGH); //Enciende el laser 1
    }
    if (pc == 'i')
    {
      digitalWrite(led1, LOW); //Apaga el laser 1
    }
    if (pc == 'j')
    {
      digitalWrite(led2, HIGH); //Enciende el laser 2
    }
    if (pc == 'k')
    {
      digitalWrite(led2, LOW); //Apaga el laser2
    }
   }

}

Si utilizo este codigo en el que elimino la parte de encendido y apagado mediante interruptores funciona perfecto desde el pc, cuando le pido que se encienda se enciende, y permanece encendido hasta que le pido que se apague.

Algun error estoy cometiendo y no soy capaz a verlo o a solucionarlo.

#define interruptor1 A4
#define interruptor2 A3

#define led1 A1
#define led2 A2

void setup() 
{
  pinMode(interruptor1, INPUT);
  pinMode(interruptor2, INPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  Serial.begin(9600);

}

void loop() 
{
  //Codigo para los interruptores de los led


 //Codigo para manejo desde el pc
 if (Serial.available() > 0)
   {
      int pc = Serial.read();
 
 if (pc == 'h')
    {
      digitalWrite(led1, HIGH); //Enciende el laser 1
    }
    if (pc == 'i')
    {
      digitalWrite(led1, LOW); //Apaga el laser 1
    }
    if (pc == 'j')
    {
      digitalWrite(led2, HIGH); //Enciende el laser 2
    }
    if (pc == 'k')
    {
      digitalWrite(led2, LOW); //Apaga el laser2
    }
   }

}

Cuando controles algo desde dos vias, debes considerar que solo uno haga el cambio y no que alguno tenga la prioridad como pasa en tu código.

Mira tu códidgo primero.
Leo esto
//Codigo para los interruptores de los led

y luego leo esto
//Codigo para manejo desde el pc

cuando solo deberia leer

// Codigo para manejo de leds desde PC o interruptores.

Esto suena fácil pero veamos como lo hacemos.

No me he esforzado mucho.. asi que supongo que tu partes de código estan bien.

#define interruptor1 A4
#define interruptor2 A3

#define led1         A1
#define led2         A2
int pc = 0;
bool interruptoresCambio = false;
bool pcCambio = false;

void setup() 
{
  pinMode(interruptor1, INPUT);
  pinMode(interruptor2, INPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  Serial.begin(9600);
}

void loop() {
   //Codigo para los interruptores de los led

   bool valor1 = digitalRead(interruptor1);
   bool valor2 = digitalRead(interruptor2);
   bool m;
   bool n;
   if (valor1 != valor1Ant || valor2 != valor2Ant)
       interruptoresCambio = true;

   if (Serial.available() > 0) {
      pc = Serial.read();
      pcCambio = true;
   }

   if (interruptoresCambio)
      if (valor1 == HIGH )  {
         digitalWrite(led1, HIGH);
         m = false;
      }

      if ((valor1 == LOW) && (m == false))  {
          digitalWrite(led1, LOW);
          m = true; 
      }
    
      if (valor2 == HIGH)  {
         digitalWrite(led2, HIGH);
         n = false;
      }

      if ((valor2 == LOW) && (n == false))  {
         digitalWrite(led2, LOW);
         n = true; 
      }
      interruptoresCambio = false;
   ]

   if (pcCambio) {
      if (pc == 'h') {
          digitalWrite(led1, HIGH); //Enciende el laser 1
      }
      
      if (pc == 'i') {
          digitalWrite(led1, LOW); //Apaga el laser 1
      }

      if (pc == 'j') {
         digitalWrite(led2, HIGH); //Enciende el laser 2
      }

      if (pc == 'k') {
         digitalWrite(led2, LOW); //Apaga el laser2
      }
      pcCambio = false;
   }
}

Hola surbyte
Lo primero gracias por contestar
Intente hacerlo con el codigo que me aconsejaste pero me daba errores, le hice algunos cambios hasta que no me dio ningun error y bueno... ahora desde el pc los led funcionan bien, lo malo es que desde los interruptores no se encienden en una secuencia normal, me explico.... no se encienden o se apagan al cambiar el estado del interruptor.
tengo que dar varias veces para que se enciendan o se apaguen.

Soy muy nuevo en el tema de arduino y programacion como es evidente y te agradezco la ayuda, si por favor pudieras seguir ayudandome a ver si conseguimos solucionarlo te lo agradeceria mucho.

el codigo que estoy usando basado en el que tu me pusiste es este:

#define interruptor1 A4
#define interruptor2 A3

#define led1         A1
#define led2         A2

int pc = 0;
bool interruptoresCambio = false;
bool pcCambio = false;

void setup() {

  pinMode(interruptor1, INPUT);
  pinMode(interruptor2, INPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  Serial.begin(9600);

}

void loop() {

   //Codigo para los interruptores de los led

   bool valor1 = digitalRead(interruptor1);
   bool valor1Ant = digitalRead(interruptor1);
   bool valor2 = digitalRead(interruptor2);
   bool valor2Ant = digitalRead(interruptor2);
   bool m;
   bool n;
   
   if (valor1 != valor1Ant || valor2 != valor2Ant)
   {
    interruptoresCambio = true;
   }

   if (interruptoresCambio == true)
   {
      if (valor1 == HIGH )  
      {
         digitalWrite(led1, HIGH);         
      }
    
      if (valor2 == HIGH)  
      {
         digitalWrite(led2, HIGH);     
      }

      if (valor1 == LOW)
      {
        digitalWrite(led1, LOW);
      }

       if (valor2 == LOW)
      {
        digitalWrite(led2, LOW);
      }

      if ((valor1 == LOW) && (valor2 == LOW))
      {
          interruptoresCambio = false;        
      }

   }

   if (Serial.available() > 0) 
   {
      pc = Serial.read();
      pcCambio = true;
   }

   if (pcCambio) 
   {
      if (pc == 'h') {
          digitalWrite(led1, HIGH); //Enciende el laser 1
      }
      
      if (pc == 'i') {
          digitalWrite(led1, LOW); //Apaga el laser 1
      }

      if (pc == 'j') {
         digitalWrite(led2, HIGH); //Enciende el laser 2
      }

      if (pc == 'k') {
         digitalWrite(led2, LOW); //Apaga el laser2
      }
      pcCambio = false;
   }




}

No se si el problema estara en las declaraciones de valor1Ant y valor2Ant, que era uno de los errores que me daba. que no estaban declarados.

Un saludo y gracias.

Se deslizaron un par de errores por no probarlo
Versión corregida.

#define interruptor1 A4
#define interruptor2 A3

#define led1         A1
#define led2         A2

int pc = 0;
bool interruptoresCambio = false;
bool pcCambio = false;

bool valor1, valor1Ant = false;
bool valor2, valor2Ant = false;
bool m, n;

void setup() {
  pinMode(interruptor1, INPUT);
  pinMode(interruptor2, INPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  Serial.begin(9600);
}

void loop() {
	//Codigo para los interruptores de los led

	valor1 = digitalRead(interruptor1);
	valor2 = digitalRead(interruptor2);

	if (valor1 != valor1Ant || valor2 != valor2Ant)
	    interruptoresCambio = true;

	if (Serial.available() > 0) {
		pc = Serial.read();
		pcCambio = true;
	}

	if (interruptoresCambio) {
		if (valor1 && !valor1Ant )  { // cuando presionas se enciende
		 	digitalWrite(led1, HIGH);
		}

		if (!valor1 && valor1Ant )  { // cuando sueltas se apaga
		  	digitalWrite(led1, LOW);
		}

		if (valor2 && !valor2Ant )  { // cuando presionas se enciende
		 	digitalWrite(led2, HIGH);
		}

		if (!valor1 && valor1Ant )  { // cuando sueltas se apaga
		 	digitalWrite(led2, LOW);
		}
		interruptoresCambio = false;
	}

	valor1Ant = valor1;
   	valor2Ant = valor2;

	if (pcCambio) {
		if (pc == 'h') {
		  	digitalWrite(led1, HIGH); 	// Enciende el laser 1
		}

		if (pc == 'i') {
		  	digitalWrite(led1, LOW); 		// Apaga el laser 1
		}

		if (pc == 'j') {
		 	digitalWrite(led2, HIGH); 		// Enciende el laser 2
		}

		if (pc == 'k') {
		 	digitalWrite(led2, LOW); 		// Apaga el laser2
		}
		pcCambio = false;
	}
}

Hola de nuevo surbyte.

Ahora funciona perfecto, muchisimas gracias por la ayuda porque me estaba volviendo loco ya.

Un saludo, y de nuevo muchisimas gracias.... me salvaste la vida.

Debes ir a Documentaciòn y en el primer hilo dice => Indice de temas tutoriales. Te aconsejo que veas las clases de Youtube y los libros que hai estan indicados.
Te falta base de conocimientos, sin ella siempre vas a necesitar ayuda.