Numero id discussione: 21668

Automatizzare accensione e spegnimento luci

Non è una domanda. ;)

Messaggioda RikkironzoLoL » 01/03/2017, 19:15

Ciao a tutti ragazzi,
dopo un periodo di inattività sul forum a causa di mille impegni, sono pronto per realizzare il mio nuovo progetto.
Come da titolo, ho intenzione di automatizzare l'accensione e lo spegnimento delle luci (fari e modalità notte del quadro strumenti).
Per fare questo, manualmente, bisogna chiaramente intervenire sulla rotella del quadro luci, spostando la selezione da "spento" ad "acceso" (o "posizione").
Il mio intervento viene applicato in questa operazione: la rotella viene sempre lasciata su "acceso", dopodiché, sarà un modulo aggiuntivo a decidere se, quando e come accendere/spegnere le luci.

Per fare ciò mi sono affidato ad Arduino; i più smanettoni già sanno di cosa sto parlando, per tutti gli altri, fatevi un giro su Google. :eheh:

Il concetto è semplice:
    1) Il modulo viene alimentato dalla 12v della macchina (io ho preso corrente dall'accendisigari)
    2) Una fotoresistenza verifica la luminosità dell'ambiente
    3) Se la luminosità ambientale è bassa e le luci sono spente, queste vengono accese
    4) Se la luminosità ambientale è alta e le luci sono accese, queste vengono spente

Ora, ogni minima variazione di luminosità comporterebbe un'infinita variazione dello stato delle luci, facendole accendere e spegnere ripetutamente.
Per ovviare al problema, ho programmato diversi controlli che permettono al modulo di essere indipendente (ed intelligente :okok:).

Il codice sorgente del modulo è il seguente (ho commentato il più possibile per far capire i vari concetti):

Codice: Seleziona tutto
int relePin = 7; // DICHIARO IL PIN DEL RELE'
int photoresPin = A5; // DICHIARO IL PIN DELLA FOTORESISTENZA
int lightValue = 0; // DICHIARO IL VALORE DELLA FOTORESISTENZA
int lastLightValue = 0; // DICHIARO IL VALORE DELL'ULTIMA RILEVAZIONE DELLA FOTORESISTENZA
int off2on = 450; // DICHIARO VALORE DI ACCENSIONE (ACCENDO DA 0 A 450)
int on2off = 550; // DICHIARO VALORE DI SPEGNIMENTO (SE ACCESO, SPENGO DA 550 IN SU)
int forceOff = 700; // DICHIARO IL VALORE DI FORZATURA DELLO SPEGNIMENTO
int timer = 0; // DICHIARO IL TIMER
int timerStep = 100; // DICHIARO IL VALORE DI INCREMENTO DEL TIMER IN MILLISECONDI
int loopDelay = 100; // DICHIARO IL TEMPO DI ATTESA TRA UN CICLO E L'ALTRO IN MILLISECONDI
int timeToTurn = timerStep * loopDelay; // DICHIARO IL TEMPO NECESSARIO PER ESEGUIRE IL COMANDO IN MILLISECONDI
int lastLightTimer = 0; // DICHIARO IL TIMER PER IL SALVATAGGIO DELL'ULTIMA RILEVAZIONE
int timeToLastLight = 1000; // DICHIARO IL TEMPO DI ATTESA TRA UN SALVATAGGIO E L'ALTRO DELL'ULTIMA RILEVAZIONE IN MILLISECONDI

boolean debug = false; // DICHIARO SE ESEGUIRE IL DEBUG
boolean lowDebug = false; // DICHIARO SE ESEGUIRE IL DEBUG COMPLETO
boolean lightsOn = false; // DICHIARO LO STATO DELLE LUCI (SPENTE)
boolean firstRun = true; // DICHIARO IL PRIMO AVVIO

void setup() {
  if(debug){
    Serial.begin(9600);

    if(lightsOn)
      turn(true); // ACCENDO LUCI
    else
      Serial.println("LUCI SPENTE");
  }
 
  pinMode(relePin, OUTPUT);
  pinMode(photoresPin, INPUT);
}

/*
* -- GENERALE --
* LA RILEVAZIONE DELLA LUMINOSITA' VIENE EFFETTUATA OGNI SECONDO.
* SE LE LUCI SONO SPENTE E C'E' POCA LUMINOSITA', LE LUCI VENGONO ACCESE; SE LE LUCI SONO ACCESE E C'E' MOLTA LUMINOSITA', LE LUCI VENGONO SPENTE.
*
* -- TIMER E TIMETOTURN --
* IL RITARDO DI 10 SECONDI PER ESEGUIRE L'AZIONE, E' UTILE NELL'EVITARE CONTINUI CAMBI DI STATO CAUSATI DA VELOCI CAMBI DI LUMINOSITA', COME AD ESEMPIO LE OMBRE DI ALBERI.
* PER ESEGUIRE L'AZIONE DESIDERATA, LA CONDIZIONE SI DEVE VERIFICARE PER ALMENO 10 SECONDI, COSI' DA DECRETARNE UNO STATO PERMANENTE.
*
* -- LIGHTVALUE E LASTLIGHTVALUE --
* MEMORIZZARE L'ULTIMA RILEVAZIONE E CONFRONTARLA CON QUELLA ATTUALE E' UTILE PER VERIFICARE UN CAMBIO DI LUMINOSITA' ESPONENZIALE, COME AD ESEMPIO L'ENTRATA E L'USCITA IN GALLERIA.
* SE LA DIFFERENZA TRA LE DUE CONDIZIONI E' NOTEVOLE, SI PUO' CONSIDERARE NECESSARIO UN CAMBIO DI STATO.
*
* -- NOTE --
* LA DIFFERENZA POTREBBE ESSER CALCOLATA TRAMITE UNA PERCENTUALE RELATIVA ALL'ULTIMA RILEVAZIONE, PIUTTOSTO CHE ALLA SUA META'.
*/

void loop() {
  lightValue = analogRead(photoresPin); // CONTROLLO IL VALORE DELLA FOTORESISTENZA

  if(!lightsOn && lightValue <= off2on){ // SE LE LUCI SONO SPENTE E LA LUCE AMBIENTE E' INFERIORE O UGUALE AL VALORE DI ACCENSIONE
    if(timer < timeToTurn && !firstRun && lightValue > lastLightValue / 2) // SE IL TIMER E' INFERIORE AL TEMPO NECESSARIO PER ESEGUIRE IL COMANDO, NON E' IL PRIMO AVVIO E LA LUCE AMBIENTE E' MAGGIORE DELLA META' DELL'ULTIMA RILEVAZIONE
      timer += timerStep; // INCREMENTO IL TIMER
    else // SE IL TIMER E' MAGGIORE AL TEMPO NECESSARIO PER ESEGUIRE IL COMANDO, SE E' IL PRIMO AVVIO O SE LA LUCE AMBIENTE E' MINORE DELLA META' DELL'ULTIMA RILEVAZIONE
      turn(true); // ACCENDO LUCI
  }
  else if(lightsOn && lightValue > on2off){ // SE LE LUCI SONO ACCESE E LA LUCE AMBIENTE E' MAGGIORE AL VALORE DI SPEGNIMENTO
    if(timer < timeToTurn && !firstRun && lightValue < forceOff) // SE IL TIMER E' INFERIORE AL TEMPO NECESSARIO PER ESEGUIRE IL COMANDO, NON E' IL PRIMO AVVIO E LA LUCE AMBIENTE E' MINORE DEL VALORE DI SPEGNIMENTO FORZATO
      timer += timerStep; // INCREMENTO IL TIMER
    else // SE IL TIMER E' MAGGIORE AL TEMPO NECESSARIO PER ESEGUIRE IL COMANDO, SE E' IL PRIMO AVVIO O SE LA LUCE AMBIENTE E' MAGGIORE DEL VALORE DI SPEGNIMENTO FORZATO
      turn(false); // SPENGO LUCI
  }

  if((timer > 0 && lightsOn && lightValue < on2off) || (timer > 0 && !lightsOn && lightValue > off2on)) // SE IL TIMER E' MAGGIORE DI 0 MA NON VI SONO LE CONDIZIONI PER VARIARE LO STATO DELLE LUCI
    timer = 0; // RESETTO IL TIMER

  if(firstRun) // SE E' IL PRIMO AVVIO
    firstRun = false; // DISABILITO TALE CONDIZIONE

  if(lastLightTimer < timeToLastLight) // SE IL TIMER E' INFERIORE AL TEMPO NECESSARIO PER SALVARE L'ULTIMA RILEVAZIONE
    lastLightTimer += timerStep; // INCREMENTO IL TIMER
  else{ // SE IL TIMER E' MAGGIORE AL TEMPO NECESSARIO PER SALVARE L'ULTIMA RILEVAZIONE
    lastLightValue = lightValue; // IMPOSTO IL VALORE DELL'ULTIMA RILEVAZIONE DELLA FOTORESISTENZA
    lastLightTimer = 0; // RESETTO IL TIMER
  }
 
  if(debug && lowDebug){
    Serial.println(lightValue);
    Serial.println(timer);
  }
 
  delay(loopDelay);
}

void turn(boolean state){
  if(state){ // SE DEVO ACCENDERE LE LUCI
    lightsOn = true; // IMPOSTO LO STATO DELLE LUCI COME ACCESO
    digitalWrite(relePin, HIGH); // ACCENDO LE LUCI

    if(debug)
      Serial.println("ACCENDO LUCI");
  }
  else if(!state){ // SE DEVO SPEGNERE LE LUCI
    lightsOn = false; // IMPOSTO LO STATO DELLE LUCI COME SPENTO
    digitalWrite(relePin, LOW); // SPENGO LE LUCI
   
    if(debug)
      Serial.println("SPENGO LUCI");
  }
   
  timer = 0; // RESETTO IL TIMER DOPO LA VARIAZIONE DELLO STATO DELLE LUCI
}


Ovviamente, tutto questo può capirlo chi ha delle basi di elettronica e programmazione; per tutti gli altri, prendetelo come dato di fatto. :l0l:

Questo fine settimana salderò il circuito per creare il modulo definitivo, specificando meglio i componenti utilizzati per la realizzazione; ora è tutto su breadboard e funziona perfettamente, sono pronto quindi alla saldatura.

Continuerò ad aggiornare il post con tutte le novità; se qualcuno ha qualche suggerimento per migliorare l'argomento di cui all'oggetto, scriva tutto ciò che pensa, sarò felice di discutere ogni eventuale dubbio. :read:

Al prossimo aggiornamento. :cool:
RikkironzoLoL
1.3 CDTI
1.3 CDTI
 
Messaggi: 228
Iscritto il: 02/12/2015, 9:17
Regione: Emilia Romagna (er)
modello opel: Opel Corsa E 1.3 CDTI 95cv COSMO

Messaggioda Riccardo64 » 01/03/2017, 19:46

Interessante :cool:

come le luci condominiali :eheh:
Riccardo64
1.7CDTI
1.7CDTI
 
Messaggi: 855
Iscritto il: 01/10/2016, 13:01
Località: Cologno Monzese
Regione: Lombardia (lo)
modello opel: Opel Corsa C 1.2 Comfort

Messaggioda Maligno » 01/03/2017, 21:12

Ottimo, proprio questo periodo sto iniziando a capirci qualcosa su arduino :D attendo con ansia sviluppi!
Avatar utente
Maligno
Supermod
Supermod

Referente di Zona
 
Messaggi: 2049
Iscritto il: 05/01/2011, 0:05
Località: Seddori
Regione: Sardegna (sa)
modello opel: Opel Corsa D facelift Bcolor

Messaggioda dukeluca86 » 01/03/2017, 22:52

Carino, conosco arduino, ci ho fatto un riduttore di giri in pwm regolabile tramite potenziometro per un motore.

Stò invece facendo una cosa simile ma a discreti per la mia radio android per automatizzare la potenza della retroilluminazione.

La cosa che fa la differenza è il dove posizionare la fotoresistenza, gia piccoli cambiamenti di direzione della stessa cambiano di molto il suo valore, anche a parità di luce.
Ultima modifica di dukeluca86 il 01/03/2017, 22:54, modificato 1 volta in totale.
dukeluca86
1.4 16V
1.4 16V
 
Messaggi: 420
Iscritto il: 06/11/2015, 14:47
Regione: Marche (ma)
modello opel: Corsa D GplTech 2009

Messaggioda Worm Boy » 02/03/2017, 13:54

Se viene fuori qualcosa di carino potresti anche pensare di venderlo!

[ Post made via Android ] Immagine
Immagine
Immagine
Avatar utente
Worm Boy
1.0 12V
1.0 12V
 
Messaggi: 54
Iscritto il: 13/02/2011, 19:29
Località: Sacile (PN)
Regione: Friuli-Venezia Giulia (fr)
modello opel: D 1.2 b-color

Messaggioda RikkironzoLoL » 02/03/2017, 19:57

Dove mettere la resistenza ci penserò a tempo debito.. Farò varie prove fino a quando non troverò la posizione ottimale; per ovviare al problema del cambiamento di luce, farò un'ottimizzazione del codice, se necessario; già adesso ho previsto questi cambiamenti, ma ovviamente avrò un riscontro reale soltanto quando avrò il modulo in funzione.
La mia domanda più grossa, al momento, è come collegare il tutto al quadro luci, in quanto vorrei evitare di tagliare i cavi originali; vorrei fare, se possibile, un'aggiunta ai cavi, ottenendo un: cavi originali > modulo > quadro luci, non so se mi sono spiegato. :l0l:
RikkironzoLoL
1.3 CDTI
1.3 CDTI
 
Messaggi: 228
Iscritto il: 02/12/2015, 9:17
Regione: Emilia Romagna (er)
modello opel: Opel Corsa E 1.3 CDTI 95cv COSMO

Messaggioda biodelta » 02/03/2017, 21:54

molto interessante, complimenti. fuori i centri abitati c'è l'obbligo di avere gli anabbaglianti accesi anche di giorno, quindi penso tu debba prevedere una funzione che accenda le luci indipendentemente dal sensore (sicuramente ci avrai già pensato)
biodelta
1.3 CDTI
1.3 CDTI
 
Messaggi: 241
Iscritto il: 13/12/2013, 19:12
Regione: Lazio (la)
modello opel: Opel Corsa D 2007 1.2 benzina e gpl

Messaggioda RikkironzoLoL » 02/03/2017, 21:59

biodelta » 02/03/2017, 21:54 ha scritto:molto interessante, complimenti. fuori i centri abitati c'è l'obbligo di avere gli anabbaglianti accesi anche di giorno, quindi penso tu debba prevedere una funzione che accenda le luci indipendentemente dal sensore (sicuramente ci avrai già pensato)


In verità non ci ho pensato, in quanto ho i DRL e non ho il bisogno di avere questa funzione; ad ogni modo, se tutto funzionerà come deve, è possibile aggiungere tale funzione per tutti coloro che non li hanno.
RikkironzoLoL
1.3 CDTI
1.3 CDTI
 
Messaggi: 228
Iscritto il: 02/12/2015, 9:17
Regione: Emilia Romagna (er)
modello opel: Opel Corsa E 1.3 CDTI 95cv COSMO

Messaggioda MaxMix » 02/03/2017, 22:12

Beh, senza ricorrere a arduino ci sono schemi molto semplici a componenti discreti facilmente reperibili per automatizzare le luci.
Un operazionale, fotodiodo e qualche transistor. Dovrei ravanare tra le riviste ma se cerchi in rete credo ne trovi a bizzeffe.
Cmq se te la cavi bene con questo vediamo l'evoluzione finale del progetto.
MaxMix
1.7CDTI
1.7CDTI
 
Messaggi: 688
Iscritto il: 26/07/2014, 14:46
Regione: Veneto (ve)
modello opel: Corsa C 1.3 CDTI

Messaggioda Alcide » 04/03/2017, 13:15

Scusa se dico la mia. Ormai la logica discreta è finita, almeno nella hobbistica. Vista la disponibilità di preassemblati a bassissimo costo si fa prima ad usare un micro anche per far lampeggiare un led.
Alcide
1.7CDTI
1.7CDTI
 
Messaggi: 848
Iscritto il: 12/02/2011, 9:33
Regione: Italia (it)
modello opel: Corsa D 1.2 edition a GAS

Messaggioda Riccardo64 » 04/03/2017, 15:05

si, ormai è diventato un discorso di "lana caprina"... alla fine conta il risultato e soprattutto la soddisfazione personale :cool:
Riccardo64
1.7CDTI
1.7CDTI
 
Messaggi: 855
Iscritto il: 01/10/2016, 13:01
Località: Cologno Monzese
Regione: Lombardia (lo)
modello opel: Opel Corsa C 1.2 Comfort

Messaggioda MaxMix » 05/03/2017, 18:27

Beh, dipende anche cosa si ha sottomano, e da me i componenti discreti abbondano (e sono ancora ampiamente reperibili).
Ma come già detto alla fine conta giustamente il risultato.
MaxMix
1.7CDTI
1.7CDTI
 
Messaggi: 688
Iscritto il: 26/07/2014, 14:46
Regione: Veneto (ve)
modello opel: Corsa C 1.3 CDTI

Messaggioda dukeluca86 » 05/03/2017, 20:39

Be dai che lo logica discreta è finita forse è un pò esagerato, di sicuro si è ridimensionata, possiamo dire che l'elettronica "digitale" discreta è finita. Ma per i progetti analogici, ci sono schemi che con pochi componenti sopperiscono ad un micro che ha milioni di transistor dentro e sono tuttora convenienti economicamente. E il varialuce è uno di questi. Certo che con un micro qualsiasi, che sia atmel,pic,avr, o altro hai senza dubbio molte piu possibilità.
A proposito complimenti a Rikkironzolo per la realizzazzione. Se posso ti suggerisco di utilizzare magari due sensori, in modo da fare una media e non essere eluso da fonti di luce tipo fari di auto che vengono contro o luci stradali.

Ora che ci penso... Non è la stessa funziona del selettore in posizione AUTO per chi ha il sensore di pioggia/luce ?
Ultima modifica di dukeluca86 il 05/03/2017, 20:40, modificato 1 volta in totale.
dukeluca86
1.4 16V
1.4 16V
 
Messaggi: 420
Iscritto il: 06/11/2015, 14:47
Regione: Marche (ma)
modello opel: Corsa D GplTech 2009

Messaggioda Riccardo64 » 05/03/2017, 20:43

io credo che sia anche una questione di soddisfazione personale... :cool:
Riccardo64
1.7CDTI
1.7CDTI
 
Messaggi: 855
Iscritto il: 01/10/2016, 13:01
Località: Cologno Monzese
Regione: Lombardia (lo)
modello opel: Opel Corsa C 1.2 Comfort

Messaggioda dukeluca86 » 06/03/2017, 8:59

Certo, ci mancherebbe, siamo tutti qua per questo immagino.
dukeluca86
1.4 16V
1.4 16V
 
Messaggi: 420
Iscritto il: 06/11/2015, 14:47
Regione: Marche (ma)
modello opel: Corsa D GplTech 2009

Prossimo

Torna a Elettronica e illuminazione

Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti