Executar código 01 vez com Push Button sempre pressionado.

Olá, estou tentando fazer com que o código seja executado 01 unica vez mesmo com o Push Button sempre pressionado.

Sendo necessário que ele seja liberado e pressionado novamente para que o código volte a ser executado e se ele for liberado durante a execução o código volte ao estado inicial.

Estou usando um Arduíno Nano e um Push Button normalmente aberto que liga um relé.

Agradeço desde já a ajuda.

#define pinReleCorte 6  // IN2 rele 

#define pinBotaoCorte 3 // botao 

#define potCorte A0 //potenciometro 

int TempoCorte ; //variavel potenciometro 
unsigned long delay1 = 0;

void setup() {

  pinMode(potCorte, INPUT);
  
  pinMode(pinBotaoCorte, INPUT_PULLUP );

  pinMode(pinReleCorte, OUTPUT);


}

void loop() {

  TempoCorte = analogRead(potCorte); // Faz a leitura do potenciometro corte
  TempoCorte = map(TempoCorte,0,1023,500,8000); // escala a leitura do potenciometro corte
 
// comandos para corte
if ( digitalRead (pinBotaoCorte) == LOW ) {   // liga 
  
     if ((millis() - delay1) < 100) {
       digitalWrite( pinReleCorte, HIGH);
    }

    if ((millis() - delay1) >= TempoCorte) {
       digitalWrite( pinReleCorte, LOW);
    }
    
    if ((millis() - delay1) >= 100 + TempoCorte) {
      delay1 = millis(); 
 }
}
else {
   digitalWrite ( pinReleCorte , LOW); // desliga 
 }
}

Tenta isso aqui :

#define pinReleCorte 6  // IN2 rele

#define pinBotaoCorte 3 // botao

#define potCorte A0 //potenciometro

int TempoCorte ; //variavel potenciometro

unsigned long delay1 = 0;

boolean executaComando = true;

void setup() {

  pinMode(potCorte, INPUT);
 
  pinMode(pinBotaoCorte, INPUT_PULLUP );

  pinMode(pinReleCorte, OUTPUT);


}

void loop() {

  TempoCorte = analogRead(potCorte); // Faz a leitura do potenciometro corte
  TempoCorte = map(TempoCorte,0,1023,500,8000); // escala a leitura do potenciometro corte
 
// comandos para corte
while( digitalRead (pinBotaoCorte) == LOW ) {   // liga
  If( executaComando = true) {
       if ((millis() - delay1) < 100) {
         digitalWrite( pinReleCorte, HIGH);
       }

      if ((millis() - delay1) >= TempoCorte) {
         digitalWrite( pinReleCorte, LOW);
      }
   
      if ((millis() - delay1) >= 100 + TempoCorte) {
        delay1 = millis();
      }
      executaComando = false;
  }

  digitalWrite ( pinReleCorte , LOW); // desliga
  executaComando = true;
}

Não deu certo, tentei mexer em algumas coisas, mais não consegui ainda.

No seu código alterei o if que estava em maiúsculo uma chave que faltava, ele ficou desgovernado alternando entre HIGH e LOW no pino 6.

Oi bene1256, da próxima vez vou esperar ter acesso ao computador para te responder, não tive como testar o código pois lhe enviei a resposta do celular de dentro do ônibus. Vi outros erros também.
Mas testei esse código e funcionou.

#define pinReleCorte 6  // IN2 rele

#define pinBotaoCorte 3 // botao

#define potCorte A0 //potenciometro

int tempoCorte = 0 ; //variavel potenciometro

unsigned long delay1 = 0;// Nunca deixe de dar valores as suas variaveis

boolean executaComando = true;

int tempo = 0;

void setup() {

  pinMode(potCorte, INPUT);
 
  pinMode(pinBotaoCorte, INPUT_PULLUP );

  pinMode(pinReleCorte, OUTPUT);

}
  

void loop() {

  tempoCorte = analogRead(potCorte); // Faz a leitura do potenciometro corte
  tempoCorte = map(tempoCorte,0,1023,500,8000); // escala a leitura do potenciometro corte
// comandos para corte
  while( digitalRead (pinBotaoCorte) == LOW ) {   // liga

    if( executaComando == true) {
      tempo = (millis() - delay1);
    
      if (tempo < 100) {
        digitalWrite( pinReleCorte, HIGH);
      }else if (tempo >= tempoCorte) {
        digitalWrite( pinReleCorte, LOW);
      }else if (tempo >= (100 + tempoCorte)) {
        delay1 = millis(); 
      }else {
        digitalWrite ( pinReleCorte , LOW); // desliga
      }
      
      executaComando = false;
    }
  }

  executaComando = true;
}

Tranquilo Tecdiego não tem problema.

Ainda não foi, ele não está executando o código com o botão pressionado, mais depois de um tempo ligado se pressionar ele muda o estado e permanece em HIGH o pino 6, só testei ele não tentei fazer mais modificações.

Segue imagem do esquema, no lugar do led vai ser uma dupla solenoide.

Nessa imagem é o estado inicial do relé está certo fechado, com push button mesmo pressionado não muda o estado do relé.

Nessa imagem depois de um tempo executando quando pressiona o button ele muda de estado e não volta mais.

Cara, roda esse código, monitora na Serial e manda um print com os valores.

#define pinBotaoCorte 3 // botao

#define potCorte A0 //potenciometro

int tempoCorte = 0 ; //variavel potenciometro

unsigned long delay1 = 0;// Nunca deixe de dar valores as suas variaveis

boolean executaComando = true;

int tempo = 0;

int contadorIf = 0;

int contadorWhile = 0;

void setup() {

  pinMode(potCorte, INPUT);
 
  pinMode(pinBotaoCorte, INPUT_PULLUP );

  pinMode(pinReleCorte, OUTPUT);

}
 

void loop() {

  tempoCorte = analogRead(potCorte); // Faz a leitura do potenciometro corte
  tempoCorte = map(tempoCorte,0,1023,500,8000); // escala a leitura do potenciometro corte
// comandos para corte
  while( digitalRead (pinBotaoCorte) == LOW ) {   // liga
    Serial.println("######################################################");
    contadorWhile++;
    
    if( executaComando == true) {
      conadorIf++;
      tempo = (millis() - delay1);
      Serial.println("Tempo " + tempo);
      if (tempo < 100) {
        digitalWrite( pinReleCorte, HIGH);
	Serial.println("estado 1");
      }else if (tempo >= tempoCorte) {
        digitalWrite( pinReleCorte, LOW);
	Serial.println("estado 3");
      }else if (tempo >= (100 + tempoCorte)) {
        delay1 = millis();
	Serial.println("estado 3");
      }else {
        digitalWrite ( pinReleCorte , LOW); // desliga
	Serial.println("estado 4");
      }
      
      executaComando = false;
    }// if
    Serial.println(contadorWhile);
    Serial.println(contadorIf); 
  }// while

  executaComando = true;
}

Boa noite Tecdiego, desculpa a demora é que hoje foi meio corrido.

Segue os prints Tecdiego.

Nessa primeira eu mantive o botão pressionado.

Nessa outra eu precionei e soltei varias vezes.

Percebi tbm que depois que executa o código se deixar o Arduíno ligado ele troca o estado do rele sozinho, se está high vai pra low e vice versa.

Desculpa não ajudar muito, mais já estou praticamente sem ideia, tenho pouco conhecimento, estou aprendendo ainda.

Vou tentar alterar algumas coisas tbm.

Achei essa biblioteca GitHub - pololu/pushbutton-arduino: C++ library for the Arduino IDE that helps interface with pushbuttons by either reading the state of the button or monitoring it for press/release events, mais não eswtou sabendo usar, acho que resolveria isso.

Segue texto copiado da pagina:

A waitForPress()função aguarda até que o botão seja pressionado. A waitForRelease()função aguarda até o botão ser liberado.

Observe que, se o botão já estiver pressionado quando waitForPress()for chamado, ele retornará rapidamente (em 10 ms). Se você deseja executar uma ação quando o usuário pressiona o botão, mas deseja evitar executar a ação várias vezes enquanto o usuário mantém pressionado o botão, será necessário chamar waitForRelease():

void loop() {
  button.waitForPress();
  // Perform action here.
  button.waitForRelease();
}

Essa primeira parte do código para botão pull-up já não entendi, que eu faço?

É para incluir a biblioteca e depois?

#include <Pushbutton.h>
Pushbutton button(BUTTON_PIN);

Cara como pode ver nas imagens, ele trava no estado 2, as outras condições não são alcançadas. Na primeira imagem que vc mantém o botão apertado o contandorWhile é incrementado e o contadorIf não incrementa, mostrando que as condições foram verificadas apenas uma vez. Na segunda imagem ambos são incrementado e o estado permanece em 2. Conseguiu perceber isso? O problema está nas condições que você colocou. Passa a ideia do que você quer fazer, aí quem sabe eu posso te ajudar. Quanto a biblioteca eu nunca usei, sempre um while para botões.

Entendi Tecdiego, realmente acho que eu não soube passar a ideia certa, estou meio perdido.

A ideia é a seguinte:

Quando ligar o Arduíno o relé fica desligado.

Quando acionar o botão o relé liga e fica ligado por x segundos que vai ser determinado pelo potenciômetro e depois desliga, essa parte de ligar e desligar é feita com o botão pressionado.

E para ligar novamente precisa soltar o botão e apertar novamente.

Entendi, mas o que é para acontecer se você soltar o botão antes de desligar, ele deve continuar ligado??

Se soltar antes desliga o relé, e se apertar de novo
executa o código do início.

Se tem que desligar o relé, qual seria o tempo mínimo que o botão deve permanecer apertado para ele desligar quando soltar???

Não tem tempo minimo se apertar e soltar ja desliga.

Aquele código que eu fiz está meio confuso né.

Pq ele leva 100 MS pra ligar o relé quando aperta o botão, não precisa pode ligar direto, mais eu não consegui tirar essa linha de comando.

Depois que ele liga conta o tempo definido pelo potenciômetro e desliga.