Mini árvore de Natal sem delay()

Sempre que faço um programa para Arduino, uma preocupação que tenho é de evitar utilizar a função delay(). Apesar de muito prática em diversas situações, esta função tem o inconveniente de parar a execução do programa, prejudicando assim outras funcionalidades que possam estar em execução.

Para exercitar mais um pouco os neurónios, decidi pegar na ideia da árvore de Natal com o Arduino e transformei o código para ter quatro efeitos diferentes sem usar a função delay(). Como é fácil de perceber, são necessárias muitas mais linhas de código e uma estrutura para forçar a sequência e controlar o tempo de cada efeito.

A utilidade prática deste código é que se for necessário, podemos colocar o Arduino a controlar outra coisa qualquer para além dos LEDs, por exemplo, um sensor de proximidade para controlar um motor sem nunca parar esta funcionalidade.

Video

Sketch

/*
 * Mini X-Mas Tree with Arduino
 *
 * This sketch doesn't use the delay() function to blink the LEDs
 *
 * 20111216 Luis Sismeiro
 */

#define LEDNUM 12
#define PROG00 13
#define PROG01 22
#define PROG02 5  
#define PROG03 5

const int ledPin[LEDNUM] = {4, 6, 10, 13, 5, 8, 12, 9, 11, 3, 2, 7};

int ledProg00[PROG00][LEDNUM] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

int ledProg01[PROG01][LEDNUM] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

int ledProg02[PROG02][LEDNUM] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0},
};

int ledProg03[PROG03][LEDNUM] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0},
  {0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0},
  {1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0}
};

long timeStart = 0;
int prog = 0;
int line = 0;

void setup() {
  for (int col = 0; col < LEDNUM; col++) {
    pinMode(ledPin[col], OUTPUT);
  }
}

void loop() {
  if (millis() - timeStart > 1000 && prog == 0) {
    for (int col = 0; col < LEDNUM; col++) {
      digitalWrite(ledPin[col], ledProg00[line][col]);
    }
    if (line < PROG00 - 1) {
      line++;
    }
    else {
      line = 0;
      prog = 1;
    }
    timeStart = millis();
  }

  if (millis() - timeStart > 50 && prog == 1) {
    for (int col = 0; col < LEDNUM; col++) {
      digitalWrite(ledPin[col], ledProg01[line][col]);
    }
    if (line < PROG01 - 1) {
      line++;
    }
    else {
      line = 0;
      prog = 2;
    }
    timeStart = millis();
  }

  if (millis() - timeStart > 500 && prog == 2) {
    for (int col = 0; col < LEDNUM; col++) {
      digitalWrite(ledPin[col], ledProg02[line][col]);
    }
    if (line < PROG02 - 1) {
      line++;
    }
    else {
      line = 0;
      prog = 3;
    }
    timeStart = millis();
  }

  if (millis() - timeStart > 500 && prog == 3) {
    for (int col = 0; col < LEDNUM; col++) {
      digitalWrite(ledPin[col], ledProg03[line][col]);
    }
    if (line < PROG03 - 1) {
      line++;
    }
    else {
      line = 0;
      prog = 0;
    }
    timeStart = millis();
  }
}

Etiquetas: ,

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s


%d bloggers like this: