lampada graduale

salve a tutti, sono nuovo di questo forum... :D ho un problema che mi perseguita da giorni non riesco a capirne la possibile soluzione anche se è una cosa semplicissima...praticamente questo programma serve per far accendere/spegnere un led se il pulsante viene premuto con un tempo minore di 500ms altrimenti comincia ad abbassarsi o alzarsi gradualmente la luce. Quando il led è spento se il pulsante viene schiacciato per un tempo >500ms o premuto velocemente esegue le rispettive azioni ma se io lo rischiaccio tenendolo premuto si spegne comunque, invece io voglio fare in modo che, anche se acceso possa, se tenuto premuto, accendersi o abbassarsi gradualmente. Spero di essermi spiegato e che qualcuno mi aiuti a trovare la soluzione!!! grazie!!! :)

non avevo messo il programma..XD

//Turn on LED while buttons is pressed
//and keep it on after they are released
//now with a new and improved formula
//including simple de-boucing
//if the button is held, brighness changes
#define LED 9 //defined as port 9
#define BUTTON 2//defined as port 2
int a=0;
int b=0;
int x=0;
int val=0; //inizialize variable for button
int old_val=0; //this variable stores the prevoius value of "val"
int state=0; //0=LED off while 1=LED on
int brightness=128; //stores the brightness value
unsigned long startTime=0; //when did it begin pressing
void setup()
{pinMode(LED,OUTPUT); //set LED as output
 pinMode(BUTTON,INPUT);} //set BUTTON as input
void loop()
{val=digitalRead(BUTTON); //read input value by BUTTON
 if ((val==HIGH) && (old_val==LOW)) //check if the input is HIGH
    {state=1-state; //change the state from off to on or vice-versa
     startTime=millis(); //start to count how much time is pressed
     delay(10);} //change the state with a pause
 if ((val==HIGH) && (old_val==HIGH) && (x==0))
    {if (state==1 && (millis()-startTime)>500)
       {brightness++; //increment brightness by 1
        delay(10); //delay to avoid brightness going up too fast
        a=1;
        if (brightness==255)
          {x=1;
           a=0;}}}
 if ((val==HIGH) && (old_val==HIGH) && (x==1))
    {if (state==1 && (millis()-startTime)>500)
       {brightness--; //increment brightness by 1
        delay(10); //delay to avoid brightness going up too fast
       b=1;
       if (brightness==0)
          {x=0;
           b=0;}}}
 old_val=val; //val is now old, let's store it
 if ((val==LOW) && (old_val==LOW) && (a==1)) 
   {x=1;
    a=0;}
 if ((val==LOW) && (old_val==LOW) && (b==1))
   {x=0;
    b=0;}
 if (state==1)
   {analogWrite(LED,brightness);} //turn on LED at the right
 else                             //level brightness
   {analogWrite(LED,LOW);}
}

Ciao Lollo, benvenuto.

Ffff… mamma mia mi hai fatto impazzire con sto codice… Cmq mi hai fatto fare un bell’esercizio di programmazione.

Dunque quello sotto dovrebbe funzionare… pero’ attenzione che io uso gli internal pullup sul pin 2 quindi il bottone e’ collegato direttamente senza i pullup/pulldown esterni. La differenza sta che usando gli internal pullup il bottone schiacciato da LOW mentre nel tuo codice originale il bottone schiacciato da HIGH. Se noti infatti tutti gli if val==SOMETHING sono stati invertiti.

Se il codice funziona, mandalo anche a coloro che scrissero il codice originale in modo che sia utile anche ad altri.

//Turn on LED while buttons is pressed
//and keep it on after they are released
//now with a new and improved formula
//including simple de-boucing
//if the button is held, brighness changes
#define LED 9 //defined as port 9
#define BUTTON 2//defined as port 2

int a=0;
int b=0;
int decrement=0;
int val=0; //inizialize variable for button
int old_val=0; //this variable stores the prevoius value of “val”
int old_state=0, state=0; //0=LED off while 1=LED on
int brightness=128; //stores the brightness value
unsigned long startTime=0; //when did it begin pressing

void setup()
{
pinMode(LED,OUTPUT); //set LED as output
digitalWrite(BUTTON, HIGH); // use internal pullup
pinMode(BUTTON,INPUT); //set BUTTON as input
Serial.begin(9600);
}
void loop()
{
val=digitalRead(BUTTON); //read input value by BUTTON
Serial.println(val);

if ((val==LOW) && (old_val==HIGH)) //button press
{
//state=1-state; //change the state from off to on or vice-versa
startTime=millis(); //start to count how much time is pressed

old_state = state;
if(state == 0) {
state = 1;
}

delay(10);
}
else if((val==HIGH) && (old_val==LOW)) // button release
{
if(millis()-startTime<500) {
if(state == 1 && old_state == 1) {
state=0;
}
}
}

if((val==LOW) && (old_val==LOW) && millis()-startTime>500) {
delay(10); //delay to avoid brightness going up or down too fast
if(decrement==0)
{
brightness++; //increment brightness by 1

a=1;
if (brightness==255)
{
decrement=1;
a=0;
}
}
if(decrement==1)
{
brightness–; //increment brightness by 1
b=1;
if (brightness==0)
{
decrement=0;
b=0;
}
}
}

old_val=val; //val is now old, let’s store it

if ((val==HIGH) && (old_val==HIGH) && (a==1))
{
decrement=1;
a=0;
}
if ((val==HIGH) && (old_val==HIGH) && (b==1))
{
decrement=0;
b=0;
}
if (state==1)
{
analogWrite(LED,brightness);
} //turn on LED at the right
else //level brightness
{
analogWrite(LED,LOW);
}
}

grazie fabio del programma e scusa se ti ho fatto incasinare, ma non è proprio quello che intendevo. Allora con il tuo codice fa questo: appena scaricato schiaccio una volta il pulsante e lui comincia in continuo a far variare la luminosità del led. Se lo tengo premuto o comunque lo premo e basta, lui si ferma e procede nel verso opposto di prima (se prima scendeva la luminosità, ora sale e viceversa). Ah una parentesi..il codice l'ho preso da Getting Started With Arduino e l'ho modificato io in modo che mi funzionasse così. Comunque sperando che tu capisca io voglio che: 1)una volta caricato il prog 2)se io premo il tasto si accende ma la luce rimane fissa 3)se lo rischiaccio si spegne 4)sia da spento che da acceso voglio far in modo che se tenuto premuto la luminosità si alza o si abbassa (ovviamente se è spento si alzerà). Questo significa che se la prima volta il led si alza, io mollo il pulsante e poi lo ripremo, si abbasserà la luminosità e così via...

Spero tu riesca a risolvere :) Grazie

Come hai collegato il bottone 2? Devi collegarlo direttamente, senza usare push up o pull down resitor esterni. Vengono usati quelli interni.

si lo sò che vengono usati quelli interni ho solo messo una resistenza di protezione perchè altrimenti mi fà corto...

Non servono resistenze di alcun tipo. Colleghi il Digital 2 con il bottone e il bottone a terra. Attivando i pullup interni viene attivata una resistenza da 20K.

Guarda qui http://sheepdogguides.com/arduino/aht0button.htm sezione "A clever convenience" ...

La resistenza la devi invece mettere in serie al LED, una da 1k ohm andra' bene.

ho provato come hai detto te ma appena schiaccio il pulsante mi va in corto e si resetta arduino :'( :'( :'( nessuno sà come fare? please

Secondo me hai qualcosa che non va nel circuito.

Ti ho fatto 2 foto del mio. Guardale su http://www.varesano.net/blog/fabio/gradual-lamp-arduino

Confrontalo col mio. Se vuoi carica una foto del tuo..

grazie fabioo :smiley: :smiley: :smiley: ho capito qual’era l’errore del mio ragionamento!!! comunque si, il mio collegamento era diverso dal tuo. Io ovviamente siccome sono abbastanza testardo, XD, ho cercato con la tua logica di riaggiustare il mio e ce l’ho fatta!!! Io lo posto che non si sà mai che qualcuno utilizzi il mio stesso metodo di collegamento e ragionamento.

Foto:
http://img100.imageshack.us/img100/1687/lampadagraduale.jpg

E il codice… :wink:

//Turn on LED while buttons is pressed
//and keep it on after they are released
//now with a new and improved formula
//including simple de-boucing
//if the button is held, brighness changes
#define LED 9 //defined as port 9
#define BUTTON 2//defined as port 2
int a=0; //varible to check the entered in the cicle of fade in
int b=0; //varible to check the entered in the cicle of fade out
int x=0; //to select the type of fading
int val=0; //inizialize variable for button
int old_val=0; //this variable stores the prevoius value of val
int state=0; //0=LED off while 1=LED on
int old_state=0; //this variable store the prevoius value of state
int brightness=128; //stores the brightness value
unsigned long startTime=0; //when did it begin pressing
void setup()
{pinMode(LED,OUTPUT); //set LED as output
 pinMode(BUTTON,INPUT);} //set BUTTON as input
void loop()
{val=digitalRead(BUTTON); //read input value by BUTTON
 if ((val==HIGH) && (old_val==LOW)) //check if the input is HIGH
    {startTime=millis(); //start to count how much time is pressed
     old_state=state; //state is now old, let's store it
     state=1;
     delay(10);} //change the state with a pause     
 else if ((val==LOW) && (old_val==HIGH)) //button release
   {if((millis()-startTime)<500)
     {if (old_state==1) {state=0;}}}     
 if ((val==HIGH) && (old_val==HIGH) && (x==0)) //fade in
   {if (state==1 && (millis()-startTime)>500)
     {brightness++; //increment brightness by 1
      delay(10); //delay to avoid brightness going up too fast
      a=1;
      if (brightness==255)
        {x=1;
         a=0;}}}
 if ((val==HIGH) && (old_val==HIGH) && (x==1)) //fade out
   {if (state==1 && (millis()-startTime)>500)
     {brightness--; //increment brightness by 1
      delay(10); //delay to avoid brightness going up too fast
      b=1;
      if (brightness==0)
        {x=0;
         b=0;}}}
 old_val=val; //val is now old, let's store it
 if ((val==LOW) && (old_val==LOW) && (a==1)) //resetting variables
   {x=1;
    a=0;}
 if ((val==LOW) && (old_val==LOW) && (b==1)) //resetting variables
   {x=0;
    b=0;}
 if (state==1)
   {analogWrite(LED,brightness);} //turn on LED at the right
 else                             //level brightness
   {analogWrite(LED,LOW);}}

Ottimo! Mi fa piacere! Hai fatto bene a sistemare anche il tuo.. essere testardi aiuta ad imparare.. io sono uguale!

Sono contento! Buon hacking!