Como controlar o tempo de delay usando botão?

Olá pessoal,

Estou chaveando uma carga na saída de um relê, estou usando o sketch abaixo. Eu gostaria inserir botões para incrementar e decrementar os tempos de delay, no caso seriam 4 botões.
Botão 1: Incrementar Tempo do delay de TRUE (em milisegundos)
Botão 2: Diminuir o tempo de delay de TRUE
Botão 3: Aumentar Tempo do delay de FALSE
Botão 4: Diminuir Tempo do delay de FALSE

Qual função posso utilizar para controlar os tempos usando esses botões?


/*
  ---- ACIONAMENTO DE CARGAS COM RELÉ E ARDUINO -- -

*/

#define Relay1 5 //Definição do pino de controle do Rele 1
//Condições iniciais de execução

void alteraStatus(int porta, bool ativado); //Declarando a função alteraStatus

void setup() {
  pinMode(Relay1, OUTPUT); //Pino declarado como saída
  digitalWrite(Relay1, LOW); //Pino setado para nível lógico baixo
    }
void loop() {
  alteraStatus(Relay1, true); //Chama a função alteraStatus e passa como parâmetro o relé e o status desejado (true - ligado | false - desligado)
  delay(60000); //aguarda 60 segundos
  alteraStatus(Relay1, false); //Chama a função alteraStatus e passa como parâmetro o relé e o status desejado (true - ligado | false - desligado)
  delay(10000); //aguarda 10 segundos
}
//Função responsável por alterar o status da carga de acordo com o relé selecionado. Ligado = true | Desligado = false
void alteraStatus(int porta, bool ativado) {
  if (ativado == true) digitalWrite(porta, HIGH); //Se a função alteraStatus recebe true como parâmetro, envia nível lógico alto para o pino de controle do relé que aciona a carga.
  else digitalWrite(porta, LOW); //caso contrário, envia nível lógico baixo para desativar a carga.
}

Olá! Bem vindo ao Forum.

Existem diferentes maneiras de fazer o que você descreveu. A alteração do tempo de delay precisa ser feita durante a execução do loop?

Se não precisa, a minha sugestão é que você faça seu projeto no formato "state machine" onde num momento você configura o delay em outro o loop roda com os delays que você definiu. Nesse caso, escreva uma função para gerenciar os 4 botões, de forma que ela altere duas variáveis globais p.ex "tempodelaytrue" e "tempodelayfalse". Depois é só usar:

delay(tempodelaytrue); // e
delay(tempodelayfalse);

Um detalhe: você tem certeza que quer incrementar o valor de 1 em 1 milissegundo? (para alterar 1 segundo você teria que apertar o botão 1000 vezes...)

Aprende a utilizar o millis()... Ve o exemplo "blink without delay". O que queres fazer nao funciona com o delay();

Estou aborrecido hoje entao vou tentar isto:

unsigned char prev_High_plus = 0, prev_High_minus = 0; //define o estado anterior dos botoes. 
unsigned char prev_Low_plus = 0, prev_Low_minus = 0; //define o estado anterior dos botoes. 
unsigned long HIGH_time = 60000; //variavel que guarda o tempo. 
unsigned long LOW_time = 60000; 
unsigned long prev_HIGH = 0; 
unsigned long prev_LOW = 0; 
const unsigned long _increase = 1000; 
unsigned char estado = HIGH; // comeca em high. 

void loop() { 

//le os botoes
Low_plus = digitalRead(Low_plus_pin); 
//adiciona tu o resto. 

if (Low_minus != prev_Low_minus){
   if (LOW_time < _increase) // nao podemos subtrair do zero
      LOW_time = 0; 
   else{
      LOW_time = LOW_time -_increase; }

if (Low_plus != prev_Low_plus){
      LOW_time = LOW_time + _increase; }

if (High_minus != prev_High_minus){
   if (HIGH_time < _increase) // nao podemos subtrair do zero
      HIGH_time = 0; 
   else{
      HIGH_time = HIGH_time -_increase; }

if (High_plus != prev_High_plus){
      HIGH_time = HIGH_time + _increase; }

// executa a logica de High e Low
if (estado == HIGH) {
   digitalWrite(pin, HIGH); 
   if (millis() - prev_HiGH > HIGH_time){
      estado = LOW; 
      prev_LOW = millis();   
   }
}else {
   digitalWrite(pin, LOW); 
   if (millis() - prev_LOW > LOW_time){
      estado = HIGH; 
      prev_HIGH = millis();   
   }   
}

//guarda o estado dos botoes para o proximo ciclo. 
prev_Low_plus = Low_plus; 
prev_Low_minus = Low_minus; 
prev_High_plus = High_plus; 
prev_High_minus = High_minus; 

}


Algo assim deve funcionar como deve ser. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.