Amigos, boa tarde.


Estou com uma dúvida. Sou novo no Arduino e estou tentando fazer um código para executar tarefas em sequência (talvez umas 8), com um tempo pré-definido e terminando as tarefas, o Arduino parar de executá-las. Para cada tarefa, tenho botões de segurança para acionamento de relês em caso de querer parar a operação.

Queria modificar o programa para executá-las em sequência a partir do acionamento do primeiro botão e não ter loop nenhum (tipo, voltar ao main), somente executar uma vez e mantendo os botões para interrupções. Pensei em usar o módulo RTC DS1302 para fazer o controle dos tempos das tarefas, ou talvez usar a função millis, para não ter delays.

Alguém tem alguma ideia para poder me ajudar? Obrigado.

Segue o código:

//Programa : Teste Rele - Botoes


//Porta ligada ao pino IN1 do modulo
int porta_rele1 = 7;
//Porta ligada ao pino IN2 do modulo
int porta_rele2 = 8;
//Porta ligada ao pino IN3 do modulo
int porta_rele3 = 9;
//Porta ligada ao pino IN4 do modulo
int porta_rele4 = 10;
//Porta ligada ao botao 1
int porta_botao1 = 2;
//Porta ligada ao botao 2
int porta_botao2 = 3;
//Porta ligada ao botao 3
int porta_botao3 = 4;
//Porta ligada ao botao 4
int porta_botao4 = 5;

//Armazena o estado do rele - 0 (LOW) ou 1 (HIGH)
int estadorele1 = 1;
int estadorele2 = 1;
int estadorele3 = 1;
int estadorele4 = 1;

//Armazena o valor lido dos botoes
int leitura1 = 0;
int leitura2 = 0;
int leitura3 = 0;
int leitura4 = 0;

void setup()
{
//Define pinos para o rele como saida
pinMode(porta_rele1, OUTPUT);
pinMode(porta_rele2, OUTPUT);
pinMode(porta_rele3, OUTPUT);
pinMode(porta_rele4, OUTPUT);

//Define pinos dos botoes como entrada
pinMode(porta_botao1, INPUT);
pinMode(porta_botao2, INPUT);
pinMode(porta_botao3, INPUT);
pinMode(porta_botao4, INPUT);

//Estado inicial dos reles - desligados
digitalWrite(porta_rele1, HIGH);
digitalWrite(porta_rele2, HIGH);
digitalWrite(porta_rele3, HIGH);
digitalWrite(porta_rele4, HIGH);
}

void loop(){

//Verifica o acionamento do botao 1
leitura1 = digitalRead(porta_botao1);
if (leitura1 != 0)
{
while(digitalRead(porta_botao1) != 0)
{
delay(1000);
}

//Inverte o estado da porta
estadorele1 = !estadorele1;
//Comandos para o rele 1
digitalWrite(porta_rele1, estadorele1);
}
{

//Verifica o acionamento do botao 2
leitura2 = digitalRead(porta_botao2);
if (leitura2 != 0)
{
while(digitalRead(porta_botao2) != 0)
{
delay(2000);
}
//Inverte o estado da porta
estadorele2 = !estadorele2;
//Comandos para o rele 2
digitalWrite(porta_rele2, estadorele2);

}

//Verifica o acionamento do botao 3
leitura3 = digitalRead(porta_botao3);
if (leitura3 != 0)
{
while(digitalRead(porta_botao3) != 0)
{
delay(100);
}
//Inverte o estado da porta
estadorele3 = !estadorele3;

//Comandos para o rele 3
digitalWrite(porta_rele3, estadorele3);
}

//Verifica o acionamento do botao 4
leitura4 = digitalRead(porta_botao4);
if (leitura4 != 0)
{
while(digitalRead(porta_botao4) != 0)
{
delay(100);
}
//Inverte o estado da porta
estadorele4 = !estadorele4;
//Comandos para o rele 4
digitalWrite(porta_rele4, estadorele4);
}

}}

Exibições: 729

Anexos

Responder esta

Respostas a este tópico

Amigo, você quer que só passa uma vez pelo loop ?
e quando você aperta o botão... ele faça o processo e depois para...
seria isso sua dúvida ?

Mauricio de Souza, obrigado pela resposta.

Cara, o problemado loop eu resolvi, usei um while (1) no fim. O esquema do botão é este mesmo que falou, um liga e desliga. 

Pensei em usar um arduino uno como master, você sabe como faz?

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inicializa o display no endereco 0x3F
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE);

#define RELAY1  3                        

#define RELAY2  9                        

#define RELAY3  10                        

#define RELAY4  11

void setup()

{    
 Serial.begin(9600);
 lcd.begin (20,4);


  pinMode(RELAY1, OUTPUT);       

  pinMode(RELAY2, OUTPUT);

  pinMode(RELAY3, OUTPUT);

  pinMode(RELAY4, OUTPUT);

  digitalWrite(RELAY1, HIGH);
  digitalWrite(RELAY2, HIGH);
  digitalWrite(RELAY3, HIGH);
  digitalWrite(RELAY4, HIGH);

  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("PROCESSO ");
  lcd.setCursor(0,1);
  lcd.print("INICIALIZADO");
  delay(8000);
  lcd.setBacklight(LOW);
  delay(2000);

  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("PROCESSO 1");
  lcd.setCursor(0,1);
  lcd.print("INICIALIZADO");

}
 void loop()
{
 
   digitalWrite(RELAY1,LOW);           // Relé 1 ligado (ON)
   delay(1800000);                                      // espera do processo
   digitalWrite(RELAY1,HIGH);          // Relé 1 desligado (OFF)
        
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("PROCESSO 2");
  lcd.setCursor(0,1);
  lcd.print("INICIADO    ");
 
   digitalWrite(RELAY2,LOW);           // Relé 2 ligado (ON)
   delay(1200000);                                      // espera do processo
   digitalWrite(RELAY2,HIGH);          // Relé 2 desligado (OFF)

  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("PROCESSO 3    ");
  lcd.setCursor(0,1);
  lcd.print("INICIADO");
 
   digitalWrite(RELAY3,LOW);           // Relé 3 ligado (ON)
   delay(1500000);                                      // espera do processo
   digitalWrite(RELAY3,HIGH);          // Relé 3 desligado (OFF)
 
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("PROCESSO 4   ");
  lcd.setCursor(0,1);
  lcd.print("INICIADO     ");
 
   digitalWrite(RELAY4,LOW);          // Relé 4 ligado (ON)
   delay(1500000);                    // espera do processo
   digitalWrite(RELAY4,HIGH);         // Relé 4 desligado (OFF)  
        
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("PROCESSO   ");
  lcd.setCursor(0,1);
  lcd.print("FINALIZADO   ");
 
while (1);
 }

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço