Go Down

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

fionda08

Fionda08

Brunello

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

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