problemas al querer encender y apagar relays por software

Buenas noches!!! acudo a ustedes para que me puedan ayudar con un problema que tengo para activar y desactivar unos relays por medio de VBA, lo que hago es lo siguiente, el programa tiene dos botones, Relay 1 y Relay 2, cuando apreto por ej el boton de Relay 1 el relay se tiene que activar, y cuando vuelvo a apretar el boton el relay se tiene que desactivar, lo mismo con el boton de Relay 2, con cada boton envio una letra (Relay 1 = “A” y Relay 2 = “B”) se envia todo fenomeno llegan las letras a arduino todo comprobado, pero el problema lo tengo en el codigo de Arduino, probe con dos metodos.

Metodo 1: con este metodo activaba y desactivaba el Relay 1 sin problemas, pero al querer activar el segundo relay no entra :confused:

    if (Serial.available() > 0)
         {
         if(Serial.read()==65)  //Verifica si se recibe una A (65 en ASCII)...
            {
                  cont1=cont1+1;
                  switch(cont1)
                  {
                  case 1:
                  digitalWrite(9,LOW);
                  break;
                  case 2:
                  digitalWrite(9,HIGH);
                  cont1=0;
                  break;    
                 }
            }
          
          if(Serial.read()==66)  //Verifica si se recibe una B (66 en ASCII)...
            {
                  cont2=cont2+1;
                  switch(cont2)
                  {
                  case 1:
                  digitalWrite(10,LOW);
                  break;
                  case 2:
                  digitalWrite(10,HIGH);
                  cont2=0;
                  break;    
                 }
            }
 
         }

Metodo 2: En esta me base en un proyecto anterior que hice con pulsadores con antirebote y etc, el problema que tengo aca es que se activa el relay 1 y para desactivarlo tengo que presionar el boton del Relay2 y muchas cosas locas mas jajaja, la cuestion es que no corre como deberia.

if (Serial.available() > 0) //Verifica si se reciben datos del puerto
    {
        stateRelay1 = Serial.read();  
        if(stateRelay1 == 65 && previousR1 == 0 && millis() - time > debounce) 
            {
                if(stateRelay1 == 65)
                    {
                      stateRelay1 = 0; 
                    } 
                else 
                    {
                    stateRelay1 = 1; 
                    }
                    time = millis();
            }
        digitalWrite(Relay1, stateRelay1);
        previousR1 == stateRelay1;
    }
if (Serial.available() > 0)
    {
        stateRelay2 = Serial.read();  
        if(stateRelay2 == 66 && previousR2 == 0 && millis() - time > debounce) 
            {
                if(stateRelay2 == 66)
                    {
                    stateRelay2 = 0; 
                    } 
                else 
                    {
                    stateRelay2 = 1; 
                    }
                    time = millis();
            }
        digitalWrite(Relay2, stateRelay2);
        previousR2 == stateRelay2;
    }

Bueno y mi peticion es si alguien poooodria por favor guiarme o pasar un pedaso de codigo que tenga por ahi para hacer funcionar esta parte de mi proyecto? si necesitan que comente algunas de las partes de los codigos que me avise no tengo ningun problema :smiley:

excel botonera.jpg

Algo que todavía no me queda claro es:

  • Cuál método prefieres?
  • La botonera envía datos al monitor serie (puerto serial)?

Si me quedaran claros estos dos puntos, te podría ayudar...

Del método 1: te sugiero esto

if (Serial.available() > 0) {
    char a = Serial.read()=='A'; 
    switch (a) {     //Verifica si se recibe una A (65 en ASCII)...
        case 'A':
                  bool estado1 = !estado1;    
                  if (estado1) 
                      digitalWrite(9, LOW);
                  else 
                      digitalWrite(9, HIGH);
                  break;
        case 'B':
                  bool estado2 = !estado2;    
                  if (estado2) 
                      digitalWrite(10, LOW);
                  else 
                      digitalWrite(10, HIGH);
                  break;
    }
}

Ahora queres que además se activen via pulsadores?

code

Lucario448: Algo que todavía no me queda claro es:

  • Cuál método prefieres?
  • La botonera envía datos al monitor serie (puerto serial)?

Si me quedaran claros estos dos puntos, te podría ayudar...

prefiero el metodo que mas comodo les quede y si, la botonera envia datos al puerto serie, esto es lo que manda

'-----------------------------BOTONES DE RELAY----------------------------------------->
Private Sub RelayButton1_Click()
        DoEvents    'seguir interactuando con eventos en la aplicacion.
        Me.NETComm1.Output = "A"    'enviar una A a la salida del puerto COM.
End Sub

Private Sub RelayButton2_Click()
        DoEvents    'seguir interactuando con eventos en la aplicacion.
        Me.NETComm1.Output = "B"    'enviar una B a la salida del puerto COM.
End Sub
'-------------------------------------------------------------------------------------->
[code]

surbyte: Del método 1: te sugiero esto

if (Serial.available() > 0) {
    char a = Serial.read()=='A'; 
    switch (a) {     //Verifica si se recibe una A (65 en ASCII)...
        case 'A':
                  bool estado1 = !estado1;    
                  if (estado1) 
                      digitalWrite(9, LOW);
                  else 
                      digitalWrite(9, HIGH);
                  break;
        case 'B':
                  bool estado2 = !estado2;    
                  if (estado2) 
                      digitalWrite(10, LOW);
                  else 
                      digitalWrite(10, HIGH);
                  break;
    }
}

Ahora queres que además se activen via pulsadores?

nono sin pulsadores solo la botonera, probe el codigo y me tirar error

 Arduino:1.6.8 (Windows 10), Tarjeta:"Arduino/Genuino Uno"

C:\Users\Leandro\Desktop\p01_PrendeLed\p01_PrendeLed.ino: In function 'void loop()':

p01_PrendeLed:26: error: jump to case label [-fpermissive]

         case 'B':

              ^

p01_PrendeLed:20: error: crosses initialization of 'bool estado1'

                   bool estado1 =! estado1;    

                        ^

p01_PrendeLed:34: error: expected '}' at end of input

 }

 ^

exit status 1
jump to case label [-fpermissive]

[code]

No pusiste todo el código por ende es algo para que resuelvas tu.

se coló este error pero aprende a resolverlos por tu cuenta

char a = Serial.read()=='A';

por este

char a = Serial.read();

surbyte si eso ya lo habia notado y lo modifique pero aun asi me sigue tirando el mismo error, y otra cosa, que es el “=!”? por q si pongo el operador logico de desigual que use siempre ("!=") no lo toma como valido asi que calculo que “=!” no significa desigual, perdonen hace poco que estoy con esto de arduino jajaja

"!=" es para comparación. Ejemplo:

if (x != y) //¿x es diferente de y?

"= !" es invertir el valor lógico de la variable de la derecha del símbolo de "igual", luego almacenar el resultado en la variable de la izquierda. Ejemplo:

x = ! x  // Invierte el valor lógico de x, luego guarda el resultado en x

Eso aclara tu duda?

gracias lucario me quedo mas que claro, ya lo escribo en mi anotador jajaja, bueno logre solucionar el problema en el codigo de surbyte, pero logro activar los relay, seguire retocando el codigo y probando

listo tema resuelto, gracias chicos!!!! :D

Como bien dijo lucario no hay que ver =! sino !estado1 que solo es para invertir el estado de la variable estado1 cada vez que se cumple la condición correspondiente.