Go Down

Topic: Consigli su programmazione '-.- (Read 1 time) previous topic - next topic

maggio93

Jul 22, 2012, 11:53 pm Last Edit: Jul 22, 2012, 11:57 pm by maggio93 Reason: 1
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...  :~
Pagina FB: https://www.facebook.com/pages/LaLed/442032022502554?ref=hl

Sito: http://www.laled.altervista.org

MauroTec

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

Code: [Select]

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.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

maggio93


Code: [Select]

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
Pagina FB: https://www.facebook.com/pages/LaLed/442032022502554?ref=hl

Sito: http://www.laled.altervista.org

MauroTec

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.
Code: [Select]

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.

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy