richiesta d'aiuto per controller luci con Tlc5940 [ Risolto]

Ciao a tutti, ho bisogno di aiuto, anche io sono un principiante con la programmazione di arduino quindi perdonatemi se dico o mostro qualche cavolata.
Ho realizzato un piccolo progetto con arduino e il TLC5940 con lo scopo di illuminare 2 ambienti diversi in tempi diversi. Il primo e’ il il box auto con relativo percorso per arrivarci, per un totale di 8 punti luce, il secondo e’ lo shed (stanzino attrezzi) con il suo passaggio ed ho usato 6 punti luce, in entrambi gli ambienti l’ accensione e lo spegnimento dei singoli punti luce a led led sono progressivi.
Per l’accensione ho usato 2 sensori pir, 1 per ambiente, 1 sensore LDR per escludere l’accensione diurna delle luci. Ho anche inserito un interruttore che permetta in caso di bisogno o per fare lo
“sborone” con gli amici, l’annullamento del sensore LDR e quindi ottenere l’accensione delle luci senza limitazioni. Questo progetto l’ho realizzato e funziona discretamente, i ritardi non sono definitivi pensavo a 5 minuti di accensione prima dello spegnimento rinnovabile magari da altri sensori, e il ritardo del sensore LDR che non so se dargli 5 o 10 minuti tanto per evitare lo sfarfallio di funzionamento.
Come dicevo, solo qualche piccolo difetto, ad esempio quando si accende l’ LDR oppure azionando l’interruttore per escluderlo, a volte parte un ciclo di accensione, anche il setting dell’ LDR mi sembra non rispondere adeguatamente, inoltre ogni tanto, tutto il sistema mi sembra un po’ lento.
Pensavo..... il problema sara’ mica proprio l’interruttore per annullare LDR tramite il quale mando al pin 5 di arduino una tensione fissa fino al suo disinserimento??????.
Vi posto il code e ogni commento o suggerimento per risolvere le sue anomalie e’ il benvenuto.
Grazie infinite.

#include "Tlc5940.h"
#define sensor_1   7         // sensore box
#define sensor_2   8         // sensore shed
#define button 5             // interruttore always
#define led  6                   // led always on
#define led_LDR  2           // il pin 2 led ldr
const int sensorValue = 150;    // setting  LDR sensor
int x = 0;              // sensor variable status
int always = 0;         // switch variable status

void setup()
{
  pinMode(led_LDR,OUTPUT);
  pinMode(led,OUTPUT); 
  pinMode(sensor_1, INPUT);      
  pinMode(sensor_2, INPUT);
  pinMode(button, INPUT); 
  Tlc.init();
}

void box()
  {
for (int channel =5; channel >=0; channel --)
  {
  Tlc.set(channel, 4095);
  Tlc.update();
 delay(500);
 }
delay(1000); 	 // da modificare  con 300000 = 5 minuti
for (int channel =5; channel >=0; channel --) 
{
Tlc.set(channel, 0);
  Tlc.update();
 delay(500);
  }
}    
// ======= fine box ========

void shed() 
 {
for (int channel =0; channel <=7; channel ++)
  {
  Tlc.set(channel, 4095);
  Tlc.update();
 delay(500);
 }
delay(1000);  // modifica con 300000 = 5 minuti
for (int channel =0; channel <=7; channel ++) 
{
Tlc.set(channel, 0);
  Tlc.update();
 delay(500);
  }
}
//  ======= fine shed ===========

void luminoso()
{
 digitalRead(sensor_1)&& digitalRead(sensor_2) == LOW; 
}
  void buio()
{
  x = digitalRead(sensor_1);
if ( x == HIGH) {    
box();
}
x = digitalRead(sensor_2);
if ( x == HIGH) {    
shed();
 }
}

void loop(){
  
  always = digitalRead(button);
if ( always == HIGH) {     
digitalWrite(led, HIGH);
digitalWrite(led_LDR,LOW);
buio();
} 
  else  {
digitalWrite(led, LOW); 
int sensor = analogRead(A0);    
if (sensor < sensorValue) 
{     
luminoso();
digitalWrite(led_LDR,LOW);
delay(2000);         	 // da modificare  con  5/10 min. 
}
else {
buio();
digitalWrite(led_LDR,HIGH);
delay(2000);         	 // da modificare con 5/10 min. 
  }
 }  
}

Ciao aldo1958,

sui forum vige la regola che scrivere tutto maiuscolo significa urlare. Potresti gentilmente modificare il tuo titolo scrivendolo in minuscolo?
Un consiglio, già che ci sei aggiungi anche qualche informazione riguardante il tuo problema così sarà più facile che qualcuno con le capacità per aiutarti sia in grado di notare la discussione

ciao
f

Sarebbe utile anche uno schema dei collegamenti. Anche uno scarabocchio su un foglio di carta.

Ho visto che l'if su button è vero quando è HIGH: hai messo la pull-down sul pulsante?

Questa non l'ho capita

void luminoso()
{
 digitalRead(sensor_1) && digitalRead(sensor_2) == LOW; 
}

p.s. Prima di pubblicare il codice riordina l'indentazione con il comando "formattazione automatica" nel menù "strumenti" dell'IDE.

p.s. 2 Così come hai fatto per sensor anche x e always le puoi usare come variabili locali, non c'è bisogno che siano globali.
Inoltre se sei sicuro che la variabile non supererà il valore di 255 puoi usare il tipo byte o unsigned char.
Oppure boolean per le variabili di stato.

chiedo scusa e' la prima volta che partecipo ad un forum.

Dai una lettura al regolamento --> [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum
I punti 7, 8 e 9 sono interessanti per quanto riguarda la pubblicazione del codice e gli allegati.

Benvenuto. :wink:

Ciao PaoloP, grazie per l' interessamento e i consigli, ho ricreato velocemente lo schema in allegato
purtroppo l' originale e' in un' altro computer che per il momento non e' disponibile.
Il void luminoso() l'ho messo per bloccare i pir quando l' LDR rileva il giorno, mentre il buio da' il via al funzionamento... sto sbagliando?
Di nuovo grazie, ciao

schema controller.sch (468 KB)

Forse non ho ben capito il funzionamento del tutto

#include "Tlc5940.h"

const byte sensor_1 = 7;         // sensore box
const byte sensor_2 = 8;         // sensore shed
const byte button = 5;             // interruttore always
const byte led = 6;                   // led always on
const byte led_LDR = 2;           // il pin 2 led ldr
const unsigned int sensorValue = 150;    // setting  LDR sensor
// boolean x = 0;              // sensor variable status
// boolean always = 0;         // switch variable status

void setup()
{
  pinMode(led_LDR,OUTPUT);
  pinMode(led,OUTPUT); 
  pinMode(sensor_1, INPUT);      
  pinMode(sensor_2, INPUT);
  pinMode(button, INPUT); 
  Tlc.init();
}

void box()
{
  for (int channel =5; channel >=0; channel --)
  {
    Tlc.set(channel, 4095);
    Tlc.update();
    delay(500);
  }
  delay(1000); 	 // da modificare  con 300000 = 5 minuti
  for (int channel =5; channel >=0; channel --) 
  {
    Tlc.set(channel, 0);
    Tlc.update();
    delay(500);
  }
}    
// ======= fine box ========

void shed() 
{
  for (int channel =0; channel <=7; channel ++)
  {
    Tlc.set(channel, 4095);
    Tlc.update();
    delay(500);
  }
  delay(1000);  // modifica con 300000 = 5 minuti
  for (int channel =0; channel <=7; channel ++) 
  {
    Tlc.set(channel, 0);
    Tlc.update();
    delay(500);
  }
}
//  ======= fine shed ===========

void luminoso()
{
  if (digitalRead(sensor_1) == LOW && digitalRead(sensor_2) == LOW) 
  {
    // do nothing... 
  } 
}

void buio()
{
  if ( digitalRead(sensor_1) == HIGH ) box();
  if ( digitalRead(sensor_2) == HIGH) shed();
}

void loop(){
  byte always = digitalRead(button);
  if ( always == HIGH) {     
    digitalWrite(led, HIGH);
    digitalWrite(led_LDR,LOW);
    buio();
  } 
  else  {
    digitalWrite(led, LOW); 
    unsigned int sensor = analogRead(A0);    
    if (sensor < sensorValue) 
    {     
      luminoso();
      digitalWrite(led_LDR,LOW);
      delay(2000);         	 // da modificare  con  5/10 min. 
    }
    else {
      buio();
      digitalWrite(led_LDR,HIGH);
      delay(2000);         	 // da modificare con 5/10 min. 
    }
  }  
}

Ciao PaoloP, provo a spiegare cosa vorrei realizzare e come ho interpretato lo sketch.
Quando arrivo in prossimita’ del corridoio che conduce al box, il sensore rilevandomi da’
Inizio al ciclo box() quindi accende una per volta le luci fino ad arrivare al suo interno.
La durata di accensione sara’ di 5 min. , attualmente e’ di un solo secondo per esigenze di prova,
dopodiche’ inizia lo spegnimento con la stessa sequenza dell’ accensione.
Analogo funzionamento per lo shed().
Per essere pratico questo sistema deve funzionare solo di sera, quindi ho inserito un LDR e ho creato il luminoso() che blocca il funzionamento di box() e shed() mentre la funzione buio() li mette in funzione in base ai rilevamenti dei sensori. Quando LDR e’ in prossimita’ di rilevare
Il giorno o la notte ho notato che “sfarfalla” un po’ di volte, quindi ho inserito un ritardo che attualmente e’ di 2 secondi ma in fase definitiva il tempo sara’ di 5/10 minuti (corretto?).
A questo punto e’ pero’ utile mettere un interruttore (always) che elimini la limitazione del funzionamento di notte, quindi quando always e’ high il sistema funziona sempre, sia di giorno che di notte, altrimenti solo di notte.
Tutto qui’, spero di aver spiegato al meglio.
In attesa ciao e grazie.

Ho capito.
Cancella tutto e riinizia da capo perché quella non è la strada giusta.
Devi lavorare con un temporizzatore, il delay ti blocca l'elaborazione dei comandi e non è una buna cosa.
Guarda gli esempi "alba-tramonto" per gli acquari o nell'IDE il "blink without delay".

Ci sono anche delle librerie pronte per la temporizzazione di eventi in tempi prestabiliti: cerca la LeOS di Leo72.

Il problema del delay è che se vai nel box e parte la sequenza, non funzionerà la luce nello stanzino e viceversa.

Mi viene male al sol pensiero di rincominciare, le anomalie che ho riscontrato non sembravano cosi' gravi.
Scusa l'ignoranza, dove posso trovare la documentazione che dici?

controller per acquario --> Ardu-Aquarium Controller v. 3.3.1 - Megatopic - Arduino Forum

LeOS --> leOS - un semplice OS per schedulare piccoli task - Megatopic - Arduino Forum

Grazie infinite PaoloP.