Pages: [1] 2   Go Down
Author Topic: TIX LED CLOCK ARDUINO  (Read 1723 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, x chi non conoscesse il tix led clock, è questo qua http://www.thinkgeek.com/homeoffice/lights/7437/

sul forum ho trovato questo sketch, e sono in contatto con l'utente che l'ha scritto x emularlo su arduino. qua posto il link del forum con il codice (thanks SilverCG)

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1268523298

lo sto testando su una matrice di led già pronta, e x questo non ho problemi. Ho problemi invece sul come  settare l'orario, ho provato tramite l'apposito sketch x processing della libreria datetime, sembra che un refresh lo faccia, ma non riesco proprio a vedere un nesso tra i led accesi e l'ora attuale... sto cercando di capire se tante volte ci fosse un "mischiamento" di collegamento tra i pin da collegare alle colonne e righe, ma pare tutto ok... i led si accendono in modo random ma mantenendo una parvenza di "ordine orario".... se qualcuno ha fatto qualche prova con questo codice o abbia voglia di perdercisi un attimo x aiutarmi... grazie!!
« Last Edit: July 19, 2010, 02:10:09 pm by nytro81 » Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessuno che mi aiuta?!?!!? helllpppp!!!!!!!!!!!!!!!!  smiley-wink
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Problemi risolti, tante volte a qualcuno interessasse fare questo orologio!! Adesso visualizzo correttamente l'ora sulla matrice, in formato 24h. Quello di cui avrei bisogno, se possibile, qualche aiuto per collegarci un rtc tipo il ds1302, per fare la sincronizzazione automatica dell'ora in caso di mancata alimentazione!!!
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Acc.... possibile nessuno che abbia esperienze o idee su come interfacciare un rtc a questo sketch!?! Spero di non diventare noioso, ma spero tanto che qualcuno venga in mio aiuto, grazie ancora!!!
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 198
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa ma non ho capito in che modo si legge l'ora su quell'orologio !!!
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il quadrante è diviso in 4 campi, il primo ha 3 led, il secondo 9, il terzo 6 led ed il quarto nuovamente nove. per esempio se fossero le 12.34, troveresti accesi 1 led nel primo campo, 2 nel secondo, 3 nel terzo e 4 nell'ultimo. La particolarità sta nel fatto che ogni tot secondi cambia la posizione dei led accesi, mantenendo però lo stesso numero... non so se mi sono spiegato!!! è la replica di quello venduto su thinkgeek
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21655
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao nytro81

Hai provato di leggere le specifiche tecniche?
http://datasheets.maxim-ic.com/en/ds/DS1302.pdf

Ciao Uwe
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Certo, ho già provato con successo a leggere e far scrivere su seriale (o su display lcd) l'ora e la data, ma non trovo il modo di far leggere all'orologio che già è in funzione l'ora in arrivo dal ds1302, questo è il mio problema!!
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21655
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai visto questa libreria? http://quadpoint.org/projects/arduino-ds1302

non capisco cosa vuoi dire con: "ma non trovo il modo di far leggere all'orologio che già è in funzione l'ora in arrivo dal ds1302"
Manda il sketch che usi.
Ciao Uwe
« Last Edit: August 07, 2010, 06:34:17 pm by uwefed » Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo è lo sketch che uso. ha la possibilità di sincronizzare l'ora tramite seriale, tramite uno sketch in processing, ma a me servirebbe come detto prima la possibilità che in automatico prendesse l'ora dal rtc... grazie intanto x l'interessamento!!!

/*#################################################
###           ---- Tix LED Clock ----           ###
###Copyright 2010 - Dave Johnson - SilverCG.com ###
### --- this code includes 3 rows of multiplexed###
### leds to display a clock                     ###
#################################################*/

#include <DateTime.h>
#include <DateTimeStrings.h>
#define TIME_MSG_LEN  11   // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER  255   // Header tag for serial time sync message

int colpins[] = {2,3,4,5,6,7,8,9,10};
int rowpins[] = {12, 11, 13};
char top;
long timer;
const long muxInterval = 20;
int mux = 0;
int x;
int timesync;
int hourlist2[3];
int hourlist[9];
int minlist2[6];
int minlist[9];
int oldminute;


void setup() {
  Serial.begin(19200);
  for (int pin=0; pin<9; pin++) {
    pinMode( colpins[pin], OUTPUT );
  }
  for (int pin=0; pin<3; pin++) {
    pinMode( rowpins[pin], OUTPUT );
  }
  DateTime.sync(DateTime.makeTime(0, 34, 12, 10, 4, 2010));;

}

/* void hoursplit(){
  */

void loop(){
  int hour = (DateTime.Hour);
  int minute = (DateTime.Minute);
  int seconds = (DateTime.Second);
  int newhour = 0;

  if (seconds == 0 || timesync == 1) {
    Serial.println(seconds);
   // reset
    for (int i = 0; i < 9; i++){
      minlist = 0;
      hourlist = 0;
    }
    for (int i = 0; i < 6; i++) {
      minlist2 = 0;
    }  
    for (int i = 0; i < 3; i++) {
      hourlist2 = 0;
    }  
  
  
   //math
   //------------- start new code ---- july 22 2010 ---
   if (hour == hour){
//    if (hour > 12){
//      newhour = hour - 12;
//    }
//    if (hour < 12) {
//      newhour = hour;
//    }
//    if (newhour == newhour){
//      if (newhour == 0) {
//        hourlist2[0] = 1;
//        hourlist[0] = 1;
//        hourlist[1] = 1;
//      }
//      if (newhour == 12){
//        hourlist2[0] = 1;
//        hourlist[0] = 1;
//        hourlist[1] = 1;
//      }
//      if (newhour == 11){
//        hourlist2[0] = 1;
//        hourlist[0] = 1;
//      }
//      if (newhour == 10){
//        hourlist2[0] = 1;
//        hourlist2[1] = 0;
//        hourlist2[2] = 0;
//        for (int i = 0; i < 9; i++){
//          hourlist = 0;
//        }
//      }
    if (hour > 19 && hour < 24) {
      hourlist2[0] = 1;
      hourlist2[1] = 1;

      int subhour = hour - 20;
      for (int i = 0; i < subhour; i++){
        hourlist = 1;
      }
    }
    if (hour > 9 && hour < 20) {
      hourlist2[0] = 1;
      int subhour = hour - 10;
      for (int i = 0; i < subhour; i++){
        hourlist = 1;
      }
    }
      
    if (hour > 0 && hour < 10) {
      for (int i = 0; i < hour; i++){
        hourlist = 1;
      }
    }
    if (hour == 0){  
    }
//--------------------end new code
    if (minute >= 0 and minute < 10) {
      minlist2[0] = 0;
      minlist2[1] = 0;
      minlist2[2] = 0;
      minlist2[3] = 0;
      minlist2[4] = 0;
      minlist2[5] = 0;
      minute -= 0;
      for (int i = 0; i < minute; i++){
        minlist = 1;
      }
    }
    if (minute >= 10 and minute < 20) {
      minlist2[0] = 1;
      minlist2[1] = 0;
      minlist2[2] = 0;
      minlist2[3] = 0;
      minlist2[4] = 0;
      minlist2[5] = 0;
      minute -= 10;
      for (int i = 0; i < minute; i++){
        minlist = 1;
      }
    }
    if (minute >= 20 and minute < 30) {
      minlist2[0] = 1;
      minlist2[1] = 1;
      minlist2[2] = 0;
      minlist2[3] = 0;
      minlist2[4] = 0;
      minlist2[5] = 0;
      minute -= 20;
      for (int i = 0; i < minute; i++){
        minlist = 1;
      }
    }
    if (minute >= 30 and minute < 40) {
      minlist2[0] = 1;
      minlist2[1] = 1;
      minlist2[2] = 1;
      minlist2[3] = 0;
      minlist2[4] = 0;
      minlist2[5] = 0;
      minute -= 30;
      for (int i = 0; i < minute; i++){
        minlist = 1;
      }
    }
    if (minute >= 40 and minute < 50) {
      minlist2[0] = 1;
      minlist2[1] = 1;
      minlist2[2] = 1;
      minlist2[3] = 1;
      minlist2[4] = 0;
      minlist2[5] = 0;
      minute -= 40;
      for (int i = 0; i < minute; i++){
        minlist = 1;
      }
    }
    if (minute >= 50 and minute < 60) {
      minlist2[0] = 1;
      minlist2[1] = 1;
      minlist2[2] = 1;
      minlist2[3] = 1;
      minlist2[4] = 1;
      minlist2[5] = 0;
      minute -= 50;
      for (int i = 0; i < minute; i++){
        minlist = 1;
      }
    }
  }
timesync = 0;
}

// Random function
if (seconds == 0 || seconds ==  5 || seconds ==  10 || seconds == 15 || seconds ==  20 || seconds ==  25 || seconds == 30 || seconds ==  35 || seconds ==  40 || seconds ==  45 || seconds ==  50 || seconds == 55){
  if (x == 1){
    x = 0;
    for (int a=0; a<9; a++){
      int r = random(a,9);
      int temp = minlist[a];
      minlist[a] = minlist[r];
      minlist[r] = temp;
 
    }
    for (int a=0; a<9; a++){
      int r = random(a,9);
      int temp = hourlist[a];
      hourlist[a] = hourlist[r];
      hourlist[r] = temp;
      }
    for (int a=0; a<6; a++){
      int r = random(a,6);
      int temp = minlist2[a];
      minlist2[a] = minlist2[r];
      minlist2[r] = temp;
    }
    for (int a=0; a<3; a++){
      int r = random(a,3);
      int temp = hourlist2[a];
      hourlist2[a] = hourlist2[r];
      hourlist2[r] = temp;
    }
  }
}
// random off for 10 seconds
if (seconds == 1 || seconds == 6 || seconds == 11 || seconds ==  16 || seconds == 21 || seconds == 26 || seconds == 31 || seconds == 36 || seconds == 41 || seconds == 46 || seconds == 51 || seconds == 56){
  x = 1;
}

// draw



int rowone[] = {hourlist2[0], hourlist[0], hourlist[1], hourlist[2], minlist2[0], minlist2[1], minlist[0], minlist[1], minlist[2]};
int rowtwo[] = {hourlist2[1], hourlist[3], hourlist[4], hourlist[5], minlist2[2], minlist2[3], minlist[3], minlist[4], minlist[5]};
int rowthree[] = {hourlist2[2], hourlist[6], hourlist[7], hourlist[8], minlist2[4], minlist2[5], minlist[6], minlist[7], minlist[8]};
 
if (millis() - timer < muxInterval)
  {
    timer = millis();
    mux++;
    if (mux > 2){
      mux = 0;
    }
    for (int i = 0; i <=8; i++){
      digitalWrite(colpins, LOW);

    }
    digitalWrite(rowpins[0], LOW);
    digitalWrite(rowpins[1], LOW);
    digitalWrite(rowpins[2], LOW);
    
      
   if (mux == 0) {
      for (int i = 8; i >= 0; i--) {
        if (rowone == 1){
          digitalWrite(colpins, HIGH);
          digitalWrite(rowpins[0], HIGH);
        }
      }
    }
  

  if (mux == 1) {
    for (int i = 8; i >= 0; i--) {
      if (rowthree == 1){
        digitalWrite(colpins, HIGH);
        digitalWrite(rowpins[2], HIGH);
      }
    }
  }

  if (mux == 2) {
    for (int i = 8; i >= 0; i--) {
      if (rowtwo == 1){
        digitalWrite(colpins, HIGH);
        digitalWrite(rowpins[1], HIGH);
      }
    }
  }
}
  

// Time
unsigned long  prevtime;
  if( getPCtime()) {  // try to get time sync from pc
    Serial.print("Clock synced at: ");
    Serial.println(DateTime.now(),DEC);
  }
  if(DateTime.available()) { // update clocks if time has been synced
    digitalWrite(13,LOW);  // first flash the LED
    prevtime = DateTime.now();

    DateTime.available(); //refresh the Date and time properties


  }
}


boolean getPCtime() {
  // if time sync available from serial port, update time and return true
  while(Serial.available() >=  TIME_MSG_LEN ){  // time message consists of a header and ten ascii digits
    if( Serial.read() == TIME_HEADER ) {        
      time_t pctime = 0;
      for(int i=0; i < TIME_MSG_LEN -1; i++){  
        char c= Serial.read();
        top = c;        
        if( c >= '0' && c <= '9'){  
          pctime = (10 * pctime) + (c - '0') ; // convert digits to a number    
        }
      }
      timesync = 1;  
      DateTime.sync(pctime);   // Sync Arduino clock to the time received on the serial port
      return true;   // return true if time message received on the serial port
    }  
  }
  return false;  //if no message return false
}


Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa, ho risposto a metà.... ma non trovo il modo di far leggere all'orologio che già è in funzione l'ora in arrivo dal ds1302" significa che non trovo il modo di inserire la lettura dell'ora del rtc, ed il successivo utilizzo all'interno dello sketch.... non so se mi sono spiegato!! In pratica così com'è già funziona, xò devo settare manualmente l'ora da programmazione ogni volta che lo resetto, quindi le soluzioni sono: o trovo il modo di far leggere automaticamente l'ora dal ds1302, o da un ricevitore DCF77 per la ricezione della sincronizzazione tipo orologio atomico, oppure inserire 1 pulsante (soluzione + drastica ma comunque utile) che mi permetta di far andare + veloce lo scorrimento del tempo, rendendo possibile il settaggio manuale dell'ora... praticamente tenendolo premuto il tempo scorre velocemente fino all'ora desiderata, lasciandolo torna a scorrere alla frequenza di 60 sec/min
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Altrimenti 2 pulsanti che vanno ad agire sulle variabili delle ore e dei minuti, facendole incrementare di 1 ad ogni pressione, fino ad arrivare all'ora desiderata... ma a dirla onestamente, questo sketch (almeno x quanto riguarda la parte del conteggio del tempo) è troppo complicato x le mie competenze attuali, per questo sto cercando così disperatamente un aiuto!!!
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21655
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

semplice Tu hai un orologio (RTC) fatto col DS1302. prendi il tempo da lí.
al posto di

void loop(){
 int hour = (DateTime.Hour);
 int minute = (DateTime.Minute);
 int seconds = (DateTime.Second);
 
leggi l' ora e i minuti dal RTC

Ciao Uwe
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 215
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E' proprio questo il problema... non so come interpretare edd inserire la parte di script del 1302 nello script che ho già!! Forse dovrei mettere questa parte

snprintf(buf, sizeof(buf), "%s %02d-%02d-%04d %02d:%02d:%02d",
           day,
           t.date, t.mon, t.yr,
           t.hr, t.min, t.sec);

ed usare t.hr, t.min e t.sec al posto di hour, minute e seconds?
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21655
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sí;
scrivi: dopo aver chiamato la funzione che ti legge l' orologio:
hour = (t.hr);
minute = (t.min);
seconds = (t.sec);
ecc
Ovviamente devi includere la libreria che gestisce la comunicazione col 1302.
Ciao Uwe
Logged

Pages: [1] 2   Go Up
Jump to: