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.
Desafio
MédioPermita 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
}
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
3Sensor de Estacionamento
Sensor de Estacionamento: DistânciaSensor de Estacionamento: LuzesSensor de Estacionamento: BipesSensor de Estacionamento: Visor6Relógio NeoPixel
Relógio NeoPixel: SegundosRelógio NeoPixel: MinutosRelógio NeoPixel: Combinando os ponteirosRelógio NeoPixel: Ajustar a horaPratique por conta própria: Playground de Arduino