Go Down

Topic: Controllare 20 LED in funzione del tempo (Read 1 time) previous topic - next topic

srecalcati

Starò attento e chiederò consiglio se necessario.

Grazie!

srecalcati

#31
Apr 06, 2019, 11:06 am Last Edit: Apr 06, 2019, 11:07 am by srecalcati
Buongiorno a tutti  :),

ho ricevuto Arduino MEGA e RTC e sono riuscito a scrivere il codice necessario a far funzionare l'orologio come voglio (se volete allego il codice, sono aperto a qualunque suggerimento), credevo di riscontrare problemi, ma non è stato così, funziona perfettamente a parte un ritardo di 3.9 sec che non riesco a eliminare (ma non importa).

Ora nasce un'altra necessità; l'appetito vien mangiando come si suol dire.

Vorrei controllare l'intensità tutti i 114 led (sì, se ne sono aggiunti 4 con relativo output per un totale di 24 output) tramite fotoresistenza.

Faccio un piccolo riepilogo del setup attuale:
Uso 24 output per controllare 3 ULN2803A alimentati a circa 12V, ogni uscita è collegata a un gruppo di led formato da 1 fino a 8 led ciascuno (con relative resistenze, chiaro). Potrei allegare anche un semplice schema se necessario.

Ora mi chiedo, é possibile controllare l'intensità di tutti con una solo fotoresistenza? Se sì, devo stravolgere tutto?

Vi ringrazio molto!

Stefano

maubarzi

Hai usato __DATE__ e __TIME__ giusto?
Se è così, quando il codice viene compilato, il pre-compilatore le sostituisce con data e ora di compilazione, il ritardo che noti dipende dal tempo che passa dalla compilazione a quando il codice viene copiato sulla flash ed eseguito effettivamente. Quindi per evitare la cosa devi prevedere un modo per aggiornare a posteriori la data manualmente o appoggiandoti a un qualche sistema automatico di riallineamento dell'ora. Il secondo dipende da come ti connetti all'esterno mondo, ci sono varie possibilità, basta fare un po' di ricerche in giro.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

srecalcati

#33
Apr 06, 2019, 02:45 pm Last Edit: Apr 06, 2019, 02:51 pm by srecalcati
Ciao, sinceramente ho utilizzato un programma che è insieme alla libreria DS1307RTC.h che ho scaricato da qui.

https://github.com/PaulStoffregen/DS1307RTC

Nella cartella examples ho trovato SetTime di cui riporto il codice:

Code: [Select]
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
  bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}

void loop() {
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}


in effetti utilizza ciò che hai detto, prendendo data e ora direttamente dal computer, se riesce. Ho provato a rifarlo diverse volte ma genera sempre un piccolo ritardo (a mio avviso trascurabile).

Per quanto riguarda la l'intensità dei led, sai dirmi qualcosa?

Grazie mille.

maubarzi

Azz, per regolare l'intensità serve il PWM, te ne avevo accennato all'inizio.
Ora non so se il MEGA ha così tante uscite che supportano il PWM. Se ne ha ok perchè (anche qui vado a memoria) l'ULN2803A dovrebbe starci dietro come frequenza di switch.
Se non ci sta dietro o non ci sono abbastanza uscite PWM si può tornare a prendere in considerazione il PCA9685 che gestisce il PWM e lo mantiene da solo una volta impostato.
Con il PWM, definisci non se l'uscita è HIGN o LOW ma l'intensità (gestito come duty cycle, cioè alternando acceso e spento con tempistiche diverse che l'occhio coglie come diversa intensità luminosa)

Scusa tutti i condizionali che ho usato ma sono di corsa e non ho verificato i dettagli.

Per l'RTC ok, io ti ho spiegato il motivo del ritardo, se non è rilevante per la tua applicazione tanto meglio, è un problema in meno ;)
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

gpb01

#35
Apr 06, 2019, 03:19 pm Last Edit: Apr 06, 2019, 03:21 pm by gpb01
Azz, per regolare l'intensità serve il PWM, te ne avevo accennato all'inizio.
Ora non so se il MEGA ha così tante uscite che supportano il PWM.
Arduino MEGA ha 15 pin di I/O PWM.

Eventualmente si può usare QUESTO già pronto ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

srecalcati

Non preoccuparti, grazie per le tue risposte!

Allora Arduino MEGA ha 14 pin PWD, a me ne servirebbero 24, a meno che non possa usare meno pin, visto che voglio controllarli tutti insieme e in modo uguale! Oppure semplicemente non si può?

Se non si può, ho trovato questo oggetto qui della Texas Instruments, per controllare esattamente 24 led (incredibile) con 4/5 pin PWM (non capisco esattamente, scusa), secondo te può andare?

TLC5947

Grazie!!

gpb01

#37
Apr 06, 2019, 03:22 pm Last Edit: Apr 06, 2019, 03:44 pm by gpb01
... ho modificato il mio post #35 ... guarda quello di cui ho messo il link e leggine bene le specifiche ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

srecalcati

Peccato che abbia già comprato già le schedine con gli ULN... va be' sarà il prossimo progetto (magari compro oggi un TLC5947 dalla Cina, che pago 3.5 euro, che impiega 2 mesi e mezzo ad arrivare, e quando lo avrò mi ci metto) .

Nel frattempo vi ringrazio tutti, magari metterò una foto del prodotto finito se vi fa piacere.

Grazie, Stefano

brunello22

Quote
Allora Arduino MEGA ha 14 pin PWD, a me ne servirebbero 24, a meno che non possa usare meno pin, visto che voglio controllarli tutti insieme e in modo uguale! Oppure semplicemente non si può?
Nulla ti vieta di usare meno pin

steve-cr

#40
Apr 06, 2019, 09:05 pm Last Edit: Apr 06, 2019, 09:05 pm by steve-cr
Una idea veloce, buttata li, senza usare PWM e accontentandosi di due o tre livelli di luminosità, è quella di "giocare" sul GND che porti agli ULN.

Ci metti una resistenza e vedi: se il giochino ti piace allora puoi metterne anche un paio e le inserisci o meno attraverso un transistor, usando uno o due uscite.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

maubarzi

Occhio sempre ai consumi, ad es. il TLC5947 recita: 30-mA Capability (Constant-Current Sink)
Quindi se con alcune uscite devi pilotare sempre i 9 led indicati, devi passare sempre per un dispositivo che dia più corrente... e quelli suggeriti fino ad ora continuano ad andar bene
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

srecalcati

#42
Apr 09, 2019, 09:38 am Last Edit: Apr 09, 2019, 09:41 am by srecalcati
Buongiorno a tutti, vi ringrazio per le numerose risposte!

Nulla ti vieta di usare meno pin

Intendi attraverso un driver come il TLC5947? O sfruttando qualcosa interno ad Arduino?
Una idea veloce, buttata li, senza usare PWM e accontentandosi di due o tre livelli di luminosità, è quella di "giocare" sul GND che porti agli ULN.

Mi sembra interessante, siccome "gioco" con la terra del circuito di potenza, la quale è comune a tutto, con un solo transistor e una resistenza controllo la luminosità di tutti i led, corretto? A quel punto potrei aggiungere qualche transistor e relativa resistenza per creare 4/5 livello di intensità differenti, giusto?
Grazie per l'idea mi sembra valida, anche a scopo didattico.


Occhio sempre ai consumi, ad es. il TLC5947 recita: 30-mA Capability (Constant-Current Sink).
Preso dalla foga, quasi me ne dimenticavo :D

Grazie a tutti,

Stefano

brunello22

Una domanda .....

Ma se tu vuoi controllare 114 led, tutti insieme, perchè hai usato 3 x ULN2803 ?

srecalcati

Io voglio controllare l'intensità di tutti i led contemporaneamente, mentre lo stato on off lo controllo a gruppi di led. In altre parole, l'intensità è comune a tutti i led accessi in quel momento l'accensione dipende dal tempo.

Grazie

Go Up