Go Down

Topic: cercando di includere e capire secTimer (Read 888 times) previous topic - next topic


Brunello

Devi mettere degli If annidati, cioe' che si verifichino solo se la 1° condizione e' vera
"C' è chi legge Guerra & Pace e non ci capisce un tubo vuoto; c'è chi legge l'etichetta delle patatine fritte e ci trova la spiegazione del mondo" (J.S. S. architetto napoletano)

fionda08

Niente annidando gli if , succede sempre lo stesso problema.
Fionda08

nid69ita

#18
May 26, 2014, 05:27 pm Last Edit: May 26, 2014, 06:16 pm by nid69ita Reason: 1
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

Code: [Select]
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);        
 }
}
my name is IGOR, not AIGOR

fionda08

Codice funzionante
Code: [Select]

#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!
Fionda08

nid69ita

#20
May 26, 2014, 06:25 pm Last Edit: May 26, 2014, 06:30 pm by nid69ita Reason: 1
No, non funziona, non hai fatto tutte le prove:
Code: [Select]
aggiornamento tempo...
gg:0:0:0:58
aggiornamento tempo...
gg:0:0:1:59
aggiornamento tempo...
gg:0:0:1:0
aggiornamento tempo...
gg:0:0:1:2


Da 0:0:58 passa a 0:1:59 e poi 0:1:00

Questi i valori del modulo 60 su secondi
Code: [Select]
readTimer mod 60
0 0
1 1
2 2
3 3
...............
58 58
59 59                 <-- tu lo fai scattare qui e non al 60°
60 0
61 1
my name is IGOR, not AIGOR

fionda08

ok fatto :
Code: [Select]

secondi=mytimer.readTimer() %60 ;
        if(secondi==0){
                minuti++;
.....
}

Fionda08

fionda08

Non l'avevo notato Grazie !!
tutto questo mi è servito, perchè voglio implementare questo orologio su display e ogni tot minuti accende o spegne un modulo relay
Fionda08

leo72

Quello che vuoifare è già stato implementato nella swRTC  ;) ;)
Bastava aprire il codice e vedere che c'era la gestione che vuoi.

A parte questo, si può fare anche con secTimer.
Cmq, brevemente, un orologio non ha bisogno di usare unsigned long! Ogni var sono 4 byte di RAM che se ne vanno, mi dici a che ti serve poter memorizzare u nnumero che va da 0 a 4294967295 quando le ore vanno da 0 a 23 ed i minuti ed i secondi da 0 a 59?

Code: [Select]
byte ore = 0;
byte minuti = 0;
byte secondi = 0;
byte vecchi_secondi;
byte giorni = 1;
byte mesi = 1;
int anni = 0;

void setup() {
  ....
  vecchi_secondi = myTimer.readTimer();
}

void loop() {
    if (vecchi_secondi!=myTimer.readTimer()) {
        vecchi_secondi=myTimer.readTimer();
        secondi++;
        if (secondi>59) {
          secondi=0;
          minuti++;
          if (minuti>59) {
            minuti=0;
            ore++;
            if (ore>23) {
              ore=0;
              giorni++;
              if (giorni>31) {
                giorni=1;
                mesi++;
                if (mesi>12) {
                   mesi=1;
                   anni++;
               }
              }
            }
ecc... chiudi tutto gli if

Ovvio che il codice qui sopra non gestisce i mesi con giorni differenti però è per capire la logica.
Ma ripeto, per un orologio c'è la swRTC che fa tutto.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy