Go Down

Topic: richiesta d'aiuto per controller luci con Tlc5940 [ Risolto] (Read 849 times) previous topic - next topic

aldo1958

Aug 29, 2013, 09:50 am Last Edit: Sep 03, 2013, 10:47 am by aldo1958 Reason: 1
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.


Code: [Select]

#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.
 }
}  
}

Federico Vanzati

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
F

PaoloP

#2
Aug 29, 2013, 10:22 am Last Edit: Aug 29, 2013, 10:31 am by PaoloP Reason: 1
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
Code: [Select]
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.

aldo1958

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

PaoloP

Dai una lettura al regolamento --> http://forum.arduino.cc/index.php?topic=149082.0
I punti 7, 8 e 9 sono interessanti per quanto riguarda la pubblicazione del codice e gli allegati.

Benvenuto.  ;)

aldo1958

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


PaoloP

Forse non ho ben capito il funzionamento del tutto

Code: [Select]
#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.
    }
  } 
}

aldo1958

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.

PaoloP

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.

aldo1958

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?

PaoloP

controller per acquario --> http://forum.arduino.cc/index.php?topic=141419.0

LeOS --> http://forum.arduino.cc/index.php?topic=111732.0


Go Up