Stampare su file il valore di una funzione

Ciao, come posso stampare su file il valore di una funzione?
Es.Ho la funzione tempo impostata in questo modo:

void stampaora(){
Serial.print("L'orario UTC e' ");    
    Serial.print(hour()); //stampa l'ora
    Serial.print(':');  
    if (minute() < 10 ) {
      Serial.print('0');
    }
    Serial.print(minute()); // stampa minuti
    Serial.print(':'); 
    if (second() < 10 ) {
      Serial.print('0');
    }
    Serial.println(second()); // stampa secondi
    
}

Se provo confile2.print(stampaora());

l’errore è invalid use of void expression. Come dovrei impostare correttamente l’espressione?

Grazie mille
ankamacha

Con file2.print(stampaora()); stampi il risultato della funzione sul file. Visto che la funzione non ha un valore di ritorno Ti da il messaggio e non mette niente nel file.

Scriviti un altra funzione simile alla stampaora() che al posto del serial.print ha file2.print

Ciao Uwe

Come detto da @Uwe la strada più semplice è fare 2 funzioni stampaora (con due nomi diversi), uno che stampa su Serial e uno su file2.

CI sono altri 2 modi per fare una “funzione unica” ma sono complessi.
Non ho visto una tua presentazione, quindi non sò se sei un programmatore esperto.

Io li indico, tanto per informazione, ma se non conosci bene la programmazione C/C++ probabilmente faticherai a capire.
In questo caso non tenerne conto. Non è importante conoscere queste parti.

  1. invece di fare 2 funzioni fai una funzione a cui passi un puntatore generico. Quando stampi su Serial passi il puntatore a Serial altrimenti il puntatore a file2. Nella funzione sfrutto il fatto che le classi File (per file2) ed HardwareSerial (per Serial) derivano da Stream:
void stampa(void *px){
  int hh=10,mm=23;
  Stream * p=(Stream*)px;
  p->print("L'orario UTC e' ");    
  p->print(hh); //stampa l'ora
  p->print(':');  
  if (mm<10) p->print('0');
  p->print(mm); // stampa minuti
}

void setup()
{ ...
  stampa(&Serial);          // stampa su Serial
  stampa(&file2);           // stampa nel file2
}

Non ho una SD in ufficio perciò ho solo compilato ma non testato la cosa su file (su Serial si provato e funziona). Usato IDE 1.0.5

  1. si crea una piccola classe che conterrà hh,mm,ss ma questa classe deriva da Printable e dichiara la funzione printTo() e dentro a questa printTo() si fa la stampa.
    Da codice potrai fare una cosa del genere:
void loop()
{ ...
  myStampa x (hour(),minute(),second());      
  Serial.print(x);
  file2.print(x);
  ...
}

class myStampa : public Printable
{ private: 
    int _hh,_mm,_ss;
  public:
    myStampa(int hh,int mm,int ss) {_hh=hh; _mm=mm; _ss=ss; };
    virtual size_t printTo(Print& p) const;
};

size_t myStampa::printTo(Print& p) const
{ size_t n = 0;
  n=n+ p.print("L'orario UTC e' ");
  n=n+ p.print(_hh,DEC);
  n=n+ p.print(':');
  if (_mm<10) n=n+ p.print('0');
  n=n+ p.print(_mm); // stampa minuti
  return n;
}

Sia Serial che File sono classi che derivano da Stream e Print (a loro volta conoscono la classe Printable)

Non potrebbe usare semplicemente fstream?

Non credo, l'oggetto Serial è di classe HardwareSerial, che deriva da Stream non da fstream.
fstream è tipicamente usata su PC, su Arduino non mi risulta usata tranne che da classe SdFat che non è quella ufficiale.

grazie ragazzi per le dritte!

ankamacha
http://ankamacha.altervista.org/