Menu
CoddyTech

Relógio NeoPixel: Ajustar a hora

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

O relógio sempre começa às 10:24:50, que é o horário certo uma vez por dia. Dois botões corrigem isso: o vermelho no pino 2 adianta o relógio em uma hora, e o verde no pino 3 em 5 minutos, um pixel do ponteiro dos minutos.

O horário é um único número, então ajustá-lo significa adicionar segundos. Guarde em uma variável o que os botões adicionaram e inclua isso na soma:

unsigned long adjust = 0;   // segundos adicionados pelos botões

unsigned long now = startTime + adjust + millis() / 1000;

Uma hora tem 3600 segundos e 5 minutos têm 300. Conte cada pressionamento uma vez, quando o botão for pressionado: LOW agora e HIGH da última vez. Adicionar em cada passagem enquanto ele estiver pressionado faria o relógio girar. Esses botões não apresentam repique.

int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
  adjust = adjust + 3600;
}
lastHour = hourState;

Todos os ponteiros são calculados a partir de now, então todos acompanham o horário, e os restos fazem as horas voltarem ao início após 11 e os minutos após 55.

challenge icon

Desafio

Médio

Permita ajustar o horário:

  • os pinos 2 e 3 são INPUT_PULLUP
  • um pressionamento no pino 2 adiciona 3600 segundos; um pressionamento no pino 3 adiciona 300, contando cada um uma vez quando o botão é pressionado
  • adicione esses segundos a now

Pressione Run e ajuste o relógio para o horário desejado; depois, pressione 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 inicial do relógio, 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;
  int hours = (now / 3600) % 12;

  int secondPixel = seconds / 5;
  int minutePixel = minutes / 5;
  int hourPixel = hours;

  // Cada pixel recebe vermelho do ponteiro das horas e verde do ponteiro dos minutos
  // e azul do ponteiro dos segundos; assim, as cores dos ponteiros se misturam em um mesmo pixel.
  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));
  }
  ring.show();
  delay(100);  // redesenha 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