eseguire per un tot tempo un processo e poi passare al successivo

Buon giorno a tutti,

sto cercando di creare degli effetti di luce con dei led rgb, (per ora uso solo il blu) vorrei in primo luogo fare un cross fade da dei led ad altri poi successivamente avere un effetto tipo fiamma e poi lasciarli accesi. Il tutto in modo temporizzato(per capirci fare il cross fade appena finito passare alla fiamma per 5 secondi e poi dopo altri 5 passare al fisso). Sicuramente è un errore da fesso il mio ma ci sto sbattendo non riesco a vedere l’errore. In pratica ora ho un effetto fiamma con fade e sull’altro ho il fading con poi il fisso. Il problema si pone anche perchè dopo l’effetto fiamma per 5 secondi non so come stabilizzare a luce fissa.

Grazie a tutti.

G.

Allego il codice

// Output
int b9   = 11;   
int bc = 10;  

// Program variables
int b9Val   = 255; 
int bcVal = 1;   
int b9Val2=100;

int i = 0;         
int wait = 50; // tempo di fade



long interval = 1000;
long previousMillis = 0;  


void setup()
{
  pinMode(b9,   OUTPUT);   
  pinMode(bc, OUTPUT);   
  analogWrite(bc,0);
  analogWrite(b9,0);

}

// Main program
void loop(){
crossfade();
      if (b9Val =5){

       intermittenza();
      }
}


void crossfade()
{

  i += 5;      
  if (i < 255)
  {
    b9Val   -= 5; 
    bcVal += 5; 
  }
  else 
  {
    i = 250;
  }  

  analogWrite(b9, b9Val);
  analogWrite(bc, bcVal); 

  delay(wait); 
}

 void intermittenza(){

analogWrite(bc, random(b9Val2)+135);


delay(random(100));


}

Ciao! Visto il lavoro che stai facendo io sostituirei il tuo ciclo di fading realizzato ad if con un for visto che ti interessa che lo faccia solo una volta dopodichè per stabilizzare la luce fissa( ponendo che tu voglia una luce fissa accesa fino a spegnimento o reset della scheda) o chiudi l'istruzione "digitalWrite (b9, HIGH);" in un ciclo while con una condizione booleana che non varia oppure fissi un delay ma il delay è sempre poco elegante per tempi lunghi.

Sandro

il guaio che ora sono bloccato sulla fiamma e non riesco a stabilizzare

void loop()
{ 
   for( int i = 0 ; i < 255 ; i += 1 ){
   bcVal +=1;
   b9Val -=1;
  analogWrite(b9, 255 - b9Val);
  analogWrite(bc, 255 - bcVal); 
  delay(20); }
  while (1)
  {
    int fiamma =random(100)+155;
    analogWrite(bc, fiamma);
delay(random(100));

ho pensato che se facessi

    for( int y = 0 ; y < 255 && fiamma == 150 ; y += 1 ){
   b9Val +=1;
  analogWrite(b9, 255 - b9Val2);
   }
  for (int x = 150; fiamma > 150; x++){
  analogWrite(bc, x);
  }

ma purtroppo non va bene… non riesco a farlo partire al momento giusto

consigli?

Non si capisce bene quello che vuoi fare.
In certi casi è come se non ci fosse legame fra quello che dici ed il codice che scrivi.

A parte alcuni errori di immediato riscontro… nel primo programma c’era un
if (b9val = 5)
dovevi usare il doppio segno di = e quindi
if (b9val ==5)
in un altro metti un ciclo for con la condizione
y < 255 && fiamma == 150
ma fiamma dentro il ciclo for è assolutamente assente

dici che non riesci a “stabilizzare” il valore ma stabilizzare… se passi ad un while (1) e dentro ci metti un analogwrite col random, non verrà “stabile”…

paulus1969:
Non si capisce bene quello che vuoi fare.
In certi casi è come se non ci fosse legame fra quello che dici ed il codice che scrivi.

A parte alcuni errori di immediato riscontro… nel primo programma c’era un
if (b9val = 5)
dovevi usare il doppio segno di = e quindi
if (b9val ==5)
in un altro metti un ciclo for con la condizione
y < 255 && fiamma == 150
ma fiamma dentro il ciclo for è assolutamente assente

dici che non riesci a “stabilizzare” il valore ma stabilizzare… se passi ad un while (1) e dentro ci metti un analogwrite col random, non verrà “stabile”…

Ho semplicemente seguito quello che mi ha consigliato Sandro. Ho eliminato l’if e ho rifatto il ciclo con il for.

Per quanto riguarda l’if non mi ero accorto del singolo =.

Per quanto riguarda il ciclo for. Il mio problema era proprio quello che non si “stabilizza”. Sto imparando per questo ho scritto sul forum per chiedere consiglio a chi ne sa più di me altrimenti sarei rimasto al mio posto. Onestamente non avevo idea di questo problema altrimenti non l’avrei mai fatto in questo modo.

paulus1969:
n un altro metti un ciclo for con la condizione
y < 255 && fiamma == 150
ma fiamma dentro il ciclo for è assolutamente assente

io so che nel ciclo for se si verifica l’iterazione che verifica il “test” viene eseguito il ciclo incrementando.In effetti quello che ho scritto era più un abbozzo, voleva essere un “che ne dite forse con un for potrebbe andare”.

Forse è meglio affrontare le varie fasi una alla volta.

Per prima cosa, spiega cosa dovrebbero fare questi LED. Se ho capito bene, tre fasi:

  • sfumatura
  • tremolio
  • luce fissa
    ogni fase dovrebbe avere una durata prestabilita, alla fine rimangono fissi o dopo una certa durata torni all'inizio (alla sfumatura) ?

Esattamente. alla fine rimane fisso.

Dopo l’informazione che mi hai dato prima ho modificato il programma e ora sto lavorando con questo.

// Output
int b9   = 10;   
int bc = 11;  

// Program variables
int b9Val   = 255; 
int bcVal = 1;   
int fiamma;


void setup()
{
  pinMode(b9, OUTPUT);   
  pinMode(bc, OUTPUT);   
  digitalWrite(bc,HIGH);
  digitalWrite(b9,HIGH);
crossfade();  //sfumatura ripetuta una sola volta

}

// Main program
void loop(){
intermittenza(); //tremolio

if (fiamma > 200)
{
digitalWrite(b9,LOW); //led fisso
digitalWrite(bc,LOW); // led che non vuol rimanere fisso.
}
}


void crossfade() //istruzioni sfumatura
{ 
   for( int i = 0 ; i < 255 ; i += 1 ){
   bcVal +=1;
   b9Val -=1;
  analogWrite(b9, 255 - b9Val);
  analogWrite(bc, 255 - bcVal); 
  delay(20); }
 
}

 void intermittenza(){ // istruzioni tremolio
fiamma =random(7, 205);
    analogWrite(bc, fiamma);
    delay(random(200));
}

Sono arrivato al punto del fisso. Purtroppo il led bc(canale 11) non vuole rimanere fisso.
Potrai notare che ho spostato la sfumatura in setup per farlo eseguire una sola volta.

piccolo aggiornamento. Da un debug che ho effettuato il tremolio viene eseguito continuamente. Ovviamente se lo inserisco nel setup è meglio non inserirlo. Si accettano consigli su come bloccare il tremolio…

// Output
int b9   = 10;
int bc = 11;

// Program variables
int b9Val   = 255;
int bcVal = 1;
int fiamma;
int wait = random(200);
int valfiamma = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(b9, OUTPUT);
  pinMode(bc, OUTPUT);
  digitalWrite(bc, HIGH);
  digitalWrite(b9, HIGH);
  crossfade();  //sfumatura ripetuta una sola volta

}

// Main program
void loop() {
  intermittenza(); //tremolio
  if (fiamma >> 200) {
    valfiamma++;
    if (valfiamma == 9)
    {
      valfiamma--;
    }
  }
  switch (valfiamma)
  {
    case 1:
      wait = 0;
      analogWrite(b9, 32);
      Serial.println("caso 1 wait:");
      Serial.print(wait);
    case 2:
      wait = 0;
      analogWrite(b9, 64);
      Serial.println("caso 2 wait:");
      Serial.print(wait);
    case 3:
      wait = 0;
      analogWrite(b9, 96);
      Serial.println("caso 3 wait:");
      Serial.println(wait);
    case 4:
      wait = 0;
      analogWrite(b9, 128);
      Serial.println("caso 4 wait:");
      Serial.print(wait);
    case 5:
      wait = 0;
      analogWrite(b9, 160);
      Serial.println("caso 5 wait:");
      Serial.print(wait);
    case 6:
      wait == 0;
      analogWrite(b9, 192);
      Serial.println("caso 6 wait:");
      Serial.print(wait);
    case 7:
      wait = 0;
      analogWrite(b9, 224);
      Serial.println("caso 7 wait:");
      Serial.print(wait);
    case 8:
      wait = 0;
      fiamma = 201;
      Serial.println("caso 8 wait:");
      Serial.println(wait);
      Serial.println("caso 8 fiamma: ");
      Serial.println(fiamma);
      digitalWrite(bc, LOW);
      digitalWrite(b9, LOW);
  }
}


void crossfade() //istruzioni sfumatura
{
  for ( int i = 0 ; i < 255 ; i += 1 ) {
    bcVal += 1;
    b9Val -= 1;
    analogWrite(b9, 255 - b9Val);
    analogWrite(bc, 255 - bcVal);
    delay(20);
    Serial.println("crossfade");
  }

}

void intermittenza() { // istruzioni tremolio
  fiamma = random(7, 202);
  analogWrite(bc, fiamma);
  delay(wait);

  Serial.println("tremolio");
    if (valfiamma >> 7) {
      while (1);
      }

}

Grazie a tutti comunque :slight_smile:

ci siamo quasi!
Quel >> dentro l'if deve essere semplicemente > il doppio segno == vale solo per l'uguale.

Il temolio lo fa sempre proprio per il fatto che lo hai messo nel loop.

Puoi metterlo benissimo nel setup se vuoi che sia eseguito una volta sola.

Anzi... visto che deve fare tutto una volta sola e poi rimanere fisso, metti tutto nel setup.

Alla fine metti il comando per accenderli fissi.

Tutto quello che metti nel loop viene eseguito infinite volte,
Si chiama loop.

L'idea era quello di eseguire il tremolio per una serie di volte(diciamo 10) e quando ogni volta che il valore di fiamma superava il valore di 200 si accendeva lentamente il b9.Superate le 10 volte si stabilizzava.

Ora mi sono accorto che i valori sono invertiti i vale a dire 255 spento e 0 acceso..

Un enorme grazie paulus1969

Questo lo ottieni facilmente.
Crea una variabile VolteTremato inizialmente =0; ogni volta che fai il tremolio la incrementi.
Ovviamente lavorerai nel loop ma richiami intermittenza() solo fino a quando VolteTremato < 11 con un if.

if (VolteTremato < 11)
   {
    intermittenza();
    VolteTremato ++;
   }

Una cosa del genere, insomma.

paulus1969:
Questo lo ottieni facilmente.
Crea una variabile VolteTremato inizialmente =0; ogni volta che fai il tremolio la incrementi.
Ovviamente lavorerai nel loop ma richiami intermittenza() solo fino a quando VolteTremato < 11 con un if.

if (VolteTremato < 11)

{
    intermittenza();
    VolteTremato ++;
  }




Una cosa del genere, insomma.

era una cosa così semplice che non ci ho pensato… :frowning:

Comunque devo ringraziarti infinitamente. Sono riuscito ad ottenere quello che volevo. :smiley:

Grazie ancora…

G.