Go Down

Topic: RTC DS1302 problema con ora e data (Read 7346 times) previous topic - next topic

sagara_939

ciao a tutti,
ho acquistato un modulo RTC con l'integrato DS1302 e batteria tampone. Sto utilizzando questa libreria http://www.henningkarlsen.com/electronics/library.php?id=5

Ho provato subito il modulo utilizzando il primo esempio della libreria (DS1302_LCD). inizialmente non funzionava, mostrandomi alternativamente ogni 2 secondi data\ora e niente, sino a quando ho capito che i 5V di arduino non andavano bene per alimentare il modulo. L'ho collegato all'uscita 3.3V e ha funzionato.
Oggi, mentre riprendevo il modulo per aggiungerlo al mio progetto, sono cominciati altri problemi. Adesso non riesco a impostare l'ora, pur inserendo nel setup dello sketch le funzioni per farlo (setTime, setDate), come anche mostrato nell'esempio provato ieri. Inserisce una data a caso e comincia a contare i secondi da 69, poi a 79 passa a 1 minuto e 40, per poi continuare normalmente.
Ho provato a togliere la batteria tampone  e ad alimentarlo prima a 5V e poi a 3.3V, ma niente da fare: con i 5V dava lo stesso problema di ieri; mentre con i 3.3V lo stesso errore di prima.
La costa strana è che ho riprovato con lo stesso esempio testato ieri e da ancora gli stessi problemi. Ho provato anche ad utilizzare un altro arduino (uso 2 arduino Uno), ma niente, stesso problema.

Ecco lo sketch che utilizzo(l'esempio della libreria):

Code: [Select]

#include <DS1302.h>

// Init the DS1302
DS1302 rtc(4, 5, 6);

// Init the LCD
//LiquidCrystal lcd(11, 10, 9, 8, 7, 6);

void setup()
{
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);
  Serial.begin(9600);
  // Setup LCD to 16x2 characters

  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(19, 01, 2011);   // Set the date to August 6th, 2010
}

void loop()
{
  // Display time centered on the upper line
  Serial.println(rtc.getTimeStr());
 
  // Display abbreviated Day-of-Week in the lower left corner
  Serial.println(rtc.getDOWStr(FORMAT_SHORT));
 
  // Display date in the lower right corner
  Serial.println(rtc.getDateStr());

  // Wait one second before repeating :)
  delay (1000);
}


Secondo voi dove potrebbe essere il problema?

leo72


sagara_939

il modulo non ha una sua sigla. ti rimando alla pagina del sito dove l'ho acquistato:
http://www.plexishop.it/it/modulo-orologio-e-calendario-con-memoria-ds1302.html

leo72

Perché dici che a 5V non ti funziona?
Come lo hai collegato all'Arduino?

sagara_939

allora:
vcc --> 5V
gnd ---> gnd
clk --> 4
dat --->5
rst ---> 6

non è che non funziona, mi mostra l'ora e la data in maniera corretta ma, ogni 2 secondi, alterna la schermata in questa maniera:
Code: [Select]
Sabato 2013/08/06 - 14:40:13
xxxxxxxxx 02.01.2004 - 05:10:05
Sabato 2013/06/08 - 14:40:15
xxxxxxxxx 02.01.2004 - 05:10:05
Sabato 2013/06/08 - 14:40:17


mentre se collego il VCC a 3.3V, sino a sta mattina funzionava... adesso parte dall'ora e dalla data che vuole lui. la cosa strana è che la tensione d'alimentazione supportata è compresa tra 2V e 5.5V...

cyberhs

Hai fatto caso che stai usando il pin 6 dI Arduino sia per il modulo RTC che per il modulo LCD?

leo72


Hai fatto caso che stai usando il pin 6 dI Arduino sia per il modulo RTC che per il modulo LCD?

Si chiama risparmio  :smiley-yell:

sagara_939

hahahahah sisi ho visto, è che ho un bel po di finestre aperte e ho preso il codice sbagliato... quello giusto è questo:

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

// Init the DS1302
DS1302 rtc(13, 8, 9);


// Init the LCD
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);

void setup()
{
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);
  Serial.begin(9600);
  // Setup LCD to 16x2 characters

  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(19, 01, 2011);   // Set the date to August 6th, 2010
}

void loop()
{
  // Display time centered on the upper line
  Serial.println(rtc.getTimeStr());
 
  // Display abbreviated Day-of-Week in the lower left corner
  Serial.println(rtc.getDOWStr(FORMAT_SHORT));
 
  // Display date in the lower right corner
  Serial.println(rtc.getDateStr());

  // Wait one second before repeating :)
  delay (1000);
}


al 13 ho collegato il RST
all'8 il DAT
al 9 il CLK

leo72

Questo codice ha anche l'inizializzazione della LiquidCrystal, che non è inclusa  ;)
Ma stai facendo dei copia-e-incolla?  ;)

Dunque, partiamo da una situazione pulita: stacca tutto (LCD, cavi, cavini, cavetti ecc...) e collega SOLO il modulino poi usa il suo esempio base, SENZA nessuna aggiunta. Ti funziona oppure no?
I collegamenti sono fatti "volanti" oppure con fili saldati?

sagara_939

si sto copiai-incollando  :D comunque sia, ho seguito il tuo consiglio e ho collegato sto benedetto modulo RTC a un altro arduino (sulla breadboard, quindi niente fili saldati) e caricato lo sketch che ho postato prima (senza il liquidcrystal). Adesso funziona e sto alimentando dal pind 5V.
Se invece provo a spostarlo sull'altro arduino, dove ho il resto del circuito in cui lo devo integrare, mi da il problema di prima.
ecco lo sketch completo:

Code: [Select]
#include<LiquidCrystal.h>
#include <DS1302.h>
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
DS1302 rtc(13, 8, 9);

int temp = A0;  // termistore
int umid = A1; //igrometro
int optoalim = 6; //fotoaccoppiatore avvio ciabatta 230V
int optopc = 10; //fotoaccoppiatore avvio PC
const int cambiolcd = A2; //pulsante cambio schermata
const int spegnilcd = A3; //pulsante accendi spegni lcd   

int letturabase = 0; //igrometro
int letturabasetemp = 0; //termistore
int umiditabase = 0; //igrometro
int temperaturabase = 0; //termistore

int retrostat = 0; //stato iniziale retroilluminazione
int cambiostat = 0; //stato iniziale schermata (ora e data)
int retroillu = 7; //transistor retroilluminazione
int optoalimestat = 0;
int optopcstat = 0;


int letturaprova=0;
int letturaprova2=0;
void setup(){
  rtc.halt(false);
  rtc.writeProtect(false);
  lcd.begin(16, 2);   // avvio lcd
  rtc.setDOW(FRIDAY);        // impostazione giorno
  rtc.setTime(12,01,01);     // impostazione ora minuti secondi
  rtc.setDate(01, 01, 2013);   // impostazione mese giorno anno (mm/gg/aa)
 
  pinMode(cambiolcd, INPUT);
  pinMode(spegnilcd, INPUT);
  pinMode(retroillu, OUTPUT);
  pinMode(optopc, OUTPUT);
  pinMode(optoalim, OUTPUT);
  pinMode(temp, INPUT);
  pinMode(umid, INPUT);

  //Serial.begin(9600);
}

void loop(){
  retroilluminazione(); //funzione per la retroilluminazione
  avviotemporizzato(); //funzione di sveglia per il pc
  cambiostat = analogRead(cambiolcd);
  if(cambiostat > 1000 && cambiostat <=1024){  //se viene tenuto premuto, il pulsante mostra la seconda schermata (temperatura e umidità)
    lcd.clear();
   
    temperaturaigrometro();
    //igrometro();
    delay(1000);
  }
  else if(cambiostat < 1000){ //se invece non è premuto, vengono mostrate ora e data
    lcd.clear();
    orologio();
  }
 
 
}


void avviotemporizzato(){
  //const char tempo = ("00:00:00");
  //tempo = rtc.getTimeStr();
  if(rtc.getTimeStr() == ("12:12:10")){ //se il tempo è uguale a quello segnato (le 7 di mattina di default)
    digitalWrite(optoalim, HIGH);
    delay(2000);
    digitalWrite(optopc, HIGH);
    delay(100);
    digitalWrite(optopcstat, LOW);
    delay(1000);
  }
  else if(rtc.getTimeStr() != ("12:12:10")){ //altrimenti continua
  }
}



void orologio(){ //funzione orologio/calendario
  lcd.setCursor(4, 0);
  lcd.print(rtc.getTimeStr());
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));
  lcd.setCursor(6, 1);
  lcd.print(rtc.getDateStr());
  delay (1000);
}

void igrometro(){ //funzione igrometro
 
 
}

void temperaturaigrometro(){  //funzione termistore
  letturabase = analogRead(umid);
  umiditabase = 0.09765625*(letturabase); //divido 100/1024 e moltiplico per il valore letto per avere la percentuale di umidita
  letturabasetemp = analogRead(temp);
  temperaturabase = (5.0 * letturabasetemp * 100.0)/1024.0;
  //lcd.setCursor(0,1);
  lcd.print("Temperatura: ");
  lcd.print(temperaturabase);
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("Umidita: ");
  lcd.print(umiditabase);
  lcd.print("%");
  delay(100);
}

void retroilluminazione(){  //retroilluminazione
  retrostat = analogRead(spegnilcd);
  if(retrostat == HIGH){
    if(retroillu == LOW){ //se è spento, accende
      digitalWrite(retroillu, HIGH);
      delay(400);
    }
    else if(retroillu == HIGH){ //se è acceso, spegne
      digitalWrite(retroillu, LOW);
      delay(400);
    }
  }
}


leo72

Se da solo ti funziona e nel circuito no, la condizione di errore è da ricercarsi lì, e magari anche nel codice.
L'esempio di output che hai messo più sopra lo ottieni da questo codice?
Perché io vedo che la data è stampata in 2 formati diversi. Quando c'è il giorno della settimana, i numeri della data sono separati dalla barra inclinata, mentre quando appare "xxxxxxx" c'è il punto ed è invertito il formato invece di gg/mm/aaaa viene aaaa.mm.gg.

sagara_939

si, credo che il problema sia nel codice, solo che non capisco dove, quella libreria la chiamo solo per far da orologio e in quello che spero diventerà una funzione da sveglia (che per ora non funziona, "avviotemporizzato"). "Avviotemporizzato" ho provato ad eliminarla, e il problema persiste.

Possibile che sia un problema di alimentazione? Se lo collego a 5V, parte con ora e data esatti, ma printa questo:

Code: [Select]
12:01:01 Friday 01.01.2013
00:00:00 xxxxxxxxx 00.00.2000
12:01:03 Friday 01.01.2013
00:00:00 xxxxxxxxx 00.00.2000


se lo alimento a 3.3V, cambia data e ora partendo da dove vuole lui, per esempio adesso fa 12:04:00 Friday 19.01.2001 invece di 12.01.01 Friday 01.01.2013


leo72

Prova alimentando il tuo progetto con un alimentatore 5V esterno (ricordati di mettere in comune le masse) e non prendendo l'alimentazione per tutto dall'Arduino. Forse sei ai limiti di corrente e per questo l'orologio "sbarella".

sagara_939

#13
Dec 21, 2013, 11:08 pm Last Edit: Dec 22, 2013, 01:02 pm by sagara_939 Reason: 1
cavolo non ci avevo pensato... effettivamente sto collegando troppa roba... purtroppo ho solo alimentatori a 9V. Ho provato a passare alcuni carichi dai 5V di arduino ai 9V di una batteria, ma non è cambiato nulla... domani provo un po di combinazioni e vi faccio sapere i risultati.

intanto di vi ringrazio :)


Ragazzi, sono riuscito a risolvere (e spero che non ne succeda un'altra). Googlando per tutta la mattinata, sono riuscito a trovare la discussione di un portoghese che ha avuto un problema simile al mio. Lui ha risolto con una resistenza tra il pin DAT e quello di arduino. Ho fatto lo stesso, e ha funzionato con una resistenza da 220ohm.

Go Up