Offline
Full Member
Karma: 0
Posts: 113
|
 |
« on: November 06, 2012, 04:27:51 am » |
salve ragazzi, eccomi di nuovo qui, sono riuscito a risolvere per l'accensione della mia plafoniera impostando l'orario su Arduino, vorrei sapere se c'è la possibilità di abbreviare il mio sketch, ogni cinque minuti dò il comando di aumentare l'intensità, ma se fosse possibile dare un comando unico per il quale ad ogni cinque minuti trascorsi aumenti il segnale del tot prestabilito. Visto che la funzione dimmer sia ad incrementare che decrementare dura 45 min ciascuna, volendo una umento/diminuzione di 1/9 ad ogni step bisogna ripetere 9 volte per ogni fase lo stesso codice quindi 18 volte in totale Io per ora ho fatto così ma se fosse possibile semplificare o comunque abbreviare lo sketch ..... if (hour()==23 && minute()==15 && second()==40)//immissione dell'orario di accensione del led analogWrite (ledw1,light+dim); analogWrite (ledw2,light2+dim); analogWrite (leduv,light3+dim); light = light+dim; light2 = light2+dim; light3 = light3+dim; if (light>=255){ light=255;} if (light2>=255){ light2=255;} if (light3>=255){ light3=255;} .....
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #1 on: November 06, 2012, 04:40:37 am » |
Puoi crearti una funzione così if (hour()==23 && minute()==15 && second()==40)//immissione dell'orario di accensione del led { SetLight(ledw1,light,dim); SetLight(ledw2,light2,dim); SetLight(leduv,light3,dim); }
void SetLight(int led, int luce, int incremento){ analogWrite (led,luce+incremento); luce = luce+incremento; if (luce>=255)luce=255; }
Verifica il codice perché l'ho scritto di getto e non l'ho verificato.
|
|
|
|
« Last Edit: November 06, 2012, 04:42:37 am by PaoloP »
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #2 on: November 06, 2012, 04:58:32 am » |
il mio problema è il dover ripetere ogni volta il codice per ogni cinque minuti trascorsi, le tre linee di led hanno un aumentod'intensità diverso, quello che vorrei è poter evitare di dover riscrivere ogni volta: if (hour()... etc.... e dare ogni volta di eguito gli stessi comandi, se ci fosse un modo, ad esempio: int time dim=255/9 int dim //incremento intensità time=(hour() && minute() && second()); if (time==time+second(30)...... //ogni trenta secondi analogWrite(light+dim)//aumenta l'intensità di 1/9 del totale ogni volta light=light+dim; spero di essermi spiegato, non sono molto pratico... anzi...
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #3 on: November 06, 2012, 05:04:04 am » |
Creati un array contenente gli orari e scandiscilo ogni tot tempo. Se l'orario è presente nel tuo array esegui la manovra.
|
|
|
|
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #4 on: November 06, 2012, 05:09:18 am » |
potresti farmi un esempio, ripeto, sono pochi giorni che uso Arduino e molte cose ancora per me sono sconosciute 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #5 on: November 06, 2012, 05:38:35 am » |
Se vuoi un consiglio, trasforma l'orario espresso in ore:minuti:secondi in secondi e basta, in questo modo impazzisci molto meno con i controlli. Quindi, quando tu immetti un certo orario, sarà poi il codice a convertirlo in secondi, una baggianata pazzesca: secondi = tempSec + (tempMin*60) + (tempOre*60*60) Esempio: le 23:15:40 diventano 40+(15*60)+(23*60*60)=83740 In questo modo i controlli sugli orari diventano un unico if. Esempio, voglio sapere se è più di mezzogiorno: if (secondi > 43200) {....} A questo punto l'array che ti consigliava Dandovino si può eliminare e prendere solo il punto iniziale da cui con un piccolo algoritmo calcolarti 9 intervalli da 5 minuti l'uno. Esempio: voglio iniziare a regolare la plafoniera dalle 22:00:00 in poi. 22:00:00->79200s 5 minuti ->300s allarme = 79200 intervallo = 0 incremento = 300 .... void loop() { ... if ((secondi>allarme+incremento) && (secondi<allarme+(incremento*9)) { // è scattata l'ora e non ho dimmerato 9 volte analogWrite(pin, step*incremento); incremento++ if (incremento>9) { //stop incremento=0 fatto=true } } Provalo perché non so se funziona, l'ho scritto al volo, ma l'idea penso sia chiara.
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #6 on: November 06, 2012, 08:07:40 am » |
A questo punto l'array che ti consigliava Dandovino ...
 allarme = 79200 intervallo = 0 incremento = 300 .... void loop() { ... if ((secondi>allarme+incremento) && (secondi<allarme+(incremento*9)) { // è scattata l'ora e non ho dimmerato 9 volte analogWrite(pin, step*incremento); incremento++ if (incremento>9) { //stop incremento=0 fatto=true } } Già ma cosi gestisci solo intervalli regolari ! Con un array gestisci un orario esatto, fermo restando che trasformare l'orario in un unico dato long è sempre vivamente consigliato.
|
|
|
|
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #7 on: November 07, 2012, 06:18:09 am » |
per l'orario ho modificato ma avendo 3 canali da gestire che cambiano in modo differente ho comunque scritto così e non so come poter abbreviare, per ogni icremento ho bisogno di un 'if' ...dim=255/18; ora=43200;//ora accensione ore*3600 minuti*60 secondi*1 ora2=83400;//ora spegnimento ore*3600 minuti*60 secondi*1 int x=150;//intervallo in secondi tra un fade e un altro... 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%"); } else if (time >= ora+x && time<=ora+x*2) { analogWrite (ledw1,dim*17);...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #8 on: November 07, 2012, 06:32:47 am » |
niki77 scusami, come funziona lo step che vedo nel tuo codice? Inoltre con il codice che c'è tra parentesi il software da per vero ogni intervallo tra 'secondi>allarme+incremento' e 'secondi<allarme+(incremento*9)' come scandisco il tempo tra un aumento e l'altro? Forse non ho capito io ma tra le due opzioni c'è un'infinito numero di volte per cui if è vero quindi ad ogni passaggio, senza l'indicazione di un tempo preciso, aumenterebbe sempre no?! if ((secondi>allarme+incremento) && (secondi<allarme+(incremento*9)) { // è scattata l'ora e non ho dimmerato 9 volte analogWrite(pin, step*incremento); incremento++
|
|
|
|
|
Logged
|
|
|
|
|
MC
Offline
God Member
Karma: 9
Posts: 670
|
 |
« Reply #9 on: November 07, 2012, 06:36:11 am » |
Guarda che io non ho postato alcun codice , ho quotato un frammento di leo72.
Io ti avevo consigliato di gestire tutto con un array di valori in millisecondi.
|
|
|
|
|
Logged
|
Vi è una spiegazione scientifica a tutto. La fede è solo quell'anello che si porta al dito dopo il matrimonio.
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #10 on: November 07, 2012, 06:41:18 am » |
vabbè, quello che avevi riportato intendevo e che ho ricopiato io nel quote. Si mi dicevi dell'array, ma non ho capito come lo devo impostare che non l'ho mai usato, infatti ti chiedevo più su se potevi farmi un esempio di come poterlo impostare
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 13
Posts: 2437
|
 |
« Reply #11 on: November 07, 2012, 07:52:52 am » |
if (hour()==23 && minute()==15 && second()==40)//immissione dell'orario di accensione del led Non si mette mai == quando si confrontano dei tempi specie se sono variazioni piuttosto rapide, molto probabile che in alcuni cicli il secondo venga perduto saltando la funzione. Usare > o = a 40 ti garantisce che se al programma sfugge il 40 ma vede il 41 o 42 la funzione viene eseguita ugualmente
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 113
|
 |
« Reply #12 on: November 07, 2012, 07:56:36 am » |
grazie, non la sapevo questa, quindi cosa cambia tra i due simboli, = e ==?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 81
Posts: 8188
:(){:|:&};:
|
 |
« Reply #13 on: November 07, 2012, 08:01:38 am » |
= vuol dire assegnazione (ovvero: la variabile X deve valere Y) == vuol dire uguaglianza (ovvero: la varibaile X è uguale ad Y?)
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 13
Posts: 2437
|
 |
« Reply #14 on: November 07, 2012, 08:05:06 am » |
A = B copio il valore di B in A If A == B ... significa che A deve essere assolutamente identico a B If A >= B ... significa che A deve essere uguale a B oppure mi va bene anche se è maggiore di B ... l'importante che non sia inferiore a B
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
|