Go Down

Topic: Non riesco a venirne a capo (Read 3599 times) previous topic - next topic

Dandovino

l'ho fatto ma come dicevo prima, non so perchè, ad esempio facendo ore*3600 + min*60+sec se sono le 22:00:00 dovrebbe venire 79200 invece stampando time su seriale mi da un valore vicino a 15000, ma l'orario segnato sull'lcd è giusto

Dandovino

è possibile che arduino abbia 'problemi' a fare le operazioni?

tonid

Quote
è possibile che arduino abbia 'problemi' a fare le operazioni?

Non è quello il problema,se fai un calcolo ed il risultato ci sta nella capacità della variabile è tutto ok.
Io proverei a stampare sul serial monitor l'ora che ricevi dal ds1307....Non conosco quella libreria e non so che formato di dati ti fornisce.
Usi hour() ,minute() ,second() ma che numero ti stampa in serial monitor?

Dandovino

hour min e sec esatti, quindi se sono le 22:00:00 da 22 se 22:30:45 da 22 30 e 45 quindi i valori sono esatti, ma provando a fare una moltipilcazione, avendo un long quindi il valore ci entra, se fai ad esempio per 4 ti da (nel caso delle 22) 88 ma se moltiplichi per 5 ad es. ti da 150 invece di 110

tonid

E' strana questa cosa ,se mi viene in mente qualche cosa ti dico.

Dandovino

potrebbe davvero essere che Arduino abbia qualche problema?

tuxduino

Scrivi subito alla atmel o a Banzi, ti saranno eternamente grati per aver scoperto un clamoroso baco nell'atmega328! :D

Sul serio...

Ho programmato per alcuni anni su PIC prima di conoscere Arduino, e mi è capitato diverse volte di sbattere la testa contro il muro fino al punto di pensare che c'era un baco nella cpu... In base alla mia esperienza, quello è il segnale che bisogna gettare (momentaneamente) il codice alle ortiche, attendere un paio di giorni e ricominciare da capo.

So già che ignorerai anche questo mio ennesimo consiglio non richiesto, comunque lo butto lì lo stesso, tanto è gratis ;)

In definitva ognuno impara dai propri bernoccoli. Buonanotte :-)

leo72

Scusami ma lo sai che questo è COMPLETAMENTE errato?
Code: [Select]
time = time*5,99999;

In informatica il separatore decimale è il punto, non la virgola!
Il tuo codice dovrebbe essere:
Code: [Select]
time = time * 5.99999;

Usando la virgola tu stai usando un costrutto del C che dice al compilatore di usare sempre l'argomento di destra, quindi 99999

Dandovino

Cavolo Leo, c'avevo pensato, ma comunque (forse stranamente)  con scritto 5,9 e non 5.9 (anche se con il punto non c'ho provato) funziona, mettendo 6 che dovrebbe comunque andare bene, invece sballa mentre dovrebbe andare bene comunque sia perché senza errore di , o . sia perché variabile long

Dandovino

non so, il tutto mi pare molto strano... ho modificato e riscritto il codice, così le cifre sembrano ritornare, eccolo qui:
Quote
#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);   // comando per ricevere l'ora dall'RTC
   
}

void loop()
{

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

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
   int dim;
   int ora;
   int oras;
   int moonlight=7;//pin led lunari
   int  time=(hour()*100 + minute());//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=14;//aumento intensità per ogni step
   ora=1200;//12:30 ora accensione
   oras=2315;//23:15 ora spegnimento
   int x=3;//intervallo in minuti tra un fade e un altro
   LCD.clear();
/*impostazione per l'accensione deiled lunari*/
 
 
  if (time >= 2300 &&  time <= 2359){
    digitalWrite (moonlight, HIGH);
  }
  if (time >= 0 && time <=1245){
    digitalWrite (moonlight, HIGH);
  }
  else{
  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%");

}

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");

}

Dandovino

Code: [Select]

/*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 && time <= 2359)

  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*18);
  LCD.setCursor(0,1);
  LCD.print ("Notte"); }
 
  if (time >= 0 && 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(dim);
}

Go Up