Aiuto per effetto con 4 led ed un led RGB

Buongiorno a tutti,
provo a riscrivere il post sperando, questa volta, di aver indovinato il posto giusto, visto che quello di ieri è stato cancellato (mea culpa).
Non sono ne un maker ne un programmatore, mi diletto di modellismo e volevo provare ad applicare ad un modello che sto realizzando Arduino per creare un effetto di luci.
Il risultato finale dovrebbe essere quello che è stato già riprodotto da un modellista giapponese che ha programmato dei PIC (da quello che ho capito), ma penso che con uno sketch di Arduino si possa rifare, di cui allego il link del Video di esempio dell’effetto.
Ho già realizzato uno sketch (che allego perché mi sembra lungo da incollare nel post) che si avvicina al risultato (più o meno), ma mi manca qualche “sfumatura” per essere pienamente soddisfatto, probabilmente perché mi manca la logica del programmatore.
L’hardware che ho usato è un Arduino UNO, 4 Led, 1 Led RGB con le relative resistenze.
Nello sketch non so come realizzare l’effetto pulsato nel fade in del led RGB con il cambio colore ed, a fine loop, inserire il fade out dopo “n” secondi.
Se gentilmente qualcuno fosse interessato ad aiutarmi nel completare lo sketch gliene sarei grato.
Grazie
Angelo

ProvaYamato.ino (3.21 KB)

Metti lo schema

Ciao e grazie della risposta. Lo schema è allegato, per comodità lo incollo qui.

int min=255;//imposta la variabile numerica 
int max=0;//imposta la variabile numerica 
int tempo=255;//imposta la variabile numerica  - deve essere 255 in modo da sincronizzare l'accensione del led rgb
int incremento=5;//imposta la variabile numerica 

const int pinLED1=2;//pin del led 1
const int pinLED2=4;//pin del led 2
const int pinLED3=7;//pin del led 3
const int pinLED4=8;//pin del led 4

const int redLEDPin = 11; //pin colore rosso del led RGB
const int greenLEDPin = 10;//pin verde rosso del led RGB
const int blueLEDPin = 9;//pin blue rosso del led RGB

int redValue =0; //valore luce rosso
int greenValue =0;//valore luce rosso
int blueValue =0;//valore luce rosso

void setup(){ 

  pinMode(pinLED1,OUTPUT);//imposta il pin del Led come uscita
  pinMode(pinLED2,OUTPUT);//imposta il pin del Led come uscita
  pinMode(pinLED3,OUTPUT);//imposta il pin del Led come uscita
  pinMode(pinLED4,OUTPUT);//imposta il pin del Led come uscita


  //i quattro ledpartono da spenti  
  digitalWrite(pinLED1,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
  digitalWrite(pinLED2,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
  digitalWrite(pinLED3,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
  digitalWrite(pinLED4,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
  
  
  //settaggio pin di uscita led rgb
  pinMode(redLEDPin,OUTPUT);
  pinMode(greenLEDPin,OUTPUT);
  pinMode(blueLEDPin,OUTPUT);
  
  //il led rgb parte da spento
  digitalWrite(redLEDPin,LOW);
  digitalWrite(greenLEDPin,LOW);
  digitalWrite(blueLEDPin,LOW);

  
} 

void loop() { 
    if(tempo > 0){ 
        //finchè il "tempo" non viene azzerato accendo e spengo i led uno alla volta,
        //aspettando un intervallo di "tempo" tra un e l'altro

        analogWrite(redLEDPin,redValue);
        analogWrite(greenLEDPin,greenValue);
        analogWrite(blueLEDPin,blueValue);

        digitalWrite(pinLED4,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
        digitalWrite(pinLED1,HIGH); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
        delay(tempo);//attendi tempo millisecondi
    
        digitalWrite(pinLED1,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
        digitalWrite(pinLED2,HIGH); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
        delay(tempo);//attendi tempo millisecondi   
    
        digitalWrite(pinLED2,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
        digitalWrite(pinLED3,HIGH); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
        delay(tempo);//attendi tempo millisecondi
    
        digitalWrite(pinLED3,LOW); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)     
        digitalWrite(pinLED4,HIGH); // accendi/spegni (HIGH/LOW è il voltaggio 5V/0V)
        delay(tempo);//attendi tempo millisecondi
    
        tempo = tempo - incremento; //In questo modo ad ogni loop il tempo di attesa tra un led e l'altro diminuisce...
      
        //Aumento l'intensità della luce nel led rgb ad ogni loop
        redValue = redLEDPin + incremento;
        greenValue = greenValue + incremento;
        blueValue = blueValue + incremento;
    }
    else{
        //quando il "tempo" è azzerato accendo tutto;
        analogWrite(redLEDPin,255);
        analogWrite(greenLEDPin,255);
        analogWrite(blueLEDPin,255);
        digitalWrite(pinLED1,LOW); 
        digitalWrite(pinLED2,LOW); 
        digitalWrite(pinLED3,LOW); 
        digitalWrite(pinLED4,LOW); 

    }
}

Karsh: Lo schema è allegato, per comodità lo incollo qui.

Emmm ... quello è il CODICE, io credo che ti sia stato chiesto lo SCHEMA ... ovvero lo schema elettrico dei collegamenti (... come hai collegato i LED, che piedini hai usato, ecc. ecc.) :)

Guglielmo

Scusate l'ignoranza... :confused: ho utilizzato una breadboard con ponticelli, provo a disegnarlo... un po' di pazienza

Ma cosa fa variare tempo ? Io vedo che è sempre a 255.. Ancora ce n'è di strada per far ruotare i led e l'effetto sfumato dell'RGB. Se hai scaricato quello del giapponese, si è già a metà strada. Salvo gli effetti sul led tricolore.

Ecco lo schema… spero che si capisca

schema.jpg

Lo sketch funziona, i 4 led ruotano diminuendo l'intervallo tra un on/off e l'altro ed il led rgb aumenta di intensità, l'ho già provato... mancano gli effetti indicati nel primo post, come quelli del video... La variabile che fa variare il tempo è int incremento=5 Il codice non l'ho scaricato da quello giapponese... magari!!! Per un anno, nei ritagli di tempo ho provato e riprovato sino a giungere a quest'ultima versione con molti fallimenti Grazie per l'aiuto che riuscirete a darmi.

L'RGB, così non si accenderà mai ;) Devi mettere l'anodo comune al positivo. Poi ti conviene assegnare 4 piedini contigui, che li farai ruotare con un ciclo di for. Almeno i quattro separati.

Non capisco, il led rgb si accende ed aumenta di intensità con il ciclo definito del loop mentre i 4 led ruotano con la velocità che aumenta.
Per piedini contigui che intendi?
Scusami per le banalità, ma come ho detto sono un po’ ignorante nella logica della programmazione.

Può darsi che lo schema abbia un errore.
Con il for puoi fare

for (byte i =0; i<4; i++) {
    digitalWrite(2+i, HIGH);
    delay(tempo);
    digitalWrite(2+i, LOW);
    delay(tempo);
}

Ammesso che usi i pin 2,3,4,5 .

Grazie per l'interessamento e scusami se rispondo solo ora ma sono stato fuori per 3 gg. La funzione for che mi suggerisci, farebbe il running led in una sintassi più corta oppure ho capito male? Se è così dovrei correggere il codice con quello che mi suggerisci, ma rimarrebbe irrisolto il problema iniziale, completare uno sketch che, nonostante un pessimo codice macchinoso, fa più o meno il suo lavoro e non saprei più come legare il running led con l'effetto del led RGB che vorrei realizzare. Aiutoooo!!! Mi sono imbarcato in qualcosa più grande di me.... perdonatemi. :cold_sweat:

Karsh: Aiutoooo!!! Mi sono imbarcato in qualcosa più grande di me.... perdonatemi. :cold_sweat:

Come mai ? Ma lo fai per passatempo, oppure c'è una costrizione. Col primo caso, metti una pausa, prova a riflettere, trova altre informazioni. Tutto sommato è imparare a programmare.

Karsh: ... data l'evidente inesperienza (... ma il cosiglio lo darei comunque, anche a gente più esperta), fossi in te, ricomincerei da capo con il codice, dedicandomi ad [u]UNA[/u] cosa alla volta (... e non a voler fare tutto assieme scopiazzando da di qua e di la, magari senza capire bene cosa si sta copiando), sino a quando questa non funziona bene ed aggiungendo le varie funzionalità, sempre una alla volta e sempre dopo aver verificato che ciò che aggiungi NON disturbi il codice già esistente e funzioni correttamente.

Vedrai che, con calma ed un po' di tempo, raggiungerai il tuo scopo ;)

Guglielmo

Ciao a tutti, allora ho iniziato a studiare i Finite State Machine per vedere di risolvere il mio quesito e li ho trovati molto interessanti. Da quello che ho sono riuscito a capire sino ad ora, dovrei suddividere lo sketch in stati (funzioni?) (void running; void fade in; void change color; void pulse; void fade out; ecc...) e poi riunire il tutto in uno stato comune (void loop). Il dubbio che mi viene è come posso fare per far coincidere due o più stati nello stesso momento. Cerco di spiegarmi. L'effetto che voglio riprodurre prevede che 4 led facciano il running in modo sempre più veloce (primo stato) poi durante l'esecuzione (es. fine primo ciclo di running, o accensione led4) si avvii lo stato "fade in" del led RGB e, contemporaneamente, lo stato void change color e lo stato pulse, quest'ultimo rimane attivo finché dura tutto il ciclo dell'unico led RGB o sino al prossimo stato. Sarò stupido... ma non riesco a capire come fare :astonished: . Mi aiutate a capire dove non capisco o a darmi una dritta per risolvere. Grazie

Dove hai iniziato a leggere dei FSM ? Io consiglio questo come esempio: www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

Gli stati sono... uno stato. La Finite State Machine dovrebbe avere un solo stato. Esempio un semaforo in ogni istante ha un solo stato. Poi se in uno di questi stati accende sia il verde che il giallo non vuol dire che hai 2 stati contemporaneamente. Lo stato è "VERDE_quasi_ROSSO" e in quello stato accendi 2 led, il verde e il giallo. A quello stato ci arrivi dopo un pò di tempo dallo stato "VERDE" dove solo il led verde è acceso. 1 stato => anche più azioni