Pages: [1]   Go Down
Author Topic: Consigli su programmazione '-.-  (Read 972 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 294
L'uomo non smette di giocare perché invecchia, ma invecchia perché smette di giocare. (George Bernard Shaw)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!!  smiley-lol

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...  smiley-confuse
« Last Edit: July 22, 2012, 04:57:57 pm by maggio93 » Logged


0
Offline Offline
Faraday Member
**
Karma: 30
Posts: 2905
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Offline Offline
Sr. Member
****
Karma: 0
Posts: 294
L'uomo non smette di giocare perché invecchia, ma invecchia perché smette di giocare. (George Bernard Shaw)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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... smiley per adesso ti ringrazio moltissimo!! smiley-grin
Logged


0
Offline Offline
Faraday Member
**
Karma: 30
Posts: 2905
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

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

Pages: [1]   Go Up
Jump to: