003 — Sunrise Alarm Clock
05/03/2026
Introdução
Este foi meu projeto final para o curso de introdução à ciência de computação (CS50), de Harvard.
Decidi juntar meu conhecimento de eletrônica e Arduino com os fundamentos aprendidos no curso fazendo um projeto que já estava na minha cabeça há muito tempo: um despertador que imita o nascer do Sol.
A ideia era ter um dispositivo com ajuste de hora do alarme, e controle de LEDs RGB para imitar as cores do nascer do Sol. Aproveitei para incluir um menu controlável por encoder rotativo.
Operação
Na tela principal, o despertador mostra a hora atual e o dia da semana. Para ajustar o alarme, basta segurar o botão do encoder por quase um segundo: um bipe avisa que o menu de ajuste foi aberto. Girando o encoder, a hora sobe ou desce, e um pequeno traço embaixo do número mostra qual campo está sendo ajustado. Um toque rápido no botão passa para os minutos, e outro toque volta para as horas. Quando o horário estiver certo, é só segurar o botão de novo para voltar à tela principal.
Quando chega a hora marcada, a luz começa a acender bem devagar. Ao longo de 20 minutos, ela passa por um roxo quase apagado, depois por um magenta, um vermelho e, por fim, um laranja quente, como o céu fazendo a transição da noite para o dia. Depois disso, a luz fica no brilho máximo por mais 20 minutos e então apaga sozinha.
No restante do tempo, o despertador também funciona como luminária: o segundo botão liga e desliga uma luz laranja e quente.
Ela também pode ser ligada e desligada com duas palmas, como naquelas luminárias de filme de ficção científica! Um pequeno microfone fica atento ao som do quarto, e o despertador só considera a segunda palma se ela vier entre 0,1 e 0,8 segundo depois da primeira. Assim, um barulho isolado (uma porta batendo, por exemplo) não acende a luz.
Como funciona
Um LED RGB é, na verdade, três LEDs em um só: um vermelho, um verde e um azul. Variando o brilho de cada um, é possível misturar praticamente qualquer cor, da mesma forma que um pintor mistura tintas na paleta. O brilho de cada cor é controlado por PWM, a mesma técnica que expliquei no projeto do gerador de frequências.
Para imitar o nascer do Sol, defini seis cores-chave, da mais escura para a mais clara:
int colors[6][3] = {
{2, 1, 2},
{10, 4, 10},
{40, 2, 12},
{80, 0, 20},
{160, 24, 4},
{200, 60, 10}
};
Se o LED pulasse de uma cor para a outra, a transição ficaria artificial, como uma apresentação de slides. Por isso, o código calcula a porcentagem do nascer do Sol que já passou e, a partir dela, descobre entre quais duas cores-chave a luz está e quão perto de cada uma ela deve ficar. O resultado é um degradê contínuo, que vai do roxo ao laranja sem saltos.
Para as palmas, usei um módulo de microfone com o amplificador MAX4466. Ele não diz simplesmente “ouvi” ou “não ouvi”: a saída dele é o próprio sinal do som, que oscila em torno da metade da tensão de alimentação. Por isso, a cada volta do programa o Arduino escuta o microfone por 30 milissegundos e mede a diferença entre o ponto mais alto e o mais baixo do sinal. Silêncio gera uma diferença pequena, e uma palma gera um pico grande. Quando esse pico passa de um limite, conta como palma.
Além disso, o tempo do nascer do Sol é contado a partir do horário do alarme em segundos, de forma que a luz continua acendendo normalmente mesmo quando a transição passa de uma hora para a outra (um alarme às 6h50, por exemplo, termina de acender às 7h10).
O circuito

Esquema elétrico do despertador, feito no EasyEDA
O circuito gira em torno de um Arduino Nano. A alimentação vem de uma fonte de 12 V, que vai direto para a fita de LED e passa por um regulador 7805 para gerar os 5 V do resto do circuito.
A luz vem de uma fita de LED RGB de 12 V. Um pino do Arduino não aguenta a corrente de uma fita de LED, então cada cor passa por um MOSFET IRL540N, que funciona como um interruptor controlado pelo Arduino: o vermelho fica no pino D3, o verde no D5 e o azul no D6. Esses três pinos têm PWM, então o Arduino liga e desliga cada MOSFET centenas de vezes por segundo, e a proporção entre o tempo ligado e o desligado define o brilho de cada cor. Isso nos possibilita selecionar uma vasta gama de cores para serem exibidas. Além disso, cada MOSFET tem um resistor de 100 Ω entre o pino e o gate, e outro de 10 kΩ do gate para o terra, que mantém a fita apagada enquanto o Arduino ainda está ligando.
O relógio de tempo real (RTC DS1307) e o display OLED conversam com o Arduino pelos mesmos dois fios (o barramento I2C), nos pinos A4 e A5. O encoder fica nos pinos D11 e D12, com o botão dele no D10. O botão da luminária fica no D4, o buzzer no D9 e o microfone, com o amplificador MAX4466, no A0.
Versões
1- Protótipo em breadboard
Testei o encoder com o display OLED e buzzer numa protoboard. A parte da conexão com os MOSFETs eu já tinha dominado, do projeto do placar de esgrima e outros projetos anteriores, então estava confiante em soldar essa parte direto quando fosse para a perfboard. Nesse estágio pude testar questões como short e long presses no encoder e sons no buzzer para indicar se uma ação estava excedendo algum limite do aparelho, e quando diferentes menus eram selecionados.

Protótipo em breadboard
2- Teste das luzes na perfboard
Após soldar todos os componentes na perfboard, espetei uma pequena seção da fita de LEDs RGB na placa para testar a exibição das cores. Na versão final, a fita ficava enrolada dentro da carcaça da luminária, com um difusor na frente.

Teste das luzes
3- Ferramenta para teste das cores, em p5js
Durante o desenvolvimento, pensei em definir uma cor inicial e uma cor final e interpolar linearmente entre as duas, então criei um programa em p5js para visualizar como seriam as sequências de cores. No final, deixei essa ideia de lado, pois defini “checkpoints” de cores no código, e interpolava entre os checkpoints. Isso me permitia ter cores mais fiéis ao nascer do Sol.

Teste das cores no p5js
4- Montagem final
Aproveitei a carcaça de uma luminária antiga e colei a eletrônica na base.

Montagem final
Conclusão
Este projeto começou como um projeto normal, cujo principal objetivo era aprender algo novo. Mas acaba que atualmente uso ele todos os dias para me despertar. Começar o dia com luz no rosto, por mais que artificial, me faz acordar mais disposto e evita que eu fique dando snooze no despertador! Como um próximo passo, eu adoraria implementar a mesma lógica em uma smart lamp comercialmente disponível. Cenas para os próximos capítulos…