• Welcome to LusoRobótica - Robótica em Português.
 

Real Time Clock DS1307 (RTC) + Arduino

Started by tr3s, 13 de March de 2009, 01:06

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

metRo_

#15


Venho aqui apresentar-vos a minha contribuição para este tópico eheh  ;D
Vou postar aqui o código que vos permite colocarem as horas no LCD, no entanto é necessário dizer que existem algumas limitações a nível de memória por isso retirei no vector onde está definida a tabela ascii tudo excepto os números de 0 a 9 e :.

Serial.print("Sao:    ");
  int horas = rtc[HORAS];             //Coloca as horas numa variavel
  Serial.print(horas,DEC);            // em primeiro vêm as horas...
  Serial.print(":");                  // ...
  int minutos = rtc[MINUTOS];         //Coloca os segundos numa variavel
  Serial.print(minutos,DEC);          // Agora os minutos...
  Serial.print(":");                  // ...
  int segundos = rtc[SEGUNDOS];       //Coloca os segundos numa variavel
  Serial.print(segundos,DEC);         // E de seguida os segundos. Vamos agora às estrelas... (Ai Marisa... (.)(.) )
  char hor_str[3] = "  ";             //criamos uma string onde vamos colocar o valor das horas
  char min_str[3] = "  ";             //criamos uma string onde vamos colocar o valor dos minutos
  char seg_str[3] = "  ";             //criamos uma string onde vamos colocar o valor dos segundos
  itoa(horas, hor_str, 10);           //Convertemos de inteiro (horas) para string(hor_str) na base 10, decimal.
  itoa(minutos, min_str, 10);         //Convertemos de inteiro (minutos) para string(min_str) na base 10, decimal.
  itoa(segundos, seg_str, 10);        //Convertemos de inteiro (segundos) para string(seg_str) na base 10, decimal.
  cursorxy(0,1);                      //Posicionamos o cursor no lcd.
  apagarLinha(1);                     // Apaga uma linha do LCD.
  cursorxy(0,1);                      //Posicionamos novamente o cursor no lcd.
  putstr(hor_str);                    //Colocamos os segundos no LCD :)
  putstr(":");
  putstr(min_str);                    //Colocamos os segundos no LCD :)
  putstr(":");
  putstr(seg_str);                    //Colocamos os segundos no LCD :)


O vector com os caracteres ficou assim:
byte nokiabyte[11][5] = {
{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
};


Como agora começamos no 0 (hex 0x30) é necessário nas funções em baixo alterar para 0x30 como mostra o seguinte:
void putchar(char character){                  // Traduz os caracteres para um formato reconhecido pelo PCD8544 e envia-os para o LCD. Cada caracter é um conjunto de 5 bytes.
  for (char i = 0; i < 5; i++){
    writedata(nokiabyte[character - 0x30][i]); // Vai buscar o byte ao array de caracteres e envia-o para o LCD
  }
  writedata(0x00);                             // Espaçamento de um pixel entre cada caracter
}

void putcharInv(char character){                  // Traduz os caracteres para um formato reconhecido pelo PCD8544 e envia-os para o LCD. Cada caracter é um conjunto de 5 bytes.
  for (char i = 0; i < 5; i++){
    writedata((nokiabyte[character - 0x30][i])^0xff); // Vai buscar o byte ao array de caracteres e envia-o para o LCD com as cores inversas
  }
  writedata(0xff);                             // Espaçamento de um pixel entre cada caracter
}


Programa em Anexo

tr3s se calhar era interessante no primeiro post colocar uma nota para este post.

ricardo-reis

:) tiro-lhe o chapéu, sr metro.. mt bem, mt bem..

(essa técnica de cortar nos caracteres k n são importantes eu tb já a tinha usado no meu 'termopac', realmente correu mt bem nos primeiros dias, mas o arduino de vez em kd dá uns cortes no lcd.. fica tudo desconfigurado.. (acontecia especialmente com as imagens))

tr3s

Tr3s
Daniel Gonçalves

metRo_

 :)
Podes explicar melhor ou dar links para sítios com esta informação porque acontecem estes problemas de memória quando se usa o i2c e grandes vectores?

PS: não é "metr0_" é metRo_ lool

ricardo-reis

Quote from: metRo_ on 28 de March de 2009, 23:22
PS: não é "metr0_" é metRo_ lool

aish! k nome feio k ele te chamou! :D

npaiva

Chegaram os meus samples do real time clock DS1307 RTC, agr vai ser só brincar... ::)
"É necessário ter o caos aqui dentro para gerar uma estrela."

- Friedrich Nietzsche

Ricardo_91

boas
já pedi samples ;D do ds1307 á maxim deve xegar dentro de 2 semanas
agora falta o cristal, vi este cristal na leiritronica

Cristal Quartzo 768KHZ para Relógio

Stock: DISPONÍVEL
Ref.: CQ32,768      0,26€ (IVA incluído)

axam que funciona??
eu sei que diz 768khz mas na referencia diz 32,768 e diz que é utilizada em relogios
Ricardo Vieira


TigPT

É isso mesmo, esse é o clock k é utilizado para gerar segundos ;)

delphi

Para os mais preguiçosos, como eu, existe esta board, já com tudo assemblado http://www.futurlec.com/Mini_DS1307.shtml que custa +/- 6 euros  ( + 4 USD de portes, que são repartidos se encomendarem mais unidades ou outros artigos).
www.saborapalco.com - Companhia de Teatro Amador
www.megavaquinha.com - Uma mega aposta no euromilhões de um grupo de mega amigos

amando96

Boas, chegaram samples do RTC, queria saber o valor recomendado para as resistencias de pull up, sei que dá normalmente de 1k a 47k, o que difere com diferentes resitencias?

e outra coisa, encontrei um cristal numa impressora, tem a mesma forma que esse, mas não tem nada escrito  ???

como posso encontrar o valor dele? há algum medidor?

outra coisa será ver as peças da impressora no site, mas está perto do impossivel...

obrigado :)

tcustodio

#25
Quote from: amando96 on 28 de July de 2009, 23:18
como posso encontrar o valor dele? há algum medidor?
um medidor da frequência de cristais:
http://blog.makezine.com/archive/2008/08/how_to_build_a_frequency.html ;)
tava pra criar um novo post pra isto  :D
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

amando96

Ui  :o mas só o tempo que me leva pa fazer isso já o rtc passou do prazo  :P

então e se eu puzer um cristal aleatorio? o que acontece? simplesmente conta o tempo mal?

tcustodio

Quote from: amando96 on 28 de July de 2009, 23:36
Ui  :o mas só o tempo que me leva pa fazer isso já o rtc passou do prazo  :P
podes fazer aquilo de maneira a apenas mandar o valor da frequência para a consola ;)

Quote from: amando96 on 28 de July de 2009, 23:36
então e se eu puzer um cristal aleatorio? o que acontece? simplesmente conta o tempo mal?
Yup, ou conta mais depressa ou mais devagar, consoante o valor do cristal ;D
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

amando96

Quote from: tcustodio on 28 de July de 2009, 23:46
Quote from: amando96 on 28 de July de 2009, 23:36
Ui  :o mas só o tempo que me leva pa fazer isso já o rtc passou do prazo  :P
podes fazer aquilo de maneira a apenas mandar o valor da frequência para a consola ;)

Quote from: amando96 on 28 de July de 2009, 23:36
então e se eu puzer um cristal aleatorio? o que acontece? simplesmente conta o tempo mal?
Yup, ou conta mais depressa ou mais devagar, consoante o valor do cristal ;D
ahh ok então sempre posso experimentar.
obrigado :)

tr3s

Sim experimenta, mas se tem esse aspecto quase de certeza que é um destes :D
Tr3s
Daniel Gonçalves