Índice:

Relógio de texto de rolagem do Arduino: 3 etapas
Relógio de texto de rolagem do Arduino: 3 etapas

Vídeo: Relógio de texto de rolagem do Arduino: 3 etapas

Vídeo: Relógio de texto de rolagem do Arduino: 3 etapas
Vídeo: Curso de Arduino para Iniciantes - Aula 01 - Primeiros Passos (Exemplo de um Vumeter) 2024, Julho
Anonim
Arduino Scrolling Text Clock
Arduino Scrolling Text Clock

O objetivo deste projeto é construir um relógio de texto de rolagem que exibe a hora conforme é falada (por exemplo, "é meia-noite").

Este é um projeto rápido - nós damos a você o suficiente para começar com o hardware e o esboço, e então você pode levá-lo adiante para atender às suas necessidades.

Etapa 1: Hardware

Hardware
Hardware

Você precisará de três itens principais -

  • uma placa compatível com Arduino Uno
  • um circuito ou módulo de relógio em tempo real usando um IC DS1307 ou DS3231
  • e uma tela LED monocromática estilo P10

Você pode querer uma fonte de alimentação externa, mas veremos isso mais tarde.

O primeiro estágio é ajustar seu relógio em tempo real. Clique aqui para obter o tutorial se precisar de ajuda com isso.

A esta altura, espero que você esteja pensando “como você acerta o tempo?”.

Existem duas respostas para essa pergunta. Se você estiver usando o DS3231, apenas defina-o no esboço (veja abaixo), pois a precisão é muito boa, você só precisa fazer o upload do esboço com a nova hora duas vezes por ano para cobrir o horário de verão.

Caso contrário, adicione uma interface de usuário simples - alguns botões podem fazer isso. Finalmente, você só precisa colocar o hardware na parte traseira do DMD. Há muito espaço para atender às suas necessidades, uma solução simples pode ser alinhar a placa de controle para que você possa acessar o soquete USB com facilidade - e, em seguida, fixá-lo com um pouco de Sugru.

Com relação à alimentação do relógio - você pode executar UM display LED do Arduino, e ele funciona com um bom brilho para uso interno. Se você deseja que o DMD funcione com brilho máximo de queima de retina, você precisa usar uma fonte de alimentação 5V 4A DC separada. Se você estiver usando dois DMDs - isso vai para 8A e assim por diante. Simplesmente conecte a alimentação externa aos terminais de um DMD (conecte o segundo ou mais DMDs a esses terminais).

Se você não gosta de cortar a extremidade do cabo de alimentação, use um conector de saída CC.

Etapa 2: o esboço do Arduino

Você precisará instalar as duas bibliotecas do Arduino a seguir - TimerOne e DMD. Em seguida, faça upload do esboço:

// para RTC # inclua "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // o RTC DS1307 é 0x68

// para display LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // você poderia ter mais de um DMD em um linha #define DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // usado para conter a frase final para exibir no DMD

void ScanDMD () // necessário para DMD

{dmd.scanDisplayBySPI (); }

void setup ()

{// para DMD Timer1.initialize (5000); Timer1.attachInterrupt (ScanDMD); dmd.clearScreen (true);

// para RTC

Wire.begin (); // ativa o byte do barramento I2C segundo, minuto, hora, dayOfWeek, dayOfMonth, month, year; // altere as variáveis e remova o comentário de setDateDs1307 para definir o tempo // então comente novamente a função e carregue o esboço novamente, segundo = 0; minuto = 13; hora = 23; dayOfWeek = 4; dayOfMonth = 19; mês = 5; ano = 13; // setDateDs1307 (segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano); }

// funções RTC usuais

// Converter números decimais normais em bytes decimais codificados em binário decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); }

// Converte decimais codificados em binários em números decimais normais

byte bcdToDec (byte val) {return ((val / 16 * 10) + (val% 16)); }

void setDateDs1307 (byte segundo, // 0-59

byte minuto, // 0-59 byte hora, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28 / 29 / byte mês, // 1-12 byte ano) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (segundo)); // 0 ao bit 7 inicia o relógio Wire.write (decToBcd (minuto)); Wire.write (decToBcd (hora)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mês)); Wire.write (decToBcd (ano)); Wire.write (00010000); // envia 0x10 (hex) 00010000 (binário) para o registrador de controle - ativa a onda quadrada Wire.endTransmission (); }

// Obtém a data e hora do ds1307

void getDateDs1307 (byte * segundo, byte * minuto, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mês, byte * ano) {// Redefina o ponteiro de registro Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Alguns deles precisam de máscaras porque certos bits são bits de controle

* segundo = bcdToDec (Wire.read () & 0x7f); * minuto = bcdToDec (Wire.read ()); * hora = bcdToDec (Wire.read () & 0x3f); // É necessário alterar isso se 12 horas am / pm * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * mês = bcdToDec (Wire.read ()); * ano = bcdToDec (Wire.read ()); }

void drawText (String oldString)

{dmd.clearScreen (true); dmd.selectFont (Arial_Black_16); char newString [256]; int sLength = oldString.length (); oldString.toCharArray (newString, sLength + 1); dmd.drawMarquee (newString, sLength, (32 * DISPLAYS_ACROSS) -1, 0); início longo = milis (); longo temporizador = início; longo temporizador2 = início; boolean ret = false; enquanto (! ret) {if ((temporizador + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); temporizador = milis (); }}}

void createTextTime (int hh, int mm)

// isso mescla todos os dados de tempo em texto como uma frase {finalString = ""; // apaga a frase para casos especiais (abaixo) finalString = finalString + "It's";

// agora adicione a hora

if (hh == 1 || hh == 13) {finalString = finalString + "um"; } if (hh == 2 || hh == 14) {finalString = finalString + "dois"; } if (hh == 3 || hh == 15) {finalString = finalString + "três"; } if (hh == 4 || hh == 16) {finalString = finalString + "quatro"; } if (hh == 5 || hh == 17) {finalString = finalString + "cinco"; } if (hh == 6 || hh == 18) {finalString = finalString + "seis"; } if (hh == 7 || hh == 19) {finalString = finalString + "sete"; } if (hh == 8 || hh == 20) {finalString = finalString + "oito"; } if (hh == 9 || hh == 21) {finalString = finalString + "nove"; } if (hh == 10 || hh == 22) {finalString = finalString + "ten"; } if (hh == 11 || hh == 23) {finalString = finalString + "onze"; }

// agora adicione os minutos

switch (mm) {case 1: finalString = finalString + "oh one"; pausa; caso 2: finalString = finalString + "oh dois"; pausa; caso 3: finalString = finalString + "oh três"; pausa; caso 4: finalString = finalString + "oh quatro"; pausa; caso 5: finalString = finalString + "oh cinco"; pausa; caso 6: finalString = finalString + "oh seis"; pausa; caso 7: finalString = finalString + "oh sete"; pausa; caso 8: finalString = finalString + "oh oito"; pausa; caso 9: finalString = finalString + "oh nove"; pausa; caso 10: finalString = finalString + "dez"; pausa; caso 11: finalString = finalString + "onze"; pausa; caso 12: finalString = finalString + "doze"; pausa; caso 13: finalString = finalString + "treze"; pausa; caso 14: finalString = finalString + "quatorze"; pausa; caso 15: finalString = finalString + "quinze"; pausa; caso 16: finalString = finalString + "dezesseis"; pausa; caso 17: finalString = finalString + "dezessete"; pausa; caso 18: finalString = finalString + "dezoito"; pausa; caso 19: finalString = finalString + "dezenove"; pausa; caso 20: finalString = finalString + "vinte"; pausa; caso 21: finalString = finalString + "vinte e um"; pausa; caso 22: finalString = finalString + "vinte e dois"; pausa; caso 23: finalString = finalString + "vinte e três"; pausa; caso 24: finalString = finalString + "vinte e quatro"; pausa; caso 25: finalString = finalString + "vinte e cinco"; pausa; caso 26: finalString = finalString + "vinte e seis"; pausa; caso 27: finalString = finalString + "vinte e sete"; pausa; caso 28: finalString = finalString + "vinte e oito"; pausa; caso 29: finalString = finalString + "vinte e nove"; pausa; caso 30: finalString = finalString + "trinta"; pausa; caso 31: finalString = finalString + "trinta e um"; pausa; caso 32: finalString = finalString + "trinta e dois"; pausa; caso 33: finalString = finalString + "trinta e três"; pausa; caso 34: finalString = finalString + "trinta e quatro"; pausa; caso 35: finalString = finalString + "trinta e cinco"; pausa; caso 36: finalString = finalString + "trinta e seis"; pausa; caso 37: finalString = finalString + "trinta e sete"; pausa; caso 38: finalString = finalString + "trinta e oito"; pausa; caso 39: finalString = finalString + "trinta e nove"; pausa; caso 40: finalString = finalString + "quarenta"; pausa; caso 41: finalString = finalString + "quarenta e um"; pausa; caso 42: finalString = finalString + "quarenta e dois"; pausa; caso 43: finalString = finalString + "quarenta e três"; pausa; caso 44: finalString = finalString + "quarenta e quatro"; pausa; caso 45: finalString = finalString + "quarenta e cinco"; pausa; caso 46: finalString = finalString + "quarenta e seis"; pausa; caso 47: finalString = finalString + "quarenta e sete"; pausa; caso 48: finalString = finalString + "quarenta e oito"; pausa; caso 49: finalString = finalString + "quarenta e nove"; pausa; caso 50: finalString = finalString + "cinquenta"; pausa; caso 51: finalString = finalString + "cinquenta e um"; pausa; caso 52: finalString = finalString + "cinquenta e dois"; pausa; case 53: finalString = finalString + "cinquenta e três"; pausa; caso 54: finalString = finalString + "cinquenta e quatro"; pausa; caso 55: finalString = finalString + "cinquenta e cinco"; pausa; caso 56: finalString = finalString + "cinquenta e seis"; pausa; caso 57: finalString = finalString + "cinquenta e sete"; pausa; caso 58: finalString = finalString + "cinquenta e oito"; pausa; caso 59: finalString = finalString + "cinquenta e nove"; pausa; }

// meio-dia?

if (hh == 12 && mm == 0) {finalString = finalString + "meio-dia"; } // meia-noite? if (hh == 00 && mm == 0) {finalString = finalString + "meia-noite"; }

}

void loop ()

{// obtém a hora do byte RTC, segundo, minuto, hora, dayOfWeek, dayOfMonth, mês, ano; getDateDs1307 (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

// converter a hora em uma string de frase

createTextTime (hora, minuto);

// agora envie o texto para o DMD

drawText (finalString); }

O esboço tem as funções usuais para definir e recuperar a hora dos CIs de relógio em tempo real DS1307 / 3232 e, como de costume com todos os nossos relógios, você pode inserir as informações de tempo nas variáveis na configuração de void (), em seguida, descomente setDateDs1307 (), carregue o esboço, comente novamente setDateDs1307 e carregue o esboço mais uma vez. Repita esse processo para redefinir a hora se você não adicionou nenhuma interface de usuário baseada em hardware.

Etapa 3:

Depois que o tempo é recuperado em void loop (), ele é passado para a função createTextTime (). Esta função cria a sequência de texto a ser exibida começando com "É" e, em seguida, determina quais palavras seguir, dependendo da hora atual. Finalmente, a função drawText () converte a string que contém o texto a ser exibido em uma variável de caractere que pode ser passada para o DMD.

Recomendado: