premere pulsante brevemente || premere pulsante più di 2 secondi

che cosa ci possiamo "inventare""
per fare passare una variabile da zero a uno premendo normalmente un pulsante,

e mantenendo premuto per più di 2 secondi lo stesso pulsante fa passare un 'altra variabile da zero a uno

Ma è una domanda? :o

Se lo è ... vedi la funzione millis()

se era una risposta non la postavo :smiling_imp:
comunque a parte le battute
come si può fare ad "azionare" 2 cose diverse premendo lo stesso pulsante per un tempo differente?

Si ma la domanda è seguita da un simbolo tipo questo "?" :smiley:

la funzione millis() fa al caso tuo
http://playground.arduino.cc/Code/AvoidDelay
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

mah .. che ci vuole millis() l'avevo "intuito"
purtroppo ho anche visto che bisogna prendere per "buono" il rilascio del pulsante passaggio da stato high a low
e un po di prezzemolo lo vogliamo mettere (debounce)

r significa che bisogna mettere mano a tutti gli sketch già scritti :cry:

siamo rovinati :angry:

Volevi qualcosa di già pronto ?
Fai prima a scrivertelo da solo.

... una cosa del genere ? (scritta al volo, e non la posso provare, quindi devi arrangiarti ad adattarla al tuo sketch e vedere se funziona ... inoltre non prevede la gestione dell'overflow di millis, quindi e' da migliorare, usala solo come esempio)

	puls = digitalRead(pin)
	if ((puls != oldpuls) && (oldpuls == 0)) // pulsante premuto (non fa nulla fino al rilascio)
	{
		oldpuls = puls;
		tempo1 = millis();		
	}
	if ((puls != oldpuls) && (oldpuls == 1)) //pulsante rilasciato
	{
		oldpuls = puls;
		tempo2 = millis();
		tempo = tempo2-tempo1;
		if (tempo < 500) 	//se premuto per massimo mezzo secondo
		{
			//azioni da fare per pressione breve
		}
		else	//se premuto per piu di mezzo secondo		
		{
			//azioni da fare per pressione lunga
		}
	}

EDIT: i debounce si fanno con le reti RC !!! ... :stuck_out_tongue:

C'è già troppo spirito e l'incendio è dietro l'angolo.

Etemenanki:
... una cosa del genere ? (scritta al volo, e non la posso provare, quindi devi arrangiarti ad adattarla al tuo sketch e vedere se funziona ... inoltre non prevede la gestione dell'overflow di millis, quindi e' da migliorare, usala solo come esempio)

	puls = digitalRead(pin)
if ((puls != oldpuls) && (oldpuls == 0)) // pulsante premuto (non fa nulla fino al rilascio)
{
	oldpuls = puls;
	tempo1 = millis();		
}
if ((puls != oldpuls) && (oldpuls == 1)) //pulsante rilasciato
{
	oldpuls = puls;
	tempo2 = millis();
	tempo = tempo2-tempo1;
	if (tempo > 500) 	//se premuto per massimo mezzo secondo
	{
		//azioni da fare per pressione breve
	}
	else	//se premuto per piu di mezzo secondo		
	{
		//azioni da fare per pressione lunga
	}
}



EDIT: i debounce si fanno con le reti RC !!! ... :P

devo modificare questo codice che ho usato,

if (digitalRead (7)== LOW) puls_encoder=1;

if (puls_encoder ==1)digitalWrite (5, HIGH),
conta_impulsi_pulsante = conta_impulsi_pulsante + 1,
puls_encoder=0,
delay (300);

funziona ma se tengo premuto il pulsante, conta_impulsi_pulsante sale a raffica (che è gia un mezzo errore)
il pulsante è sul pin 7 (pullup) che lo mette a massa quando premo; il delay 300 fa da debouce

conta_impulsi_pulsante appena arriva a >5 viene rimesso a zero (nello sketch)

per primo si può modificare qualcosa per far incrementare al rilascio del pulsante,?

e poi se si preme a lungo una variabile passa da zero a uno ?

resenza stravolgere troppo

elrospo:
...
funziona ma se tengo premuto il pulsante, conta_impulsi_pulsante sale a raffica (che è gia un mezzo errore)
...

I due cicli if principali consecutivi nel mio esempio servono proprio a quello (ovviamente devi prima settare le relative variabili puls e oldpuls a zero nel setup ;)) ... quando premi il pulsante, il primo ciclo if viene eseguito una sola volta, poi il tutto non fa piu nulla finche' non lo rilasci, a quel punto viene eseguito una sola volta il secondo ciclo if (con tutto quello che contiene, inclusi gli altri sottocicli e le relative istruzioni) ... in quel modo e' indifferente se il pulsante lo tieni premuto un secondo o un minuto o un giorno, perche' le azioni che inserisci nei punti del secondo ciclo le esegue solo quando lo lasci andare ...

Inoltre dato che si basa su cicli if autoescludenti, e' possibile usare piu di un blocco di cicli in sequenza per controllare piu pulsanti, perche' non bloccano l'esecuzione ... anche se tieni premuto il pulsante a lungo, il sistema continua ad eseguire tutto lo sketch, ricontrollando ad ogni loop se lo hai mollato o no, ma senza fermarsi ad aspettare ... :wink:

Poi, ripeto, il debounce software sara' anche una finezza, ma introduce ritardi, il vero debounce lo si fa SEMPRE con un condensatore fra ingresso e massa ed una resistenza fra ingresso e pulsante ... :wink:

@Etemenanki

TANKS per l'interessamento, ho risolto almeno parzialmente senza stravolgere rifare da capo gli sketc :slight_smile:

per adesso modificato cosi il codice, il pulsante risponde al rilascio, e tempo_di_pressione prende il tempo di quanto sta premuto il punsante ogni volta che viene premuto

if (digitalRead (7)== LOW ) puls_encoder=1
;
if (digitalRead (7)== LOW && start_millis_1 == 0) lettura_millis_1 = millis(), start_millis_1 = 1;
if (puls_encoder ==1 && digitalRead (7)== HIGH) start_millis_1 = 0;

if (puls_encoder > 0 && digitalRead (7)== LOW) lettura_millis_2 = millis(),tempo_di_pressione = lettura_millis_2 - lettura_millis_1;

if (puls_encoder ==1 && digitalRead (7)== HIGH)
digitalWrite (5, HIGH),
conta_impulsi_pulsante = conta_impulsi_pulsante + 1,
puls_encoder=0,
delay (300);