Pages: 1 2 [3] 4   Go Down
Author Topic: Non riesco a venirne a capo  (Read 2703 times)
0 Members and 1 Guest are viewing this topic.
Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
allora, se davanti a ora e oras metto 'int' da vera la fase giorno sia di giorno che di notte, se metto 'long' da vera la fase di notte sempre in entrambe i casi... tra un pò spacco tutto... è illogico!!!
Una variabile di tipo int non può contenere un valore di 45000,guarda quì
Quote
int

Description
Integers are your primary datatype for number storage, and store a 2 byte value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1).

edit. Quindi è normale che superato il suo massimo valore positivo ti dia poi un valore negativo
« Last Edit: November 11, 2012, 04:04:18 pm by tonid » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

questo è vero.
Un int va da -32768 a +32767 mentre un unsigned int va da 0 a 65535, in entrambi i casi non arrivi al max numero di secondi di un giorno, 86400. Ti serve un long per forza.
Logged


Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
long

Description
Long variables are extended size variables for number storage, and store 32 bits (4 bytes), from -2,147,483,648 to 2,147,483,647.
E' un po un spreco ma non credo sia possibile fare diversamente.....
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si, ma vista la formula per portare hr min sec in secondi dovrei avere un valore, alle 22 avrò 79200, invece dà come risultato circa 13000, se aggiungo alla formula *2 mi dà naturalmente 26000 se provo *4 mi da 4268647983 che non c'entra nulla con 13000*4.
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
si, ma vista la formula per portare hr min sec in secondi dovrei avere un valore, alle 22 avrò 79200, invece dà come risultato circa 13000, se aggiungo alla formula *2 mi dà naturalmente 26000 se provo *4 mi da 4268647983 che non c'entra nulla con 13000*4.
E che variabile stai usando ?
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

long
ora ho aggiunto questa riga
Code:
time = time*5;
ma con il 5 da un risultato reale, fino a 5,9 se invece metto *6 sballa. Ipotesi, 1*5=5.....1*5,9=5,9.....1*6=6,5....
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ti converrebbe cercare di risolvere il problema dei numeri negativi scrivendo un piccolo sketch che contenga soltanto il codice minimo necessario ad analizzare (e comprendere) questo problema.
Metti le routine di conversione e stampa dei risultati, poi fai varie prove.
E _posta il codice_ che stai usando.
A forza di frasi smozzicate e "si ferma" "non va", ecc. non si va da nessuna parte.

IMHO, sia chiaro...
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mettendo 5,9 mi da 80300 mentre se metto 6 mi da 92000 e passa
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

questo è il codice completo
Code:
/*
 * TimeRTC.pde
 * example code illustrating Time library with Real Time Clock.
 *
 */
#include <LiquidCrystal.h>
#include <Time.h> 
#include <Wire.h> 
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t
LiquidCrystal LCD(12,11,5,4,3,2);



void setup()  {
 
 LCD.begin (16,2);
 Serial.begin(9600);
 setSyncProvider(RTC.get);
   DS1307RTC(); 
}

void loop()
{

  LCD.setCursor(0,0);
   digitalClockDisplay(); 
   delay(1000);
 
}

void digitalClockDisplay(){
 
  // digital clock display of the time
  LCD.print(hour());
  printDigits(minute());
  LCD.setCursor(5,0);
  printDigits(second());
  LCD.print(" ");
  }

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
 
  LCD.print(":");
  if(digits < 10)
    LCD.print('0');
  LCD.print(digits);
}
void DS1307RTC(){
 
 
   int ledw1=9;//pin linea led bianchi e rb posteriore
   int ledw2=10;//pin linea led bianchi e rb anteriore
   int leduv=6;//pin linea led rossi, verdi, uv
   float dim;
    unsigned long ora;
    unsigned long  oras;
   int moonlight=7;//pin led lunari
   unsigned long  time=((hour()*60*60) + (minute ()*60) + second());//orario hr,min,sec ridotto in secondi//cambiato da unsigned int a int
   pinMode (ledw1,OUTPUT);
   pinMode (ledw2, OUTPUT);
   pinMode (leduv, OUTPUT);
   pinMode (moonlight,OUTPUT); 
   dim=255/18;//aumento intensità per ogni step
   ora=45000;//12:30 ora accensione in millisecondi(ore*3600 minuti*60 secondi*1)*1000
   oras=83700;//23:15 ora spegnimento in millisecondi(ore*3600 minuti*60 secondi*1)*1000
   int x=150;//intervallo in millisecondi tra un fade e un altro
LCD.clear();
 time = time*5,99999;
/*impostazione per l'accensione deiled lunari*/

 
  if (time > oras+x*2 &&  time <=86399){
    digitalWrite (moonlight, HIGH);
  }
  if (time >= ora*0 && time <=ora+x*2){
    digitalWrite (moonlight, HIGH);
  }
  if (time <= oras+x*2&&  time>ora+x*2){
  digitalWrite (moonlight, LOW);}
 
 /*inizio della fase 'Alba' e aumento graduale dell'intensità dell'illuminazione*/
 
    if ( time >= ora&&time <ora+x)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*16);
  LCD.setCursor(0,1);
  LCD.print ("Alba 0%");

}

 if (time >= ora+x&&time<ora+x*2)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*14);
  LCD.setCursor(0,1);
  LCD.print ("Alba 6%");

}

if (time >= ora+x*2&&time < ora+x*3)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*16);
  analogWrite (leduv, dim*14);
  LCD.setCursor(0,1);
  LCD.print ("Alba 12%");

}

if (time >= ora+x*3&&time < ora+x*4)
  {
  analogWrite (ledw1,dim*17);
  analogWrite (ledw2,dim*15);
  analogWrite (leduv, dim*13);
  LCD.setCursor(0,1);
  LCD.print ("Alba 18%");

}

if (time >=ora+x*4&&time < ora+x*5)
  {
  analogWrite (ledw1,dim*16);
  analogWrite (ledw2,dim*14);
  analogWrite (leduv, dim*12);
  LCD.setCursor(0,1);
  LCD.print ("Alba 24%");

}

if (time >= ora+x*5&&time<ora+x*6)
  {
  analogWrite (ledw1,dim*15);
  analogWrite (ledw2,dim*13);
  analogWrite (leduv, dim*11);
  LCD.setCursor(0,1);
  LCD.print ("Alba 30%");

}
if (time >= ora+x*6&&time<ora+x*7)
  {
  analogWrite (ledw1,dim*14);
  analogWrite (ledw2,dim*12);
  analogWrite (leduv, dim*10);
  LCD.setCursor(0,1);
  LCD.print ("Alba 36%");

}

if (time >= ora+x*7&&time<ora+x*8)
  {
  analogWrite (ledw1,dim*13);
  analogWrite (ledw2,dim*11);
  analogWrite (leduv, dim*9);
  LCD.setCursor(0,1);
  LCD.print ("Alba 42%");

}
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if (time >= ora+x*8&&time<ora+x*9)
  {
  analogWrite (ledw1,dim*12);
  analogWrite (ledw2,dim*10);
  analogWrite (leduv, dim*8);
  LCD.setCursor(0,1);
  LCD.print ("Alba 48%");

}

if (time >= ora+x*9&&time<ora+x*10)
  {
  analogWrite (ledw1,dim*11);
  analogWrite (ledw2,dim*9);
  analogWrite (leduv, dim*7);
  LCD.setCursor(0,1);
  LCD.print ("Alba 54%");

}
if (time >= ora+x*10 && time<ora+x*11)
  {
  analogWrite (ledw1,dim*10);
  analogWrite (ledw2,dim*8);
  analogWrite (leduv, dim*6);
  LCD.setCursor(0,1);
  LCD.print ("Alba 60%");

}
if (time >= ora+x*11 && time<ora+x*12)
  {
  analogWrite (ledw1,dim*9);
  analogWrite (ledw2,dim*7);
  analogWrite (leduv, dim*5);
  LCD.setCursor(0,1);
  LCD.print ("Alba 66%");

}

if (time >= ora+x*12 && time<ora+x*13)
  {
  analogWrite (ledw1,dim*8);
  analogWrite (ledw2,dim*6);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Alba 72%");

}
if (time >= ora+x*13 && time<ora+x*14)
  {
  analogWrite (ledw1,dim*7);
  analogWrite (ledw2,dim*5);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Alba 78%");

}
if (time >=ora+x*14 && time<ora+x*15)
  {
  analogWrite (ledw1,dim*6);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Alba 84%");

}

if (time >=ora+x*15 && time<ora+x*16)
  {
  analogWrite (ledw1,dim*5);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Alba 90%");

}
/*fase intermedia 'Giorno' nella quale l'illuminazione viene tenuta al massimo dell'intensità impostata e che va dalla fine dell'alba all'inizio della fase di decremento dell'illuminazione 'Tramonto' */
if (time >=ora+x*16 && time <oras+x)
  {
  analogWrite (ledw1,dim*4);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Giorno");
 

}
 /*inizio della fase 'Tramonto' e diminuzione graduale dell'intensità dell'illuminazione fino al completo spegnimento*/

if (time >=oras+x&&time <oras+x*2)
  {
  analogWrite (ledw1,dim*5);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -45:00");

}

if (time >= oras+x*2&&time<oras+x*3)
  {
  analogWrite (ledw1,dim*6);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -42:30");

}

if (time >= oras+x*3&&time<oras+x*4)
  {
  analogWrite (ledw1,dim*7);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -40:00");

}

if (time >= oras+x*4&&time<oras+x*5)
  {
  analogWrite (ledw1,dim*8);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*4);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -37:30");

}

if (time >= oras+x*5&&time<oras+x*6)
  {
  analogWrite (ledw1,dim*9);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*5);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -35:00");

}

if (time >=oras+x*6&&time<oras+x*7)
  {
  analogWrite (ledw1,dim*10);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*6);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -32:30");

}

if (time >=oras+x*7&&time<oras+x*8)
  {
  analogWrite (ledw1,dim*11);
  analogWrite (ledw2,dim*4);
  analogWrite (leduv, dim*7);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -30:00");

}

if (time >=oras+x*8&&time<oras+x*9)
  {
  analogWrite (ledw1,dim*12);
  analogWrite (ledw2,dim*6);
  analogWrite (leduv, dim*8);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -27:30");

}

if (time >=oras+x*9&&time<oras+x*10)
  {
  analogWrite (ledw1,dim*13);
  analogWrite (ledw2,dim*7);
  analogWrite (leduv, dim*9);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -25:00");

}


if (time >= oras+x*10&&time<oras+x*11)
  {
  analogWrite (ledw1,dim*14);
  analogWrite (ledw2,dim*9);
  analogWrite (leduv, dim*10);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -22:30");

}

if (time >= oras+x*11&&time<oras+x*12)
  {
  analogWrite (ledw1,dim*15);
  analogWrite (ledw2,dim*10);
  analogWrite (leduv, dim*10);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -20:00");

}

if (time >= oras+x*12&&time<oras+x*13)
  {
  analogWrite (ledw1,dim*16);
  analogWrite (ledw2,dim*11);
  analogWrite (leduv, dim*10);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -17:30");
 
}

if (time >= oras+x*13&&time<oras+x*14)
  {
  analogWrite (ledw1,dim*17);
  analogWrite (ledw2,dim*14);
  analogWrite (leduv, dim*10);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -15:00");
 
}
if (time >= oras+x*14&&time<oras+x*15)
  {
  analogWrite (ledw1,dim*17);
  analogWrite (ledw2,dim*15);
  analogWrite (leduv, dim*11);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -12:50");
 
}

if (time >= oras+x*15&&time<oras+x*16)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*16);
  analogWrite (leduv, dim*11);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -10:00");
 
}

if (time >=oras+x*16&&time<oras+x*17)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*17);
  analogWrite (leduv, dim*11);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -7:30");
 
 
}

if (time >= oras+x*17&&time<oras+x*18)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*14);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -5:00");
 
}

if (time >= oras+x*18&&time<oras+x*19)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*16);
  LCD.setCursor(0,1);
  LCD.print ("Tramonto -2:30");
 
}
/*spegnimento completo dell'illuminazione, fase 'Notte' */
if (time > oras+(x*19))

  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*18);
  LCD.setCursor(0,1);
  LCD.print ("Notte"); }
 
  if (time<ora)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*18);
  LCD.setCursor(0,1);
  LCD.print ("Notte     "); }
  Serial.print (time);
  Serial.print (ora);
  Serial.print (oras);
 delay(10);
 

}

 
 
   
   
   
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi sembra tutto molto strano.....
Sembra che usi una unsigned int che ha come capacità un numero fino a 65535 e ti spiego perchè...
Come tu dici ,alle 22 dovresti leggere un valore di 79200 ma siccome la unsigned int arriva fino a 65535 quello che leggerai sarà pari a
79200-65535=13655........se moltiplichi 79200 per 2 avrai 158400 quindi riempi la variabile più di una volta 158400-65535-65535=27330 che dovrebbe essere il valore che leggi.....se moltiplichi però per numeri più alti,secondo i tuoi esempi, i conti non tornano più.
Ridai una sistemata al codice controllando bene le variabili e poi magari posta il tutto,è più facile poterti aiutare.

edit.mentre scrivevo lo hai già fatto smiley-wink
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no non è int è long
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si infatti ma facendo i conti sembrava lo fosse..
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mi sta venendo un altro dubbio, ma le fasi di alba e tramonto 'funzionano' quindi lì riconoscel'orario....  smiley-roll-sweat
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Di tutto cuore ho gli occhi che iniziano ad incrociarsi  smiley-sleep
Sicuramente mi viene da escludere che il problema siano le varie if.....dovresti provare a fare la stampa degli orari in serial monitor e,partendo da lì ,vai avanti seguendo il codice fino ad individuare l'intoppo...
Logged

Pages: 1 2 [3] 4   Go Up
Jump to: