Duch vs RTC ? battaglia persa

Mi rimetto nelle vostre mani perchè: Sono in possesso di un Seeduino stalker v2 con rtc incluso RTC Chip (RX8025), mi reputo un noob poichè sono un perito informatico ma le ultime stringe di c/c++ risalgono a ormai 6 anni fa abbondanti.

COn soddisfazione ho montato e sono riuscito a farci funzionare una led strip e applicarti un fading dei led , ora per finire il mio progetto e riabbandonare la programmazione per altri 6/7 anni vorrei potere gestire il fading in maniera progressiva cioè

ore 22 inizia il fading ore 23 led + accentuati etc etc ore 02 led massima potenza ore 06 fine del fading

il tutto in maniera automatica poichè quando riuscirò a fare questo potrò aggiungere altre strip per il giorno

il MIO grosso problema è che nemmeno gli sketch più semplici di serial.print mi funzionano, se ne faccio di semplici tipo il print di un carattere ASCII tutto ok, ma gg mese e anno Niente.

Ho spulciato arduino en. ma il risultato è 6hr oggi , un gran mal di testa e un pacchetto di sigarette andato ma nulla

una parola sola :

AIUTOOO :blush:

ma con il RTC ti sei interfacciato? che problemi ai riscontrato...così come l'hai messa giù, a parte come vuoi comandare le LED strip il resto non l'ho capito!

ci sto provando ma non ho avuto risposte cioè: nonriesco a vedere data e ora!

posta il codice!!!

Posta il codice oppure mandaci una sfera di cristallo a ciascuno di noi;
Ciao Uwe

uwefed: Posta il codice [u]oppure mandaci una sfera di cristallo a ciascuno di noi;[/u] Ciao Uwe

ROTFL :stuck_out_tongue_closed_eyes:

/*

  • TimeSerial.pde
  • example code illustrating Time library set through serial port messages.
  • Messages consist of the letter T followed by ten digit time (as seconds since Jan 1 1970)
  • you can send the text on the next line using Serial Monitor to set the clock to noon Jan 1 2010
    T1262347200
  • A Processing example sketch to automatically send the messages is inclided in the download
    */

#include <Time.h>

#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER ‘T’ // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message

void setup() {
Serial.begin(9600);
setSyncProvider( requestSync); //set function to call when sync required
Serial.println(“Waiting for sync message”);
}

void loop(){
if(Serial.available() )
{
processSyncMessage();
}
if(timeStatus()!= timeNotSet)
{
digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh
digitalClockDisplay();
}
delay(1000);
}

void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" “);
Serial.print(day());
Serial.print(” “);
Serial.print(month());
Serial.print(” ");
Serial.print(year());
Serial.println();
}

void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print(‘0’);
Serial.print(digits);
}

void processSyncMessage() {
// 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
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= ‘0’ && c <= ‘9’){
pctime = (10 * pctime) + (c - ‘0’) ; // convert digits to a number
}
}
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}

time_t requestSync()
{
Serial.print(TIME_REQUEST,BYTE);
return 0; // the time will be sent later in response to serial mesg
}

è già un passo avanti
con questo codice riesco a ricevere informazioni però come tolgo l’alimentazione torna tutto a zero…

ora vorrei capire come fare per mantenere la data visto che in teoria un modo c’è sennò che senso ha un chip rtc?!

lo studio notturno porta consiglio!

Ma il tuo RTC ce l'ha una batteria di backup? Altrimenti ovvio che allo spegnimento si azzera tutto.

menniti: Ma il tuo RTC ce l'ha una batteria di backup? Altrimenti ovvio che allo spegnimento si azzera tutto.

batteria tipo tampone ot simila no, viene mensionato tale super capacitor ( condensatore) per rtc backup

Ah, ok, non conoscevo questo shield; in effetti molti usano un super-condensatore come sistema di backup, ma per che autonomia è garantito? Se togli l'alimentazione e la ridai all'istante si azzera lo stesso?

menniti: Ah, ok, non conoscevo questo shield; in effetti molti usano un super-condensatore come sistema di backup, ma per che autonomia è garantito? Se togli l'alimentazione e la ridai all'istante si azzera lo stesso?

purtroppo si, ora è questa cosa che mi fa imbestialire, ma sopratutto non dovrebbe esser l'rtc a darmi i valori invece che io a dargli lo start?

qualcosa non mi torna...

duch: purtroppo si, ora è questa cosa che mi fa imbestialire, ma sopratutto non dovrebbe esser l'rtc a darmi i valori invece che io a dargli lo start?

qualcosa non mi torna...

No, torna eccome. Se l'orologio perde l'ora, devi risincronizzarlo tu col tempo effettivo altrimenti non ti dà l'orario.

leo72:

duch: purtroppo si, ora è questa cosa che mi fa imbestialire, ma sopratutto non dovrebbe esser l'rtc a darmi i valori invece che io a dargli lo start?

qualcosa non mi torna...

No, torna eccome. Se l'orologio perde l'ora, devi risincronizzarlo tu col tempo effettivo altrimenti non ti dà l'orario.

si ok, mi sta bene , ma allora il condensatore non serve a niente...

e poi tutte le volte devo caricare lo sketch per settargli l'ora e poi caricare quello finale? mi sembra una follia poi tutto ci sta!

No quello che dice Leo è normale se il tuo RTC perde l'ora, ovvio che in apparenza il condensatore non sta facendo il suo lavoro, controlla che non ci sia da attivare qualche jumper; in alternativa prova a collegare al volo una piccola vera batteria in parallelo al condensatore e vedi cosa succede. Se l'RTC riesce a mantenere l'ora ovvio che non hai più necessità di aggiornarlo.

no, l'ora la setti solo quando, causa scarica del condensatore/batteria, l'RTC si azzera.

Scusa, ma hai provato a verificare se il condensatorone funziona? misura col tester il voltaggio tra il catodo del condensatore(indicato dalla striscia bianca) e gnd, dovrebbe essere 3 o 5v

lesto:
no, l’ora la setti solo quando, causa scarica del condensatore/batteria, l’RTC si azzera.

Scusa, ma hai provato a verificare se il condensatorone funziona? misura col tester il voltaggio tra il catodo del condensatore(indicato dalla striscia bianca) e gnd, dovrebbe essere 3 o 5v

fino a domani rimarraà un mistero, ora ho un dubbietto che mi assilla prima di andare a letto, dubbietto che se risolto apparte la pila penso di aver finito il lavoro

dovrei tirar fuori 3 variabili dal sorgente superiore per unirle a un altro

var ore
var min
var sec

così le posso dichiarare in determinati

if(rtc[2]==10 && rtc[1]==54 &&rtc[0]==0) {//inizio creazione alba
for(int fadeValue = 0 ; fadeValue <=5; fadeValue +=5)
analogWrite(ledPin, fadeValue);

dove qui sono rtc[2] rtc[1] e rtc[0]

le mie tre var a dove le faccio puntare? domani ricerco anche il libro del c!

che vuoi fare puntare le variabili? nono tira fuori il libro che è meglio (senza offesa, son ostici a molti i puntatori) :)

Se non ho capito male vuoi mettere le variabili dentro ad un array. Puoi farlo attraverso i puntatori, ore min sec li trasformi in puntatori, ognuno che punta alla sua celletta dell'array, però poi nel codice attuale devi cambiare ogni volta che usi le tre variabili in modo che abbiano il * davanti, perchè lavori con il valore e non con l'indirizzo.. cambiare per cambiare, tanto vale combiare tutto per usare direttamente l'array, così non chiami in causa (direttamente ;) ) i puntatori

lesto:
che vuoi fare puntare le variabili? nono tira fuori il libro che è meglio (senza offesa, son ostici a molti i puntatori) :slight_smile:

Se non ho capito male vuoi mettere le variabili dentro ad un array. Puoi farlo attraverso i puntatori, ore min sec li trasformi in puntatori, ognuno che punta alla sua celletta dell’array, però poi nel codice attuale devi cambiare ogni volta che usi le tre variabili in modo che abbiano il * davanti, perchè lavori con il valore e non con l’indirizzo… cambiare per cambiare, tanto vale combiare tutto per usare direttamente l’array, così non chiami in causa (direttamente :wink: ) i puntatori

#include <Time.h>  

#define TIME_MSG_LEN  11   // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER  'T'   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 

int ledPin = 9;    // Dichiara il PIN di arduino incaricato di gestire il fading
int fadeValue = 0;

void setup()  {
  Serial.begin(9600);
  setSyncProvider( requestSync);  //set function to call when sync required
  Serial.println("Waiting for sync message");
}

void loop(){    
  if(Serial.available() ) 
  {
    processSyncMessage();
  }
  if(timeStatus()!= timeNotSet)   
  {
    digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh  
    digitalClockDisplay();  
  }
  delay(1000);

  /*
 // Esegue un aumento progressivo della luminosità da 0 a 255 (massimo) con step di 5 punti
   for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
   // Invia il valore al mosfet (0-255):
   analogWrite(ledPin, fadeValue);        
   // Attende 30 millisecondi prima in modo da poter visualizzare l'effetto di dimmeraggio
   delay(30);                            
   }
   
   // Esegue una diminuzione progressiva della luminosità da 255 a 0 (massimo) con step di -5 punti
   for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
   // Invia il valore al mosfet (0-255):
   analogWrite(ledPin, fadeValue);        
   // Attende 30 millisecondi prima in modo da poter visualizzare l'effetto di dimmeraggio
   delay(30);      
   */
  if  (hour()==22 && minute()==10 && second()==0) {//inizio creazione fase lunare
    for(int fadeValue = 0 ; fadeValue <=5; fadeValue +=5)
      analogWrite(ledPin, fadeValue);       
  }

  if  (hour()==23 && minute()==00 && second()==0) {
    for(int fadeValue = 00 ; fadeValue <=5; fadeValue +=15)
      analogWrite(ledPin, fadeValue);  
  }
  if  (hour()==23 && minute()==50 && second()==0) {
    for(int fadeValue = 15 ; fadeValue <=20; fadeValue +=15)
      analogWrite(ledPin, fadeValue);     
  }
  if  (hour()==00 && minute()==40 && second()==0) {
    for(int fadeValue = 30 ; fadeValue <=40; fadeValue +=15)
      analogWrite(ledPin, fadeValue);     
  }
  if (hour()==01 && minute()==30 && second()==0) {
    for(int fadeValue = 45 ; fadeValue <= 50; fadeValue +=15)
      analogWrite(ledPin, fadeValue);       
  }
  if (hour()==02 && minute()==20 && second()==0) {
    for(int fadeValue = 60 ; fadeValue <= 70; fadeValue ==60)
      analogWrite(ledPin, fadeValue);       
  }
  if (hour()==03 && minute()==10 && second()==0) {
    for(int fadeValue = 60 ; fadeValue <= 70; fadeValue -=15)
      analogWrite(ledPin, fadeValue);       
  }
  if (hour()==04 && minute()==00 && second()==0) {
    for(int fadeValue = 45 ; fadeValue >= 40; fadeValue -=15)
      analogWrite(ledPin, fadeValue);       
  }
  if (hour()==04 && minute()==50 && second()==0) {
    for(int fadeValue =30 ; fadeValue >= 25; fadeValue -=15)
      analogWrite(ledPin, fadeValue);       
  }
  if (hour()==05 && minute()==40 && second()==0) {
    for(int fadeValue = 15 ; fadeValue >= 5; fadeValue -=15)
      analogWrite(ledPin, fadeValue);       
  }
  if (hour()==06 && minute()==00 && second()==0) {
    for(int fadeValue = 20 ; fadeValue >= 15; fadeValue -=0)
      analogWrite(ledPin, fadeValue);       
  }
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

void processSyncMessage() {
  // 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
    char c = Serial.read() ; 
    Serial.print(c);  
    if( c == TIME_HEADER ) {       
      time_t pctime = 0;
      for(int i=0; i < TIME_MSG_LEN -1; i++){   
        c = Serial.read();          
        if( c >= '0' && c <= '9'){   
          pctime = (10 * pctime) + (c - '0') ; // convert digits to a number    
        }
      }   
      setTime(pctime);   // Sync Arduino clock to the time received on the serial port
    }  
  }
}

time_t requestSync()
{
  Serial.print(TIME_REQUEST,BYTE);  
  return 0; // the time will be sent later in response to serial mesg
}

codice pressochè ultimato, settando il T tutte le volte funziona MA se levo corrente ( anche con una lipo attaccata al relativo spinotto) non mi mantiene data e ora

domani sarà la sfida perchè risolto questo ho risolto tutti

per le variabili ho risolto con quelle di sistema!

buonanotte a tutti e grazie mille !

mettendo anche la lipo? mi sembra strano, ma finchè non metti un voltometro sull'entrata dell'RTC per controllare se alimentato (e magari controlla pure se ha un ingresso reset che inavvertitamente viene azionato)

comuqnue la soluzione con tutti quegli IF mi pare bruttissima. tanto per cominciare, il tempo trascorso dell'RTC se non erro ti arriva in secondi dal 1-1-1900 a mezzanote esatta(timestamp), e il tuo processo si deve ripetere ogni 50 minuti (ovvero 3000secondi esatti)

quindi basterebbe fare: timestamp%3000==0

in realtà se == 0 allora prenderebbe come punto di riferimento la mezzanotte precisa. Ma visto che tu vuoi partire dalla mezzanotte e 10 minuti, 10 minuto sono 600 secondi, quindi if ( timestamp%3000==600 ){ //accendi il led }

similarmente puoi escludere gli intervalli di tempo che non ti interessano, e usando il / invece che il %, otteresti un valore che puoi usare per capire a che intensità devi far accendere il led.

ma queste son complicazioni per quando avremo risolto, e se hai voglia di imparare a sbattere la testa sulle cose, in fondo è più matematica che programmazione, anche se molto basica.

menniti: Ah, ok, non conoscevo questo shield; in effetti molti usano un super-condensatore come sistema di backup, ma per che autonomia è garantito? Se togli l'alimentazione e la ridai all'istante si azzera lo stesso?

Quei condensatori sono da 1F se dimensioni in maniera esatta la resistenza con un led ad alta luminosità hai una lampada d'emergenza da 40-45 minuti :) però devi attivalo con un ponticello :) http://garden.seeedstudio.com/images/4/40/Stalker_v2.0_Schematics.pdf