pulsante reset per contatore

Salve a tutti
sono da pochissimo che ho iniziato con arduino quindi non me ne vogliate se vi faccio questa domanda ma e da tanto che ci sto sbattendo senza risultati.
come posso inserire nello sketch un comando che mi azzeri il contatore ogni volta premuto? e che subito dopo riparte di nuovo da zero?

//Variabili per la comunicazione seriale
int data1 = 10;
int data2 = 8 ;
int clock = 12;
int latch1 = 11;
int latch2 = 9;

//Variabili per la determinazione delle cifre
int u  = 0;
int d  = 0;
int c  = 0;
int um = 0;
int dm = 0;
int cm = 0;
int n  = 0;

//Variabili per la determinazione del tempo
int z  = 1;
int di = 0;
int y  = 0;
int t  = 1000;
int ti = 1;

void setup () {
  pinMode ( data1 , OUTPUT);
  pinMode ( data2 , OUTPUT);
  pinMode ( clock , OUTPUT);
  pinMode ( latch1, OUTPUT);
  pinMode ( latch2, OUTPUT);
}

void loop () {
  for (y = 0; y < t; y += ti) {
  switch (z) {
    case 1: N(u ); di = 2  ;      break;
    case 2: N(d ); di = 4  ;      break;
    case 3: N(c ); di = 8  ;      break;
    case 4: N(um); di = 16 ;      break;
    case 5: N(dm); di = 32 ;      break;
    case 6: N(cm); di = 64 ; z=0; break;
  }
  
  digitalWrite ( latch2 , LOW  );
  shiftOut     ( data2, clock, MSBFIRST, di );
  digitalWrite ( latch2 , HIGH );
  z += 1;
  delay (ti);
  }
  
  u += 1;
  if (u  > 9 ) {d  += 1 ; u  = 0;}
  if (d  > 9 ) {c  += 1 ; d  = 0;}
  if (c  > 9 ) {um += 1 ; c  = 0;}
  if (um > 9 ) {dm += 1 ; um = 0;}
  if (dm > 9 ) {cm += 1 ; dm = 0;}
  if (cm > 9 ) {cm  = 0 ; dm = 0; um = 0; c = 0; d = 0; u  = 0;}
}

void N(int n) {
     S();
  digitalWrite(latch1,LOW);
    switch (n) {
    case 0: shiftOut(data1, clock, MSBFIRST, 16 ); break;
    case 1: shiftOut(data1, clock, MSBFIRST, 219); break;
    case 2: shiftOut(data1, clock, MSBFIRST, 40 ); break;
    case 3: shiftOut(data1, clock, MSBFIRST, 136); break;
    case 4: shiftOut(data1, clock, MSBFIRST, 194); break;
    case 5: shiftOut(data1, clock, MSBFIRST, 132); break;
    case 6: shiftOut(data1, clock, MSBFIRST, 4  ); break;
    case 7: shiftOut(data1, clock, MSBFIRST, 216); break;
    case 8: shiftOut(data1, clock, MSBFIRST, 0  ); break;
    case 9: shiftOut(data1, clock, MSBFIRST, 128); break;
    }
  digitalWrite (latch1,HIGH);
}

void S() {
   digitalWrite ( latch2, LOW );
   shiftOut     ( data2, clock, MSBFIRST, 0);
   digitalWrite ( latch2, HIGH);
  }

Se ho sbagliato qualcosa vi chiedo gentilmente di avvisarmi così provvederò subito alla modifica

grazie in anticipo a tutti

In conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie. :slight_smile:

Guglielmo

P.S.: ti consiglio anche di togliere tutte quelle righe vuote e di seguire quanto spiegato al punto 17.2 del REGOLAMENTO

Grazie mille.. Ho seguito quanto detto..

Ma ... ma hai tradotto le parole chiave del 'C' in Italiano ? ? ? :o :o :o

Quel programma NON compilerà mai ... i termini devono restare TUTTI in Inglese, non puoi tradurre il codice ...
... copia/incolla da pagina tradotta da Google immagino. Torna dove hai preso il codice e copialo senza traduzione dopo di che mettilo tra i tag CODE e dacci il codice esatto !

Guglielmo

salve e scusatemi dei tanti casini che sto combinando.. il codice era giusto è stato chrome a tradurlo

Non c’è nessuno che riuscirebbe a darmi una risposta? Almeno spiegarmi come procedere?

pasquale898989:
… come posso inserire nello sketch un comando che mi azzeri il contatore ogni volta premuto? e che subito dopo riparte di nuovo da zero?

… scusa, QUALE contatore? Io vedo molte variabili, ma nessuna di nome ‘contatore’ … ::slight_smile:

Se imparaste a scrivere i programmi in modo leggibile, usando nomi di variabili che hanno un senso, probabilmente sarebbe molto più facile aiutarvi … :confused:

Guglielmo

Ma cos'è il programma?
Cosa fa?
Se non si sa questo come si potrebbe modificare?

Io mi sono fatto l'idea che sia un cronometro
Un fracco di shiftout e un po' di potenze di due

Ma magari mi sono sbagliato

Comunque pessimamente indentato

Lo hai copiato?
Da dove?

E un semplice cronometro..

Anch'io ho capito poco la logica del programma, comunque in linea di massima a te serve leggere lo stato del pulsante e azzerare una variabile.
Tipo

 if (digitalRead(PIN) == HIGH) {
  variabile = 0;
}

Direi che andrebbe messo nel loop...
In ogni caso vedo dei delay che potrebbero influire sulla lettura bloccando il micro.

pasquale898989:
E un semplice cronometro..

E basta?

È tutta la tua risposta?

Qual è la variabile di conteggio?

Quali pin hai occupato?
Che scheda usi?
Sai cos'è un debounce?

Non è che dobbiamo ricostruire il progetto da zero perché tu stai abbottonato...

Ripeto la domanda: se lo hai copiato, perché lo HAI copiato, da dove?

Scusatemi.. Rispondo e spero che riesca a darvi capire quello che dovrei fare con la mia ignoranza in questa materia.. Ho creato un cronometro con display a 7 segmenti fatti con le strisce LED. . Ho collegato il tutto facendo partire e funzionare. . Nella foto c'è lo schema elettrico.. I pin utilizzati sono 8,9,10,11,12 collegati ai shift register(74hc595)e il 3 vorrei usarlo come pulsante.. Ora.. Il circircuito è già montato e funzionante... L'unica cosa che vorrei fare è far azzerare solo il contatore non la scheda quando premo il pulsante in qualsiasi momento.. La scheda è una arduino uno r3 compatibile. Lo schetch l'ho trovato su internet.. Al momento non sono al PC e non posso mandarvi il link da dove lo abbia preso...sto chiedendo tanto? Capisco di elettronica ma non di programmazione. . Infatti a leggere gli schemi elettrici non ho problemi perché lo faccio anche di mestiere. . Per quello che ho letto e visto il debaunce e un antirimbalzo.. Ma questo l'ho capito ma non so proprio come muovermi nello schetch

Allora dire che è abbastanza facile

Colleghi un pulsante tra +5v e pin3, metti una resistenza da 10k tra pin 3 e gnd

Usi il pezzo di programma che ti ha consigliato fratt

Il nome della variabile

Sono più di una

Devi resettare sia u che d che c e tutte le sue sorelle

Ma quello non è uno "schema elettrico"... E' uno schema pratico di montaggio!
Inoltre, non riesco a capire... Unità, decine e centinaia di secondi e unità, decine e centinaia di minuti???...
I nomi delle variabili e delle funzioni, poi, dovrebbero almeno lasciar intuire a che cosa servono! La funzione N, per esempio, potrebbe chiamarsi Visualizza. Vedo che contiene la codifica a 7 segmenti, con i segmenti accesi a livello basso. S che fa? Spegne un display per togliere gli zeri non significativi?...

Unità di migliaia
decine di migliaia
Centinaia di migliaia

Quel coso conta fino a un megasecondo

Con la precisione del clok interno

E con un refresh dei display di un millesimo di secondo
Usando mille refresh come se fosse un secondo, senza compensare il tempo di elaborazione
Tempo una settimana ed è fuori orario di alcune ore

Sì, è sbagliato il concetto. I secondi devono incrementare di uno ogni volta che millis() aumenta di 1000.

grazie a tutti voi del supporto… ho risolto inserendo l’aiuto di fratt…
con la mia ignoranza ci ero quasi riuscito pero mi serviva solo una conferma da voi più esperti…
questo è il nuovo codice

//Variabili per la comunicazione seriale
int data1 = 5;
int data2 = 3 ;
int clock = 7;
int latch1 = 6;
int latch2 = 4;
int puls = 8;
int statopuls =0;

//Variabili per la determinazione delle cifre
int u  = 0;
int d  = 0;
int c  = 0;
int um = 0;
int dm = 0;
int cm = 0;
int n  = 0;

//Variabili per la determinazione del tempo
int z  = 1;
int di = 0;
int y  = 0;
int t  = 800;
int ti = 1;

void setup () {
  pinMode ( data1 , OUTPUT);
  pinMode ( data2 , OUTPUT);
  pinMode ( clock , OUTPUT);
  pinMode ( latch1, OUTPUT);
  pinMode ( latch2, OUTPUT);
  pinMode (puls, INPUT_PULLUP);
}

void loop () {
  statopuls = digitalRead (puls);
   if (statopuls == 0){
   u +1;
  

  }else{
 
    if (statopuls == 1){
     u = 0;
    d = 0;
    c = 0;
    um = 0;
    dm = 0;
    cm = 0;  ;
    
  }
  }
  
      
  for (y = 0; y < t; y += ti) {
  switch (z) {
    case 1: N(u ); di = 2  ;      break;
    case 2: N(d ); di = 4  ;      break;
    case 3: N(c ); di = 8  ;      break;
    case 4: N(um); di = 16 ;      break;
    case 5: N(dm); di = 32 ;      break;
    case 6: N(cm); di = 64 ; z=0; break;
  }
  
  digitalWrite ( latch2 , LOW  );
  shiftOut     ( data2, clock, MSBFIRST, di );
  digitalWrite ( latch2 , HIGH );
  z += 1;
  delay (ti);
  }
  
  u += 1;
  if (u  > 9 ) {d  += 1 ; u  = 0;}
  if (d  > 5 ) {c  += 1 ; d  = 0;}
  if (c  > 9 ) {um += 1 ; c  = 0;}
  if (um > 5 ) {dm += 1 ; um = 0;}
  if (dm > 9 ) {cm += 1 ; dm = 0;}
  if (cm > 6 ) {cm  = 0 ; dm = 0; um = 0; c = 0; d = 0; u  = 0;}
}

void N(int n) {
     S();
  digitalWrite(latch1,LOW);
    switch (n) {
    case 0: shiftOut(data1, clock, MSBFIRST, 63 ); break;
    case 1: shiftOut(data1, clock, MSBFIRST, 6); break;
    case 2: shiftOut(data1, clock, MSBFIRST, 91 ); break;
    case 3: shiftOut(data1, clock, MSBFIRST, 79); break;
    case 4: shiftOut(data1, clock, MSBFIRST, 102); break;
    case 5: shiftOut(data1, clock, MSBFIRST, 109); break;
    case 6: shiftOut(data1, clock, MSBFIRST, 125  ); break;
    case 7: shiftOut(data1, clock, MSBFIRST, 7); break;
    case 8: shiftOut(data1, clock, MSBFIRST, 127  ); break;
    case 9: shiftOut(data1, clock, MSBFIRST, 103); break;
    }
  digitalWrite (latch1,HIGH);
}

void S() {
   digitalWrite ( latch2, LOW );
   shiftOut     ( data2, clock, MSBFIRST, 0);
   digitalWrite ( latch2, HIGH);
  }

ringrazio infinitamente ancora a tutti e vi chiedo scusa se ho creato casini … purtroppo e un mondo nuovo per me e penso sia normale avere delle difficoltà…