Arduino Forum

International => Italiano => Software => Topic started by: Flavi71 on Nov 11, 2018, 02:03 am

Title: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 11, 2018, 02:03 am
Salve a tutti, devo costruire un contapezzi manuale, il circuito è molto semplice, ogni volta che premo un pulsante mi va ad aumentare di una unità la variabile buttonPushCounter e il risultato viene visualizzato su un display a 7 segmenti (il modello che ho disponibile è quello in foto allegata). Un secondo pulsante mi va ad azzerare il contatore e pulisce il display.

Il tutto funziona col monitor seriale, ma se collego il display visualizzo solo le cifre da 1 a 9 poi le lettere da "a" a F poi si ferma. Io ho la necessità di arrivare a contare fino a 90, ma non so come "dire" al display di visualizzare le 2 cifre del contatore.

Ho studiato il funzionamento su Playground, https://playground.arduino.cc/Main/LedControl#Seg7Control
e credo che necessiti usare la funzione

Code: [Select]

void printNumber(int v) {
    int ones;
    int tens;
    int hundreds;
    boolean negative;
[code]

ma non riesco a capirne il funzionamento. Chiedo qualche suggerimento, non la soluzione, voglio arrivarci da solo  :D

Questo è il codice del contapezzi che ho provato.

[code]

 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
      lc.setDigit(0,0,buttonPushCounter,false);
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (buttonPushCounter = 0);
       lc.clearDisplay(0);
    }
  }
[/code]
[/code]
Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 11, 2018, 10:23 am
Ciao! Premettiamo che stai usando una libreria, il display si potrebbe controllare anche senza librerie ma sarebbe molto complicato!

Nel link che hai mostrato c'è la soluzione, forse non è cosi immediato capirla per un principiante come NOI! :)

Nel display a 7 segmenti gestisci la stampa su un solo riquadro! Se il display è a 2 cifre, prima stampo le unità e poi stampo le decine, non è come un lcd che automaticamente  stampa più cifre.


Per cui tu hai un numero intero che va da 0 a 90,
1) Ti ricavi le unità
2)Ti ricavi le decine
3) Stampi le unità sul display
4) Stampi le decine sul display


Adesso per ricavare le unità prendi il resto della divisione per dieci, e in C si fa con l'operatore %


Esempio :

Code: [Select]


int contatore=46;
int unità=0;
int decine=0;

void loop(){

   unita=contatore%10; // Il resto della divisione per 10 sono la cifra unità
   decine=contatore/10; // Divido il numero per 10 e ottengo le decine
  
   lc.setDigit(0,0,(byte)unita,false);// stampo le cifre delle unita
   lc.setDigit(0,1,(byte)decine,false);// stampo le cifre delle decine
  
}


Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 11, 2018, 10:35 am
Che poi è quello che cera scritto nel link da te postato ;)

Nel link non calcola solo decine e unità ma anche le migliaia!


Dal tuo link

Code: [Select]


ones=v%10;
    v=v/10;
    tens=v%10;
    v=v/10;
    hundreds=v;
    if(negative) {
       //print character '-' in the leftmost column
       lc.setChar(0,3,'-',false);
    }
    else {
       //print a blank in the sign column
       lc.setChar(0,3,' ',false);
    }
    //Now print the number digit by digit
    lc.setDigit(0,2,(byte)hundreds,false);
    lc.setDigit(0,1,(byte)tens,false);
    lc.setDigit(0,0,(byte)ones,false);
}




Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 11, 2018, 11:10 am
Ok grazie Torn, con la tua spiegazione mi è più chiaro, ora provo ad applicarlo.
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 12, 2018, 12:45 am
Ok sono riuscito nel mio intento, contare fino a 90, ma per curiosità ho provato a inserire anche la variabile per le centinaia in modo da poter contare anche oltre il 99, ma al nr. 100 appare la scritta 1a0  e a 110 appare 1b0 e così via senza però visualizzare 100...110...120... Cosa c'è di sbagliato?

Code: [Select]


 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;

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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
 unita=contatore%10;
 decine=contatore/10;
 centinaia=contatore/100;
 
      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
  }
Title: Re: Contapezzi con display 7 segment
Post by: Silente on Nov 12, 2018, 07:03 am
La sequenza corretta di operazioni é
Variabile n=numero%10;
Numero=numero/10;
Varuabile n1=numero%10;
Numero=numero/10
... E così via.
Se metti le variabilinin un array con una for ti fai fino a quando vuoi (salvo poi finire i pin)
Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 12, 2018, 07:05 am
Ciao! Di sbagliato c'è il modo in cui calcoli le migliaia!



Code: [Select]

// Tu fai cosi e non stai calcolando le migliaia...
unita=contatore%10;
 decine=contatore/10;
 centinaia=contatore/100;

/******************************************/

//Dovrebbe essere [b]per passare all'ordine di grandezza superiore dividi sempre per 10 e poi prendi il resto[/b]

unita=contatore%10; //Resto della divisione per dieci sono le unità
contatore=contatore/10; // Divido per dieci adesso contatore contiene le DECINE esempio 23 decine
decine=contatore%10;// Prendo il resto della divisione per dieci e sono le decine

// Esempio se contatore è uguale a 23 DECINE prendo il resto e sono 3 decine


 centinaia=contatore/10;// Adesso decine diviso 10 sono le centinaia ESEMPIO 23 decine/10=2,3
//visto che usiamo variabili intere int, in centinaia sarà inserito solo 2


Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 15, 2018, 12:02 am
La sequenza corretta di operazioni é
Variabile n=numero%10;
Numero=numero/10;
Varuabile n1=numero%10;
Numero=numero/10
... E così via.
Se metti le variabilinin un array con una for ti fai fino a quando vuoi (salvo poi finire i pin)
Allora seguendo la sequenza di Silente ho compilato il codice che segue, ma il risultato che ottengo è che appare solo il nr. 1 poi basta, resta fermo lì!!

Code: [Select]

[code]

 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
     
 unita=contatore%10;
 contatore=contatore/10;
 decine=contatore%10;
 contatore=contatore/10;
 centinaia=contatore%10;
 contatore=contatore/10;
 
      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
  }


Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 15, 2018, 12:14 am
Ciao! Di sbagliato c'è il modo in cui calcoli le migliaia!



Code: [Select]

// Tu fai cosi e non stai calcolando le migliaia...
unita=contatore%10;
 decine=contatore/10;
 centinaia=contatore/100;

/******************************************/

//Dovrebbe essere [b]per passare all'ordine di grandezza superiore dividi sempre per 10 e poi prendi il resto[/b]

unita=contatore%10; //Resto della divisione per dieci sono le unità
contatore=contatore/10; // Divido per dieci adesso contatore contiene le DECINE esempio 23 decine
decine=contatore%10;// Prendo il resto della divisione per dieci e sono le decine

// Esempio se contatore è uguale a 23 DECINE prendo il resto e sono 3 decine


 centinaia=contatore/10;// Adesso decine diviso 10 sono le centinaia ESEMPIO 23 decine/10=2,3
//visto che usiamo variabili intere int, in centinaia sarà inserito solo 2




Scusa ma a cosa serve calcolare le migliaia se fino a 999 bastano le centinaia?
Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 15, 2018, 07:51 am
Se guardavi il codice trovavi scritto centinaia! Quindi mi sono sbagliato ma il codice è corretto!

Nel codice ho messo commenti che spiegavano il ragionamento, ma visto che non le hai letti non hai capito.
PER L'ULTIMA CIFRA devi dividere solo per 10 e non prendere il resto


Ti faccio un esempio NUMERO=498

unita=NUMERO%10  unita vale 8 resto
NUMERO=NUMERO/10  numero vale 49 decine
decine=NUMERO%10 decine vale 9 resto di 10
Centinaia=NUMERO/10   49 DECINE/10  4 CENTINAIA


Questo perché usiamo variabili in  49/10 fa 4,9  ma noi prendiamo solo la parte intera 4

Code: [Select]


unita=contatore%10; // Resto di dieci sono le unità
 contatore=contatore/10; // Divido per dieci e ottengo le decine che potrebbero essere superiori a 46
 decine=contatore%10; // Prendo il resto e ottengo le decine
centinaia=contatore/10; // Sono già le centinaia non c'è bisogno di prendere il resto

 




Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 15, 2018, 08:31 am
Ho visto che hai aperto un altra discussione su display, mi sembra che ti hanno suggerito una libreria diversa da quella che usi con cui puoi stampare direttamente un numero a più cifre!
A seconda della libreria che usi fai le cose in modo diverso, più semplice o più complesso.
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 15, 2018, 01:23 pm
Ho visto che hai aperto un altra discussione su display, mi sembra che ti hanno suggerito una libreria diversa da quella che usi con cui puoi stampare direttamente un numero a più cifre!
A seconda della libreria che usi fai le cose in modo diverso, più semplice o più complesso.
Si Torn, perchè per il mio progetto contapezzi volevo sostituire il Display 8 cifre MAX 7219 con quello a 4 cifre TM1637, visto che 4 cifre sono più che sufficienti per quello che devo contare, ma il TM 1637 sto imparando a usarlo perchè ho visto che i comandi da dargli sono diversi.
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 15, 2018, 01:38 pm
Se guardavi il codice trovavi scritto centinaia! Quindi mi sono sbagliato ma il codice è corretto!

Nel codice ho messo commenti che spiegavano il ragionamento, ma visto che non le hai letti non hai capito.
PER L'ULTIMA CIFRA devi dividere solo per 10 e non prendere il resto
Scusa Torn o sono "de coccio" io o ... ho sostituito la porzione di codice esattamente uguale alla tua, ma non cambia nulla, appare solo il numero 001 e poi non va più avanti.


Code: [Select]


 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
     
 unita=contatore%10;
 contatore=contatore/10;
 decine=contatore%10;
 centinaia=contatore/10;
 
      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
  }


Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 15, 2018, 04:11 pm
Avevi detto che fino a 90 contava, quindi dovrebbe funzionare.
Se contava fino a 90 adesso dovrebbe contare fino a 999, non vedo motivi perché non lo faccia!
Controlla anche i collegamenti elettronica.
Prova a vedere se cosi il programma funziona! Ho semplificato la lettura del pulsante togliendo l'antirimbalzo, io i pulsanti li uso cosi con un piccolo delay() e non ho problemi.

Code: [Select]




 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
}

void loop() {
  
    if (digitalRead(buttonPin)==HIGH){
      
        contatore++;
      
        unita=contatore%10;
        contatore=contatore/10;
        decine=contatore%10;
        centinaia=contatore/10;
 
        lc.setDigit(0,2,(byte)centinaia,false);
        lc.setDigit(0,1,(byte)decine,false);
        lc.setDigit(0,0,(byte)unita,false);
    }
    if(contatore>999) contatore=0; // Ritorna a zero quando deve contare 1000
    delay(200);
  
  

  
    if  (digitalRead(buttonReset) == HIGH){
        (contatore = 0);
         lc.clearDisplay(0);
    }
  }








Title: Re: Contapezzi con display 7 segment
Post by: Silente on Nov 15, 2018, 04:52 pm
Fa un gioco: aggiungi la seriale, anche se non sarà parte del programma definitivo. Scrivi su seriale il contatore e le sue varie parti per poter verificare se la procedura di calcolo è giusta, e se Quindi il problema si trova nella parte di rappresentazione.
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 15, 2018, 09:55 pm
Con queste righe di codice (stessi collegamenti) conta fino a 99 senza problemi e lo visualizza correttamente sul display.

Code: [Select]

unita=contatore%10;
decine=contatore/10;

      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
[code]
[/code]

Il tuo codice modificato l' ho provato Torn ma non funziona, mi da lo stesso risultato, solo 001 poi si ferma.
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 15, 2018, 11:11 pm
Fa un gioco: aggiungi la seriale, anche se non sarà parte del programma definitivo. Scrivi su seriale il contatore e le sue varie parti per poter verificare se la procedura di calcolo è giusta, e se Quindi il problema si trova nella parte di rappresentazione.
In realtà è stata la prima cosa che ho fatto Silente, infatti per la scrittura del codice del Contapezzi ho preso spunto dall' esempio dell' IDE StateChangeDetection, in cui viene usato il monitor seriale e viene visualizzato il conteggio che avanza ad ogni pressione del tasto ButtonPushCounter. Poi il problema è sorto quando a visualizzare il conteggio deve essere il display 7 segment e non più il monitor seriale.
Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 16, 2018, 07:30 am
Prova a stampare su seriale i valori di unita,decine e centinaia, ma credo che sia tutto esatto.
Ma secondo me non c'è problema nel programma, sono abbastanza sicuro che il calcolo sia corretto e la stampa su display è copiata dall'esempio del link che hai postato.
Quindi non è un errore di programma!
A volte si hanno componenti elettronici difettosi è una possibilità da tenere presente.
Prova comunque a stampare su seriale, la stampa su display è quella del link quindi non è sbagliata...


Code: [Select]







 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);

  Serial.begin(9600);
}

void loop() {
  
    if (digitalRead(buttonPin)==HIGH){
      
        contatore++;
      
        unita=contatore%10;
        contatore=contatore/10;
        decine=contatore%10;
        centinaia=contatore/10;

        Serial.print(centinaia);
        Serial.print("-");
        Serial.print(decine);
        Serial.print("-");
        Serial.print(unita);
        Serial.println(" ");
 
        lc.setDigit(0,2,(byte)centinaia,false);
        lc.setDigit(0,1,(byte)decine,false);
        lc.setDigit(0,0,(byte)unita,false);
    }
    if(contatore>999) contatore=0; // Ritorna a zero quando deve contare 1000
    delay(200);
  
  

  
    if  (digitalRead(buttonReset) == HIGH){
        (contatore = 0);
         lc.clearDisplay(0);
    }
  }












Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 16, 2018, 10:18 pm
Ecco fatto! Allego schermata della seriale. Restituisce tutti 0-0-1.

Toglimi uno sfizio, prova a riprodurre i collegamenti (bastano due pulsanti, due resistenze e qualche cavetto) anche se non metti il display 7 segment, e prova anche tu lo sketch che mi hai proposto con la seriale, così tagliamo la testa al toro.  :D
Title: Re: Contapezzi con display 7 segment
Post by: Silente on Nov 16, 2018, 10:44 pm
Bene. Quindi abbiamo capito dove é il problema, ovvero sul valore delle variabili. Ora é necessario capire perché é li.
A tale scopo potresi aggiungere scritte su seriale. Una potrebbe essere il valore del contatore ogni volta che lo aumenti, e una seconda una scritta che indichi quando stai azzerando.
Title: Re: Contapezzi con display 7 segment
Post by: elrospo on Nov 16, 2018, 11:15 pm
Scusa Torn o sono "de coccio" io o ... ho sostituito la porzione di codice esattamente uguale alla tua, ma non cambia nulla, appare solo il numero 001 e poi non va più avanti.


Code: [Select]


 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
     
 unita=contatore%10;
 contatore=contatore/10;
 decine=contatore%10;
 centinaia=contatore/10;
 
      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
  }



ma non è che te non hai ancora afferrato qualcosa  :o  :smiley-confuse:

non puoi mettere la variabile contatore direttamente attraverso il ...contatore%10..  dopo pochi microsecondi l'avrai divisa per 10 migliaia di volte
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 17, 2018, 02:41 am
ma non è che te non hai ancora afferrato qualcosa  :o  :smiley-confuse:

non puoi mettere la variabile contatore direttamente attraverso il ...contatore%10..  dopo pochi microsecondi l'avrai divisa per 10 migliaia di volte
E quindi? Spiegati meglio, cosa dovrei fare...?
Title: Re: Contapezzi con display 7 segment
Post by: Silente on Nov 17, 2018, 07:01 am
Creare all'inizio del ciclo di scrittura su 7s una variabile ausiliaria (contatore2) resa uguale a contatore. Successivamente usi questultima invece di contatore per le varie divisioni. Così facendo non tocchi contatore, il quale resta dek suo valore, mentre la variabile nuova che usi viene resa ogni ciclo uguale a contatore.

Grazie elrospo, non ci sarei mai arrivato
Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 17, 2018, 07:52 am
Be questo era un problema che non avevo pensato!BISOGNA USARE UNA VARIABILE DI APPOGGIO

int tmp=contatatore;

e poi fare i calcoli con la variabile temporanea cosi da non modificare contatore.
Fino a 99 funziona perchè non dividiamo contatore per 10, non facciamo contatore=contatore/10
Mentre per contare le centinaia dividiamo per 10
Dovrebbe essere quello il problema! ESEMPIO Conti uno poi lo dividiamo  per 10 e poi aggiungi uno, quindi hai sempre un unita, con la variabile di appoggio invece contatore arriva a 999

Per quanto riguarda fare calcoli li ho provati e sono corretti! Se devi valutare solo codice C e non usare librerie di arduino o elettronica, allora un qualunque compilatore C va bene.

Esempio qui dobbiamo fare dei calcoli, questo è C puro, per cui lo si può provare su qualunque compilatore,
io per provare piccoli pezzi di codice uso l'ide online IDEONE.


Con variabile di appoggio Modifica:



Code: [Select]



 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);

  Serial.begin(9600);
}

void loop() {
  
    if (digitalRead(buttonPin)==HIGH){
      
        contatore++;
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

        Serial.print(centinaia);
        Serial.print("-");
        Serial.print(decine);
        Serial.print("-");
        Serial.print(unita);
        Serial.println(" ");
 
        lc.setDigit(0,2,(byte)centinaia,false);
        lc.setDigit(0,1,(byte)decine,false);
        lc.setDigit(0,0,(byte)unita,false);
    }
    if(contatore>999) contatore=0; // Ritorna a zero quando deve contare 1000
    delay(200);
  
  

  
    if  (digitalRead(buttonReset) == HIGH){
        (contatore = 0);
         lc.clearDisplay(0);
    }
  }




Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Nov 17, 2018, 11:04 pm
Ok grazie, complimenti a tutti...problema risolto, testato e funziona ;D
Ora un ultima domanda: alimentando questo aggeggio con una pila da 9V, quanto tempo può durare?
Uso un arduino nano e un display 7 segment MAX7219. Vedi schema allegato.
Title: Re: Contapezzi con display 7 segment
Post by: Patrick_M on Nov 18, 2018, 12:10 am
un paio d'ore?...
Title: Re: Contapezzi con display 7 segment
Post by: Silente on Nov 18, 2018, 11:45 am
NON é risposta alla domanda, ma si potrebbe ottimizzare un po il calcolo del contatore. Credo di poter eliminare i due if.
Code: [Select]
contatore=((contatore+letturapulsanteaggiungi)*(!letturapulsanteazzeramento))%100;

Inoltre credo che se metto prima di tutta la pappardella variabilediappoggio= ho ridotto di un'altra riga.
Potrei anche evitare il calcolo delle unità e delle decine ecc. come variabili singole, e passare direttamente alla funzione il calcolo. E inoltre se usassi un ciclo for potrei, con due righe di codice, stampare tutte le cifre che voglio:
Code: [Select]

for (byte numcifra=0;numcifra<massiko+1;numcifra++)
{
lcd.setdigit (0,numcifra,variabilediappoggio%10,0);
variabilediappoggio/=10;
}
Title: Re: Contapezzi con display 7 segment
Post by: torn24 on Nov 19, 2018, 07:49 am
Quello del fare calcoli con un ciclo è un idea furba! Mi è già capitato di calcolare le cifre di un numero in altri linguaggi!

Forse serve un cast a byte, (byte)variabile%10, visto che variabile deve essere di tipo int.

E' una questione di necessità o meno che porta all'adozione di una soluzione o un altra! Esempio per calcolare unità,decine e centinaia abbiamo scritto 5 righe di codice, ottimizzarla è un bene ma non una necessità. Se invece avessimo dovuto calcolare le cifre di valori di miliardi avremmo dovuto scrivere decine di righe di codice ,probabilmente di fronte a questo problema sarebbe nato spontaneamente l'idea di usare un ciclo, perché la necessità portava a quella soluzione.
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Mar 19, 2019, 09:19 pm
Salve, sono anche io interessato al contapezzi .. ma se invece di incrementare volessi decrementare facendo partire il contatore da 300? Il codice come varia? E volendo posso sostituire il pulsante fisico con un sensore IR singolo ? Proiettando su di esso un fascio luminoso cosi ad ogni passaggio di un oggetto si ha l interruzione di tale fascio e automaticamente mi decrementa a 299 poi 298 e cosi via?
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Mar 20, 2019, 09:47 pm
Se vuoi andare a decrementare imposti il contatore iniziale a 300 poi con il pulsante (o col sensore come vuoi fare tu) al posto di contatore++ metti contatore--.
Per il sensore potresti usare anche uno a ultrasuoni, meno influenzabile dalla luce.
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Mar 29, 2019, 09:30 am
ho Caricato il codice di TORN24 il risultato è display spento e non vuole funzionare, cosa ho sbagliato?
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 01, 2019, 09:49 pm
Mi da questo Problema..qualcuno sa spiegarmi come mai?
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Apr 01, 2019, 11:44 pm
Mi da questo Problema..qualcuno sa spiegarmi come mai?
Puoi postare uno schema dei collegamenti che hai fatto? E anche il codice che hai caricato.
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 07, 2019, 06:36 pm
Questo è il codice che ho inserito. ho usato un arduino nano, un integrato max 7219 e un display a 7 segmenti a 3 cifre a catodo comune, ho collegato i rispettivi pin del display al max7219 e poi al nano datain al pin 12, clk al pin 11 e il load al pin 10 di arduino come scritto nel codice. una volta caricato non funziona, il led rimane spento..

Code: [Select]




 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 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);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
const int  buttonPin = 2;// the pin that the pushbutton is attached to
const int  buttonReset = 4;// the pin that the buttonreset is attached to

// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);

  Serial.begin(9600);
}

void loop() {
   
    if (digitalRead(buttonPin)==HIGH){
     
        contatore++;
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

        Serial.print(centinaia);
        Serial.print("-");
        Serial.print(decine);
        Serial.print("-");
        Serial.print(unita);
        Serial.println(" ");
 
        lc.setDigit(0,2,(byte)centinaia,false);
        lc.setDigit(0,1,(byte)decine,false);
        lc.setDigit(0,0,(byte)unita,false);
    }
    if(contatore>999) contatore=0; // Ritorna a zero quando deve contare 1000
    delay(200);
 
 

 
    if  (digitalRead(buttonReset) == HIGH){
        (contatore = 0);
         lc.clearDisplay(0);
    }
  }



Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Apr 09, 2019, 10:09 pm
Se hai fatto i collegamenti come lo schema allegato (lascia stare il buzzer) deve almeno accendersi. Comunque io ho usato il modulo già assemblato (vedi foto allegata), posta qualche foto/schema del tuo circuito.
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 10, 2019, 05:38 pm
Questo è il circuito, scusate per il disegno pessimo, comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12. Non riesco proprio a capire dove sbaglio... ah i pulsanti non li ho disegnati ma sono stati collegati al piedino D2 e D3.
Title: Re: Contapezzi con display 7 segment
Post by: brunello22 on Apr 10, 2019, 07:26 pm
Ma la resistenza tra ISET e il positivo, ce l'hai messa ?
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 10, 2019, 08:27 pm
Ahm no, non ho messo la resistenza tra iset e positivo.. di quanto gliela devo mettere? E a cosa serve la
Resistenza su quel pin?
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Apr 10, 2019, 10:23 pm
comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12.
scusa ma ho fatto talmente tante prove/modifiche a quel circuito che non ricordo più quale è quello definitivo ::) domani controllo poi ti dico.

Flaviano
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 11, 2019, 08:13 pm
Fammi sapere perché davvero non so come farlo funzionare :/
Title: Re: Contapezzi con display 7 segment
Post by: elrospo on Apr 13, 2019, 05:30 am
Questo è il circuito, scusate per il disegno pessimo, comunque ho notato che nello schema con il buzzer non hai collegato i piedini D10, D11 e D12 ma bensì altri anche se nel programma sta citato che hai utilizzato quei piedini li d10, d11 e d12. Non riesco proprio a capire dove sbaglio... ah i pulsanti non li ho disegnati ma sono stati collegati al piedino D2 e D3.
devi usare moduli già assemblati  se cerchi di far funzionare i max 7219 con fili volanti il più delle volte non funzionano   :smiley-confuse: anche se tutto sembra collegato correttamente

uso quei moduli  con i led inseriti (non saldati) e se voglio mettere moduli led più grandi o di colore diverso è fattibile,

https://www.banggood.com/it/5Pcs-MAX7219-Red-8-Bit-Digital-Tube-LED-Display-Module-For-Arduino-MCU-p-1029084.html?rmmds=mywishlist&cur_warehouse=CN (https://www.banggood.com/it/5Pcs-MAX7219-Red-8-Bit-Digital-Tube-LED-Display-Module-For-Arduino-MCU-p-1029084.html?rmmds=mywishlist&cur_warehouse=CN)
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 13, 2019, 07:55 am
Ciao Elrospo avevo gia pensato di acquistare un modulo come hai detto tu, solo che a me servirebbe pilotare solo 1 display a 3cifre e per il progetto che vorrei fare sono molto ristretto con gli spazi
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Apr 13, 2019, 11:54 pm
Fammi sapere perché davvero non so come farlo funzionare :/
Scusa il ritardo.
Lascia stare lo schema dei collegamenti del post #34. Quelli giusti sono:
buttonPin = D2  (pulsante del contatore)
buttonReset = D4 (pulsante di reset)
CLK         = D9
LOAD-CS  = D10
DIN         = D12

Con questo codice DEVE funzionare:


Code: [Select]


 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 pin 12 is connected to the DataIn
 pin 9 is connected to the CLK
 pin 10 is connected to LOAD
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,9,10,1);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
 #define buttonPin 2 // the pin that the pushbutton is attached to
 #define buttonReset 4 // the pin that the buttonreset is attached to
 
// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
 
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
     
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
     
    // Delay a little bit to avoid bouncing
    delay(50);
 
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
}

Fammi sapere.
Flaviano
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 21, 2019, 05:51 pm
Scusa il ritardo.
Lascia stare lo schema dei collegamenti del post #34. Quelli giusti sono:
buttonPin = D2  (pulsante del contatore)
buttonReset = D4 (pulsante di reset)
CLK         = D9
LOAD-CS  = D10
DIN         = D12

Con questo codice DEVE funzionare:


Code: [Select]


 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 pin 12 is connected to the DataIn
 pin 9 is connected to the CLK
 pin 10 is connected to LOAD
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,9,10,1);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
 #define buttonPin 2 // the pin that the pushbutton is attached to
 #define buttonReset 4 // the pin that the buttonreset is attached to
 
// Variables will change:
int contatore = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


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);

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
 
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore++;
     
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
     
    // Delay a little bit to avoid bouncing
    delay(50);
 
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 0);
       lc.clearDisplay(0);
    }
}

Fammi sapere.
Flaviano
Ciao Flavi71 scusami per il ritardo, allora ho aggiunto una resistenza al pin ISET del max7219 ogni volta che premo il pulsante comincia a contare solo che lo stato iniziale del display è spento come premo si accende.. come faccio a farlo stare acceso al primo stato? ho notato anche che conta dall'ultima cifra.. mi spiego meglio: invece di contare 001, 002.. mi conta 100,200 e cosi via come risolvo?
GRAZIE per il tempo che mi stai dando :)
Fammi sapere
FuryMan
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 21, 2019, 06:09 pm
Risolto per quanto riguarda il conteggio sfalsato ho invertito i pin del dig1 e del dig3 cosi' parte dal primo a contare.. non riesco a risolvere il problema del display spento all'inizio :/
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Apr 21, 2019, 06:19 pm
Perché non usi solo l'ATmega328p? Io ho fatto un timer per la magnetoterapia di Nuova Elettronica con solo quello e due display:

Code: [Select]
  ATMEGA 328P - 1MHz
        Pin
I/O0  PD0  2: KA
I/O1  PD1  3: KB
I/O2  PD2  4: KC
I/O3  PD3  5: KD
I/O4  PD4  6: KE
I/O5  PD5 11: KF
I/O6  PD6 12: KG
I/O7  PD7 13: Kdp
I/O8  PB0 14: Uscita fCk.
I/O9  PB1 15: Anodo comune: *Alto(diretto):A2*; Basso(via PNP):A1
I/O10 PB2 16: Anodo comune: *Alto(diretto):A1*; Basso(via PNP):A2
I/O11 PB3 17: MOSI -
I/O12 PB4 18: MISO -
I/O13 PB5 19:  SCK -
XTAL1 PB6  9: ---
XTAL2 PB7 10: ---
A0  PC0 23: Potenziometro per l'impostazione del tempo.
A1  PC1 24: BUZZER PASSIVO
A2  PC2 25: OUT al transistor NPN pilota del relè.
A3  PC3 26:
A4  PC4 27:
A5  PC5 28:
         1: Reset
     7, 20: Vcc
     8, 22: GND
        21: ARef
*/
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Apr 21, 2019, 06:22 pm
Code: [Select]
// Il tempo parte all'accensione (avvio=0) o dopo l'impostazione della durata (avvio=1)?
#define avvio 1

#include <EEPROM.h>
unsigned int durata;
unsigned int durata0;
byte DS1; // Dip Switch 1: può valere 0 o 1.
byte DS2; // Dip Switch 2: può valere 0 o 1.
byte adesso; // millis() in minuti
byte minRimanenti=0;
byte minRimanentiP=250; // Valore precedente di minRimanenti.
byte z=0;
byte n=0;
byte d=0; // decine di minuti
byte u=0; // unità di minuti
byte dpon=0; // 1: dp acceso (pin basso per anodo comune).
unsigned long millis0=0; // Valore di millis()per il conteggio del tempo dall'impostazione della durata.
unsigned long t=0; // Valore di millis() per il tempo a disposizione per l'impostazione della durata.
unsigned long t1=0; // Valore di millis() per il rilevamento della richiesta di pausa.
byte b=0; // Contatore dei Bip di avviso della pausa.
byte c=0; // Contatore dei Bip di avviso dello spegnimento anticipato.
unsigned long t2=0; // Valore di millis() per il rilevamento della richiesta di spegnimento.
byte potAZero=0;
byte potA60=0;
byte endSetup=0;

void displ();
void mpx();

void setup()
{
// durata=600000*(((PINB&((1<<PB4)|(1<<PB3)))>>3)+1); // Con dip switch verso +V.
// Legge i due dip switch su PB4 (peso 16) e PB3 (peso 8) e divide per 8, ottenendo valori tra 0 e 3;
// somma 1, ottenendo valori tra 1 e 4, poi moltiplica per 10, ottenendo 10...40 minuti.
// Moltiplicando per 60.000 ottiene i millisecondi.
pinMode(0,OUTPUT); // KA
pinMode(1,OUTPUT); // KB
pinMode(2,OUTPUT); // KC
pinMode(3,OUTPUT); // KD
pinMode(4,OUTPUT); // KE
pinMode(5,OUTPUT); // KF
pinMode(6,OUTPUT); // KG
pinMode(7,OUTPUT); // Kdp
pinMode(8,OUTPUT); // fCk out (abilitata con AVR Burn-O-Mat).
pinMode(9,OUTPUT);  // Anodo comune: Basso:A1; Alto:A2.
pinMode(10,OUTPUT); // Anodo comune: Basso:A2; Alto:A1.
pinMode(A0,INPUT);  // Potenziometro per l'impostazione del tempo.
pinMode(A1,OUTPUT); // Buzzer
pinMode(A2,OUTPUT); // OUT
// pinMode(A3,OUTPUT); // Periodo 2000ms (non serve più, perché ho attivato l'uscita fCk sull'8).

digitalWrite(A2, HIGH); // Eccita il relè.


OSCCAL=161; // Era 162 e la frequenza di clock era 1,004MHz;
            // Con 161, la frequenza di clock è circa 998,5kHz.
/*
Serial.begin(9600);
Serial.print("OSCCAL=");
Serial.print(OSCCAL,DEC);
Serial.end();
*/

delay(100);
t=millis();
millis0=millis();

if(EEPROM.read(0)==255) // Se c'è scritto 255, vuol dire che non è stata mai scritta oppure è stata
  {                     // "azzerata" a 255, perciò prosegue con l'impostazione della durata.
  while(millis()-t<4000)
    {
    analogRead(A0); durata=1+analogRead(A0)/17.2;
    d = int(durata/10); // DECINE DI MINUTI
    u = durata%10;      // UNITA' DI MINUTI
    mpx(); // Visualizza d e u.
    if(durata!=durata0) {durata0=durata; t=millis();}
    }
  tone(A1,880,60); // E' finito il tempo per l'impostazione della durata.
  }
else // Se non c'è scritto 255, significa che l'apparecchio è stato messo in pausa e il valore rappresenta i minuti residui.
  {
  durata=EEPROM.read(0);
  EEPROM.update(0,255); // "Azzera" il contenuto della cella a 255.
  d = int(durata/10); // DECINE DI MINUTI
  u = durata%10;      // UNITA' DI MINUTI
  tone(A1,880,200); // Poiché ha caricato il tempo residuo in memoria, emette 3 toni: LA4-LA5-LA4.
  delay(250);
  tone(A1,440,200);
  delay(250);
  tone(A1,880,250);
  mpx(); // Visualizza d e u.
  }
 
if(analogRead(A0)<15) potAZero=1;
if(analogRead(A0)>1010) potA60=1;
 
#if avvio==1           // Se avvio=1,
  millis0=millis();    // la durata parte dopo l'impostazione della durata,
#endif                 // altrimenti millis0 vale già 0 e la durata parte dall'accensione.
  endSetup=1;
}
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Apr 21, 2019, 06:23 pm
Code: [Select]
void loop()
{
adesso=int((millis()-millis0)/60000);

// Calcola e visualizza i minuti rimanenti (a ogni passaggio commuta Display 1 / Display 2):
minRimanenti=durata-adesso;
d = int(minRimanenti/10); // DECINE DI MINUTI
u = minRimanenti%10;      // UNITA' DI MINUTI
mpx(); // visualizza d e u.
if(analogRead(A0)>15) potAZero=0;
if(analogRead(A0)<1010) potA60=0;
   
  // Controlla se il tempo è scaduto:
if(adesso>=durata)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  PORTD=0b00001110;     // Stop:  Visualizza " F."
  digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
  while(1==1);
  }

  // RICHIESTA DI PAUSA?
if(potAZero==0) // Se il potenziometro non sta a 0 dall'accensione
  {
  if(analogRead(A0)>15) t1=millis(); // Se il potenziometro non è al minimo, aggiorna costantemente t1.
  else                               // Se viene messo al massimo, non aggiorna più t1.
    {
    digitalWrite(10,LOW); // Toglie alimentazione al display 1.
    digitalWrite(9,HIGH); // Alimenta il display 2.
    PORTD=0b00001100;     // Visualizza " P."
    while(analogRead(A0)<=15 && millis()-t1<3200)
      {
      if(b==0) {tone(A1,1760,100); b=1;} // Se il potenziometro sta al minimo e b è ancora 1, fa un primo Bip e incrementa b a 1.
      if(b==1 && (millis()-t1)>=1000) {tone(A1,1760,100); b=2;} // Dopo 1 secondo fa un altro Bip e incrementa b.
      if(b==2 && (millis()-t1)>=2000) {tone(A1,1760,100); b=3;} // Dopo 1 secondo fa un altro Bip e incrementa b. 
      if(millis()-t1>3000) // Se per 3 secondi il potenziometro sta al minimo, va in pausa.
        {
        EEPROM.update(0,minRimanenti);  // Salva il tempo residuo.
        digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
        while(1==1);
        }
      }                                   
    b=0; // Se il potenziometro viene mosso prima dello scadere dei 3 secondi, azzera b. 
    }
  }

  // RICHIESTA DI SPEGNIMENTO?
if(potA60==0) // Se il potenziometro non sta a 60 dall'accensione
  {
  if(analogRead(A0)<1010) t2=millis(); // Se il potenziometro non è al massimo, aggiorna costantemente t2.
  else                                 // Se viene messo al massimo, non aggiorna più t2.
    {
    digitalWrite(10,LOW); // Toglie alimentazione al display 1.
    digitalWrite(9,HIGH); // Alimenta il display 2.
 // PORTD=0b00001001;     // Visualizza " H."
    PORTD=0b00010010;     // Visualizza " S."
    while(analogRead(A0)>=1010 && millis()-t2<3200)
      {
      if(c==0) {tone(A1,880,100); c=1;} // Se il potenziometro sta al massimo e c è ancora 1, fa un primo Bip e incrementa c a 1.
      if(c==1 && (millis()-t2)>=1000) {tone(A1,880,100); c=2;} // Dopo 1 secondo fa un altro Bip e incrementa c.
      if(c==2 && (millis()-t2)>=2000) {tone(A1,880,100); c=3;} // Dopo 1 secondo fa un altro Bip e incrementa c.   
      if(millis()-t2>3000) // Se per 3 secondi il potenziometro sta al massimo, spegne tutto.
        {
        digitalWrite(A2,LOW); // Spegne. I caratteri restano visualizzati finché i condensatori sull'alimentazione sono carichi.
        while(1==1);
        }
      }                                   
    c=0; // Se il potenziometro viene mosso prima dello scadere dei 3 secondi, azzera c. 
    } 
  }
 
} // END loop

// --------------------------------------------------

void mpx()
{
if(!z) // z=0: A1 (Display delle decine)
  {
  digitalWrite(7,HIGH); // Spegne il punto, che deve accendersi solo sul display 2 nei secondi pari.
  digitalWrite(9,LOW);  // Toglie alimentazione al display 2.
  n=d;     // Prepara le decine di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(10,HIGH); // Alimenta il Display 1.
  delay(5); // mpx a circa 100Hz (5+5=10mS)
  }
else   // z=1: A2 (Display delle unità)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  n=u; // Prepara le unità di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  // Fa lampeggiare il punto del display 2:
  if(endSetup && (millis()-millis0)%2000<1000) digitalWrite(7,LOW); // Se è un secondo pari, accende il punto.
  else digitalWrite(7,HIGH); // Se è un secondo pari, lo spegne.
  delay(5);
  }
z=1-z;
}

void displ()
{
switch(n)      // Anodo comune
               // D 76543210
  {            //  dpGFEDCBA (0: segmento acceso)
  case 0: {PORTD|=0b01000000;  // Spegne i segmenti a 1
           PORTD&=0b11000000;} // Accende i segmenti a 0
  break;
  case 1: {PORTD|=0b01111001;
           PORTD&=0b11111001;}
  break;
  case 2: {PORTD|=0b00100100;
           PORTD&=0b10100100;}
  break;
  case 3: {PORTD|=0b00110000;
           PORTD&=0b10110000;}
  break;
  case 4: {PORTD|=0b00011001;
           PORTD&=0b10011001;}
  break;
  case 5: {PORTD|=0b00010010;
           PORTD&=0b10010010;}
  break;
  case 6: {PORTD|=0b00000010;
           PORTD&=0b10000010;}
  break;
  case 7: {PORTD|=0b01111000;
           PORTD&=0b11111000;}
  break;
  case 8: {PORTD|=0b00000000;
           PORTD&=0b10000000;}
  break;
  case 9: {PORTD|=0b00010000;
           PORTD&=0b10010000;}
  break;
  }
}
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Apr 21, 2019, 06:26 pm
L'essenziale che ti serve è questo:
Code: [Select]
d = int(minRimanenti/10); // DECINE DI MINUTI
u = minRimanenti%10;      // UNITA' DI MINUTI
mpx(); // visualizza d e u.

// Tu, invece, calcolerai centinaia, decine e unità. Nel multiplexer, poi, userai per z i valori 1, 2 e 3, scrivendo alla fine, al posto di z=1-z:
z+=1; if(z==4) z=1;

void mpx()
{
if(!z) // z=0: A1 (Display delle decine)
  {
  digitalWrite(7,HIGH); // Spegne il punto, che deve accendersi solo sul display 2 nei secondi pari.
  digitalWrite(9,LOW);  // Toglie alimentazione al display 2.
  n=d;     // Prepara le decine di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(10,HIGH); // Alimenta il Display 1.
  delay(5); // mpx a circa 100Hz (5+5=10mS)
  }
else   // z=1: A2 (Display delle unità)
  {
  digitalWrite(10,LOW); // Toglie alimentazione al display 1.
  n=u; // Prepara le unità di minuti per essere visualizzate.
  displ(); // Pilota il display.
  digitalWrite(9,HIGH); // Alimenta il display 2.
  // Fa lampeggiare il punto del display 2:
  if(endSetup && (millis()-millis0)%2000<1000) digitalWrite(7,LOW); // Se è un secondo pari, accende il punto.
  else digitalWrite(7,HIGH); // Se è un secondo pari, lo spegne.
  delay(5);
  }
z=1-z;
}


void displ()
{
switch(n)      // Anodo comune
               // D 76543210
  {            //  dpGFEDCBA (0: segmento acceso)
  case 0: {PORTD|=0b01000000;  // Spegne i segmenti a 1
           PORTD&=0b11000000;} // Accende i segmenti a 0
  break;
  case 1: {PORTD|=0b01111001;
           PORTD&=0b11111001;}
  break;
  case 2: {PORTD|=0b00100100;
           PORTD&=0b10100100;}
  break;
  case 3: {PORTD|=0b00110000;
           PORTD&=0b10110000;}
  break;
  case 4: {PORTD|=0b00011001;
           PORTD&=0b10011001;}
  break;
  case 5: {PORTD|=0b00010010;
           PORTD&=0b10010010;}
  break;
  case 6: {PORTD|=0b00000010;
           PORTD&=0b10000010;}
  break;
  case 7: {PORTD|=0b01111000;
           PORTD&=0b11111000;}
  break;
  case 8: {PORTD|=0b00000000;
           PORTD&=0b10000000;}
  break;
  case 9: {PORTD|=0b00010000;
           PORTD&=0b10010000;}
  break;
  }
}
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 23, 2019, 09:47 am
Grazie Datman sembra molto interessante ma vorrei portare a termine un progetto alla volta, aspetto la risposta di Flavi71 per quanto riguarda il display spento all'inizio e non capisco come mai ..
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Apr 23, 2019, 11:22 am
E' semplice: nel setup() viene eseguito:
lc.clearDisplay(0);
perciò il display rimane senza alcuna scritta. Se preferisci, subito dopo il clear fagli scrivere "0". Probabilmente devi scrivere così:
lc.setDigit(0,0,0,false);
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Apr 23, 2019, 12:23 pm
Code: [Select]
//State change detection (edge detection)
//Libreria per il controllo del display:
#include "LedControl.h"

/*
Connessioni:
I/O 12: DataIn
I/O  9: CLK
I/O 10: LOAD
*/

LedControl lc=LedControl(12,9,10,1);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/

// Costanti (valori che non cambieranno):
 #define buttonPin 2 // the pin that the pushbutton is attached to
 #define buttonReset 4 // the pin that the buttonreset is attached to
 
// Variabili:
int contatore = 0;       // Contatore delle pressioni del tasto
int buttonState = 0;     // Stato del pulsante
int lastButtonState = 0; // Stato precedente del pulsante
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;

void setup()
{
// The MAX72XX is in power-saving mode on startup: we have to do a wakeup call
lc.shutdown(0,false);

// Imposta la luminosità a un valore medio, cancella il display e visualizza 0:
lc.setIntensity(0,8);
lc.clearDisplay(0); lc.setDigit(0,0,0,false);

// Impostazione degli ingressi (in realtà all'accensione gli I/O vengono impostati
// come ingressi, perciò è necessario impostare solo le uscite, ma può essere utile lasciarlo scritto):
pinMode(buttonPin, INPUT);
pinMode(buttonReset, INPUT);
}

void loop()
{
// Legge il pulsante:
buttonState=digitalRead(buttonPin);

// Se prima era basso e adesso è alto, incrementa il contatore e visualizza sul display:
if(lastButtonState==LOW && buttonState==HIGH)
  {   
  contatore++;
  tmp=contatore; unita=tmp%10;
  tmp=tmp/10;    decine=tmp%10;
                 centinaia=tmp/10;

  lc.setDigit(0,2,(byte)centinaia,false);
  lc.setDigit(0,1,(byte)decine,false);
  lc.setDigit(0,0,(byte)unita,false);
  delay(50); // Delay a little bit to avoid bouncing
  lastButtonState = buttonState; // save the current state as the last state, for next time through the loop
  }

if(digitalRead(buttonReset)==HIGH) // E' stato premuto il reset?
  {contatore=0; lc.clearDisplay(0); lc.setDigit(0,0,0,false);}
}
Title: Re: Contapezzi con display 7 segment
Post by: Flavi71 on Apr 24, 2019, 12:50 am
Grazie Datman sembra molto interessante ma vorrei portare a termine un progetto alla volta, aspetto la risposta di Flavi71 per quanto riguarda il display spento all'inizio e non capisco come mai ..
Anche a me resta spento all' inizio, e a dir la verità non ci avevo fatto molto caso, perchè per me non è un problema, basta che si accenda quando inizio a contare. Comunque prova a fare come ti ha detto Datman, dovrebbe funzionare...io non ho provato.

Flaviano
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Apr 26, 2019, 05:04 pm
Grazie mille Datman appena posso lo provo e ti faccio sapere :) grazie anche a te Flaviano, il mio sarebbe un progetto per il Softair (un gioco con delle repliche di armi chiamate AirSoftGun, nettamente diverso dal conosciutissimo Paintball) precisamente un contatore di pallini (BB)  infatti al posto del pulsante andrò a posizionare un sensore tipo fotocellula composta da un emettitore IR e un ricevitore e spero che il Codice non vari perché a livello di programmazione sono negato ed è stato grazie a voi che ho potuto cominciare e portare quasi a termine il progetto :)
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on May 05, 2019, 10:19 am
Ho provato il Circuito di Datman il contatore da fermo mi da 0 poi incrementa solo di 1 e non si incrementa più, ho inserito la stringa lc.setDigit(0,0,0,false); nel vecchio sketch ed effettivamente parte da 0 e poi conta regolarmente.. una domanda se volessi far partire il conteggio da 250 e decrementando basta che scrivo contatore=250 e poi contatore -- ? perché vorrei sostituire il pulsante con un photoresistor e un irled in modo tale che quando il fascio viene interrotto lui mi decrementi di un unità alla volta. ho inserito altre due stringhe di codice per far comparire 000 all'inizio
 
Code: [Select]

void setup(){
    lc.shutdown(0,false);
    lc.setIntensity(0,8);
    lc.clearDisplay(0);

    lc.setDigit(0,0,0,false); //
    lc.setDigit(0,1,0,false); // Ho inserito 3 stringhe per far comparire 000
    lc.setDigit(0,2,0,false); //
 

  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
 
}

come faccio fer farlo partire da 250 a video al posto di 000?
vi ringrazio infinitamente per l'aiuto che mi state dando, aspetto vostre risposte.


FuryMan
Title: Re: Contapezzi con display 7 segment
Post by: Datman on May 05, 2019, 01:11 pm
Nel setup poni la variabile=250.
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on May 06, 2019, 01:56 pm
Ciao Datman ho posto int contatore=250 ma mi da sempre come valore 000 poi quando premo il pulsante mi passa a 251 direttamente, come faccio a porla nel setup questa variabile?
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on May 15, 2019, 11:20 am
Aspetto tue Risposte Datman :)
Title: Re: Contapezzi con display 7 segment
Post by: Datman on May 17, 2019, 09:47 am
Ciao
Sono stato un po' indaffarato.

Semplicemente, devi fargli visualizzare 250 o, genericamente, il valore di contatore in lc.setDigit. :-)

Code: [Select]
lc.setDigit(0,2,2,false);
lc.setDigit(0,1,5,false);
lc.setDigit(0,0,0,false);

oppure, genericamente:

lc.setDigit(0,2,contatore/100,false);
lc.setDigit(0,1,(contatore/10)%10,false);
lc.setDigit(0,0,contatore-10*int(contatore/10),false);


Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on May 20, 2019, 12:19 pm
Ciao Datman ho provato il circuito e il tutto funziona benissimo, vorrei sostituire il pulsante con un sensore ir dove l'emettitore ir led è sempre attivo mentre il ricevitore ir è collegato al piedino del vecchio interruttore, facendo cio' ho notato che non funziona la mia domanda è devo aggiungere qualche stringa nel codice facendogli leggere l'irled come un semplice pulsante? questo è il codice, ti ringrazio mille!
Code: [Select]

 //State change detection (edge detection)
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 pin 12 is connected to the DataIn
 pin 9 is connected to the CLK
 pin 10 is connected to LOAD
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,9,10,1);

/*  The circuit:
 - buttonpin attached to pin 2 from +5V
 - buttonreset attached to pin 4 from +5V
 - 10 kilohm resistor attached to pin 2&4 from ground
*/
// this constant won't change:
 #define buttonPin 2 // the pin that the pushbutton is attached to
 #define buttonReset 4 // the pin that the buttonreset is attached to
 
// Variables will change:
int contatore = 250;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int unita = 0;
int decine = 0;
int centinaia = 0;
int tmp=0;


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);
  lc.setDigit(0,2,2,false);
  lc.setDigit(0,1,5,false);
  lc.setDigit(0,0,0,false);
 

  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  pinMode(buttonReset, INPUT);
 
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      contatore--;
     
        tmp=contatore;
        unita=tmp%10;
        tmp=tmp/10;
        decine=tmp%10;
        centinaia=tmp/10;

      lc.setDigit(0,2,(byte)centinaia,false);
      lc.setDigit(0,1,(byte)decine,false);
      lc.setDigit(0,0,(byte)unita,false);
    }
     
    // Delay a little bit to avoid bouncing
    delay(30);
 
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
}

  // if the buttonreset is pressed reset the buttonpushcounter
  if  (digitalRead(buttonReset) == HIGH){
      (contatore = 250);
       lc.clearDisplay(0);
       lc.setDigit(0,2,2,false);
       lc.setDigit(0,1,5,false);
       lc.setDigit(0,0,0,false);
    }
}

[code]
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Jun 04, 2019, 12:09 pm
Datman solo tu puoi aiutarmi aspetto tue risposte in merito perché sto uscendo pazzo non riesco a farlo funzionare con l'ir led
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Jun 04, 2019, 12:14 pm
Se il ricevitore IR sostituisce il pulsante, perché non funziona?...
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Jun 04, 2019, 04:35 pm
Ho collegato al posto del pulsante il ricevitore ir led a 3 pin dove l uscita del ricevitore collegata al piedino del vecchio pulsante, collegato con resistenze in modo da non fargli avere un picco di tenzione troppo alta e poi l'emettitore ir collegato direttamente ai 3,3volt con relativa resistenza in modo che stia sempre sullo stato alto... ma non conta come se non lo leggesse come pulsante... ha bisogno forse di altre stringhe codice?
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Jun 04, 2019, 06:10 pm
Non sono riuscito a capire com'è fatto il circuito. Servirebbe uno schema. Comunque mi sa che c'è qualche resistenza di troppo...
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Jun 06, 2019, 06:49 pm
Non sono riuscito a capire com'è fatto il circuito. Servirebbe uno schema. Comunque mi sa che c'è qualche resistenza di troppo...
Ciao Datman ho disegnato un circuito riguardante solamente l'emettitore e il ricevitore IRled da me inseriti adesso ti posto il file, spero mi saprai aiutare, ti ringrazio infinite :)
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Jun 06, 2019, 07:50 pm
Che modello è? Senza sapere il modello del sensore, non posso dire nulla...
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Jun 06, 2019, 10:44 pm
Credo sia un comunissimo phototransistor tipo TSOP4856 a 3 pin, quando lo comprai gli dissi phototransistor quindi non so dirti se va bene o meno :/ ... ho pensato di acquistare un modulo TCRT5000 però non so se i collegamenti sono gli stessi o meno.. e se sia abbastanza sensibile per il mio progetto. In allegato un phototransistor come il mio: non riesco a caricare l'immagine mi scuso se posto il link della foto
https://www.newark.com/productimages/standard/en_US/4472390.jpg

Tu quale mi consigli di usare?
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Jun 08, 2019, 03:28 pm
Ho controllato meglio è un TSOP31230 a 3 pin .. ma non va inserita nessuna stringa inerente all'irled?
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Jun 10, 2019, 11:00 pm
Come è scritto chiaramente nel datasheet

www.google.com/search?&q=TSOP31230+datasheet

quel sensore è un ricevitore specifico per telecomandi, che ha un filtro che fa passare solo segnali con una portante a 30kHz +/-5%! :-)
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Jun 12, 2019, 11:50 am
Ciao Datman ti ringrazio per avermi risposto, ma non ho capito ancora come devo risolvere :/
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Jun 12, 2019, 11:54 am
Cambiando sensore! :-(
Devi usare un fototransistor semplice, non un dispositivo particolare come quello, che è specifico per telecomandi con portante a 30kHz (quindi solo alcuni telecomandi). Se hai un comune BC107/8/9 o 2N2222 o simile in contenitore metallico, puoi provare segando la parte superiore o facendo un foro con una piccola fresa (ti sconsiglio il trapano, a meno che sia a colonna e il transistor ben tenuto nella morsa, per evitare che la punta venga trascinata giù fino a distruggere il chip).
Sul sito RS, ad esempio, puoi farti un'idea dei fototransistor esistenti. Attento a sceglierne uno sensibile alla lunghezza d'onda della luce che usi: se usi luce visibile, uno sensibile solo all'infrarosso (hanno un filtro scuro, o tutto il corpo è scuro) non va bene.
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Jun 12, 2019, 12:14 pm
Ah ok grazie mille quindi sostituisco il fototransistor con uno comune tipo NPN .. ti farò sapere appena provo grazie mille!!
Title: Re: Contapezzi con display 7 segment
Post by: Datman on Jun 12, 2019, 12:23 pm
Prego! :-)
Title: Re: Contapezzi con display 7 segment
Post by: Fury_man on Aug 29, 2019, 11:48 am
Ho provato a sostituire iRled con dei semplici diodiIRled a 940nm il problema è che quando taglio il fascio che va dall emettitore al ricevitore ir led non mi conta e quindi non mi decrementa a questo punto mi viene da pensare: ci sarà qualcosa di sbagliato nello scketch?