Orologio con MAX7221

Ciao a tutti!

Sto cercando di fare un orologio 7 sementi con Arduino UNO e MAX 7221, ma non riesco a trovare un modo per impostare l’ora iniziale.

Se faccio così, il programma mi salta la procedura interamente:

int minuti=0;
int decineminuti=0;
int ore=0;
int decineore=0;

int impminuti=9;
int impore=8;
int ok=7;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
  pinMode(ok,INPUT);
  pinMode(impore,INPUT);
  pinMode(impminuti,INPUT);
}

void impostaOra(int &minuti, int &decineminuti, int &ore, int &decineore)
{
  //while (digitalRead(ok)==LOW)
  {
    if(digitalRead(impminuti)==HIGH)// se viene premuto il pulsante per impostare i minuti
    {
      if(decineminuti<1)//controlliamo che non sia già stato premuto 10 volte
      {
        minuti++;//in tal caso incrementiamo solo i minuti
      }
      if(decineminuti>1)//altrimenti incrementiamo i minuti e le decine di minuti
      {
        decineminuti++;
        minuti++;
      }
    }

    lc.setDigit(0,0,byte(minuti),false);
    lc.setDigit(0,1,byte(decineminuti),false);

 
    if(digitalRead(impore)==HIGH)// se viene premuto il pulsante per impostare le ore
    {
      if(decineore<1)//controlliamo che non sia già stato premuto 10 volte
      {
        ore++;//in tal caso incrementiamo solo le ore
      }
      if(decineore>1)//altrimenti incrementiamo le ore e le decine di ore
      {
        decineore++;
        ore++;
      }
    }
    lc.setDigit(0,3,byte(ore),true);
    lc.setDigit(0,4,byte(decineore),false);
    delay(500);
  }
}

Grazie per tutti i suggerimenti che potrete darmi!
Buona serata.

Mattia

Nota del moderatore - Per questa volta ti ho racchiuso io il codice nei tag CODE, la prossima volta sei pregato di ricordartene. Grazie. - gpb01

Ciao,
essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO

… inoltre, in conformità al suddetto regolamento, punto 7, edita (in basso a destra del post, bottone More → Modify) il tuo post e racchiudi il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

@mattia, io ci ho capito poco. Il MAX7221 serve per pilotare il display. Nel codice manca la loop() quindi parrebbe solo un pezzo del programma. Cosa vuol dire un'ora iniziale, hai un RTC (orologio) ? Arduino non ha un orologio interno.

Ciao!
Scusate se non mi sono spiegato bene…cercherò di chiarire qui di seguito.
Allora, il mio intento è quello di creare una specie di orologio/cronometro con un Arduino, 4 display 7 segmenti e un MAX 7221.
Riguardo al MAX e ai display non ho molti problemi, il mio vero problema è fare in modo che, senza RTC, che non ho, io possa fare in modo di avere un pulsante per impostare l’ora, uno per impostare i minuti e uno per confermare queste stesse impostazioni.
Di seguito allego l’intero codice, che spero possa fare in modo che voi riusciate ad aiutarmi in questa ardua impresa.
Poi logicamente, se un RTC mi risparmia un sacco di lavoro, che benvenga, ne andrò poi a comprare uno.

//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=250;

int minuti=0;
int decineminuti=0;
int ore=0;
int decineore=0;

int impminuti=9;
int impore=8;
int ok=7;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
  pinMode(ok,INPUT);
  pinMode(impore,INPUT);
  pinMode(impminuti,INPUT);
}

void impostaOra(int &minuti, int &decineminuti, int &ore, int &decineore)
{
  //while (digitalRead(ok)==LOW)
  {
    if(digitalRead(impminuti)==HIGH)// se viene premuto il pulsante per impostare i minuti
    {
      if(decineminuti<1)//controlliamo che non sia già stato premuto 10 volte
      {
        minuti++;//in tal caso incrementiamo solo i minuti
      }
      if(decineminuti>1)//altrimenti incrementiamo i minuti e le decine di minuti
      {
        decineminuti++;
        minuti++;
      }
    }

    lc.setDigit(0,0,byte(minuti),false);
    lc.setDigit(0,1,byte(decineminuti),false);

 
    if(digitalRead(impore)==HIGH)// se viene premuto il pulsante per impostare le ore
    {
      if(decineore<1)//controlliamo che non sia già stato premuto 10 volte
      {
        ore++;//in tal caso incrementiamo solo le ore
      }
      if(decineore>1)//altrimenti incrementiamo le ore e le decine di ore
      {
        decineore++;
        ore++;
      }
    }
    lc.setDigit(0,3,byte(ore),true);
    lc.setDigit(0,4,byte(decineore),false);
    delay(500);
  }
}


void contaOre(int minuti, int decineminuti, int ore, int decineore)
{
  lc.setChar(0,5,'0x1h',false);
  while(minuti<9)
  {
    delay(600);//facciamo passare un minuto
    minuti++;//incrementiamo i minuti
    lc.setDigit(0,0,byte(minuti),false);
  }
  minuti=0;
  decineminuti++;
  lc.setDigit(0,1,byte(decineminuti),false);
}





void loop() 
{ while(digitalRead(ok)==LOW)
  {
  impostaOra(minuti,decineminuti,ore,decineore);
  }
  contaOre(minuti,decineminuti,ore,decineore);
}

Il problema che ho con questo codice è che, appunto, salta direttamente il void dell’impostaore e dell’impostaminuti.
Grazie della vostra attenzione.

Mattia

ciao, l'RTC in realta non ti risparmia un sacco di lavoro, semplicemente tiene traccia del tempo molto meglio di un arduino

quindi anche se stacchi l'alimentazione o resetti il micro l'RTC mantiene comunque l'ora che rimane aggiornata al prossimo riavvio di arduino

Ok. Ma riguardo al problema delle ore...non c'è nessuno che possa aiutarmi?

In qualsiasi caso, volendo fare in modo che il micro non esegua le operazioni dopo finchè non viene premuto un tasto di start, com'è possibile fare?

Mattia9914: In qualsiasi caso, volendo fare in modo che il micro non esegua le operazioni dopo finchè non viene premuto un tasto di start, com'è possibile fare?

... condizionare quello che si deve fare ad una flag che viene messa vera dalla pressione del tasto e ... e poi chi la rimette falsa ? La fine delle cose da fare ?

Devi spiegare esattamente tutto il ciclo di ciò che vuoi fare ...

Guglielmo

Essenzialmente devo realizzare una funzione cronometro: devo fare in modo che, finchè l'utente non ha premuto avvio, egli sia in grado di aumentare le decine e le unità di secondi. Dopo averle impostate, basterà premere avvio per fare iniziare il countdown. Molto semplicemente, è questo ciò che voglio fare, ma non so come realizzarlo.

La strada più semplice per iniziare sono tre pulsanti ... ... il primo lo usi per incrementare le decine, il secondo per incrementare le unità ed il terzo come start/stop.

Dato che parliamo di pulsanti ricorda che dovrai attuare delle tecniche di "debuncing" (cerca su Google) o via software o, più semplicemente, via hardware.

Ti servirà poi padroneggiare bene la funzione millis(), per cui ... ti consiglio di studiare prima QUI, poi QUI ed infine anche QUI e QUI.

Guglielmo

Mattia9914: Essenzialmente devo realizzare una funzione cronometro: devo fare in modo che, finchè l'utente non ha premuto avvio, egli sia in grado di aumentare le decine e le unità di secondi. Dopo averle impostate, basterà premere avvio per fare iniziare il countdown. Molto semplicemente, è questo ciò che voglio fare, ma non so come realizzarlo.

quindi vuoi realizzare un semplice timer? giusto? tipo quelli che qui molti usano per far spegnere il bromografo dopo tot minuti :)

Esatto elrospo, mi hai letto nel pensiero! Penso che ci siano sketch sul sito, andrò a cercarne uno.

Grazie!

Allora.. prima di iniziare devi stabilire l'hardware che devi usare,

il minimo dovrebbe essere un encoder con pulsante piu le cifre leds,

almeno io ho usato questo, http://www.robotstore.it/product/500/Encoder-Rotativo-Illuminato-Rosso-Verde.html

il max e le cifre led quattro sopra e quattro sotto

il tempo mm:ss (l'ultimo) viene sempre memorizzato nelle memorie, all'avvio le memorie vengono lette e si parte sempre con quel tempo appena giro l'encoder,

se invece premo il pulsante 1 volta inizia a lampeggiare la prima cifra 2 la seconda cifra ecc.. girando l'encoder si regola la cifra che lampeggia a fine regolazione le 4 cifre vengono memorizzate in memoria

se avvio arduino con il pulsante premuto posso regolare/memorizzare la luminosità dei display

alla fine del countdown un pin da basso passa alto e un altro da alto passa basso ;)

come vedi alcune cose "ardware" devi deciderle prima es come impostare facilmente l"ora" cifra per cifra