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

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.

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.

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

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]);
  }
}

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  
      }
     
       }

Estou fazendo um projeto com 2 placas de LED tipo semaforo, e gostaria de acrescentar 1 LED avulso para que ficassem piscando intermitente, porem não sei como fazer para que os mesmos trabalhem de forma simultanea.

Com ofaço para criar 2 loop simultaneos?

abaixo a configuração que fiz:

const int ledVerde1 = 3; //PINO DIGITAL UTILIZADO PELO LED VERDE
const int ledAmarelo1 = 4; //PINO DIGITAL UTILIZADO PELO LED AMARELO
const int ledVermelho1 = 5; //PINO DIGITAL UTILIZADO PELO LED VERMELHO
const int ledVerde2 = 8; //PINO DIGITAL UTILIZADO PELO LED VERDE
const int ledAmarelo2 = 9; //PINO DIGITAL UTILIZADO PELO LED AMARELO
const int ledVermelho2 = 10; //PINO DIGITAL UTILIZADO PELO LED VERMELHO
const int ledBranco = 12; //PINO DIGITAL UTILIZADO PELO LED BRANCO

void setup() {
pinMode(ledVerde1,OUTPUT); //DEFINE O PINO COMO SAÍDA
pinMode(ledAmarelo1,OUTPUT); //DEFINE O PINO COMO SAÍDA
pinMode(ledVermelho1,OUTPUT); //DEFINE O PINO COMO SAÍDA
pinMode(ledVerde2,OUTPUT); //DEFINE O PINO COMO SAÍDA
pinMode(ledAmarelo2,OUTPUT); //DEFINE O PINO COMO SAÍDA
pinMode(ledVermelho2,OUTPUT); //DEFINE O PINO COMO SAÍDA
pinMode(ledBranco,OUTPUT); //DEFINE O PINO COMO SAÍDA

}

void loop() {

 digitalWrite(ledBranco,HIGH); //acende O LED BRANCO
 delay(250); //INTERVALO DE 0,25 SEGUNDOS
 digitalWrite(ledBranco,LOW); //APAGA O LED BRANCO
 delay(5000); //INTERVALO DE 5 SEGUNDOS

{

digitalWrite(ledVerde1,HIGH); //ACENDE O LED VERDE 1
digitalWrite(ledVermelho2,HIGH); //ACENDE O LED VERMELHO 2
delay(7000); //INTERVALO DE 7 SEGUNDO
digitalWrite(ledVerde1,LOW); //APAGA O LED VERDE 1
digitalWrite(ledAmarelo1,HIGH); //ACENDE O LED AMARELO 1
delay(2000); //INTERVALO DE 2 SEGUNDO LED AMARELO 1
digitalWrite(ledAmarelo1,LOW); //APAGA O LED AMARELO 1
digitalWrite(ledVermelho2,LOW); //APAGA O LED VERMELHO 2
digitalWrite(ledVermelho1,HIGH); //ACENDE O LED VERMELHO 1
digitalWrite(ledVerde2,HIGH); //ACENDE O LED VERDE 2
delay(5000); //INTERVALO DE 5 SEGUNDOS LED VERDE 2
digitalWrite(ledVerde2,LOW); //APAGA O LED VERDE 2
digitalWrite(ledAmarelo2,HIGH); //ACENDE O LED AMARELO 2
delay(2000); //INTERVALO DE 2 SEGUNDO LED AMARELO 2
digitalWrite(ledAmarelo2,LOW); //APAGA O LED AMARELO 2
digitalWrite(ledVermelho1,LOW); //APAGA O LED VERMELHO 1

}
}

@Giovani_Forfel fiz isso usando interrupção do timer 1.

Eu conto o tempo dos leds de forma independente com duas variáveis, uma para o semáforo 1 e outra para o semáforo 2.

Usei a biblioteca TimerOne para isto.

https://playground.arduino.cc/code/timer1

No caso eu criei uma rotina que é acessada toda vez que se atinge um determinado parâmetro configurado, que no meu projeto seria de 1s.

// inicializa o TIMER 1 para aproximadamente 1s (resolução inicial)  
Timer1.initialize(1000000); 

// aponta para a rotina de tratamento do timer1
Timer1.attachInterrupt(trataTimer);

E dentro da rotina de tratamento eu criava as possibilidades para cada um dos semáforos do meu projeto.

// -----------------------------------------------------------------------------------
// rotina de interceptacao do timer1 que contará o tempo de acendimento das lampadas
// de acordo com o ciclo entre verdes básico.
// -----------------------------------------------------------------------------------
void trataTimer(){

.
.
.
.
}

A biblioteca pode ser baixada aqui.

Espero ter ajudado.

Abraços.

Opa. Valeu. Os semáforos estão funcionando de forma alternada perfeitamente com meu projeto. Apenas esses Leds alternativos q não consigo fazer piscar alternadamente junto com o semáforo.