[Iniciante] Problema no programa

Boa Tarde! Estou a criar um projeto de sinalização sala a sala, e estou a ter um problema em acender dois leds ao mesmo tempo. Por exemplo: Num hotel um hospede chama o empregado e acende a luz, e outro hospede também chama o empregado, como faço para correr os código. Tem de ser IF dentro de outro IF?

int ledPin1 = 10; 
int ledPin2 = 11; 
int ledPin3 = 12;
int ledPin4 = 13; 
int Botao1 = 2; 
int Botao2 = 3; 
int Botao3 = 4;
int Botao4 = 5;
int EstadoBotao1 = 0; 
int EstadoBotao2 = 0;
int EstadoBotao3 = 0;
int EstadoBotao4 = 0;

void setup() {
pinMode(ledPin1, OUTPUT); 
pinMode(Botao1, INPUT); 
pinMode(ledPin2, OUTPUT);
pinMode(Botao2, INPUT);
pinMode(ledPin3, OUTPUT);
pinMode(Botao3, INPUT);
pinMode(ledPin4, OUTPUT);
pinMode(Botao4, INPUT);
}

void loop() {
EstadoBotao1 = digitalRead(Botao1); 
EstadoBotao2 = digitalRead(Botao2);
EstadoBotao3 = digitalRead(Botao3);
EstadoBotao4 = digitalRead(Botao4); 
if(EstadoBotao1 == HIGH) {  
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin1, LOW); 
int EstadoBotao1 = 0; 
}
if(EstadoBotao2 == HIGH) 
{  
digitalWrite(ledPin2, HIGH);
delay(3600)
digitalWrite(ledPin2, LOW);
int EstadoBotao2 = 0; 
} 
if(EstadoBotao3 == HIGH) 
{  
digitalWrite(ledPin3, HIGH);
delay(3600)
digitalWrite(ledPin3, LOW);
int EstadoBotao3 = 0; 
}
if(EstadoBotao3 == HIGH)
{
digitalWrite(ledPin4, HIGH);
delay(3600)
digitalWrite(ledPin4, LOW);
int EstadoBotao4 = 0; 
}

Olá!

Falta um "delay" aqui.

if(EstadoBotao1 == HIGH) {  
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin1, LOW); 
int EstadoBotao1 = 0; 
}

Como tem 3 LEDs e 3 botões independentes esse código deveria funcionar.

Verifique se não tem nenhum erro no "hardware".

Abraço.

Fernando Garcia

Boa tarde!

Pois esqueci-me de meter esse delay. Mas não consigo ligar os dois leds ao mesmo tempo. Tenho de esperar que o led se desligue para ligar outro.

Obrigado por responder! Abraço!

No mesmo instante é impossível pois, o Arduino não é multitarefa.

Ele segue a ordem do código.

Não sei como está seu circuito mas, para evitar ter valores aleatórios com o "digitalRead" faça assim:

http://arduino.cc/en/Tutorial/Debounce

Edit: Se trocar o "delay()" por "millis()" vai poder ter uma resposta mais rápida do próximo LED.

O botão 3 está repetido no led 3 e 4.

Bem vindo ao fantástico mundo do delay... e porque não deve ser usado.

Tens de trocar o delay por outra função. Pesquisa nos exemplos do Arduino por blink without delay.

Boa tarde!

Qual a tua board? Se for a Arduino Due, existe uma library que permite a multitarefa...

O teu projeto pelo que percebi é assim..

4 botões, que quando clicados faz acender a sua respectiva led por 3,6 segundos... Depois desse tempo, apaga... É isso?

Não seria melhor, (e mais fácil): Clicar nos botões e as leds acenderem cada uma com o seu botão, e ficarem acesas até pressionar um outro botão que as faz apagar a todas?

penso que sim que podes ligar 2 leds, nao ao mesmo tempo exato mas com diferença de poucos milisegundos basta por if dentro de if, dará algum trabalho se quiseres por em todos mas ficará um trabalho engraçado

Engraçado... será que ainda ninguém viu qual é o problema naquele bocado de código??

Porque está toda a gente a atirar-se ao multitarefa (O DUE não é multitarefa), quando isso não é o problema aqui??

Multitarefa verdadeira só existe com dois cores, coisa que não existe nestes microcontroladores. Existe sim a possibilidade de usar threads, que simulam a multitarefa mas que não é exactamente a mesma coisa.

Desde que o delay está metido no código, a multitarefa nunca funcionaria... pois o processador ficaria ali, literalmente, a contar carneirinhos. Olhando, como disse antes ao exemplo do blink without delay, é possível de conseguir o que se pretende. Creio que existe também um classe para o Arduino que permite escalonar acções e que talvez servisse para este propósito.

No mesmo instante é impossível pois, o Arduino não é multitarefa.

Escrevendo 1 em ambos bits do Porto onde esses Leds estao ligados usando o registo PORT, irá fazer com que os leds acendam no mesmo instante, mas parece me que o teu problema nao seja bem esse, ja que acender agora ou uns microsegundos afrente nao me parece relativo na tua aplicaçao. O digitalWrite nao é tao rapido como se pensa, o melhor que se obtem em termos de rapidez é escrever directamente no PORT. Juntando isso com o blink without delay tens a tua solução para o teu problema

Desde que o delay está metido no código, a multitarefa nunca funcionaria... pois o processador ficaria ali, literalmente, a contar carneirinhos.

Ora, simples e directo.Adoro a parte dos carneirinhos XD XD Usar multi threads para apenas acender uns leds parece me demasiado overkill :roll_eyes: