Um botão - dois Relés ajuda

Boa tarde.

Estou um pouco desesperado porque não sei para onde me virar :confused: ... sou novo no mundo do arduino tenho algumas noções mas tudo muito básico.

Estou a tentar fazer um código em que tenho somente 1 pressbutton e 2 relés

O que quero fazer é isto.

Carrego no botão acciona relé 1
Carrego no botão desliga relé 1
Carrego no botão acciona relé 2
Carrego no botão desliga relé 2
e reiniciar o ciclo

O Problema é que o código não está a fazer o que quero.
A acção do botão:
aperto o botão liga relé1
aperto o botão desliga relé1
aperto o botão liga relé1
aperto o botão nao faz nada
aperto o botão desliga relé1
aperto o botão liga relé2
aperto o botão nao faz nada
aperto o botão nao faz nada

as vezes funciona outras nao...

//Porta 11 ligada ao Relé1
int rele1 = 11;
//Porta 10 ligada ao Relé2
int rele2 = 10;
//Porta 2 ligada ao botao 1
int botao = 2;
int flag = 0;

void setup()
{
  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);
  pinMode (botao, INPUT);
  digitalWrite(rele1,LOW);
  digitalWrite(rele2,LOW);
}
void loop()
{    
  //Liga relé1
  if(digitalRead(botao) == HIGH && flag == 0)
    {
    while(digitalRead(botao) == HIGH);
{
    digitalWrite(rele1, HIGH);
    flag = 1;
    delay(200);
}
  }
  //Desliga relé1
  else if(digitalRead(botao) == HIGH && flag == 1)      
  {
    while(digitalRead(botao) == HIGH);
{
    digitalWrite(rele1, LOW);
    flag = 0;
    delay(200);
}
  }
  //Liga relé2
  else if(digitalRead(botao) == HIGH && flag == 0)
  {
    while(digitalRead(botao) == HIGH);
{
    digitalWrite(rele2, HIGH);
    flag = 1;
    delay(200);
}
   }
   //Desliga relé2
  else if(digitalRead(botao) == HIGH && flag == 1)      
  {
    while(digitalRead(botao) == HIGH);
{
    digitalWrite(rele2, LOW);
    flag = 0;
    delay(200);
}
  }
}

o meu setup
1- Arduino Mega 2560
3- 8x Relay Model - Sainsmart

ACIONANDO_MODULO_RELE_COM_ARDUINO_CIRCUITO_2_LAMPADAS.ino (1.48 KB)

Caro D-map, em primeiro lugar bem-vindo ao fórum. Em segundo lugar leia as regras o fórum e aprenda a postar código. Possivelmente até é um problema simples e de fácil resolução, mas com o código desta forma é impossível, ver alguma coisa.

luisilva
Obrigado pelo comentário. já alterei o post

Video do estado (des)funcional dos botoes

Imagino que uma coisa como a que se segue funcione da maneira pretendida:

//Porta 11 ligada ao Relé1
int rele1 = 11;
//Porta 10 ligada ao Relé2
int rele2 = 10;
//Porta 2 ligada ao botao 1
int botao = 2;

int flag = 0;

int estado_botao = 0;
int ultimo_botao = 0;
int estado = 0;

void setup()
{
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);
  pinMode (botao, INPUT);
  digitalWrite(rele1,LOW);
  digitalWrite(rele2,LOW);
}

void loop()
{   
  estado_botao = digitalRead(botao);

  // botao premido - alterar estado
  if (estado_botao == HIGH && estado_botao != ultimo_botao) {
    estado++;
    flag = 1; // o estado foi alterado - executar acçao
    if (estado > 3) {
      estado = 0;
    }
  }

  // acçoes
  if (flag == 1) {
    flag = 0;
    switch (estado) {
    case 1:
      digitalWrite(rele1, HIGH);
      break;
    case 3:
      digitalWrite(rele2, HIGH);
      break;
    default:
      digitalWrite(rele1, LOW);
      digitalWrite(rele2, LOW);
    }
  }
  
  ultimo_botao = estado_botao;
}

Não testei, por isso pode não funcionar correctamente.

Muitíssimo obrigado pela ajuda luisilva.

Vou testar assim que chegar a casa.