Eae Galera!

Estou com um problema de logica, penando e nao sai, é o seguinte:

1 Botão, 3 LEDs

Se eu pressionar o botao ele acende o LED 1.

Se eu segurar o botao por 3 segundos ele acende o LED 2.

Se eu segurar por 5 segundos ele acende o LED 3.

Acredito que a logica seja simples porem ta dificil rsrsrs.

Se alguem puder ajudar. Vaaaleu !

Exibições: 3846

Responder esta

Respostas a este tópico

Como vc quer fazer isso ? Com uC ou componentes discretos?

No caso mais simples pode fazer com dois RC et 2 portas schmitt-trigger

LED1 diretamente ligado ao botao.

Qd fecha o botao carrega os dois capacitores vao ser carregados pelos resistores. Vc ajusta os RC para que o limite pra ligar a porta schmitt trigger seja atingida depois de 3 e 5 segundos.

Agora se quiser "precisao" melhor usar um oscilador e contador digital. Ou um uC. Depende da aplicaçao.

Hummmmm, será que não teria como fazer via software ?

Claro e é bem mais facil.

nunca programei Arduino mas outros uC sim.

Precisaria 3 variaveis com tres portas/saidas. Observe continuamente a entrada/porta do botao. Qd acionada acende LED1.

Assim que a entrada do botao esta ativada tambem parte um timer. Quando o timer/contador chegar num determinado valor que corrsponde aos tres segundos acende LED2. Mesma coisa para o LED3.

Pros detalhas de programaçao pro Arduino nao posso te ajudar, so fiz controladores 8-bit e so em assembler.

Estou tentando com contador mais não está dando certo, ja mudei varias vezes a logica e nd. rsrsrs tá dificil! 

Vaaleuu

Não consigo via software, ja tentei com delay, com millis, e nao consigo fazer, na verdade é um sensor capacitivo e 3 reles, nao consigo de forma alguma!

Amigo, tentou usar duas condições (uma dentro da outra)?

Fiz rapidamente aqui:

if(botão==HIGH){
digitalWrite(led, HIGH);
}

if(botão==HIGH){
delay(3000);
if(botão==HIGH){
digitalWrite(led2, HIGH);
}
}

if(botão==HIGH){
delay(5000);
if(botão==HIGH){
digitalWrite(led3, HIGH);
}
}

Obs: não testei, apenas para passar a lógica!

Logicamente era pra funcionar assim, mais ja executei aqui de novo, e nada, o delay faz o capsense para de ler e ai ele de qualquer forma friza que o botao está apertado e liga mesmo se eu dar um toque somente.

Pode ser problema no delay...

Modifiquei desta forma:

if(digitalRead(botao)==HIGH){


digitalWrite(led, HIGH);


delay(3000);
if(digitalRead(botao)==HIGH){
digitalWrite(led2, HIGH);
}
delay(2000);
if(digitalRead(botao)==HIGH){
digitalWrite(led3, HIGH);
}
}

Obs: o segundo delay de 2000 pois soma com o primeiro, totalizando 5000 (5 segundos), testei aqui e funcionou perfeitamente... lembrando de não esquecer o resistor de pulldown no botão/sensor

testa este codigo altera as portas conforme a sua ligação

#define led1 13
#define led2 12
#define led3 11
#define button 10

unsigned long StartTimePress = 0;
unsigned long LastTimePress = 0;
int ButonDown = 0;

void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(button, INPUT);
digitalWrite(button, HIGH);
}
void loop()
{
if (digitalRead(button) == 0 && ButonDown == 0) {
StartTimePress = millis();
ButonDown = 1;
}
if (digitalRead(button) == 1 && ButonDown == 1) {
LastTimePress = millis() - StartTimePress;
if (LastTimePress < 3000 && LastTimePress > 100) {
digitalWrite(led1, 1);
} else if ( LastTimePress < 5000 && LastTimePress > 100) {
digitalWrite(led2, 1);
} else if ( LastTimePress > 100) {
digitalWrite(led3, 1);
}
ButonDown = 0;
}
}

Um bom começo, mas o que acontece se mantiver apertado o botão por, digamos, 6 segundos? Lembrando qque o comando digitalWrite(button, HIGH); funciona nas saídas digitais do arduino, então o circuito tem que ser ligado a essas saídas. Sucesso!

se pressionar por mais de 5 segundos ele acende o led 3

Estou meio sem tempo mais irei testar! Acho que com millis funciona eu tentei mais nao entendi muito essa funçao, agora que peguei a manha! Vaaaleu acho que assim irá funcionar porque delay ja testei e nao dá! Vaaaleu depois posto se deu certo!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço