cercando di includere e capire secTimer

Salve allora leggendo di qua e di la su internet leggo che la funzione millis() dopo 47 giorni si resetta, ok.... però mi mostra solo i secondi. Io vorrei una funzione che invece mi faccia spuntare d:h:m:s; ho scaricato la libreria secTimer ma dopo averla estratta tutta per intera dentro la cartella steckbook\libreries , una volta che l 'includo

#include "secTimer.h"

programma.ino:1:22: fatal error: secTimer.h: File o directory non esistente compilation terminated.

Il problema del reset della funzione millis() è relativo, basta sapere come gestirlo ;)

Detto questo, siccome sono l'autore della secTimer, posso certificarti che la lib funziona perfettamente per cui se hai degli errori dipenderà da come hai incluso la lib in Arduino. Tu dici che l'hai "estratta tutta per intera dentro la cartella steckbook\libreries" ma... l'hai lasciata nella sua cartella secTimer? Il percorso del file .h deve essere sketchbook/libraries/secTimer/secTimer.h

si esattamente home/steckbook/libreries/secTimer/secTimer.h , e quando includo quel hederfile mi da errore!

L'errore è chiaro, ti dice che non ha trovato il file o la directory, per cui ricontrolla il percorso. Ah, per la cronaca, la cartella si chiama "sketchbook", non "steckbook", non so se dipende da questo ma ho notato che lo hai scritto male 2 volte: la prima pensavo fosse un errore di digitazione, però ora nel percorso che metti noto nuovamente l'errore.

nono lo scrivevo male :roll_eyes:
ti mando un immagine vedi tu perchè mi sembra una cosa un po anomala :grin:

Il percorso è giusto. L'hai copiata lì dentro ad IDE chiuso? Altrimenti non te la vede. Al riavvio, hai trovato in "File/Esempi" la voce secTimer e poi l'esempio allegato alla libreria?

sisi ho riavviato l'IDE , ma negli esempi non spunta nessun secTimer

Allora ci sono riuscito, in pratica io avevo istallato arduino da terminale , e includendo la libreria non andava. Ora ho scaricato la versione dal sito , e aprendo l'ide (che è una verione portable) riesce a leggere il secTimer.h e spunta pure la voce secTimer->secTimerled

Ora vorrei fare una funzione che mi scandisca il tempo, in gg:hh:mm:ss

fionda08:
Allora ci sono riuscito, in pratica io avevo istallato arduino da terminale , e includendo la libreria non andava.
Ora ho scaricato la versione dal sito

Bisogna sempre usare la versione scaricata dal sito, con le altre ho sempre avuto problemi.

Ora vorrei fare una funzione che mi scandisca il tempo,
in gg:hh:mm:ss

Beh, non devi fare altro che un semplice orologio software con 4 variabili, gg, hh, mm e ss che incrementerai a cascata ad ogni variazione di 1 secondo.
Guarda l’esempio allegato, secTimerLed: al posto del cambio di stato del LED ci metterai gli incrementi dei secondi. Dopo 59 secondi, rimetti a 0 i secondi ed incrementi di 1 i minuti. Dopo 59 minuti, rimetti a 0 i minuti ed incrementi di 1 le ore e così via.

PS:
tieni presente che la precisione di un Arduino nel misurare il tempo è mooolto limitata, puoi perdere anche diversi minuti al giorno.

Allora io ho fatto una breve implementazione, ma una volta che faccio stampare seconds mi da sempre 0 ripetuto all 'infinito, io pensavo che incrementasse. questo è il codice

#include "secTimer.h"
int led =13;
unsigned long seconds;
secTimer mytimer;

void setup(){
   pinMode(led,OUTPUT);
   Serial.begin(9600);
   mytimer.startTimer();
   seconds=mytimer.readTimer();
   
}

void loop (){
  Serial.println(seconds);
  
}

… e mi meraviglierei del contrario !

Nel loop li devi leggere i secondi, mica la tua variabile si aggiorna da sola, quindi … anche nel loop()

seconds=mytimer.readTimer();

Guglielmo

P.S. : Hai letto il README.txt che accompagna la lib ? E’ chiaramente spiegato !

Ha ragione xD però una cosa, una volta che seconds=mytimer.readTimer arriva a 60 secondi e io impongo questo if

if(seconds==60){
          seconds=0;
          minutes++;
}

tutto si blocca a 60 secondi , perchè giustamente mytimer supera i 60 secondi, c'è un modo di resettare mytimer.readTimer() ??

Se invece di fare come stai facendo :

seconds=mytimer.readTimer();

usi la funzione modulo :

seconds=mytimer.readTimer() % 60;

dovresti avere i valori che girano in continuazione da 0 a 59 sec ;)

Guglielmo

Piccolo problema, tutto va bene fino al 59esimo secondo, dopo di che lui porta a 0 i secondi ma i minuti ore e giorni attribuisce valori a casaccio, premetto che ho inizializzato tutti i valori = 0 questo è il codice

#include"secTimer.h"
int led = 13;
char select ;
unsigned long secondi=0 ;
int minuti =0;
int ore=0;
int giorni=0;
secTimer mytimer;

void setup(){

    pinMode(led,OUTPUT);
    Serial.begin(9600);
    Serial.println("select 1 -> led ON\nselect 0 -> led OFF\nselect t -> show run time\n");
        mytimer.startTimer();   


}


void loop(){
        select=Serial.read();   
        secondi=mytimer.readTimer() %60 ;
        if(secondi==59  ){

        minuti=minuti+1;
        }
    if(minuti==59){
        ore=ore+1;
                minuti=0;
        }
    if(ore==24){
        giorni=giorni+1;
                ore=0;
    }

    if(select=='1'){
        digitalWrite(led,HIGH);
        Serial.println("led HIGH");
    }
    if(select=='0'){
        digitalWrite(led,LOW);
        Serial.println("led LOW");

    }

    if(select=='t'){

        Serial.println("aggiornamento tempo...");
        Serial.println("giorni:");
        Serial.println(giorni);
        Serial.println("ore:");
        Serial.println(ore);
        Serial.println("minuti:");
        Serial.println(minuti);
        Serial.println("secondi:"); 
        Serial.println(secondi);        
        Serial.println("**********");
    }

}

???

if(secondi==59  ){

Devi mettere:

if(secondi==0  ){

59 % 60=>59 60 % 60=>0 61 % 60=>1 Il % è il modulo ovvero il resto della divisione, ritorna 0 quando il numero è perfettamente divisibile.

Stesso problema

Devi mettere degli If annidati, cioe' che si verifichino solo se la 1° condizione e' vera

Niente annidando gli if , succede sempre lo stesso problema.

Attenzione il timer parte da 0, quindi nella loop per ben 1 secondo hai sempre mytimer.readTimer()=> 0 e 0 % 60 fa 0 per ben 1 secondo

void loop(){
  secondi=mytimer.readTimer() %60 ;
 // Serial.print(secondi);Serial.print("  ");Serial.println(minuti);
  if(secondi==0 && secondi>0)
  { minuti=minuti+1;
    if(minuti==60)
    { ore=ore+1;
      minuti=0;
    }
    if(ore==24)
    { giorni=giorni+1;
      ore=0;
    }
  }
  select=Serial.read();    
  if(select=='1'){
    digitalWrite(led,HIGH);
    Serial.println("led HIGH");
  }
  if(select=='0'){
    digitalWrite(led,LOW);
    Serial.println("led LOW");
  }
  if(select=='t')
  { Serial.println("aggiornamento tempo...");
    Serial.print("gg:"); Serial.print(giorni);
    Serial.print(" "); Serial.print(ore);
    Serial.print(":"); Serial.print(minuti);
    Serial.print(":"); Serial.println(secondi);        
  }
}

Codice funzionante

#include"secTimer.h"
int led = 13;
char select ;
unsigned long secondi=0 ;
unsigned long minuti =0;
unsigned long ore=0;
unsigned long giorni=0;
secTimer mytimer;

void setup(){
	
	pinMode(led,OUTPUT);
	Serial.begin(9600);
	Serial.println("select 1 -> led ON\nselect 0 -> led OFF\nselect t -> show run time\n");
        mytimer.startTimer();	
	

}


void loop(){
        delay(1000);
        select=Serial.read();	
        secondi=mytimer.readTimer() %60 ;
        if(secondi==59){
                minuti++;
	if(minuti==60){
                ore++;
                minuti=0;
		}
	if(ore==24){
                giorni++;
                ore=0;
	}
}
	if(select=='1'){
		digitalWrite(led,HIGH);
		Serial.println("led HIGH");
	}
	if(select=='0'){
		digitalWrite(led,LOW);
		Serial.println("led LOW");
		
	}
    if(select=='t'){
        Serial.println("aggiornamento tempo...");
        Serial.print("gg:");
        Serial.print(giorni);
        Serial.print(":");
        Serial.print(ore);
        Serial.print(":");
        Serial.print(minuti);
        Serial.print(":");	
        Serial.println(secondi);        
        Serial.println("**********");
	}

}

allora intanto ho cambiato minuti ore e giorni da int a unsigned long.
e dentro gli if invece di fare esempio(minuti=minuti+1) ho fatto (minuti++)
e il codice va!