Go Down

Topic: Indicatore direzione moto (Read 1 time) previous topic - next topic

docdoc

Volevo rispondere, ma docdoc ha già fatto "cancellato post"
Non è importante, non è una gara :) potevi lasciarlo.
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

torn24

Era inutile, la tua spiegazione è più completa! Poi due teste è meglio che una, non è sempre vero, due soluzioni un po diverse possono confondere più che aiutare. :)

Stilita

#17
May 06, 2019, 05:51 pm Last Edit: May 06, 2019, 06:10 pm by Stilita
Il pulsante è  puluppato.
Noto che hai usato il punto esclamativo per invertire lo stato.
Altre considerazioni, ho usato millis e non interrupt perché  il micro ne ha solo 2, altrimenti credo
sarebbe stato più  facile.
Domani ci rimetto mani e vedo di fare qualche progresso.
Per ora dico come stavo pensando di fare, che già mi hai anticipato che non ti piace:
Nel loop mi metto in attesa che qualche pulsante venga premuto, uando accade azzero l'altro led e  salto alla sua funzione lampeggio di quello che voglio far lampeggiare, e nel frattempo che faccio i controlli sul tempo sento se è  stato premuto un altro pulsante, se non è  stato premuto resto sotto lampeggia, altrimenti spengo il primo e salto ad un altro lampeggia.

Ho letto che richiamare continuamente una funzione da se stessa non va bene, nemmeno se la chiamata viene effettuata sempre ripetutamente dal loop?
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Standardoil

#18
May 06, 2019, 05:59 pm Last Edit: May 06, 2019, 06:05 pm by Standardoil
boh, io avevo avanzato un 30 minuti e ho fatto questo
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare:
// lampeggiatore


byte pulsanti[3] = {2, 3, 4} ;// i 3 pulsanti destra sinistra, emergenza
#define DX 12 // led destro
#define SX 13 // led sinistro (built-in)
byte stato; // lo stato attuale 0 non lampeggia 1 dx 2 sx 3 sx+dx
unsigned long int tprec; //tempo precedente del lampeggio
#define PASSO 500 // il passo di lampeggio
bool lampeggio;

void setup(void)
{
    for (byte i = 0; i < 3; i++)
    {
        pinMode(pulsanti[i], INPUT);
    }

    pinMode(DX, OUTPUT);
    pinMode(SX, OUTPUT);
}

void loop(void)
{
    byte j = 0; // il pulsante premuto, occhio che parte da 1 non da zero

    for (byte i = 0; i < 3; i++)
    {
        if (digitalRead(pulsanti[i]))
        {
            // trovato pulsante premuto
            delay(50); //tempo di debounce

            while (pulsanti[i]);

            j = i + 1; // lo salvo
            break;// trovato premuto, atteso debounce, atteso rilascio, uscito
        }
    }

    if (j)
    {
        // un pulsante è premuto
        if (j == stato)
        {
            //premuto lo stesso tasto che era stato premuto prima, smetto di lampeggiare
            stato = 0;
        }
        else
        {
            if (!stato)
            {
                // non cambio, ma prima accensione
                //  riazzero il conto, che parta sempre da acceso
                tprec = millis();
                lampeggio = 1;
            }

            // comunque aggiorno lo stato
            stato = j;
        }
    }

    // lampeggio

    if (millis() - tprec >= PASSO)
    {
        tprec = millis();
        lampeggio = !lampeggio;
    }

    digitalWrite(DX, lampeggio & stato % 2);
    digitalWrite(SX, lampeggio & stato > 1);
}



Lo sketch usa 1362 byte (4%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 19 byte (0%) di memoria dinamica, lasciando altri 2029 byte liberi per le variabili locali. Il massimo è 2048 byte.
gestisce tre pulsanti , indiretti attraverso un array, se serve di spostari o espandere il programma
sente il cambio di lampeggio, la pressione una seconda volta dello stesso pulsante, e riparte col lampeggio sempre da zero
facilmente espandibile.......
a perte il piccolo trucco sulla scrittura delle uscite, dato che li non mi serviva scandire nulla
ma se serve si può cambiare in una switch case, e allora si espande bene

ma non ho qui adesso nessuna macchina, quelche anima pia me lo prova?
Non presurrò più la buona fede di chi:
NON indenta o USA la classe string o NON esegue le ricerche
Troppe volte e' stato segnalato che è sbagliato, quindi se si comportano così NON sono in buona fede

Non bado a studenti, che copino altrove

Stilita

#19
May 06, 2019, 06:05 pm Last Edit: May 06, 2019, 06:07 pm by Stilita
@Standardoil, avevo pensato anch'io ad un array,  ma visto che erano solo 3 alternative ho ridondato le funzioni, che però già  mi hanno detto che devo rivedere per come le sto usando.
Appena riesco studio anche il tuo programma e ti faccio sapere, a dopo.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Standardoil

non ho messo lo array per risparmiare sulle alternative, ma perchè così l'indice dell'array è lo stato di funzionamento............
Non presurrò più la buona fede di chi:
NON indenta o USA la classe string o NON esegue le ricerche
Troppe volte e' stato segnalato che è sbagliato, quindi se si comportano così NON sono in buona fede

Non bado a studenti, che copino altrove

Stilita

#21
May 06, 2019, 06:13 pm Last Edit: May 06, 2019, 06:35 pm by Stilita
@Standardoil

Hai considerato i pulsanti pullup o pulldown?
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Standardoil

Non presurrò più la buona fede di chi:
NON indenta o USA la classe string o NON esegue le ricerche
Troppe volte e' stato segnalato che è sbagliato, quindi se si comportano così NON sono in buona fede

Non bado a studenti, che copino altrove

Stilita

#23
May 06, 2019, 06:58 pm Last Edit: May 06, 2019, 06:58 pm by Stilita
Pulldown
Per ora non sta funzionando il tuo, poi ci guardo/guardiamo meglio.
Già che ci sono dico a docdoc che il suo funziona, e domani ci studio per completarlo con gli altri 2 pulsanti.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Standardoil

#24
May 06, 2019, 09:33 pm Last Edit: May 06, 2019, 11:05 pm by Standardoil
ok, trovato errore
si tratta di una banalità: trattandosi di lettura di un ingresso (pur se in-diretto tramite array), la lettura deve esserci......
messo a posto quello è andato al primo colpo
Non presurrò più la buona fede di chi:
NON indenta o USA la classe string o NON esegue le ricerche
Troppe volte e' stato segnalato che è sbagliato, quindi se si comportano così NON sono in buona fede

Non bado a studenti, che copino altrove

torn24

#25
May 07, 2019, 06:54 am Last Edit: May 07, 2019, 09:27 am by torn24
Be visto che tutti partecipano, partecipo anche io  :)

Io il problema se avessi dovuto farlo per me stesso, avrei adottato questa soluzione.

Ricordate che ci sono tante soluzioni a uno stesso problema, e questa è una delle tante :)




Code: [Select]

#define LEDSX 7
#define LEDDS 8
#define PULSANTESX 9
#define PULSANTEDS 10
#define EMERGENZA 11
unsigned long previousMillis = 0;
unsigned long currentMillis;
const long interval = 500;
byte flagLEDSX = 0, flagLEDDS = 0;
void setup() {
  pinMode(LEDSX, OUTPUT);
  pinMode(LEDDS, OUTPUT);
  pinMode(PULSANTESX, INPUT);
  pinMode(PULSANTEDS, INPUT);
  pinMode(EMERGENZA, INPUT);

}
void loop() {
  /* LETTURA STATO TRE PULSANTI */
  if (digitalRead(PULSANTESX) == LOW) { //se il pulsante è premuto
    flagLEDSX = !flagLEDSX; // inverto il valore di flag
    flagLEDDS=0;
    delay(200); //attendo che il dito si stacchi dal pulsante
  } else if (digitalRead(PULSANTEDS) == LOW) { //se il pulsante è premuto
    flagLEDDS = !flagLEDDS; //inverto il valore
    flagLEDSX=0;
    delay(200); //attendo che il dito si stacchi dal pulsante
  } else if (digitalRead(EMERGENZA) == LOW) { //se emergenza è premuto
    flagLEDSX = 1; flagLEDDS = 1; // se premo emergenza lampeggiano tutti e due i led
    delay(200); //attendo che il dito si stacchi dal pulsante
  }
  /********************************************/

  /* GESTIONE LAMPEGGIO */

  if (flagLEDSX && flagLEDDS == 0) {
    lampeggio(1); // lampeggia il led di sinistra
  } else if (flagLEDSX == 0 && flagLEDDS == 1) {
    lampeggio(2); //lampeggio led  destra
  } else if (flagLEDSX == 1 && flagLEDDS == 1) {

    lampeggio(3); // lampeggio entrambi i led

  }else if( flagLEDSX==0 && flagLEDDS==0){// SPEGNE I LED

        digitalWrite(LEDDS, LOW);
        digitalWrite(LEDSX,LOW);


  }
}
int lampeggio(int x) {
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    switch (x) {
      case 1:
        digitalWrite(LEDDS, LOW); // il led destra è spento
        digitalWrite(LEDSX, ledState); //il led sinistra lampeggia
        break;
      case 2:
        digitalWrite(LEDSX, LOW); // il led sinistra è spento
        digitalWrite(LEDDS, ledState); //il led destra lampeggia
        break;
      case 3:
        digitalWrite(LEDDS, ledState); // il led destra lampeggia
        digitalWrite(LEDSX, ledState); //il led sinistra lampeggia
        break;
    }

  }
}





Standardoil

Beh..
Che dire, molto piana ed esplicita
Mentre la mia è iterativa e implicita
Sono due stili differenti
Non mi piace molto l'uso di una funzione apposita per il lampeggio, quando non la chiami, come rimane il led?
Non presurrò più la buona fede di chi:
NON indenta o USA la classe string o NON esegue le ricerche
Troppe volte e' stato segnalato che è sbagliato, quindi se si comportano così NON sono in buona fede

Non bado a studenti, che copino altrove

torn24

Devo correggere il bug, il led rimane all'ultimo stato che aveva, adesso correggo il post e risolvo il problema!
Le soluzioni adottate dipendono dalle cose che conosci meglio e un po dallo stile!
Per il mio stile ad esempio, non userei un ciclo for per gestire tre pulsanti, forse la soluzione di adottare un for verrebbe anche a me con un numero considerevole di pulsanti. Questo è un po lo stile da persona a persona. :)

Standardoil

Io il for lo ho messo per tre ragioni, ma la principale è  una:
L'indice del for mi da direttamente lo stato della macchina a stati,
Questo poi mi ha "anche" semplificato la gestione dei pulsanti, ma la causa prima era la macchina a stati
Non presurrò più la buona fede di chi:
NON indenta o USA la classe string o NON esegue le ricerche
Troppe volte e' stato segnalato che è sbagliato, quindi se si comportano così NON sono in buona fede

Non bado a studenti, che copino altrove

Stilita

#29
May 07, 2019, 09:36 am Last Edit: May 07, 2019, 09:53 am by Stilita
@torn24, effettivamente i led fanno un po di confusione, se ad esempio è acceso il SX e premo il dx si accendono entrambi, e l'emergenza una volta accesa ripremendo il suo tasto non si spegne.
Faccio queste considerazioni solo per dimostrare che vi sto seguendo, non per altro...ci mancherebbe.

@Nelson, hai detto che hai trovato l'errore, ma non so se hai corretto il tuo schetch, se no è perchè vuoi che io studi su? Perchè ancora non va.

Intando porto a termine il mio...e poi ho anche lo schetch di docdoc da sviluppare, ciao a tutti.

Ps: I pulsanti devono essere pulappati, e preferisco che al premere di un pulsante il/i led si accendINO subito, cioè  devono partire dal TON e non da TOFF.
...non sapete quanto ho cercato...pfui pfui
prima di rivolgermi al forum...

Go Up