Pages: 1 [2]   Go Down
Author Topic: cercando di includere e capire secTimer  (Read 506 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 3
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Stesso problema
Logged

Fionda08

Tuscany
Offline Offline
Edison Member
*
Karma: 77
Posts: 2110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 3
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Fionda08

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 4956
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);        
  }
}
« Last Edit: May 26, 2014, 11:16:24 am by nid69ita » Logged

my name is IGOR, not AIGOR

Offline Offline
Jr. Member
**
Karma: 3
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Codice funzionante
Code:
#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!
Logged

Fionda08

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 4956
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No, non funziona, non hai fatto tutte le prove:
Code:
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:
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
« Last Edit: May 26, 2014, 11:30:41 am by nid69ita » Logged

my name is IGOR, not AIGOR

Offline Offline
Jr. Member
**
Karma: 3
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Fionda08

Offline Offline
Jr. Member
**
Karma: 3
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Fionda08

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 332
Posts: 22804
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quello che vuoifare è già stato implementato nella swRTC  smiley-wink smiley-wink
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:
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.
Logged


Pages: 1 [2]   Go Up
Jump to: