Menu
CoddyTech

Relógio NeoPixel: Combinando os ponteiros

Parte da seção Projetos do Journey de Arduino da Coddy. Lição 23 de 24.

O ponteiro das horas é vermelho. O mostrador de um relógio mostra 12 horas, então a hora é (now / 3600) % 12: de 0 a 11, em que 0 corresponde às 12 horas. Isso já é um número de pixel.

Agora os ponteiros podem se encontrar. Às 10:24:52, o ponteiro dos segundos está no pixel 10, sobre o ponteiro das horas. Desenhados um após o outro, o segundo cobre o primeiro e um ponteiro desaparece.

A luz pode se misturar. Em vez disso, dê a cada ponteiro sua própria componente de cor (vermelho para as horas, verde para os minutos, azul para os segundos) e monte cada pixel com base nos ponteiros que estão nele:

for (int i = 0; i < pixelCount; i++) {
  int r = 0;
  int g = 0;
  int b = 0;
  if (i == hourPixel) {
    r = 255;
  }
  if (i == minutePixel) {
    g = 255;
  }
  if (i == secondPixel) {
    b = 255;
  }
  ring.setPixelColor(i, ring.Color(r, g, b));
}

Onde os ponteiros se encontram, as componentes se somam: vermelho e azul formam magenta, verde e azul formam ciano, vermelho e verde formam amarelo. Cada pixel é configurado em cada passagem, então o loop também substitui ring.clear().

challenge icon

Desafio

Difícil

Adicione o ponteiro das horas e misture os ponteiros:

  • a hora é (now / 3600) % 12, desenhada nesse pixel
  • construa cada pixel em um loop for: vermelho 255 se o ponteiro das horas estiver ali, verde 255 para o ponteiro dos minutos, azul 255 para o ponteiro dos segundos

Pressione Run: o relógio começa às 10:24:50 com os ponteiros dos segundos e das horas misturados. Depois, Check.

Experimente você mesmo

#include <Adafruit_NeoPixel.h>

const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);

// O horário em que o relógio começa, em segundos desde a meia-noite: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

void setup() {
  ring.begin();
}

void loop() {
  unsigned long now = startTime + millis() / 1000;  // a hora do dia, em segundos
  int seconds = now % 60;
  int minutes = (now / 60) % 60;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // ponteiro dos segundos: azul
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // ponteiro dos minutos: verde
  ring.show();
  delay(100);  // redesenhar dez vezes por segundo
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Projetos

Pratique por conta própria: Playground de Arduino