Pages: [1]   Go Down
Author Topic: richiesta d'aiuto per controller luci con Tlc5940 [ Risolto]  (Read 553 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
  }
 }  
}
« Last Edit: September 03, 2013, 03:47:24 am by aldo1958 » Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

F

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
« Last Edit: August 29, 2013, 03:31:23 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-wink
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.44 KB - downloaded 13 times.)
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Forse non ho ben capito il funzionamento del tutto

Code:
#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.
    }
  } 
}
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 Grazie infinite PaoloP.
Logged

Pages: [1]   Go Up
Jump to: