LAMPADA RGB CON PULSANTE

Salve a tutti, sono nuovo del forum spero possiate aiutarmi!

Ho comprato la scheda arduino con l'intenzione di creare una lampada rgb ad effetto!
Quello che ho in testa è realizzare una circuito che avrà connessi alla scheda arduino:

led rosso
led verde
led blu
1 pulsante

ho ritrovato in un sito un codice che si avvicina molto a quello che mi serve ma non è stato integrato un pulsante.
questo è il link:
http://scuola.arduino.cc/en/content/controlla-faretto-rgb-potenza

quello che vorrei fare è realizzare un programma che che gestisca la parte RGB come quello dell'esempio (perchè è possibile regolare durata, ritardi, gestire i colori ecc..) però aggiungendo un pulsante che possa fare questo ciclo:

1° STATO > OFF (tutti i led spenti)
premo e rilascio il pulsante
2° STATO > ON LUCE BIANCA (tutti i led si accendono a luce max 255)
premo e rilascio il pulsante
3° STATO > ON RGB/COLORI CANGIANTI (in pratica esegue il programma dell'esempio)
premo e rilascio il pulsante
1° STATO > OFF torna all'inizio

tutto chiaro?

con un solo pulsante posso accendere la lampada in modalità luce bianca, se ripremo il pulsante diventa una lampada rgb,
e se premo ulteriormente si spegne!

io ho provato a mettere mano al programma con scarsi risultati, confido nel vostro aiuto! :slight_smile:
se non vi è chiaro qualcosa dite pure..
grazie..

Non è complicato....
Leggi lo stato del bottone e cambi il valore di una variabile... con uno switch...case metti i quattro casi ed ad ogni caso una funzione che faccia colorare il led come vuoi te.... (il quarto caso è quello che riporta la variabile a 1 e ricominicia la selezione...)
Ti scrivo il codice sommariamente..... :

riavvio:
int i = 1;
if(digitalRead(x) == HIGH){
i = i + 1;
}
switch (range) {
case 0: // tutto spento
break;
case 1:
for(int j = 9; j <11; j++){
analogWrite(j;255)
break;
case 2: //Qui ti fai il random o l'effetto che vuoi con i led
break;
case 3: i = 0;
goto riavvio;
break;
}

ovviamente è una bozzetta ... spero possa darti qualche spunto :slight_smile:

penso che si possa fare con una cosa del tipo:

void loop()
{
byte stato=0;
while(digitalRead(tasto)==HIGH)//cicli di polling, per sapere se c'è un cambio di stato sul tasto
;
while(digitalRead(tasto)==LOW)
;
stato++;

if(stato==0)
Bianco;
if(stato==1)
Colore1;
if(stato==2)
Effetto che vuoi;
if(stato==3)
stato=0;

}

con Colore1 e Effetto che vuoi intese come chiamate di funzioni che fanno quello che vuoi. Potresti aggiungere altri casi possibili con altre combinazioni di colori

Magari può tornarti utile anche questo link Costruisci la tua lampada RGB | RoboDroid
impelmenta alcuni effetti simpatici e sullo stesso sito trovi un altro articolo con i codici relativi alle varie funzioni

devi usare delle resistenze per collegare i LED al Arduino
Ciao Uwe

grazie mille a tutti.. ora farò dei tentativi poi vi farò sapere l'esito! :slight_smile: speriamo bene

Ciao ragazzi, invogliato dal post ho cercato di fare la mia lampada con un led RGb che avevo a casa. Mi trovo davanti ad un problema, vorreì far sfumare i colori aumentando gradualmente la luminosità di ogniuno dei tre canali in modo da creare un cambiamento continuo.
Nel fare i vari tentativi ho notato che in realtà, la luce che ogni colore emette varia di pochissimo anche considerando la massima escursione di tensione possibile. Ho usato delle resistenze da 330 tra i pin analogici e il led e poi il piedino comune l'ho collegato direttamente ai 5V di arduino.
Per il codice ho usato i cicli for.
Qualche consiglio?

grazie :slight_smile:

Che tipo di led è (anodo comune/catodo comune)?
Come lo piloti? Che sketch hai usato? Il circuito? XD

il led è ad anodo comune, collego il piedino comune ai 5V e gli altri agli ingressi analogici A0, A1, A2 tramite una resistenza da 330 ohm...
il codice è questo

#define Rled A2
#define Gled A1
#define Bled A0
#define Botton 2

int Status = 0;
int LastStatus = 0;
int i=0;

void setup(){
  pinMode(Rled, OUTPUT);
  pinMode(Gled, OUTPUT);
  pinMode(Bled, OUTPUT);
  pinMode(Botton, INPUT);
}

void loop(){

  Status=digitalRead(Botton);        // leggo la pressione del pulsante
    if(Status != LastStatus){        // Controllo che sia avvenuto un cambio di stato ( pressione del tasto )
      Status=LastStatus;
      i++;
    }
    delay(200);                      // pausa per annullare possibili cambi di stato consecutivi se premo lentamente
    switch (i){
      case 0:
          analogWrite(Rled, 0);      //stampa Rosso
          analogWrite(Gled, 255);
          analogWrite(Bled, 255);
      break;
      case 1:
          analogWrite(Rled, 255);    //stampa verde
          analogWrite(Gled, 0);
          analogWrite(Bled, 255);
      break;
      case 2:
          analogWrite(Rled, 255);    //stampa blu
          analogWrite(Gled, 255);
          analogWrite(Bled, 0);
      break;
      case 3:
          analogWrite(Rled, 0);      //stampa bianco
          analogWrite(Gled, 0);
          analogWrite(Bled, 0);
      break;
      case 4:
          analogWrite(Rled, 255);    //stampa nero
          analogWrite(Gled, 255);
          analogWrite(Bled, 255);
      break;
      case 5:
          analogWrite(Rled, 0);    //stampa giallo
          analogWrite(Gled, 0);
          analogWrite(Bled, 255);
      break;
      case 6:
          analogWrite(Rled, 0);    //stampa viola
          analogWrite(Gled, 255);
          analogWrite(Bled, 0);
      break;
      case 7:
          analogWrite(Rled, 255);    //stampa ciano
          analogWrite(Gled, 0);
          analogWrite(Bled, 0);
      break;
      case 8:
          analogWrite(Rled, 0);    //stampa arancione?
          analogWrite(Gled, 95);
          analogWrite(Bled, 255);
      break;
      case 9:
          analogWrite(Rled, 95);    //stampa ?
          analogWrite(Gled, 255);
          analogWrite(Bled, 0);
      break;
      case 10:
          analogWrite(Rled, 255);    //stampa ?
          analogWrite(Gled, 0);
          analogWrite(Bled, 120);
      break;
      case 11:
          i=0;                        //ricomincia da capo
      break;
    }  
}

in realtà, ne anvevo scritto un altro con i cicli for ma non l'ho salvato :sweat_smile: comunque anche qui non noto la differenza tra il caso con due colori accesi al massimo e un caso con colori intermedi

Non potrà mai variarti così, perché gli "ingressi analogici" sono appunto SOLO ingressi. Il pilotaggio che vorresti fare tu lo puoi fare solo usando i pin che sull'Arduino sono segnati col simbolo "~", che sta ad indicare un'uscita PWM, che simula una variazione di tensione.

ok, grazie