Laços ou Funções?


#1

Estou tentando executar um projeto que precisa funcionar em 3 etapas: primeiro defino o tempo de execução, depois uma temperatura e por último esses dados controlam o aquecimento de um recipiente com água, mantendo a temperatura definida pelo tempo definido, desligando em seguida. As 3 funções funcionam bem separadamente, mas não sei como uni-las num só sketch sem que sejam executadas ao mesmo tempo. Colocaria cada fase dentro de um laço? Ou chamaria uma função pra cada etapa? O que funcionaria? Grato pela ajuda


#2

Olá, vc pode isolar as funções dentro do código e chama-las separadamente:

void loop(){
  if(alguma-condição){
      setar-o-tempo();
  }

  if(alguma-outra-condição){
      setar-a-temperatura();
  }

  if(alguma-terceira-condição){
      executar-processo();
  }
}//fim do void loop

void setar-o-tempo(){
  //seu código que seta o tempo
}

void setar-a-temperatura(){
  //seu código que seta a temperatura
}

void executar-processo(){
  //seu código executa os processos
}

#3

Ola ShandeMoura,
Aprovenitando a resposta do amigo “winther” vale lembra que no arduino o bloco loop é executado infintas vezes ate que que o arduino seja desligado.
Com relação a sua duvida, o Arduíno irá executar uma função de cada vez.
Se possível poste o código para uma ajuda mais pontual
Att
Max


#4

Pelo que me parece você está fazendo uma função que bloqueia o processador, ou seja, dentro da função chamada existe um loop, correto?

Por exemplo função olha_temperatura(int temperatura) que você deve ter aí:

void olha_temperatura(int temperatura) {
while(1) {
if(pega_temperatura()>temperatura) diminui_temperatura();
if(pega_temperatura()<temperatura) aumenta_temperatura();
}
}

Se for isso, a única coisa que você precisa fazer é remover o loop da função fazendo com que ela não bloqueie. Ao invés de deixar o loop na função olha_temperatura(), você faz com que ela funcione apenas uma checagem, mas aí você chama ela reiteradamente.

Veja:
void olha_temperatura(int temperatura) {
//while(1) { <— comentado!
if(pega_temperatura()>temperatura) diminui_temperatura();
if(pega_temperatura()<temperatura) aumenta_temperatura();
//}
}

void loop() {
tempo=define_tempo(); // essa função já deve estar ok
while(tempo) {
olha_temperatura();
sleepms(1); // coloque aqui seu sleep favorito, podendo inclusive ser 0 se o valor de tempo for muito grande
tempo–; // diminui 1 no valor de tempo
} // quando tempo for 0 ele sai
} // reinicia o programa