Offline
Full Member
Karma: 0
Posts: 113
|
 |
« on: November 09, 2012, 08:19:23 pm » |
ragazzi, vi chiedo aiuto in ginocchio, perchè con il seguente codice alle 2 di notte, quindi con 'time' effettivamente maggiore di 'oras+x*19' e minore di 'ora' invece di essere nella fase 'notte' mi rimane nella fase giorno? Anche nella fase 'giorno' qualcosa non va, visto che dovrebbe attivarsi se 'time' è maggiore di 'ora+x*16' e minore di '<oras+x' come in effetti è? Alle 2 di notte questo if dovrebbe risultare falso... e invece no. Non ci sto capendo più nulla. 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 signed int dim; signed int ora; signed int oras; int moonlight=7;//pin led lunari signed 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=81900;//23:15 ora spegnimento in millisecondi(ore*3600 minuti*60 secondi*1)*1000 signed int x=150;//intervallo in millisecondi tra un fade e un altro
/*impostazione per l'accensione deiled lunari*/ if (time > oras+x*2 && time<ora+x){ digitalWrite (moonlight, HIGH); } if (time < oras+x*2 && time>ora+x){ digitalWrite (moonlight, LOW);} delay(10); /*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%"); delay(10); }
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%"); delay(10); }................... } /*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"); delay(10);.................... /*spegnimento completo dell'illuminazione, fase 'Notte' */ if (time >= oras+x*19 && time<ora) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } delay(10);
|
|
|
|
|
Logged
|
|
|
|
|
Torino
Offline
God Member
Karma: 2
Posts: 720
|
 |
« Reply #1 on: November 10, 2012, 12:53:57 am » |
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"); delay(10);.................... /*spegnimento completo dell'illuminazione, fase 'Notte' */ if (time >= oras+x*19 && time<ora) { analogWrite (ledw1,dim*18); analogWrite (ledw2,dim*18); analogWrite (leduv, dim*18); LCD.setCursor(0,1); LCD.print ("Notte"); } Mi pare manchi una graffa di chiusura della if dopo LCD,print("GIORNO");....
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 541
|
 |
« Reply #2 on: November 10, 2012, 01:29:35 am » |
dovresti postare il codice completo usando il simbolo # comunque mi pare che in questa riga c'è qualcosa che non va signed long tim e=+(hour()*60*60 + minute()*60 + second());//orario hr,min,sec ridotto in secondi o è uguale o è piu non vedo nemmeno un millis() 
|
|
|
|
« Last Edit: November 10, 2012, 01:33:31 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...
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10229
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #3 on: November 10, 2012, 03:30:10 am » |
Nella Guida sintetica di programmazione c'è scritto: x += y // same as x = x + y, or increments x by +y non so però se si possa scrivere anche nella forma =+
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #4 on: November 10, 2012, 04:19:19 am » |
Nella Guida sintetica di programmazione c'è scritto: x += y // same as x = x + y, or increments x by +y non so però se si possa scrivere anche nella forma =+No. Le forme abbreviate di assegnamento prevedono prima il simbolo dell'operazione e poi il simbolo dell'uguale. Quindi x+=y è la forma corretta.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10229
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #5 on: November 10, 2012, 04:38:01 am » |
allora quello segnalato da Gingardu è un errore in quanto ha invertito i due operatori
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #6 on: November 10, 2012, 04:42:27 am » |
Sicuramente è un errore. Poi ci possono magari essere anche errori logici, ma questi sono più difficili da interpretare se non si è nel "cranio" dell'autore del sorgente  Ad esempio, lo spezzone di codice dove sta? E' racchiuso nel loop()? Se sì, perché ad ogni ciclo imposta i pin in output? Perché usa variabili di tipo int per numeri che possono arrivare max a 59? Perché specifica "signed" quando è implicito che un "int" sia un "signed int"? Perché vedo delay(10) infilati da tutte le parti? A che serve aspettare 10 ms dopo un digitalWrite?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #7 on: November 10, 2012, 06:35:58 am » |
Il tutto si comporta come se i numeri in alcuni casi fossero di segno opposto. Eh... il cranio mio è bello duro  e tutte le domande di Leo hanno una sola risposta che le racchiude: perché sono ignorante e ho tutto da imparare su Arduino quindi il codice è scritto più a senso unito a pochi ricordi di C di quand'ero piccolo che con vera cognizione di causa... ecco perché spesso mi inceppo per stupidaggini che per voi sono scontate. Colgo l'occasione proprio per ringraziarvi per pazienza che avete e il sostegno che mi date. Ora sono col cel, appena arrivo al pc posto il codice intero. Di nuovo grazie a tutti.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #8 on: November 10, 2012, 07:12:29 am » |
ecco lo sketch, diviso in due parti sennò non mi entrava, abbiate pazienza e... grazie davvero a tutti /* /* * 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); } 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);
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 signed int dim; signed int ora; signed int oras; int moonlight=7;//pin led lunari unsigned 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=81900;//23:15 ora spegnimento in millisecondi(ore*3600 minuti*60 secondi*1)*1000 signed 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);} delay(10); /*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%"); delay(10); }
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%"); delay(10); }
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%"); delay(10); }
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%"); delay(10); }
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%"); delay(10); }
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%"); delay(10); } 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%"); delay(10); }
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%"); delay(10); }
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%"); delay(10); }
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%"); delay(10); } 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%"); delay(10); } 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%"); delay(10); }
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%"); delay(10); } 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%"); delay(10); } 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%"); delay(10); }
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%"); delay(10); } /*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"); delay(10); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #9 on: November 10, 2012, 07:12:57 am » |
/*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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); } 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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); }
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"); delay(10); } /*spegnimento completo dell'illuminazione, fase 'Notte' */ if (time >= oras+x*19 or 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 #10 on: November 10, 2012, 08:22:09 am » |
Non era un richiamo, intendiamoci.  PS: per il codice... sinceramente non posso mettermi a spulciare un sorgente del genere per capire dov'è l'errore..  inizia intanto a sistemare quelle cose che ti sono state segnalate e poi riprova.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #11 on: November 10, 2012, 08:32:23 am » |
Tranquillo, la mia risposta era intesa simpaticamente, la cosa seria e' che davvero sto imparando mentre lo programmo, come diceva un famoso comico... di più nin zo' 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #12 on: November 10, 2012, 08:52:21 am » |
gingardu, dici 'non vedo nemmeno un millis', perchè ho convertito l'orario in secondi e non in millisecondi, è sbagliato? Cambierebbe qualcosa?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #13 on: November 10, 2012, 09:09:54 am » |
Perché usa variabili di tipo int per numeri che possono arrivare max a 59? ore min e sec espressi in secondi arrivano a oltre 80000, perchè dici 59? Che variabili dovrei utilizzare? Ad esempio, lo spezzone di codice dove sta? E' racchiuso nel loop()? Se sì, perché ad ogni ciclo imposta i pin in output? I pin li ho impostati solo all'inizio,perchè dici che a ogni ciclo li reimposto?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 6
Posts: 541
|
 |
« Reply #14 on: November 10, 2012, 09:30:42 am » |
se una variabile in qualsiasi sketc non superera mai i 255 conviene mettere byte ache se nessuno vieta di adoperare ache altre tipi (per il fatto di risparmiare byte) ho dato una "sbirciata" al codice anche se concettualmente lo vedo semplicissimo accendere spegnere led (+ scritte) in base al tempo che passa ci sono tante librerie che ancora non ho mai usato/studiato quindi non sono in grado di darti il consiglio definitivo  fai dei tentativi e vedi se qualcosa va in overflow es un int che supera il valore consentito sostituisci gli int con i long se hai ancora spazio
|
|
|
|
|
Logged
|
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...
|
|
|
|
|