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.