Fala ai Zé tretas, eu sofro do mesmo mal. Esse é um problema que vejo nos microcontroladores, o delay para tudo e a implementação de threads ainda me parece um pouco confuso. O site Google Code Archive - Long-term storage for Google Code Project Hosting. esta nos meu favoritos para eu ver quando tiver algum tempo, o que esta difícil ultimamente rs
Eu uso algo parecido com o abaixo para que blocos/métodos sejam executados dentro de intervalos:
#define TempSensor 0
#define StepperMotorX 1
//Array de timers
int intDelay[] = {0,0,0,0};
//Array para armazenar a ultima execução
unsigned long longLastMillis[] = {0,0,0,0};
void setup(){
intDelay[TempSensor] = 500;
intDelay[StepperMotorX] = 15;
}
void loop (){
unsigned long currentMillis = millis();
//verifico se o tempo já passou para executar o método
if (currentMillis - longLastMillis[TempSensor] >= intDelay[TempSensor])
{
//chamada do método de leitura dos sensores
longLastMillis[TempSensor] = currentMillis;
}
}
Mas, como sempre, depende da aplicação, por exemplo, subistituir um delay entre duas partes de um mesmo bloco me forcou a criar dois blocos e um outro array tipo executar[TempSensor] = true. Assim, um método é executado após x milesimos de segundo:
#define TempSensor 0
#define StepperMotorX 1
//Array de timers
int intDelay[] = {0,0,0,0};
//Array para armazenar a ultima execução
unsigned long longLastMillis[] = {0,0,0,0};
//Array para definir se o método será executado
boolean Execute[] = {false, false, false, false};
void setup(){
Execute[TempSensor] = true;
intDelay[TempSensor] = 500;
intDelay[StepperMotorX] = 15;
}
void loop (){
ReadSensor();
}
void ReadSensor(){
unsigned long currentMillis = millis();
//verifico se o tempo já passou para executar o método
if ((Execute[TempSensor] == true) && currentMillis - longLastMillis[TempSensor] >= intDelay[TempSensor])
{
//códigos...
longLastMillis[StepperMotorX] = currentMillis;
Execute[StepperMotorX] = true; //para que seja executado após o tempo definido em intDelay[StepperMotorX]
longLastMillis[TempSensor] = currentMillis;
}
}
void StepperX() {
unsigned long currentMillis = millis();
//verifico se o tempo já passou para executar o método
if (Execute[StepperMotorX] == true && (currentMillis - longLastMillis[StepperMotorX] >= intDelay[StepperMotorX]))
{
//chamada do método de leitura dos sensores
longLastMillis[StepperMotorX] = currentMillis;
Execute[StepperMotorX] = false; //Evita que seja executado novamente
}
}
no exemplo acima, o método do sensor é executado o tempo todo (a cada 500 millis por causa do execute = true), mas o método stepperMotor só é executado após 15 millis depois de ser definido o execute = true pelo método.
Vamos aguardar para ver se trazem outras soluções