Difficoltà con RGB

Premettendo che ho controllato e ricontrollato insieme ad un'altra persona i contatti sulla centralina e che faccio uso dello sketch relativo in Arduino, se imposto tutto a 0 non mi si spengono i colori, se metto 2 colori a valore 250 non si mescolano ottenendo sempre con accensione di blu verde e rosso solo una dissolvenza che ad un certo punto tende al colore che desidero. solo un paio di volte su tanti tentativi queste mescolanze sono state decise, per cui la riuscita dipende anche dai contatti. Lo sketch lo compilo cambiando i valori di quelli che credo 3 cicli precompilati. Qui ho portato tutto a 250 negli ipotetici 3 cicli, mentre il define delay time da 10 a 60 nella speranza di avere tutto bianco con pause tra cicli (dove sbaglio?):

//www.elegoo.com
//2016.12.8


// Define Pins
#define BLUE 3
#define GREEN 5
#define RED 6

void setup()
{
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  digitalWrite(RED, HIGH);
  digitalWrite(GREEN, LOW);
  digitalWrite(BLUE, LOW);
}

// define variables
int redValue;
int greenValue;
int blueValue;

// main loop
void loop()
{
#define delayTime 60 // fading time between colors

  redValue = 255; // choose a value between 1 and 255 to change the color.
  greenValue = 255;
  blueValue = 255;

  // this is unnecessary as we've either turned on RED in SETUP
  // or in the previous loop ... regardless, this turns RED off
  // analogWrite(RED, 0);
  // delay(1000);

  for (int i = 0; i < 255; i += 1) // fades out red bring green full when i=255
  {
    redValue -= 1;
    greenValue += 1;
    // The following was reversed, counting in the wrong directions
    // analogWrite(RED, 255 - redValue);
    // analogWrite(GREEN, 255 - greenValue);
    analogWrite(RED, redValue);
    analogWrite(GREEN, greenValue);
    delay(delayTime);
  }

  redValue = 255;
  greenValue = 255;
  blueValue = 255;

  for (int i = 0; i < 255; i += 1) // fades out green bring blue full when i=255
  {
    greenValue -= 1;
    blueValue += 1;
    // The following was reversed, counting in the wrong directions
    // analogWrite(GREEN, 255 - greenValue);
    // analogWrite(BLUE, 255 - blueValue);
    analogWrite(GREEN, greenValue);
    analogWrite(BLUE, blueValue);
    delay(delayTime);
  }

  redValue = 255;
  greenValue = 255;
  blueValue = 255;

  for (int i = 0; i < 255; i += 1) // fades out blue bring red full when i=255
  {
    // The following code has been rearranged to match the other two similar sections
    blueValue -= 1;
    redValue += 1;
    // The following was reversed, counting in the wrong directions
    // analogWrite(BLUE, 255 - blueValue);
    // analogWrite(RED, 255 - redValue);
    analogWrite(BLUE, blueValue);
    analogWrite(RED, redValue);
    delay(delayTime);
  }
}

@al19701: in conformità al REGOLAMENTO , punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona TUTTA la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE). Per maggiori informazioni ... punto 17.2 del succitato regolamento. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di fare il tutto al più presto. :wink:

Ci ho provato, scusate eventuali errori.

Nei 3 cicli for di questo sketch imposti le 3 variabili a 255 e poi decrementi una ed incrementi una seconda!
L'istruzione analogWrite() si aspetta un valore compreso tra 0 e 255.

Se tu scrivi l'istruzione analogWrite(GREEN, 256); è come se stai scrivendo analogWrite(GREEN, 0); e continuando analogWrite(GREEN, 257); => analogWrite(GREEN, 1); etc etc

3 a 255 non dovrebbero dare esclusivamente il bianco?
3 a 0 il nero?
Verde e rosso a 255 blu a 0, esclusivamente il giallo?
Blu e rosso a 255 a 0 il verde, esclusivamente il rosa?
il problema è che non si spengono, come non si ottiene mai bianco continuo per ogni ciclo. Inoltre c'è una diffusione che tende verso mescolanze desiderate però non mi sbarazzo dei colori di base, blu, verde, e rosso.

Anche tutto a 256 non funziona, rimane sui 3 colori di partenza, come non accettasse il comando. aiutatemi, ho gran difficoltà. Non è che ho un qualche problema sulla centelina? Grazie anticipatamente.

... credo che non ti sia chiaro che la digitalWrite() VUOLE un valore compreso tra 0 e 255 (un solo byte), quindi, se tu vai oltre (e usi 16 bit) la parte alta viene troncata e 256 diventa ZERO !

Guglielmo

di che "centralina" stai parlando? Hai un link? Hai uno schema?

Guglielmo

Il problema è che la centralina non si spegne per ripartire quando carico, non carica, qualsiasi valore metta( centralina elegoo uno r3.)

Avevo creato un MyRgb che ho visto non funziona, andando sull'rgb, la scheda si spegne per ripartire però non accetta comunque modifiche, infatti ho portato tutti i settaggi del rosso a 0 ma il rosso compare sempre.

... continuo a chiedere ... per "centralina" che intendi? Un semplice Arduino UNO fatto dalla Elegoo? E perché diavolo chiami centralina una semplice scheda di sviluppo?

Guglielmo

... se non ci metti lo schema dei collegamenti e COSA ci hai collegato, difficilmente ti possiamo aiutare.

Guglielmo

Le foto col cell non vengono bene, dovrete fidarvi di un mio schema a mano purtroppo, tra un po' lo farò.

... va benissimo, purché sia chiaro :slight_smile:

Guglielmo

Tutto questo con collegamenti tra piedini led e resistenze allineati, con il piedino più corto esterno del led collegato col blu, il secondo col verde, il terzo al nero, il quarto al verde.

.
Riesco stranamente ad agire solo sulle pause con la funzione define delay time.

Va beh, praticamente hai un Arduino UNO collegato ad un LED RGB ... tutto qui.

Intanto considera che un LED RGB sono, in realtà, 3 LED distinti messi in un unico involucro plastico quindi ... scordati di vedere la "fusione" dei colori come un unico colore se, almeno, non interponi uno schermo diffusore ... il tuo occhio, savo casi particolari, riuscirà sempre, più o meno, specie da vicino, a vedere separati i tre LED.

Devi poi considerare che l'occhio umano:

  1. è diversamente sensibile ad ogni colore, quindi, ad esempio un 128 sul verde verrà visto come molto più luminoso di un 128 sul rosso
  2. NON è lineare quindi un aumento/diminuzione lineare, come fai tu, verrà vista come un rapido incremento e poi una lenta crescita

Detto questo, se il tutto è collegato correttamente:

  1. è del tutto inutile fare le pinMode(), che servono solo se si usano le digitalWrite(); le analogWrite riprogrammano i pin come serve a loro.

  2. inizia con tre belle analogWrite(pin, 255), una per ogni colore, ed accendi i al massimo i tre LED.

Poi prosegui con le prove ...

Guglielmo

Io, ad esempio, proverei partendo invece con tre belle analogWrite(pin,0) così da averli tutti spenti, poi farei tre cicli di prova, prima sul rosso, poi sul verde e poi sul blu da 0 a 255 e viceversa ... dovresti vedere ogni singolo colore aumentare e spegnersi, così verifichi che il collegamento sia corretto e che i tre colori funzionino.

...
for (byte i = 0; i < 255; i++) {
   analogWrite(colore, i);
   delay(100);
}
for (byte i = 255; i > 0; i--) {
   analogWrite(colore, i);
   delay(100);
}
...

Guglielmo

Infatti appena muore una lampadina a led io rimuovo il diffusore sferico di plastica e lo conservo e butto il resto.

1 Like

Ci debbo provare, grazie! Poi ti farò sapere cosa vedrò. :wink:

Debbo modificare questo a 100 per fare quanto dicii?:

#define delayTime 60 // fading time between colors