Consigli su programmazione '-.-

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... :~

Non sono sicuro di aver capito.

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

#define P1_BUTTON 2
#define P2_BUTTON 3

#define INCREMENT 0
#define DECREMENT 1
#define BUTTON_TIMEOUT 255

uint16_t piecesCounter;

byte counterFlag; // counterFlag = INCREMENT | DECREMENT

Setup()
{
    piecesCounter = 0;                     
    counterFlag = INCREMENT;         // default increment pieces counter
    pinMode(P1_BUTTON, INPUT);     // input pin with external resistor pullup
    pinMode(P2_BUTTON, INPUT);     // input pin with external resistor pullup
    // internal pullup non mi ricordo come si attiva
    
    pinMode(LED_BUILTIN, OUT);     // output mode on pin 13
}

loop()
{
    if (!digitalRead(P1_BUTTON) { // button pressed
        for(uint8_t i = 0; i < BUTTON_TIMEOUT; i++) {
            if (!digitalRead(P2_BUTTON) 
                counterFlag = INCREMENT;
        }        
    }
    if (!digitalRead(P2_BUTTON) { // button pressed
        for(byte i = 0; i < BUTTON_TIMEOUT; i++) {
            if (!digitalRead(P1_BUTTON) 
                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)

}

Vedi se lo capisci cosa fa il for all'interno delle if.

Ciao.

MauroTec:

Setup()

{
    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;

Ciao.