Go Down

Topic: Orologio con lcd (Read 3532 times) previous topic - next topic

stefanolavori

Salve,

oggi ho realizzato un orologio con un lcd e volevo condividere con voi il mio progetto:

codice:
Code: [Select]

#include <LiquidCrystal.h>

int sec;
int minuto =23;
int ora = 12;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup () {
  Serial.begin(9600);
  lcd.begin(16, 2);
}



void loop () {
  for(sec=0; sec<60; sec++)
  {
    lcd.clear();
     if(ora<10) {
    lcd.print("0");
  }
    lcd.print(ora);
  lcd.print(":");
    if(minuto<10) { 
      lcd.print("0");
    }
    lcd.print(minuto);
    lcd.print(":");   
    Serial.println("un secondo"); 
    if(sec<10) {
     lcd.print("0");
    }
    lcd.print(sec);
  delay(1000); 
  }
  minuto++;
  Serial.println("e un minuto");
  if(minuto<59 && sec<59) {
  ora++;
  } else if (ora==24 && minuto==59 && sec==59) {
   ora=0;
   minuto=0;
   sec=0;
  }
}



Collegamenti:

ho seguito quelli di questo sito: http://www.ladyada.net/learn/lcd/charlcd.html

L'lcd è questo:

http://www.robot-italy.com/product_info.php?cPath=59_194&products_id=191

Devo dire che è ottimo e non ha un costo esagerato.


Il mio arduino tiene molto bene il tempo (circa un secondo di errore ogni settimana). Ho letto che questo varia molto da Arduino ad Arduino, quindi l'errore dovrete correggerlo voi.


Spero di essere stato utile  XD,

S.

uwefed

Sono molto sorpreso che hai solo un errore di 1 secondo a settimana visto che usi come misura del tempo un semplice "delay(1000);" senza considerare tutti i tempi di esecuzione delle varie funzioni usate.
Che modello di arduino usi? Un Arduino UNO?

Secondo me hai un c..lo grande come una casa a aver beccato l'Arduino giusto per il Tuo codice oppure stai sbagliando la misura del errore di tempo.

Questa precisione non hanno neanche la maggior parte dei RTC in comercio.

Ciao Uwe

milvusmilvus


Sono molto sorpreso che hai solo un errore di 1 secondo a settimana visto che usi come misura del tempo un semplice "delay(1000);" senza considerare tutti i tempi di esecuzione delle varie funzioni usate.
Che modello di arduino usi? Un Arduino UNO?

Secondo me hai un c..lo grande come una casa a aver beccato l'Arduino giusto per il Tuo codice oppure stai sbagliando la misura del errore di tempo.

Questa precisione non hanno neanche la maggior parte dei RTC in comercio.

Ciao Uwe




tieni presente che comunque lui è steve jobs :D

leo72

Anche fosse un Arduino 2009, che ha il quarzo esterno (più preciso del risonatore della UNO), avresti comunque degli scarti introdotti dalla funzione delay, come dice giustamente Uwe la cosa è curiosa.

astrobeed


come dice giustamente Uwe la cosa è curiosa.


Più che curiosa è da catalogare come "leggenda metropolitana", è praticamente impossibile ottenere la precisione di un secondo la settimana senza usare quarzi ad alta precisione termocompensati, per non parlare della durata del main loop che non è una costante, cambia a seconda delle operazioni svolte.
Scientia potentia est

stefanolavori

#5
Jan 16, 2012, 12:15 pm Last Edit: Jan 16, 2012, 12:18 pm by stefanolavori Reason: 1
Il delay(1000) non è stato messo a caso, ma dopo varie ore di test aumentando di qualche microsecondo ogni volta.

Quote
tieni presente che comunque lui è steve jobs
Ahahahahahahahahah


E' un Arduino 2009.

Tutto è stato ben ponderato per calcolare la precisione non nell'ora o nel secondo, ma nel giorno. Cioè, ho inserito quel delay per ottenere un secondo preciso, ma tenendo conto delle variabili e delle funzioni sempre diverse che si alternano in un giorno. In effetti anche il fattore c c'entra molto.

P.s. l'altoparlante è per un futuro allarme acustico alla mattina :)

Questa è l'ultima versione del codice, con giorno e mese.

Code: [Select]
#include <LiquidCrystal.h>

int sec = 50;
int minuto = 15;
int ora = 18;
int giorno = 6;
int giorno1 = 15;

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup () {
  Serial.begin(9600);
  lcd.begin(16, 2);
 
}



void loop () {
  for(sec=0; sec<60; sec++)
  {
    lcd.clear();
     if(ora<10) {
    lcd.print("0");
  }
    lcd.print(ora);
  lcd.print(":");
    if(minuto<10) { 
      lcd.print("0");
    }
    lcd.print(minuto);
    lcd.print(":");   
     
    if(sec<10) {
     lcd.print("0");
    }
    lcd.print(sec);
    //lcd.setCursor(0,2);
    //lcd.print(giorno);
   
    switch (giorno) {
      case 0:
      lcd.setCursor(0,2);
      lcd.print("Lun ");
      break;
      case 1:
      lcd.setCursor(0,2);
      lcd.print("Mar ");
      break;
      case 2:
      lcd.setCursor(0,2);
      lcd.print("Mer ");
      break;
      case 3:
      lcd.setCursor(0,2);
      lcd.print("Gio");
      break;
      case 4:
      lcd.setCursor(0,2);
      lcd.print("Ven ");
      break;
      case 5:
      lcd.setCursor(0,2);
      lcd.print("Sab ");
      break;
      case 6:
      lcd.setCursor(0,2);
      lcd.print("Dom ");
      break;
     
    } lcd.print(giorno1);
    lcd.print(" Gennaio");
   
    if (ora==24 && minuto==59 && sec==59) {
   ora=0;
   minuto=0;
   sec=0;
   giorno++;
   giorno1++;
  }
   
  delay(1000);
 
  if(sec==59 && minuto==59) {
  ora++;
  sec = 0;
  minuto = 0;
  }
 
  if(giorno == 7) {
      giorno = 0;
    }
 
  }
  minuto++;
 
 
 
 
}



Contiene alcuni errori, che cercherò di eliminare.

L'impianto è questo:
http://imageshack.us/photo/my-images/853/p1030088j.jpg/

Le saldature non sono eccellenti ( :smiley-red: i saldatori di 30 anni fa non vanno così bene) e la scatola che vedete è quella dei Ferrero rochè (eccellenti per alloggiare i progetti).

Go Up