Ciao a tutti... eccomi con un nuovo problema...
Vorrei fare una cosa così: ho due pulsanti e un led, rispettivamente P1, P2 e L1...
se premo prima P1 e poi P2 mi si accende L1... se ripremo di nuovo P1 e P2, visto che L1 è già acceso, ci sarà tipo un conteggio ?pezzi? che la prima volta che premo sarà a uno e accenderà L1 e le volte dopo conterà solo...
Poi se quando L1 è acceso e il conteggio pezzi è a 5, io dovrò premere P2 e P1 5 volte (sempre prima uno e poi l'altro) per far spegnere L1...
come posso fare??? Mi raccomando, usate il cucchiaino perché se mi conoscete sapete che di programmazione non ci so nulla... e ancora...
GRAZIE MILLE!!! XD
Edit: una cosa per me ovvia ma che magari non lo è per tutti, è che se il conteggio è a 3 pezzi, un pezzo torna indietro, il conteggio va a due e se poi va avanti torna a 3 e così via... :~
Vediamo il codice fino ad un certo punto.
//#define LED_ON_BOARD 13 // il led sulla board 2009 o UNO e sul pin 13
// ma LED_BUILTIN è già definita ed usabile e quindi la usiamo
{
piecesCounter = 0; //contatore pezzi
counterFlag = INCREMENT; // ? ? ?
pinMode(P1_BUTTON, INPUT); // Pin del pulsante P1
pinMode(P2_BUTTON, INPUT); // Pin del pulsante P2
// internal pullup non mi ricordo come si attiva
pinMode(LED_BUILTIN, OUT); // output per il led L1
}
loop()
{
if (!digitalRead(P1_BUTTON) { // button pressed
for(uint8_t i = 0; i < BUTTON_TIMEOUT; i++) {
if (!digitalRead(P2_BUTTON) //questo blocco, se premo P1 incrementa counterFlag
counterFlag = INCREMENT;
}
}
if (!digitalRead(P2_BUTTON) { // button pressed
for(byte i = 0; i < BUTTON_TIMEOUT; i++) {
if (!digitalRead(P1_BUTTON) //questo blocco, se premo P2 incrementa counterFlag
counterFlag = DECREMENT;
}
}
if (counterFlag == INCREMENT)
piecesCounter++;
else
piecesCounter--;
if (piecesCounter) // turn led on or off if piecesCounte is true
digitalWrite(LED_BUILTIN, HIGH)
else
digitalWrite(LED_BUILTIN, LOW)
}
Poi non ho più capito nulla... :S ...c'è una cosa che forse, se ho capito bene, non va bene... con questo codice, comincia a contare anche se passa solo su P1?? non deve essere così... diciamo che il sistema deve capire che si sta andando avanti e non indietro... :) per adesso ti ringrazio moltissimo!! :D
Quel codice non fa quello che ti serve, ma è una buona base da cui partire per ottenere il comportamento ricercato
Vero il contatore va avanti o indietro sempre, invece a te serve selezionare se il conteggio deve essere avanti o indietro ma questo deve essere eseguito una volta sola all'interno del ciclo del loop.
Serve modificare la variabile counterFlag che deve essere un intero con segno, se contiene -1 deve decrementare piecesCounter, se contiene 1 deve incrementare piecesCounter, se invece è 0 non fa nulla, per cui devi scrivere le if (counterFlag == -1) else if (counterFlag == 1) e dentro le if devi azzerare counterFlag.
qui c'è pure da modifcare qualcosa, se P2_BUTTON è stato premuto bisogna uscire dal ciclo for con break
oviamente anche l'altro for va modificato allo stesso modo.
for(uint8_t i = 0; i < BUTTON_TIMEOUT; i++) {
if (!digitalRead(P2_BUTTON) { //questo blocco, se premo P1 incrementa counterFlag
counterFlag = INCREMENT;
break;
}
}
Le due if con il for dentro fanno questo, consideriamo solo la sequenza di P1 e P2.
if P1 è stato premuto entro nel ciclo for fino a che i non raggiunge BUTTON_TIMEOUT, se la raggiunge termina il ciclo senza fare nulla.
All'interno del ciclo viene testato P2, se premuto si imposta il counterFlag e termina il ciclo for con break;