Arduino Forum

International => Italiano => Generale => Topic started by: Fabiok89 on Jun 12, 2018, 11:47 pm

Title: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 12, 2018, 11:47 pm
salve a tutti, rieccomi a chiedere di nuovo il vostro aiuto.
Dopo più di un mese di programmazione sono riuscito a far funzionare il tutto alla perfezione solamente volevo migliorare inserimento del timer in modo più pulito
in questo momento il timer ha durata massima 59 m e 59 secondi(non ha le ore)
quando vado ad inserire il tempo che deve scalare lo devo inserire in questo modo,  ess: 1500 che equivale a 15:00 minuti(nella schermata di conferma lo vedo correttamente)

Qualcuno mi può suggerire dove devo intervenire sul codice per avere una cosa del genere H00:M00:S00
dove andrò a sostituire gli 0 con i valori impostati da tastiera, se è possibile volevo fare lampeggiare lo 0 che deve cambiare valore(mi pare che si faccia con lcd.cursor())

Il codice dovrebbe essere abbastanza chiaro...ovviamente ci saranno milioni di righe di codice che potranno essere semplificate xD(i consigli sono ben accetti)

Code: [Select]

/////////////////////////
//   S.M.A.S. Softair  //
//  codice editato da  //
//   Fabio Tomaselli   //
/////////////////////////
#include <Key.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>

//LED e Buzzer
int buzzer = 12;

//settaggi timer
int currentTimeValue = 0;
char tempo[4];
int currentState = 1;
int timerSeconds = 0;
int lpcnt = 0;

//settaggi della password
int currentLength = 0 ;
char password[6];
char entered[6];

//settaggi tastiera
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'#', '0', '*', 'D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //pin delle righe
byte colPins[COLS] = {9, 8, 7, 6}; //in delle colonne

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal_I2C lcd(0x27, 16, 2);

void(* Riavvia) (void) = 0; //riavvio della valigetta

void setup() {

  pinMode(buzzer, OUTPUT);

  lcd.init();
  Serial.begin(9600);
  lcd.backlight(); // illumina il display
  lcd.setCursor(4, 0);
  lcd.print("S.M.A.S.");
  lcd.setCursor(2, 1);
  lcd.print("Loading");
  lcd.setCursor(9, 1);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(10, 1);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(11, 1);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(12, 1);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(13, 1);
  lcd.print(".");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Inserire Codice:");
  while (currentLength < 6)
  {
    lcd.setCursor(currentLength + 5, 1);
    lcd.cursor();
    char key = keypad.getKey();
    key == NO_KEY;
    if (key != NO_KEY)
    {
      if ((key != '*') && (key != '#') && (key != 'A') && (key != 'B') && (key != 'C') && (key != 'D'))
      {
        lcd.print(key);
        password[currentLength] = key;
        currentLength++;
      }
    }
  }

  if (currentLength == 6)
  {
    delay(1500);
    lcd.noCursor();
    lcd.clear();
    lcd.home();
    lcd.print("Codice Inserito!");
    lcd.setCursor(5, 1);
    lcd.print(password[0]);
    lcd.print(password[1]);
    lcd.print(password[2]);
    lcd.print(password[3]);
    lcd.print(password[4]);
    lcd.print(password[5]);
    delay(3000);
    lcd.clear();
    currentLength = 0;
  }

  lcd.setCursor(0, 0);
  lcd.print("Inserire Tempo:");
  while (currentTimeValue < 4)
  {
    lcd.setCursor(currentTimeValue + 6, 1);

    lcd.cursor();
    char key = keypad.getKey();
    key == NO_KEY;
    if (key != NO_KEY)
    {
      if ((key != '*') && (key != '#') && (key != 'A') && (key != 'B') && (key != 'C') && (key != 'D')) //caratteri non permessi
      {


        lcd.print(key);
        tempo[currentTimeValue] = key;
        currentTimeValue++;
      }
    }
  }
  if (currentTimeValue == 4)
  {
    delay(1500);
    lcd.noCursor();
    lcd.clear();
    lcd.home();
    lcd.print("Tempo Inserito!");
    lcd.setCursor(5, 1);
    lcd.print(tempo[0]);
    lcd.print(tempo[1]);
    lcd.setCursor(7, 1);
    lcd.print(':');
    lcd.print(tempo[2]);
    lcd.print(tempo[3]);
    delay(3000);
    lcd.clear();
    currentTimeValue = 0;
  }

}

void settaggiotempo() {

  int l;
  char tempVal[3];
  char key = keypad.getKey();
  if (currentState == 1) {
    tempVal[0] = tempo[0];
    tempVal[1] = tempo[1];
    tempVal[2] = 0;

    timerSeconds = atol(tempVal) * 60;

    tempVal[0] = tempo[2];
    tempVal[1] = tempo[3];
    tempVal[2] = 0;

    timerSeconds = timerSeconds + atol(tempVal);
    currentState = 2;
  }

  if (lpcnt > 9) {
    lpcnt = 0;
    --timerSeconds;
    tone(buzzer, 1500, 500);
    countdown();

    if (timerSeconds <= 0) {
      currentState = 1;
      lcd.clear();
      tone(buzzer, 2000, 400);
      delay(500);
      tone(buzzer, 2000, 400);
      delay(500);
      tone(buzzer, 2000, 400);
      delay(500);
      tone(buzzer, 2000, 400);
      delay(500);
      tone(buzzer, 2000, 400);
      delay(500);
      lcd.setCursor(5, 0);
      lcd.print("Bomba");
      lcd.setCursor(4, 1);
      lcd.print("Esplosa!");
      delay(10000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Riavvio");
      delay(1000);
      lcd.setCursor(7, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(8, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(9, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(10, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(11, 0);
      lcd.print(".");
      delay(1000);
      Riavvia();
    }
  }
  ++lpcnt;
  delay(100);
}

void bombaesplosa() {
  lcd.noCursor();
  lcd.clear();
  lcd.home();
  lcd.print("Codice Errato!");
  delay(5000);
  lcd.clear();
  lcd.setCursor(5, 0);
  lcd.print("Bomba");
  lcd.setCursor(4, 1);
  lcd.print("Esplosa!");
  delay(10000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Riavvio");
  delay(1000);
  lcd.setCursor(7, 0);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(8, 0);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(9, 0);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(10, 0);
  lcd.print(".");
  delay(1000);
  lcd.setCursor(11, 0);
  lcd.print(".");
  delay(1000);
  Riavvia();


}

void tempoimpostato() {
  lcd.setCursor(7, 1);
  lcd.print(tempo[0]);
  lcd.print(tempo[1]);
  lcd.print(":");
  lcd.print(tempo[2]);
  lcd.print(tempo[3]);

}

void countdown() {
  char timest[6];

  lcd.setCursor(0, 1);
  lcd.print("Tempo: ");
  sprintf(timest, "%.2d:%.2d", (timerSeconds / 60), (timerSeconds - ((timerSeconds / 60) * 60)));
  lcd.print(timest);

}

void loop() {

  int l;
  char tempVal[3];
  char key2 = keypad.getKey();

  settaggiotempo();

  // if (key2 == 'A')  //premi per scrivere la pass
  // {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Codice:");

  while (currentLength < 6) //aspetta la password
  {

    settaggiotempo();

    char key2 = keypad.getKey();
    if (key2 == 'C') // premi x cancellare la pass
    {
      currentLength = 0;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Codice:");
    }
    else if (key2 != NO_KEY)
    {

      lcd.setCursor(currentLength + 7, 0);
      lcd.cursor();

      lcd.print(key2);
      entered[currentLength] = key2;
      currentLength++;

      delay(100);
      lcd.noCursor();
      lcd.setCursor(currentLength + 6, 0);
      lcd.print("*");
      lcd.setCursor(currentLength + 7, 0);
      lcd.cursor();
    }
  }

  if (currentLength == 6)
  {
    if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3] && entered[4] == password[4] && entered[5] == password[5])
    {
      lcd.noCursor();
      lcd.clear();
      lcd.home();
      lcd.setCursor(5, 0);
      lcd.print("Bomba");
      lcd.setCursor(2, 1);
      lcd.print("Disinnescata");
      currentLength = 0;
      delay(5000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Riavvio");
      delay(1000);
      lcd.setCursor(7, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(8, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(9, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(10, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(11, 0);
      lcd.print(".");
      delay(1000);
      Riavvia();
    }
    else
    {
      bombaesplosa();
    }
  }
  //}
}

Title: Re: Migliorare Timer Progetto
Post by: -zef- on Jun 13, 2018, 09:44 am
E' da un po' che non utilizzo un display lcd ma da quel che mi ricordo setCursor lo devi fare per indicare le coordinate del primo carattere che stampi, se gli altri seguono dopo non devi indicarne per ognuno la coordinata in modo progressivo
Code: [Select]
     lcd.setCursor(7, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(8, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(9, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(10, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(11, 0);
      lcd.print(".");

lo puoi scrivere direttamente così:
Code: [Select]
     lcd.setCursor(7, 0);
      lcd.print(".");
      delay(1000);
      lcd.print(".");
      delay(1000);
      lcd.print(".");
      delay(1000);
      lcd.print(".");
      delay(1000);
      lcd.print(".");

meglio ancora scriverlo così:
Code: [Select]
      lcd.setCursor(7, 0);     
      for (int i=0; i <= 5; i++)
      {
            lcd.print(".");
            delay(1000);
      }
Title: Re: Migliorare Timer Progetto
Post by: fabpolli on Jun 13, 2018, 12:17 pm
Per gestire il countdown ti consiglio di dare un occhiata alla libreria timer (http://playground.arduino.cc/Code/Time) che ti permette di settare un data/ora in modo abbastanza semplice.
Quello che posso dirti sul tuo codice è che non mi piace per nulla il sistema adottato per resettare il tutto, capisco che funziona ma non è proprio quello che di solito si consiglia di fare.
Ti consiglio di cercare sul forum "macchina a stati finiti" e gestire con quel metodo tutto all'interno del loop (alla fine è semplicissimo, una variabile di stato e un case).
Per l'inserimento del tempo la libreria dell'lcd ha il metodo blink() e noBlink() che ti fanno lampeggiare il cursore, quando sei in attesa del tempo ti basta posizionare il cursore e attvare il blick, ad ogni settaggio sposti il cursore e alla fine chiami la noBlink
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 13, 2018, 08:10 pm
Per gestire il countdown ti consiglio di dare un occhiata alla libreria timer (http://playground.arduino.cc/Code/Time) che ti permette di settare un data/ora in modo abbastanza semplice.
Quello che posso dirti sul tuo codice è che non mi piace per nulla il sistema adottato per resettare il tutto, capisco che funziona ma non è proprio quello che di solito si consiglia di fare.
Ti consiglio di cercare sul forum "macchina a stati finiti" e gestire con quel metodo tutto all'interno del loop (alla fine è semplicissimo, una variabile di stato e un case).
Per l'inserimento del tempo la libreria dell'lcd ha il metodo blink() e noBlink() che ti fanno lampeggiare il cursore, quando sei in attesa del tempo ti basta posizionare il cursore e attvare il blick, ad ogni settaggio sposti il cursore e alla fine chiami la noBlink
Ciao ho provato a dare una lettura a quello che mi hai consigliato... Piano piano renderò il. Codice più "pulito".. Ma per ora il mio obiettivo è sistemare l'impostazione del timer...

Hai qualche esempio da consigliarmi... Non ho trovato nulla che fa al caso mio sulla rete

E' da un po' che non utilizzo un display lcd ma da quel che mi ricordo setCursor lo devi fare per indicare le coordinate del primo carattere che stampi, se gli altri seguono dopo non devi indicarne per ognuno la coordinata in modo progressivo
Code: [Select]
    lcd.setCursor(7, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(8, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(9, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(10, 0);
      lcd.print(".");
      delay(1000);
      lcd.setCursor(11, 0);
      lcd.print(".");

lo puoi scrivere direttamente così:
Code: [Select]
    lcd.setCursor(7, 0);
      lcd.print(".");
      delay(1000);
      lcd.print(".");
      delay(1000);
      lcd.print(".");
      delay(1000);
      lcd.print(".");
      delay(1000);
      lcd.print(".");

meglio ancora scriverlo così:
Code: [Select]
     lcd.setCursor(7, 0);      
      for (int i=0; i <= 5; i++)
      {
            lcd.print(".");
            delay(1000);
      }


Grazie mille appena posso modifico il codice come mi hai suggerito... Mi puoi spiegare cosa vuol d'ore l'espressione accanto al for così ci capisco qualcosa. Sn entrato da poco in questo mondo e già aver sistemato un codice del del genere per me è un immenso traguardo
Title: Re: Migliorare Timer Progetto
Post by: Silente on Jun 13, 2018, 08:30 pm
Prova a cercare sul reference, li il for probabilmente lo trovi
Title: Re: Migliorare Timer Progetto
Post by: gpb01 on Jun 13, 2018, 08:52 pm
>Fabiok89: come ti ha indicato "silente", fai sempre riferimento al reference (https://www.arduino.cc/reference/en) di Arduino dove puoi trovare tutto quello che riguarda il linguaggio oppure ... la Bibbia (https://www.amazon.it/linguaggio-Principi-programmazione-manuale-riferimento/dp/887192200X) :D

Guglielmo
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 13, 2018, 08:58 pm
Prova a cercare sul reference, li il for probabilmente lo trovi
Ah ok

Allora mi consigliate di riscrive il codice per quanto riguarda il timer... E nn cercare di modificare questo già funzionante?
Title: Re: Migliorare Timer Progetto
Post by: Silente on Jun 13, 2018, 10:11 pm
Va bene modificarlo, ti ho solo detto di cercare cosa fa il or e cone funziona, come tu hai chiesto di sapere nel tuo post 3 ultima parte
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 14, 2018, 06:23 pm
un'altra cosa come programma simulativo cosa mi consigliate...?ne ho provati un paio online ma non hanno tutti i componenti che servono per il mio progetto

inv x quanto riguarda modificare il timer nessuno mi può aiutare?
Title: Re: Migliorare Timer Progetto
Post by: Silente on Jun 14, 2018, 06:34 pm
Quanto a proramma simulativo suggerisco di non utilizzarlo, e fare i test su fisico, perché poi ci sono problemi tipo "sul simulatore funzionava, ora no", tanto una volta che hai fatto il circuito di fumo non ne esce
Title: Re: Migliorare Timer Progetto
Post by: Patrick_M on Jun 14, 2018, 09:24 pm
:D o al limite esce subito alla prima accensione :D
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 19, 2018, 06:49 am
buon giorno...in questi giorni ho apportato delle piccole modifiche come suggerito da -zef- e da fabpolli per tenere il codice un pò più pulito da leggere

invece per quanto riguarda il timer ancora sn in alto mare, non riesco a trovare nessun esempio da seguire, su internet si trovano solo video di gente che usa il potenziometro e lo shield per impostare il countdown

qualcuno riesce a spiegarmi cosa devo modificare per aggiungere le ORE e visualizzare quando devo inserire i valori H00:M00:S00

questi sn i due codici che m gestiscono il timer

codice per inserire i valori del tempo( per ora è impostato a 4 cifre)
Code: [Select]

void inseriretempo() {
  lcd.setCursor(0, 0);
  lcd.print("Inserire Tempo:");
  while (currentTimeValue < 4)

  {
    // lcd.print("H00:M00:S00");
    lcd.setCursor(currentTimeValue + 6, 1);
      lcd.cursor();
    char key = keypad.getKey();
    key == NO_KEY;
    if (key != NO_KEY)
    {
      if ((key != '*') && (key != '#') && (key != 'A') && (key != 'B') && (key != 'C') && (key != 'D')) //caratteri non permessi
      {

        lcd.print(key);
        tempo[currentTimeValue] = key;
        currentTimeValue++;
      }
    }
  }
  if (currentTimeValue == 4)
  {
    delay(2000);
    lcd.noCursor();
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print("Start in 5 Sec");
    lcd.setCursor(6, 1);
    for (int i = 0; i <= 4; i++) // ripete x 5 volte quello scritto tra {}
    {
      lcd.print((char)0); // richiama la clessidra
      delay(1000);
    }
    lcd.clear();
    currentTimeValue = 0;
  }
}


e questo è il void che mi converte i valori in minuti e secondi se non mi sbaglio

Code: [Select]
void settaggiotempo() {

  int l;
  char tempVal[3];
  char key = keypad.getKey();
  if (currentState == 1) {
    tempVal[0] = tempo[0];
    tempVal[1] = tempo[1];
    tempVal[2] = 0;
   
    timerSeconds = atol(tempVal) * 60;

    tempVal[0] = tempo[2];
    tempVal[1] = tempo[3];
    tempVal[2] = 0;

    timerSeconds = timerSeconds + atol(tempVal);
    currentState = 2;
  }

  if (lpcnt > 9) {
    lpcnt = 0;
    --timerSeconds;
    tone(buzzer, 1500, 500);
    countdown();

    if (timerSeconds <= 0) {
      currentState = 1;
      temposcaduto();
    }
  }
  ++lpcnt;
  delay(100);
}
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 24, 2018, 11:56 am
rieccomi dopo qualche giorno...

Vi faccio un piccolo riassunto...alla fine ci sn riusci a settare le cose come dice io

però è nato un'altro probblema
vengo al dunque

siccome ho scritto tutto il codice nel loop(se lo metto fuori non mi funziona) ho il problema di resettare lo schermo nei vari passaggi la funzione lcd.clear() non va perché mi fa lampeggiare lcd esiste qualche altra soluzione, qualcuno ha qualcosa da consigliarmi su come procedere?
Title: Re: Migliorare Timer Progetto
Post by: Silente on Jun 24, 2018, 04:42 pm
1)
Senza l'attuale codice si fa poco
2)
La funzione lcd.clear() DEVE fare quello per cui é nata, quindi non é lei che non funziona. Puoi aver manomesso quello che vuoi ma mi rifiuto di credere che una funzione che tutti usano in un certo modo (cancellando lo schermo) lo faccia lampeggiare. Il problema deriva esclusivamente da come la si utilizza.
3)
L'architettura in funzioni DEVE funzionare, quanto é vero che Arduino funziona, quindi il problema sarà certamente in come le funzioni vengono fatte
4)
IL modo per cancellare un lcd é O quella funzione O riempirlo di spazi
Title: Re: Migliorare Timer Progetto
Post by: gpb01 on Jun 24, 2018, 04:47 pm
>Fabiok89: è chiaro che se chiami a raffica (cosa che avviene se la metti nel loop()) la lcd.clear() hai un effetto tipo lampeggio ...
... o la chiami SOLO quando realmente ti serve di pulire TUTTO il display o pulisci (scrivendoci sopra degli spazi) solo le parti che ti serve pulire.

Guglielmo
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 25, 2018, 06:50 am
praticamente dopo che inserisco la pass devo impostare il tempo...

il codice è scritto in modo che prima inserisco il tempo e dopo parte il countdown,non capisco il perchè ma il countdown me lo esegue subito(scrivendomi le scritte)


il problema e nelle ultime 5 righe, sicuramente sto sbagliando qualche valore

Code: [Select]
void codice2()
{
  lcd.print("Inserisci Tempo:");
  //updateDisplay();
  char key = keypad.getKey();
  //lcd.setCursor(0,1);
  //      lcd.print("H00:M00:S00");
  if (key != NO_KEY)
  {
    switch (conDig)
    {
      case 0:

        lcd.setCursor(conPos, 1);  // conPos = 0. Horas. First Digit.
        if (key <= '2')
        {
          lcd.print(key);
          conPos = 1;              // Moves the cursor at row 1 (the second one).
          conDig++;                // Moves on to the next case, with the cusor already in row 1.
          H = (key - 48) * 10;
        }
        break;
      case 1:
        lcd.setCursor(conPos, 1);   // conPos = 1. Horas. Second digit.
        lcd.print(key);
        lcd.print(":M ");
        conPos = 4;
        conDig++;
        H = H + (key - 48);
        break;
      case 2:
        lcd.setCursor(conPos, 1);   // conPos = 3. Minutos. Third digit.
        if (key <= '5')
        {
          lcd.print(key);
          conPos = 5;              // Moves the cursor at row 4 (the fifth one).
          conDig++;                // Moves on to the next case.
          M = (key - 48) * 10;
        }
        break;
      case 3:
        lcd.setCursor(conPos, 1);    // conPos = 4. Minutos. Forth digit.
        lcd.print(key);
        lcd.print(":S ");
        conPos = 8;
        conDig++;
        M = M + (key - 48);
        break;
      case 4:
        lcd.setCursor(conPos, 1);    // conPos = 6. Segundos. Fifth digit.
        if (key <= '5')
        {
          lcd.print(key);
          conPos = 10;
          conDig++;
          S = (key - 48) * 10;
        }
        break;
      case 5:
        lcd.setCursor(conPos, 1);    // conPos = 7. Segundos. Sixth digit.
        lcd.print(key);
        //  lcd.print(".");
        conDig++;
        S = S + (key - 48);
        break;
      case 6:

        timer();
    }
    while (conDig == 6)
    {
      // lcd.clear();
      // timer();
      confermapassword();
    }
  }

}
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 26, 2018, 09:17 pm
Allora finalmente dopo milioni di correzioni ne sono venuto a capo.
Sono riuscito a fare funzionare il tutto a dovere e secondo quello che mi ero prefissato all'inizio

Sto diventando pazzo su l ultima cosa, vorrei aggiungere un trattino al di sotto della cifra che sto per modificare iniziando da sinistra quindi prima le 2 cifre delle ore e cosi via, oppure fare lampeggiare lo 0 che deve essere modificato.

Sto avendo problemi con la prima cifra di Ore ,Minuti e secondi, con la seconda cifra funziona alla perfezione

di seguito vi condivido tutto lo sketch del timer , in questo momento l ho impostato con lcd.blink() all'inizio del caso 0 e lcd.noBlink() alla fine del caso 5 ,ma come detto sopra mi accontento anche di lcd.cursor()

qualcuno mi può spiegare dove sto sbagliando?

Code: [Select]


#include <Keypad.h>                     
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27, 16, 2);

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'#', '0', '*', 'D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //pin delle righe
byte colPins[COLS] = {9, 8, 7, 6}; //in delle colonne

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int conPos = 1;            // Position Counter variable that controls the position of the cursor.
int conDig = 0;            // Digital Counter variable the controls the case switching.

int ledPin = 9;            // LED connected to digital pin 9. Is used in the alarm.

int h = 0;             // This variables will store time values.
int m = 0;
int s = 0;


void setup()
{
  lcd.init();   // Configures the number of columns and rows in the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Inserisci Tempo!");   // Prints a message in the LCD. "Introduce time".

  lcd.setCursor(0, 1);
  lcd.print("H00:M00:S00");

}

void loop()
{
  char key = keypad.getKey();

  if (key != NO_KEY)

  {

    switch (conDig)
    {

      case 0:
        lcd.blink();
        lcd.setCursor(conPos, 1);  // conPos = 0. Horas. First Digit.

        if (key <= '2')
        {
          lcd.print(key);
          conPos = 2;              // Moves the cursor at row 1 (the second one).
          conDig++;                // Moves on to the next case, with the cusor already in row 1.
          h = (key - 48) * 10;

        }
        break;
      case 1:

        lcd.setCursor(conPos, 1);   // conPos = 1. Horas. Second digit.
        lcd.print(key);
        //lcd.print(":M ");
        conPos = 5;
        conDig++;
        h = h + (key - 48);

        break;
      case 2:

        lcd.setCursor(conPos, 1);   // conPos = 3. Minutos. Third digit.
        if (key <= '5')
        {
          lcd.print(key);
          conPos = 6;              // Moves the cursor at row 4 (the fifth one).
          conDig++;                // Moves on to the next case.
          m = (key - 48) * 10;
        }

        break;
      case 3:
        lcd.setCursor(conPos, 1);    // conPos = 4. Minutos. Forth digit.
        lcd.print(key);
        //lcd.print(":S ");
        conPos = 9;
        conDig++;
        m = m + (key - 48);
        break;

      case 4:
        lcd.setCursor(conPos, 1);    // conPos = 6. Segundos. Fifth digit.
        if (key <= '5')
        {
          lcd.print(key);
          conPos = 10;
          conDig++;
          s = (key - 48) * 10;
          break;

        case 5:
          lcd.setCursor(conPos, 1);    // conPos = 7. Segundos. Sixth digit.
          lcd.print(key);
          conDig++;
          s = s + (key - 48);
          lcd.noBlink();
          delay(2000);
          break;
        }
    }
    while (conDig == 6)
    {
     Timer();
    }
  }

}


Title: Re: Migliorare Timer Progetto
Post by: fabpolli on Jun 27, 2018, 09:00 am
Se non ho capito male vorresti subito far lampeggiare sulla prima cifra delle ore, quindi nel setup dopo aver stampato H00:M00:S00 metti una setcurso nella posizione della prima cifra delle ore e metti li il blink, non appena finisce il setup inizia a lampeggiare sulla prima cifra delle ore, il resto non ho capito esattamente cosa non va perché a regola il blink continua finche non lo interrompi co0n la noblink quindi dovrebbe funzionare il codice così come l'hai scritto
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jun 27, 2018, 06:04 pm
Nel momento in cui Arduino esegue la break di un case non esegue gli altri. Di conseguenza
1) la lcd.blink() la esegue solo se entra nel case 0
2) la lcd.noblink la esegue solo se entra nel case 5.

Se vuoi che valgano per tutti i casi basta metterli una prima dell'inizio e una dopo la fine dello switch
perfetto già ci avevo provato ma la prima cifra di ore min e sec non lampeggia...invece lampeggiano i : prima delle M e della S e poi appena aggiungo un valore passa direttamente al secondo 0 di ogni sezione

Se non ho capito male vorresti subito far lampeggiare sulla prima cifra delle ore, quindi nel setup dopo aver stampato H00:M00:S00 metti una setcurso nella posizione della prima cifra delle ore e metti li il blink, non appena finisce il setup inizia a lampeggiare sulla prima cifra delle ore, il resto non ho capito esattamente cosa non va perché a regola il blink continua finche non lo interrompi co0n la noblink quindi dovrebbe funzionare il codice così come l'hai scritto
grazie...ok ci siamo quasi...ora lampeggiano i : dei minuti e dei secondi appena inserisco la cifra passa direttamente al secondo valore H00 tutto ok - :M00 lampeggiano i punti e il secondo 0 - :S00 stessa cosa...come risolvo?

Code: [Select]
#include <Keypad.h>                       // We include the libraries.
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27, 16, 2);

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'#', '0', '*', 'D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //pin delle righe
byte colPins[COLS] = {9, 8, 7, 6}; //in delle colonne

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int conPos = 1;            // Position Counter variable that controls the position of the cursor.
int conDig = 0;            // Digital Counter variable the controls the case switching.

int ledPin = 9;            // LED connected to digital pin 9. Is used in the alarm.

int horas = 0;             // This variables will store time values.
int minutos = 0;
int segundos = 0;


void setup()
{
  lcd.init();   // Configures the number of columns and rows in the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Inserisci Tempo!");   // Prints a message in the LCD. "Introduce time".

  lcd.setCursor(0, 1);
 
  lcd.print("H00:M00:S00");
  lcd.setCursor(conPos,1);
lcd.blink();
}

void loop()
{
  char key = keypad.getKey();

  if (key != NO_KEY)
  {
    switch (conDig)
    {

      case 0:
        lcd.blink();
        lcd.setCursor(conPos, 1);  // conPos = 0. Horas. First Digit.

        if (key <= '2')
        {
          lcd.print(key);
          conPos = 2;              // Moves the cursor at row 1 (the second one).
          conDig++;                // Moves on to the next case, with the cusor already in row 1.
          horas = (key - 48) * 10;

        }
        break;
      case 1:

        lcd.setCursor(conPos, 1);   // conPos = 1. Horas. Second digit.
        lcd.print(key);
        //lcd.print(":M ");
        conPos = 5;
        conDig++;
        horas = horas + (key - 48);

        break;
      case 2:

        lcd.setCursor(conPos, 1);   // conPos = 3. Minutos. Third digit.
        if (key <= '5')
        {
          lcd.print(key);
          conPos = 6;              // Moves the cursor at row 4 (the fifth one).
          conDig++;                // Moves on to the next case.
          minutos = (key - 48) * 10;
        }

        break;
      case 3:
        lcd.setCursor(conPos, 1);    // conPos = 4. Minutos. Forth digit.
        lcd.print(key);
        //lcd.print(":S ");
        conPos = 9;
        conDig++;
        minutos = minutos + (key - 48);
        break;

      case 4:
        lcd.setCursor(conPos, 1);    // conPos = 6. Segundos. Fifth digit.
        if (key <= '5')
        {
          lcd.print(key);
          conPos = 10;
          conDig++;
          segundos = (key - 48) * 10;
          break;

        case 5:
          lcd.setCursor(conPos, 1);    // conPos = 7. Segundos. Sixth digit.
          lcd.print(key);
          conDig++;
          segundos = segundos + (key - 48);
          lcd.noBlink();
          delay(2000);
          break;
        }
    }
    while (conDig == 6)
    {
      comienza();
    }
  }

}
Title: Re: Migliorare Timer Progetto
Post by: fabpolli on Jun 28, 2018, 09:14 am
Tu fai una setCursor per posizionare il cursore e visualizzare la cifra inserita, poi aumenti la posizone che dovrà assumere il cursore (conDig) ma non riposizioni il cursore finché l'utente non inserisce la cifra.
Per risolvere fuori dallo switch metti
Code: [Select]

lcd.setCursor(conPos, 1);

Ma noto anche un altro problema, sulla prima cifra verifichi che il valore inserito sia minore o uguale a due, si suppone quindi che non vuoi gestire ore superiori alle 24 ore, ma nei case successivi non c'è traccia di controlli, ovvero l'utente dopo aver messo il primo due è libero di imputare H29:M59:S59

Title: Re: Migliorare Timer Progetto
Post by: fabpolli on Jun 28, 2018, 09:15 am
Nel momento in cui Arduino esegue la break di un case non esegue gli altri. Di conseguenza
1) la lcd.blink() la esegue solo se entra nel case 0
2) la lcd.noblink la esegue solo se entra nel case 5.

Se vuoi che valgano per tutti i casi basta metterli una prima dell'inizio e una dopo la fine dello switch
Una volta invocato il metodo blink il cursore continua a lampeggiare finché non viene invocato il metodo noBlink quindi non serve eseguirlo ad ogni ciclo di loop
Title: Re: Migliorare Timer Progetto
Post by: fabpolli on Jun 28, 2018, 02:18 pm
Grazie, non lo sapevo (non avevo neanche capito cosa facesse)
:o non prendertela a male... ma se non hai capito a cosa serve un istruzione dai dei suggerimenti così a casaccio???
Title: Re: Migliorare Timer Progetto
Post by: gpb01 on Jun 28, 2018, 02:31 pm
... dai dei suggerimenti così a casaccio???
... e, per di più, poi piglia e cancella il post così non si capisce più nulla ! Che brutto vizio che ha certa gente ...  >:(

Guglielmo
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jul 05, 2018, 08:24 pm
levatemi l ultimo dubbio e poi chiudo il post...

sono riuscito a fare funzionare il tutto...xrò ho una domanda.. ho riletto questo codice 1ml di volte e non capisco perchè funziona solo nel loop()

se lo inserisco fuori dal loop  non mi inserisce il valore da tastiera come se la tastiera non e collegata come mai?
Title: Re: Migliorare Timer Progetto
Post by: Patrick_M on Jul 05, 2018, 08:55 pm
beh, il loop è l'unica cosa che funziona... cioè dopo aver eseguito il setup, arduino ripete le istruzioni del loop e basta.
per eseguire "pezzi" fuori dal loop bisogna che questi "pezzi" siano delle funzioni complete e verranno eseguite solamente se nel loop ci sarà la chiamata a queste funzioni, eventuali pezzi o funzioni non chiamate non verranno eseguite
unica eccezzione le routine di interrupt... ma questo è un altro discorso :)
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jul 05, 2018, 11:07 pm
beh, il loop è l'unica cosa che funziona... cioè dopo aver eseguito il setup, arduino ripete le istruzioni del loop e basta.
per eseguire "pezzi" fuori dal loop bisogna che questi "pezzi" siano delle funzioni complete e verranno eseguite solamente se nel loop ci sarà la chiamata a queste funzioni, eventuali pezzi o funzioni non chiamate non verranno eseguite
unica eccezzione le routine di interrupt... ma questo è un altro discorso :)

Quindi come lo dovrei scrivere x farlo funzionare fuori dal loop?
Title: Re: Migliorare Timer Progetto
Post by: Patrick_M on Jul 05, 2018, 11:18 pm
devi fare una funzione
Code: [Select]
void miaFunzione(void) {
   //tutta la serie di istruzioni relative
   //alla funzione
   //in oggetto
   //per esempio
   //una serie
   //di stampe
}
//poi nel loop quando ti serve la chiami
void loop() {
   miaFunzione();
   ...
   ...
}

questo è un esempio
ma per che motivo la vuoi spostare "fuori dal loop?
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jul 06, 2018, 06:51 am
devi fare una funzione
Code: [Select]
void miaFunzione(void) {
   //tutta la serie di istruzioni relative
   //alla funzione
   //in oggetto
   //per esempio
   //una serie
   //di stampe
}
//poi nel loop quando ti serve la chiami
void loop() {
   miaFunzione();
   ...
   ...
}

questo è un esempio
ma per che motivo la vuoi spostare "fuori dal loop?

xkè volevo inserire che dopo aver inserito il tempo spuntasse una nuova schermata con scritto "pronto" "premi un puls x iniziare" e parte un countdown pre-partita...che da il tempo di chiudere e posare la valigetta...

va bene grazie dell esempio...continuerò a fare delle prove
Title: Re: Migliorare Timer Progetto
Post by: Silente on Jul 06, 2018, 08:00 am
Tutto dipende da COME scrivi la funzione. Postane una che vediamo. Poi chiaramente la devi richiamare nel loop() al posto giusto.
Poi ti do un consiglio: non farti prendere dalla funzionmania, non riempire di funzioni. Metti in funzione quello che ripeti uguale (o quasi) nel loop, così vinci un terno all'otto
Title: Re: Migliorare Timer Progetto
Post by: testato on Jul 06, 2018, 08:48 am
vinci un terno all'otto
Fatto n1: non è di Napoli
Title: Re: Migliorare Timer Progetto
Post by: Patrick_M on Jul 06, 2018, 09:48 am

Fatto n1: non è di Napoli
:D


xkè volevo inserire che dopo aver inserito il tempo spuntasse una nuova schermata con scritto "pronto" "premi un puls x iniziare" e parte un countdown pre-partita...che da il tempo di chiudere e posare la valigetta...

va bene grazie dell esempio...continuerò a fare delle prove
questo lo puoi fare a prescindere da dove hai scritto le istruzioni di "preparazione", la separazione in funzioni serve più che altro a semplificarti la vita nella stesura dei programmi ma non è strettamente necessaria al loro funzionamento. Aumentano la leggibilità ma il fatto di richiamare una funzione dal loop oppure mettere in quel punto tutte le istruzioni della funzione come dicevo non cambia proprio nulla. quindi la nuova schermata devi essere capace di implementarla... a prescindere ;)
Title: Re: Migliorare Timer Progetto
Post by: Fabiok89 on Jul 06, 2018, 10:45 am
:D


questo lo puoi fare a prescindere da dove hai scritto le istruzioni di "preparazione", la separazione in funzioni serve più che altro a semplificarti la vita nella stesura dei programmi ma non è strettamente necessaria al loro funzionamento. Aumentano la leggibilità ma il fatto di richiamare una funzione dal loop oppure mettere in quel punto tutte le istruzioni della funzione come dicevo non cambia proprio nulla. quindi la nuova schermata devi essere capace di implementarla... a prescindere ;)
Io la schermata sono riuscito a riempirla... Ma ovviamente questo comporta un'altro errore che nn capisco quale... Sopra avevo creato uno sketch solo con il timer... E funziona perfettamente... Mi lampeggiano le cifre che mi interessano... Ecc... Ricopio tutto nel codice principale... I valori non mi cambiano e nn mi lampeggiano le cifre... Stesso identico codice... Appena arrivo a casa vi posto il tutto