Pages: [1]   Go Down
Author Topic: encerrar programa  (Read 2300 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...

Code:

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.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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){}
}
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.




Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ^^

Code:
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é
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


* arduino cerrado.jpg (397.81 KB, 1473x1104 - viewed 35 times.)
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

E o que é que define esse momento?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.



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  smiley-evil. Minha intenção era ajudar, não é confundir rs

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

Abraços
Logged

Pages: [1]   Go Up
Jump to: