Pilotaggio RGB senza lampeggi o Fade

Salve,
mi sapreste indicare una guida per pilotare gli RGB?

Cosa intendi con rgb?
Semplici led (quelli con 4 piedini), strip led tipo neopixel, altro?

Ciao,
i LED con i 4 Piedini

Ciao.
Qui c'è un esempio

Salve,

io ho questo pezzo di Sketch era compilato per gestire i led, ora volevo sperimentare al suo interno il pilotaggio di 2 RGB in qui posso sciegliere quale colore dargli.

Solo che non arrivo a inserirgli il testo corretto per farlo funzionare.
Allego il codice ( spero di essere nella giusta sezione altrimenti chiedo scusa)


/* VARIABILI & COSTANTI ↓ */

//       TIMERS

unsigned long previousMillis_A          = 0 ;
unsigned long previousMillis_B          = 0 ;

// Intervallo di misurazione livello luce
const unsigned long interval_A          = 5000;

// Intervallo di accensione led rosso dopo il rilascio del PULSANTE
const unsigned long interval_B          = 2000;

//       PIEDINATURA

// N° pin analogico dell fotodiodo A3
const byte pin_Analogico                 = A5;


//Definizione pin primo RGB
const int LED1_RED       = 6;//PWM
const int LED1_GREEN     = 5;//PWM
const int LED1_BLUE      = 3;//PWM


//Definizione pin secondo RGB
const int LED2_RED       = 9;//PWM
const int LED2_GREEN     = 10;//PWM
const int LED2_BLUE      = 11;//PWM


//Pulsante campanello
const byte pulsante1       = 2;

//Limite Fotodiodo
const int LimiteFotodiodo = 200;
/* Il relè si eccita quando raggiunge il valore sopra indicato o superiore */
// I valori dell foto diodo con piena luce il valore è basso con il buio il valore è alto.

int valLumen              = 0;


byte vecchio_stato;


/************************************************************************************************************************************************************/

//mettere il codice di installazione qui, per eseguire una volta: ↓.
void setup()  {

  Serial.begin (9600 );

  //Imposto i pin digitali come porte aperte (output).
  pinMode ( LED1_RED,    OUTPUT );
  pinMode ( LED1_GREEN,  OUTPUT );
  pinMode ( LED1_BLUE,   OUTPUT );

  pinMode ( LED2_RED,    OUTPUT );
  pinMode ( LED2_GREEN,  OUTPUT );
  pinMode ( LED2_BLUE,   OUTPUT );

  /*
    // Si impostano ad HIGH/1 & LOW/0 i pin Rosso_Verde & Blù di entrambi gli RGB
    digitalWrite ( LED1_RED,   1 );  //Imposta il led come acceso 0 / spento 1
    digitalWrite ( LED1_GREEN, 1 );  //Imposta il led come acceso 0 / spento 1
    digitalWrite ( LED1_BLUE,  1) ;  //Imposta il led come acceso 0 / spento 1


    digitalWrite ( LED2_RED,   1 );  //Imposta il led come acceso 0 / spento 1
    digitalWrite ( LED2_GREEN, 1 );  //Imposta il led come acceso 0 / spento 1
    digitalWrite ( LED2_BLUE,  1 );  //Imposta il led come acceso 0 / spento 1
  */

  pinMode (pulsante1,    INPUT); // Input o Autput

}

void LetturaFotodiodo ()  {

  valLumen = analogRead  (pin_Analogico ); //  Valore restituito tra 0 - 1023
  Serial.print ("SensoreFotoDiodo : ");
  Serial.print (valLumen);
  Serial.println (" ☼ ");
}
byte Premuto (byte pin)
{
  if (digitalRead (pin))
  {
    delay (5);
    return (digitalRead (pin));
  }
  return (0);
}

/***********************************************************************************************************************************************************/

//inserire il codice principale qui, per eseguire ripetutamente: ↓.
void loop() {

  //Letura fotodiodo
  if ( millis () - previousMillis_A >= interval_A )
  {
    LetturaFotodiodo ();
    previousMillis_A = millis();
  }
  if (vecchio_stato == 0)
  {
    //Campanello non premuto
    if (Premuto (pulsante1))
    {
      //Campanello appena premuto
      vecchio_stato = 1;
    }
  }
  if (vecchio_stato == 1)
  {
    //Campanello premuto
    if (!Premuto (pulsante1))
    {
      //Campanello appena rilasciato
      vecchio_stato = 2;
      previousMillis_B = millis();
    }
  }
  if (vecchio_stato == 2)
  {
    //Campanello rilascato
    if (millis() - previousMillis_B > interval_B)
    {
      //Intervallo di sicurezza superato
      vecchio_stato = 0;
    }
  }


  if ( LimiteFotodiodo > valLumen )


  {
    //C'è luce, quindi non acendo nulla.

???????????????????????????????????????????????????

  }
  else
  {

    //Fa buio, quindi accendo il bianco se NON sto premendo il campanello, e il rosso se lo sto premendo o lo ho appena premuto;
    if (vecchio_stato == 0)
    {
      //Campanello non premuto

??????????????????????????????????????????????????????????????????

    }
    else
    {
      //Campanello premuto

????????????????????????????????????????????????????????????

    }
  }
}

/********************************************************** FINE ***********************************************************************************/


  1. non si capisce bene come vuoi gestire i due RGB, devono avere stesso colore ? Boh non lo dici

  2. i pin che hai scelto sono PWM quindi ogni singolo colore R,G,B può avere da 0 a 255 valori
    nella setup() scrivi
    ...digitalWrite ( LED1_RED, 1 ); //Imposta il led come acceso 0 / spento 1
    non capisco che senso ha. Un led è acceso con 1 e spento con 0 (HIGH,LOW) mentre per un RGB hai per ogni colore un valore 0-255 per variare luminosità (0=spento 255=max)
    e DEVI usare analogWrite ( pin, da 0 a 255);

Dove hai scritto "//C'è luce, quindi non accendo nulla"
devi scrivere

analogWrite ( LED1_RED,   0 );  
analogWrite ( LED1_GREEN, 0 ); 
analogWrite ( LED1_BLUE,  0) ;  
analogWrite ( LED2_RED,   0 );  
analogWrite ( LED2_GREEN, 0 );
analogWrite ( LED2_BLUE,  0 );

Negli altri due stati non sò che colori vuoi per ogni striscia.
Il bianco lo ottieni con tutto acceso al massimo, quindi i tre led con 255
Il rosso lo ottieni con R=255 G=0 B=0

Ciao nid69ita,

non ho mai provato gestire gli RGB quindi sto andando a tentativi.

Il progetto è composto da un fotodiodo quando cè luce i 2 RGB rimangono spenti.
Quando cè buio uno dei 2 RGB si accende
Poi cè il pulsante che se premuto si accende il 2 RGB e si spegne il 1RGB.
Nel codice dei RGB vorrei che ci fosse la possibilità di scelta con quale colore farli accendere.
Non so se sono riuscito farmi capire.

In realtà, HIGH può essere qualunque valore diverso da zero, non necessariamente 1, anche se nell'IDE è definito uguale a 1.

Buona Sera,

Ho scritto un semplice Sketch in qui accendo manualmente ( inserendo il valore nella sua cella ) i 3 led singolarmente prima il Rosso spengo il rosso accendo il verde spengo il verde sccendo il blù.
Allego il semplice sketch;

/*********************************************************************************************************************/

/*  Variabili & Costanti  */

/* Piedinatura componenti */
const byte RGB_1_Rosso      = 9;   //PWM
const byte RGB_1_Verde      = 10;  //PWM
const byte RGB_1_Blu        = 11;  //PWM

const byte Led_2_Arduino    = 13;  // Led inegrato in Arduino NON è PWM

/*********************************************************************************************************************/

//mettere il codice di installazione qui, per eseguire una volta: ↓.
void setup() {

  /* Imposto i pin DIGITALI( PWM ) come porte APERTE ( OUTPUT ) */
  pinMode ( RGB_1_Rosso,      OUTPUT );
  pinMode ( RGB_1_Verde,      OUTPUT );
  pinMode ( RGB_1_Blu,        OUTPUT );

  pinMode ( Led_2_Arduino,    OUTPUT );

}

/**********************************************************************************************************************/

//inserire il codice principale qui, per eseguire ripetutamente: ↓.
void loop() {

  /*Accendere l'RGB ( HIGH o 1( ALTO è 5V )( è la tensione sul pin )*/
  /* Spegne l'RGB portandolo a LOW o 0 ( BASSO, 0v.)*/
  
  digitalWrite ( RGB_1_Rosso,      1 ); // Il Led con  ANODO al Comune a 0 si Accende ed a 1 si Spegne
  digitalWrite ( RGB_1_Verde,      1 ); // Il Led con  ANODO al Comune a 0 si Accende ed a 1 si Spegne
  digitalWrite ( RGB_1_Blu,        1 ); // Il Led con  ANODO al Comune a 0 si Accende ed a 1 si Spegne

  digitalWrite ( Led_2_Arduino,    0 );

}

/************************************************** F I N E ******************************************************/

E fino a qui è tutto OK Ora il problema è come scrivere il codice per dirgli di mescolare i colori, se volessi per Es.
il Viola
Ciano
Rosa
Arancio Ecc......
come potrei fare, al momento non ho nessuna base su cui apogiarmi per iniziare.
Fino ad ora sono andato a Tentativi che non hanno portato a nulla.
Se ci fosse un buon Anima che potrebbe fare un Es. o Consigliare come Iniziare.....

Per fare i vari colori devi miscelare le 3 componenti RGB.
Qui spiega come funziona lo spazio colore rgb

Edit:
Se invece della digitalWrite usi la analogWrite con valori da 0 a 255 puoi ottenere tutte le sfumature che vuoi

Questo link può tornati utile.
Ovviamente come ha specificato @nid69ita dovrai usare analogWrite al posto di digitalWrite.

Con i 3 led accesi alla massima intensità dovresti avere
il bianco (o quasi).

Dimenticavo, in passato ho trovato delle librerie, prova a cercarle tramite arduino IDE.
Ciao.


Buona Sera,
Credo di esserci Riuscito,
pensate si possa migliorare lo sketch?


`/*  Variabili & Costanti  */

/* Piedinatura componenti */
const byte RGB_1_Rosso      = 9;  
const byte RGB_1_Verde      = 10; 
const byte RGB_1_Blu           = 11;  

const byte Led_2_Arduino    = 13; 

//mettere il codice di installazione qui, per eseguire una volta: ↓.
void setup() {

  pinMode ( RGB_1_Rosso,      OUTPUT );
  pinMode ( RGB_1_Verde,      OUTPUT );
  pinMode ( RGB_1_Blu,        OUTPUT );
  pinMode ( Led_2_Arduino,    OUTPUT );
}
//inserire il codice principale qui, per eseguire ripetutamente: ↓.
void loop() {
digitalWrite ( Led_2_Arduino,   1 );
 RGB_1 ( 255, 0, 0 );
}
void RGB_1( int Rosso, int Verde, int Blu )  {
  analogWrite ( RGB_1_Rosso,   Rosso );
  analogWrite ( RGB_1_Verde,   Verde );
  analogWrite ( RGB_1_Blu,       Blu );
}



````Testo preformattato`
````Testo preformattato`

Un algoritmo si da per scontato che sia sempre migliorabile anche quando non abbiamo idea di come migliorarlo.

Un codice sorgente può essere migliorati in due modi principali:

  1. Il codice viene modificato per svolgere le stesse funzioni impegnando meno risorse (cioè meno RAM, FLASH memory ecc)

  2. Il codice può essere modificato per renderlo più comprensibile o quanto meno possibile ambiguo.

Quando un algoritmo è semplice come il tuo vengono in mente solo modifiche che rientrano principalmente nel punto 2, ma come mostro di seguito conivolgono anche il punto 1.

Prima però una premessa; ci hanno insegnato che un algoritmo ha un inizio ed una fine e tu correttamente lo hai evidenziato. Tuttavia l'architettura software usata da arduino è conosciuta con il termine "superloop" dove a seguire la fine c'è l'inizio, in sostanza è come un anello nello specifico il termine è "ciclo infinito", quindi dopo la tua ultima istruzione verrà eseguita la seguente:

digitalWrite ( Led_2_Arduino, 1 );

Ora le modifiche riguarda sia il punto 1 e 2.
Perchè usare int quando il valore che gli assegniamo sta comodamente dentro un solo byte?
Inoltre il tipo di dato int occupa due byte e possiamo assegnargli valori negativi (cioè con il memo davanti), io da osservatore del tuo programma complesso cado nell'errore da deduzione, cioè vedo int è deduco che assumera numeri negativi. Ovviamente non accade ciò quando il programma conta poche righe come in questo caso.

Quindi la modifica migliora la comprensione del codice e in più risparmio risorse all'interno della memoria stack, cioè con una fava due piccioni. :grinning:

Altre modifiche riguardanti il punto due si basano su convenzioni del tipo, le costanti sono sempre in maiscolo, i nomi di funzione seguono il camel case, cioè pinMode e non pinmode, analogWrite, digitalWrite ecc.

Seguendo le convenzioni si è anche coerenti con le funzioni già presenti nelle librerie arduino.

Ma visto la brevità del codice questo risulta comprensibile anche non seguendo le convenzioni.

Ciao.

@58019378 in conformità al REGOLAMENTO , punto 7, cortesemente edita il tuo post poco 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'è, esso 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


@Maurotec : prima di rispondere, corrtesemente, aiuta a far rispettare il REGOLAMENTO per la parte del codice ... grazie :slight_smile:

Buon Giorno,

Sopra ho sperimentato come dare il comando per accendere l'RGB e funziona, ora il comando per dirgli di lasciarlo spento come si potrebbe compilare il comando ?

Sto sempre aspettando che sistemi il codice come chiesto QUI ... :roll_eyes:

Guglielmo

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

Salve,
chiedo scusa per l'ignoranza ma non ho proprio capito che devo fare, non è che non voglio farlo è che se non capisco cosa fare non lo posso fare.

Se leggi con attenzione il mio messaggio lo capisci ... si tratta di sistemare il codice nell'IDE con la corretta indentatura, di editare il post e di inserire il codice correttamente indentato marcandolo come codice (bottone </>).

Guglielmo

Boooo, qualcosa è cambiato non so se sia sufficente quello che è sucesso e se lo si deve anche trasferire piu in su non trovo il comando.

Uh?...
Mi sembra che vada bene...

Questa non l'ho capita...