Ho un problema nel settare l'RTC con il seguente codice
Leggo dei dati dalla seriale e in base a quanto ricevo se il primo carattere è "O" devo settare l'ora;
I dati ricevuti via seriale sono corretti , ho provato a printarli sull'LCD,
ma la variabile calcolata contenente l'ora non vuole saperne di fuznionare con RTC.set(DS1307_HR,ora); >:(
Dove sbaglio??
void readdata()
{
int datiricevuti = 0;
String sdati = "";
int ora=0;
if (Serial.available()>0) {
for(int f = 1; f < 4; f++){
datiricevuti=Serial.read();
sdati=sdati+char(datiricevuti);
}
if(sdati[0]=='O'){// setto orario
ora=(int) sdati[1];
ora=ora*10;
ora=ora+(int) sdati[2];
lcd.setCursor(16,3);
lcd.print(sdati[1]);
lcd.print(sdati[2]);
lcd.print(char(ora));
RTC.stop();
RTC.set(DS1307_SEC,1); //set the seconds
RTC.set(DS1307_MIN,55); //set the minutes
RTC.set(DS1307_HR,ora); //set the hours
RTC.start();
}
non so come invvi i numer,i ma se sono caratteri devi fare la conversione da char a int.
se lo volevi fare col
ora=(int) sdati[1];
é errrato;
giusto é
ora=int(sdati[1]);
Ciao Uwe
Scusa è stato un errore di battitura, in effetti ho inserito ora=int(sdati[1]);
Ma il risultato non cambia, nel senso che quando eseguo l0istruzione per settare l'ora e gli passo la variabile ora non mi setta niente!!
Se però faccio printare la variabile sull'lcd con listruzione char(ora) il valore è corretto.
boooh...
Qualche idea? >:( >:(
Non metti la libreria usata per pilotare l'RTC.
Cmq, io quando ho avuto bisogno di interfacciarmi con il DS1307 ho usato del codice derivato da questa libreria:
Ricorda che il DS1307 comunica serialmente tramite I2C per cui devi aprire una connessione impostando il numero di bit che dovrai passargli e poi invii i dati. Se guardi un po' in quella lib che ti ho linkato, capisci cosa voglio dire.
Risolto, grazie a tutti, non era un prblema di librerie ma si codice , appena riesco lo posto così se qualche guru mi aiuta ad ottimizzarlo ne sarei grato.
Ecco questo è il codice che utilizzo, praticamente ricevo una serie di bytes dalla porta seriale inviati da un programmino java, e se il primo bytes è "O" devo settare l'orario dell'RTC con i dati contenuti nei seguenti bytes.
Se si può, vorrei ottimizzare il tutto per risparmiare qualche byte di codice
void readdata()
{
int datiricevuti = 0;
String sdati = "";
char tmptime;
char * _ora;
char * _min;
char * _sec;
int ora=0;
int minuti;
int secondi;
if (Serial.available()>0) {
for(int f = 1; f <7; f++){
datiricevuti=Serial.read();
sdati=sdati+char(datiricevuti);
}
if(sdati[0]=='O'){// setto orario
tmptime=sdati[1];
_ora=&tmptime;
ora=atoi(_ora);
ora*=10;
tmptime=sdati[2];
_ora=&tmptime;
ora+=atoi(_ora);
tmptime=sdati[3];
_min=&tmptime;
minuti=atoi(_min);
minuti*=10;
tmptime=sdati[4];
_min=&tmptime;
minuti+=atoi(_min);
tmptime=sdati[5];
_sec=&tmptime;
secondi=atoi(_sec);
secondi*=10;
tmptime=sdati[6];
_sec=&tmptime;
secondi+=atoi(_sec);
RTC.stop();
RTC.set(DS1307_SEC,secondi); //set the seconds
RTC.set(DS1307_MIN,minuti); //set the minutes
RTC.set(DS1307_HR,ora); //set the hours //RTC.set(DS1307_DOW,7); //set the day of the week //RTC.set(DS1307_DATE,28); //set the date //RTC.set(DS1307_MTH,12); //set the month //RTC.set(DS1307_YR,11); //set the year
RTC.start();
}
Ho fatto un milione di prove e stamattina alle 4 finalmente ho risolto, non sono sicuro del problema, ma penso di aver trovato la parte di codice che non andava.
Praticamente ho dovuto aggiungere un variabile di tipo char (tmptime) e assegnarlo di mano mano il valore di sdati[1]...sdati[2] etc e solo poi dare _ora=&tmptime;
Se facevo l'assegnamento diretto _ora=&sdati[1] il valore non era corretto e la conversione con atoi non funzionava.
Che differenza può esserci? sdati è una stringa ma sdati[1] non identifica un singolo carattere della stringa stessa? &sdati[1] punta ad un valore diverso da &tmptime (tmptime=sdati[1]) :-/????
perché ad ora che è un int gli assegni l'indirizzo di un char?
perché un cast (int) sdati non va rispetto a int(sdati)?
p.s. non ti serve mica per il nostro progetto no?
perché nel caso credo sia inutile...
Gli assegno l'indirizzo di un char alla variabile _ora non ora, questo perchè poi la converto con la funzione atoi(_ora).
Questa parte di codice mi serve per l'impostazione dell'oraria da interfaccia pc, non c'entra con il progetto che citavi
Come ti dicevo , è un mia pallino questa interfaccia, è la faccio proseguire parallelamente con il resto, tanto non è che devo poi stravolgere il codice principale, al limite gli aggiungerò una procedura in più per gestirla.