Duvidas de programação (como criar varios loops)


#1

boa noite estou criando um projeto ao qual gostaria de particionar em em pequenos loops

bem para tentar esclarecer vou descrever o codigo como é:

eu tenho
um pulsador ligado na porta 8 que esta configurado para ficar como pino de elevação

pinMode (8, INPUT);
digitalWrite(8, 1);

quando eu preciono o botão da porta 8 ele liga a mesma ou zero o arduino reconhece e executa  a parte a seguir

//realizar a leitura do pino que esta a chave do home
  int pulsador_home = digitalRead(8); //home
   
    if (pulsador_home == LOW) { // se a chave for pressionada (obter valor baixo)
    if (abajur_statush == true || central_statush == true) { //se um ou o outro for true 
      digitalWrite(central_home, LOW);//desliga o central
      central_statush = false;
      digitalWrite(abajur_home, LOW); // desliga o led
      abajur_statush = false;      
     }else {digitalWrite(central_home, HIGH);//desliga o central
            central_statush = true;
            digitalWrite(abajur_home, HIGH);
            abajur_statush = true;
            }
         
           }

porem essa parte esta dentro do voidloop que tem mais uma infinidade de codigos, ai que esta o problema como o arduino le sempre de cima pra baixo ele fica lendo do inicio do voidloop ate o final dele
gerando assim um delay para o botao funcionar ou ate mesmo nao funcionado.

minha duvida seria se tem como criar tipo varios loops simutaneos ou ações que eu conseguice fazer com que ele fique lendo em paralelo todos os botoes para parar com esse delay

se alguem poder me ajudar agradeço.


#3

Se o seu problema é o tamanho do bloco loop, procure usar funções.
Outra opção seria usar o AttachInterrupt só que esse tem pinos específicos que podem ser usados e limite de uso.


#4

eu estava dando uma pesquisada e o que mais atenderia minhas necessidades seria as funções
porem tenho muitas duvidas de como cria-las, declara-las e etc. teria como dar um exemplo ou explicação

obrigado por ajudar


#5

Segue exemplo de função que le e grava na eeprom um valor de ponto flutuante:

#include <EEPROM.h>

float temp = 18; //temperatura default;
int endtemp = 2; //endereço eeprom
int plustemp = 5; //pino para aumentar a temperatura;
int subtemp = 6; //pino para diminuir a temperatura;

void setup() {
  pinMode(plustemp, INPUT);
  pinMode(subtemp, INPUT);
  temp = (float) (readFloat(endtemp));
  
  Serial.begin(9600);
}

void loop() {
  if (plustemp == HIGH){
    temp = temp + 0.5;    
  }
  if (subtemp == HIGH){
    temp = temp - 0.5;    
  }
  writeFloat(temp,endtemp);
  Serial.println(temp);
}

float readFloat(unsigned int addr) {
  union{
    byte b[4];
    float f;
  } 
  data;
  for(int i = 0; i < 4; i++){
    data.b[i] = EEPROM.read(addr+i);
  }
  return data.f;
}

void writeFloat(unsigned int addr, float x){
  union {
    byte b[4];
    float f;
  } 
  data;
  data.f = x;
  for(int i = 0; i < 4; i++) {
    EEPROM.write(addr+i, data.b[i]);
  }
}

#6

Bom dia amigo.

Você poderia mudar o valor de uma variável para acionar a rotina do seu pulsador.
Assim você criaria vários loops, em sub-rotinas ( void exemplo(); ) que vão se alternando conforme a mudança do valor da sua variável.
O void loop() é fixo, ele roda sempre, assim você trava ele e só ativa o que voce quer ativar quando o valor muda.

No exemplo abaixo, alterei seu codigo para mostrar mais ou menos o que quero dizer. Se atente para a “int” que criei no começo do codigo.
Não sei o que acontece no final da sua rotina, então para voltar na leitura do botão voce precisa indicar o valor referente a essa sub-rotina. Aqui, no caso, seria val_paulsador = 0

Espero ter ajudado, se não, desculpe.

Por exemplo:

int val_pulsador = 0

void setup()
{
}

void loop() {

if(val_pulsador == 0){
leitura_pulsadores() }; // Seu pulsador inicia com valor VARIAVEL = 0
}

if(val_pulsador == 1){
pulsador_desl();
}

if(val_pulsador == 2){

pulsador_liga();
}

void leitura_pulsadores(){

if (pulsador_home == LOW) {

val_pulsador=1

}
else{
val_pulsador=2

} 

}

void pulsador_desl(){

if (abajur_statush == true || central_statush == true) { //se um ou o outro for true

  digitalWrite(central_home, LOW);//desliga o central
  central_statush = false;
  digitalWrite(abajur_home, LOW); // desliga o led
  abajur_statush = false;      
 }

}

void pulsador_liga(){
if (abajur_statush == false || central_statush == false) {

        digitalWrite(central_home, HIGH);//desliga o central
        central_statush = true;
        digitalWrite(abajur_home, HIGH);
        abajur_statush = true;
   
   val_paulsador=0  
      }
     
       }