AVR

Macro TASK

A macro TASK(interval, condition) permite a execução de um bloco de código repetidamente a cada interval milissegundos, enquanto condition for verdadeira.

/* * *
 *  Macro TASK: Executa uma tarefa a cada 'interval'
 *  ms usando millis() se 'condition' for verdadeira.
 *  Use 'true' para tarefas sem condições específicas
 *
 *  Use: TASK(interval, condition) { ..code.. }
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#define TASK(interval, condition) \
  for(static unsigned long lastExecution = 0; \
      ({ unsigned long _now = millis(); \
         bool _exec = (condition) && (_now - lastExecution >= (unsigned long)(interval)); \
         if (_exec) lastExecution = _now; \
         _exec; }); \
      ) if (true)

void setup() {
  Serial.begin(9600);
  while (!Serial) {}
  delay(5000);
}

void loop() {
  TASK(1000, 1) {  // Task1
    static unsigned count = 0; count++;
    readSensor("Task1", A0, count);
  }

  TASK(1750, 1) {  // Task2
    static unsigned count = 0; count++;
    readSensor("Task2", A1, count);
  }

  TASK(3600, 1) {  // Task3
    static unsigned count = 0; count++;
    readSensor("Task3", A2, count);
  }
}

void readSensor(const char* taskName, int port, long count) {
    int sensor = analogRead(port);
    char logMessage[100]; // Buffer para armazenar a mensagem formatada

    // Formatando a mensagem no buffer
    sprintf(logMessage, "[%ld:%ld] %s port: %d: %d", millis(), count, taskName, port, sensor);

    // Enviando a mensagem ao monitor serial
    Serial.println(logMessage);
}