encerrar programa

Olá, por mais que eu tenha pesquisado não consegui realizar a seguinte rotina: apertar um botão, rodar um programa que esta funcionando muito bem, uma rotina de liga desliga algumas saídas, PARA o programa e reabilitar o botão para recomeçar tudo de novo.
Alguém me ajuda? Obrigado
Maurizio

Aqui não existe o conceito de parar o programa.

Existe o conceito do programa fazer algo para responder a um evento.

No teu caso...

void programa_que_funciona_muito_bem(void) {};

void setup(){}

unsigned char flag = 0; 
void loop(){

if (botao_apertado == TRUE && flag == 0) {
    programa_que_funciona_muito_bem();
    flag = 1;
}

if (botao_apertado == FALSE) {
    flag = 0;
}
}

Quando apertas o botão, ele corre a funcao programa_que_funciona_muito_bem() uma vez. Quando soltas o botão, o Arduino fica pronto a correr de novo a funcão quando carregares no botão de novo.

Muito obrigado.
Mas não entendi como habilito um botão, entre quais pinos?
aproveito para colocar o tal do programa_que_funciona_muito bem.
preciso que ao acionar um botão, por um instante, ele rode até o final e pare em seguida reabilitando o botão.

Mais uma vez, muito obrigado

void setup() {

pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
}

void loop() {

{

delay(100);
}

digitalWrite(10, HIGH); // 12
delay(4000);

digitalWrite(13, HIGH); // 12
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 1
delay(20);
digitalWrite(13, LOW);
delay(500);

digitalWrite(13, HIGH); // 2
delay(20);
digitalWrite(13, LOW);
delay(500);

digitalWrite(13, HIGH); // 3
delay(20);
digitalWrite(13, LOW);
delay(500);

digitalWrite(13, HIGH); // 4
delay(20);
digitalWrite(13, LOW);
delay(500);

digitalWrite(13, HIGH); // 5
delay(20);
digitalWrite(13, LOW);
delay(500);

digitalWrite(13, HIGH); // 6
delay(20);
digitalWrite(13, LOW);
delay(500);

digitalWrite(13, HIGH); // 7
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 8
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 9
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 10
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 11
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 12
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 13
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 14
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 15
delay(20); //
digitalWrite(13, LOW); //
delay(500);

digitalWrite(13, HIGH); // 16
delay(10); //
digitalWrite(13, LOW); //
delay(10);

digitalWrite(9, HIGH); // 17
delay(2000); //
digitalWrite(9, LOW); //
delay(100);

digitalWrite(13, HIGH); // 18
delay(10); //
digitalWrite(13, LOW); //
delay(1000);
digitalWrite(10, LOW);
delay(2500);

while(2){}
}

MaurizioZelada:
Muito obrigado.
Mas não entendi como habilito um botão, entre quais pinos?

Maurizio,

Imagino que o que você precisa é parecido com o que esta no site: http://arduino.cc/en/Tutorial/Pushbutton

Também tem esse tutorial que é interessante: http://arduino.cc/en/Reference/AttachInterrupt (alertando é ideal usar o interrupt só para alterar a valiável, executando o código sempre no loop)

Diz ai se os links elucidaram um pouco.

Obrigado Mortis mas resolvi de outra forma.
Vamos ver se me explico...estou fazendo um display que explica determinado regime de chuvas para uma exposição. Para isso terei 12 tubos de acrílico que se enchem de água um depois do outro. Cada um deles será enchido até uma determinada altura.
Preciso que a coisa funcione da seguinte maneira:
1- o usuário aperta um botão (push- button)
2- o tubo um começa a encher e para em determinado volume, tempo médio de 5 segundos
3- o tubo 2 começa a encher e para em outro determinado volume

....e assim por diante até o tubo 12.

tempo médio total de 60 segundos

4- não acontece nada por um determinado tempo, digamos 30 segundos
5- os tubos esvaziam
6- a máquina esta pronta para ser reutilizada assim que o push-botton for acionad.

bem, para isso eu usei a programação ai de cima e fiz o seguinte, quando o programa chega até a quase na última linha ele faz a saída 10 ficar low. isso desliga um relé que esta permitindo a passagem de corrente entre a fonte e toda a parte eletronica e portanto desliga a coisa toda.
Quando acionamos o push-botton ligamos este rele que energiza o arduino que retribui com a saida 10 em High enrgizando o rele mesmo quando o push-botton é aliviado.
Adicionalmente coloquei o push-botton em série com outro contato do rele assim quando o sistema e o rele estao energizados o push-botton fica desabilitado.
Será que me expliquei? Com certeza não adotei uma solução muito ortodoxa e temo pelos resultados a longo prazo. O que te parece?
Muito obrigado pela atenção

Olá Maurizio,

Existem muitas formas de fazer o mesmo, até mesmo sem os dalays usando arrays, etc. Mas não sei o quanto você sabe de programação.

Você tem um relê para cada tubo ou é o mesmo relê?

Mantendo o teu código, você pode adicionar uma variável global para definir o início do processo, após pressionamento do botão.

Depois de apertado o botão o processo inicia (mancando a variável como true) e quando termina marcamos a variável como false.

então, abaixo o teu código alterado com a idéia acima, lembrando que não cmpilei para saber se funciona mesmo ^^

int pin = 13;
Rodando int state = LOW;

void setup() {                
  pinMode(10, OUTPUT);  
  pinMode(9, OUTPUT); 
  pinMode(13, OUTPUT); 
  
  pinMode(pin, OUTPUT);
  attachInterrupt(0, IniciaProcesso, CHANGE); //Liga o push button na porta digital 0 para chamar esse interrupt
}

void Start()
{
  Rodando = HIGH
}

void loop() {
  if(Rodando) //Se o botão foi pressionado
  {
    delay(100);
    
    digitalWrite(10, HIGH);   // 12 
    delay(4000);
    
    digitalWrite(13, HIGH);   // 12 
    delay(20);              // 
    digitalWrite(13, LOW);    //
    delay(500); 
    
    digitalWrite(13, HIGH);   // 1
    delay(20);              
    digitalWrite(13, LOW);    
    delay(500);    
     
    digitalWrite(13, HIGH);   // 2
    delay(20);              
    digitalWrite(13, LOW);    
    delay(500);   
    
    digitalWrite(13, HIGH);   // 3
    delay(20);              
    digitalWrite(13, LOW);    
    delay(500);  
    
    digitalWrite(13, HIGH);   // 4
    delay(20);             
    digitalWrite(13, LOW);    
    delay(500);  
    
    digitalWrite(13, HIGH);   // 5
    delay(20);              
    digitalWrite(13, LOW);    
    delay(500);  
    
    digitalWrite(13, HIGH);   // 6
    delay(20);              
    digitalWrite(13, LOW);    
    delay(500);  
    
    digitalWrite(13, HIGH);   // 7
    delay(20);              // 
    digitalWrite(13, LOW);    // 
    delay(500);  
    
    digitalWrite(13, HIGH);   // 8
    delay(20);              // 
    digitalWrite(13, LOW);    // 
    delay(500);  
    
    digitalWrite(13, HIGH);   // 9
    delay(20);              // 
    digitalWrite(13, LOW);    // 
    delay(500);  
    
    digitalWrite(13, HIGH);   // 10
    delay(20);              // 
    digitalWrite(13, LOW);    // 
    delay(500);  
    
    digitalWrite(13, HIGH);   // 11
    delay(20);              // 
    digitalWrite(13, LOW);    // 
    delay(500);  
    
    digitalWrite(13, HIGH);   // 12 
    delay(20);              // 
    digitalWrite(13, LOW);    //
    delay(500);  
    
    digitalWrite(13, HIGH);   // 13
    delay(20);              // 
    digitalWrite(13, LOW);    //
    delay(500);  
    
    digitalWrite(13, HIGH);   // 14
    delay(20);              // 
    digitalWrite(13, LOW);    //
    delay(500); 
    
    digitalWrite(13, HIGH);   // 15
    delay(20);              // 
    digitalWrite(13, LOW);    //
    delay(500); 
    
    digitalWrite(13, HIGH);   // 16
    delay(10);              // 
    digitalWrite(13, LOW);    //
    delay(10); 
    
    digitalWrite(9, HIGH);   // 17
    delay(2000);              // 
    digitalWrite(9, LOW);    //
    delay(100); 
    
    digitalWrite(13, HIGH);   // 18
    delay(10);              // 
    digitalWrite(13, LOW);    //
    delay(1000); 
    digitalWrite(10, LOW);
    delay(2500);
    
    //no final marcamos Rodando como LOW
    Rodando = LOW;
  }
}

Lembrando que o uso de delays não é nada indicado, o ideal seria usar o método millis. Mas agora preciso sair e a noite volto para ver se a fase um esta ok e se der te dou um exemplo de intervalo usando o millis para substituir o delay

Até

Mortis, mais uma vez. obrigado.
Bem, como vc deve desconfiar não entendo nada de programação e agradeço dicas de livros e etc para iniciar este aprendizado.
Quanto aios reles....na verdade o Arduino manda um pulso de clock para dois CI4017 ligados em cascata e eles se encarregam de distribuir os sinais para os 12 reles.
coloquei uma foto da montagem.
nem sei se posso te perguntar isso aqui no forum e espero não estar cometendo algum deslize mas gostaria de saber se vc tem iunteresse profissional em desenvolver esta programação de maneira mais adequada.

Obrigado

Olá Maurizio,

Então estamos quites, você não manja de programação e eu não manjo de eletrônica rs

Sobre a oferta, por hora deixemos como esta, pois tenho corrido muito com o trabalho por aqui e odiaria me comprometer e não honrar o compromisso... Qualquer coisa, se estiver fora do assunto do fórum, fique a vontade para me mandar um MP (mensagem privada).

Peço desculpas por meu exemplo corrigo, bati o olho e vi que falei em true/false e usei LOW/HIGH e no interrupt usei IniciaProcesso, sendo que o método esta como START. Sei que esse tipo de coisa confunde tudo. Foi mal.

Como, teoricamente, a pergunta do seu post foi respondido, te mando uma MP sobre o projeto de forma geral.

Abraço.

Não precisa complicar; faça do jeito mais fácil: Maurício, coloque todo o seu código dentro do bloco setup() do Arduino e, para reexecutar o seu programa, acione o botão Reset da placa.

Ou seja, basta fazer um puxadinho com o botão Reset do Arduino.

Obrigado Neuron,
mas o q eu precisava era q o programa parasse por conta propria em determinado momento.

E o que é que define esse momento?

MaurizioZelada:
Obrigado Neuron,
mas o q eu precisava era q o programa parasse por conta propria em determinado momento.

Maurizio, quando você "energiza" o arduino a primeira "coisa" que acontece é a execução do Setup(), depois o arduino processa o que tiver dentro do loop() eternamente (até que a energia seja cortada).

O Neuron sugeriu colocar o "código que funciona bem" no Setup(), assim, quando o código dentro do setup chegar ao fim, o arduino não fará mais nada até que reja reiniciado ("resetado") pelo pressionamento do botão, por exemplo.

neuron_upheaval:
Não precisa complicar; faça do jeito mais fácil: Maurício, coloque todo o seu código dentro do bloco setup() do Arduino e, para reexecutar o seu programa, acione o botão Reset da placa.

Ou seja, basta fazer um puxadinho com o botão Reset do Arduino.

Fala ai Neuron, tudo joia?

Certamente é mais fácil colocar o código no setup e apenas acionar o reset para rodar o código, o setup só ocorre uma vez.

Mas, pensando no futuro, se o Maurizio for incrementar o projeto com sensores (por exemplo de nível de agua), pressionar o botão uma segunda vez para pausar o processo, adicionar um segundo botão para outra função, disparar o inicio via serial, etc, ele cairia na necessidade de usar o loop(), por isso sugeri o uso da variável no loop e o uso do interrupt.

Espero não ter deixado o Maurizio, que não tem muito conhecimento em programação, atordoado ]:). Minha intenção era ajudar, não é confundir rs

Mas de boas intenções o inferno esta cheio, né? rs

Abraços