Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #15 on: November 10, 2012, 09:42:46 am » |
si, questo dei long e int l'ho fatto, ma il problema è che sembra che in certi punti legga un numero negativo al posto del positivo, se nel pezzo di codice che sta 'lavorando' cambio il > in < o viceversa funziona... almeno quella parte
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #16 on: November 10, 2012, 12:06:36 pm » |
ho modificato qualcosina... forse ora...l'ultimo if, nella fase 'notte', mi viene accettato dal sw, ma va bene scritto così? Visto che quando sono le 23:59:59, dopo un secondo si azzera il conto quidni l'affermazione 'time > di...' diventava falsa visto che a mezzanotte ricominciando da zero, 0 è perforza minore di time. Inoltre ho aggiunto un void contenente solo l'impostazione della luminosità, prima non sapendo come fare l'avevo 'infilato' nel void 'printDigits', credo che così sia più 'pulito' /* * 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); setSyncProvider(RTC.get); // the function to get the time from the 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 long time=(hour()*60*60 + minute()*60 + second());//orario hr,min,sec ridotto in secondi 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
/*impostazione per l'accensione deiled lunari*/ if (time > oras+x*2 or time<ora+x){ digitalWrite (moonlight, HIGH); } if (time < oras+x*2 && time>ora+x){ 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*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 -42:30");
}
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 -40:00");
}
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 -37:30");
}
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 -35:00");
}
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 -32:30");
}
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 -30:00");
}
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 -27:30");
}
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 -25:00");
}
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 -22:30");
}
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 -20:00");
}
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 -17:30");
}
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 -15:00"); }
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 -12:30"); } 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 -10:00"); }
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 -7:30"); }
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 -5:00"); }
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 -2:30"); }
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<=86399) if (time <ora) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } delay(10);
}
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 541
|
 |
« Reply #17 on: November 10, 2012, 12:21:24 pm » |
sembra strano l'ultimo if  a me pare piu corretto uno solo o ripeti l'intera "strofa" o metti uno o l'altro if (time >= oras+x*19 && time<=86399) if (time <ora) altrimenti se li vuoi mettere tutti e due ripeti tutto if (time >= oras+x*19 && time<=86399) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } delay(10); if (time <ora) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } delay(10); oppure fai un or if (time >= oras+x*19 && time<=86399 || time <ora) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } delay(10);
|
|
|
|
« Last Edit: November 10, 2012, 12:24:04 pm by gingardu »
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #18 on: November 10, 2012, 07:16:04 pm » |
infatti ho fatto così if (time >= oras+x*19 && time<=86399)
{ analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } if (time>=0 && time<=ora+x) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 541
|
 |
« Reply #19 on: November 11, 2012, 02:11:27 am » |
se hai la seriale ancora libera (pin 0-1) pui sempre mettere dei serial print momentanei per vedere che succede man mano che funziona tutto,
ci sono solo 3-4 cose che trasformano "involontariamente " un numero positivo in negativo
overflow,
moltiplicarlo per un numero negativo ecc,
altra cosa,...indagherei sugli if: se un if viene eseguito, e attiva o modifica qualcosa, questa cosa rimarra sempre attiva se non gli metti un "contro" if
esempio: se metto if (millis () > 1000 && millis () < 2000) digitalvrite (7, HIGH);
questa riga lascera inevitabilmente il pin 7 sempre alto se non metto qualcosa che lo riporti allo stato iniziale
|
|
|
|
« Last Edit: November 11, 2012, 02:39:12 am by gingardu »
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #20 on: November 11, 2012, 05:43:17 am » |
Ogni pezzo di codice con if lavora in momenti differenti, ma ognuno contiene il comando per tutte e tre le linee, quindi non c'è un punto in cui sono scoperti, stamattina ad es, dopo che ieri sera dopo la mezzanotte ho controllato che funzionasse, verso le 11 ho trovato i pin che lavoravano bene ma il display vuoto, senza scritte, e' bastato ricaricare lo sketch ed è tornato tutto normale, come se ci fosse qualcosa che per un istante non abbia funzionato. C'è un modo per stabilizzare un codice? Non so, con dei delay, che fermano quando una parte del codice è vera, non saprei, mi sembra come se il tutto funzionasse, ma a volte...
|
|
|
|
|
Logged
|
|
|
|
|
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)
|
 |
« Reply #21 on: November 11, 2012, 07:35:58 am » |
Hai provato a guardare la libreria Time ? E' piuttosto potente e completa, e supporta l'uso di rtc su i2c come sorgente di tempo.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #22 on: November 11, 2012, 09:18:35 am » |
Se hai un RTC, potresti pensare ad usare un timestamp al posto della semplice conversione di ore:minuti:secondi in un numero indicante i secondi dalla mezzanotte.
Un timestamp è un numero molto grande (unsigned long, 32 bit), che tiene il numero di secondi a partire da un dato istante. In questo modo il timestamp non solo contiene le ore:minuti:secondi ma gestisce anche il giorno. In questo modo non hai più problemi di orari che scavalcano la mezzanotte.
Se vuoi approfondire puoi scaricarti la mia libreria swRTC, che contiene un algoritmo per calcolare il timestamp da un dato istante e viceversa.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #23 on: November 11, 2012, 09:49:02 am » |
il timeStamp è una variabile propria della libreria in questione, giusto? Non è un classico 'comando' di C++. Certo, ne sarei felice, qualsiasi informazione in più è importantissima. Intanto ho rimodificato il codice aggiungendo 'abs che se non ho frainteso converte la cifra (in questo caso di 'time') in unnumero positivo, che sia essa in origine negativa o positiva. Eccolo /* * 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); setSyncProvider(RTC.get); // the function to get the time from the 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=abs(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
/*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*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*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<=86399)
{ analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } if (time>=1 && time<=ora) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte "); } delay(10);
}
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #24 on: November 11, 2012, 10:04:14 am » |
Sì, il timestamp è una funzione della libreria.
|
|
|
|
|
Logged
|
|
|
|
|
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)
|
 |
« Reply #25 on: November 11, 2012, 10:06:08 am » |
abs() ritorna il valore assoluto di un numero. Semanticamente equivale a: if x < 0 return -x else return x endif Non ho letto bene il tuo codice, ma mi pare che di fronte ad una variabile che assume valori _inaspettatamente_ negativi la soluzione non sia "togliere il segno meno", ma capire perché ciò avviene. 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #26 on: November 11, 2012, 10:24:27 am » |
hai ragione, ma rileggendo tutto il codice non mi pare di vedere possibilità di far divenire un numero positivo un numero negativo... 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #27 on: November 11, 2012, 03:11:34 pm » |
non ce la faccio più, sta diventando ridicolo, come può in questo codice diventare vero l'if della fase 'giorno' passata la mezzanotte dove invece dovrebbe essere assolutamente falso? /* * 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); 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; int ora; int oras; int moonlight=7;//pin led lunari int 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(); /*impostazione per l'accensione deiled lunari*/ 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");
}
|
|
|
|
|
Logged
|
|
|
|
|
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)
|
 |
« Reply #28 on: November 11, 2012, 03:16:09 pm » |
Io proverei a stampare sulla seriale i valori all'interno delle condizioni if(). Cioè time e i due valori calcolati con cui lo confronti.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #29 on: November 11, 2012, 03:38:42 pm » |
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!!!
|
|
|
|
|
Logged
|
|
|
|
|
|