Problemi contapezzi

salve a tutti, ho risolto il problema passato con il display tm1637, ora me ne se aggiunto un’altro e non riesco proprio a capire cosa non va praticamente con un tm1637 conto, ilm segnale puo provenire da 1 di fonti che imposto con un commutatore 3 posizioni 12 vie. ina via fa la selezione dove prendere il segnale che conta, la seconda via è collegata a 3 ingressi analogici impostati come digitali. a sua volta ho implementato un display led a 7 segmenti collegati ai pin dal 4 al 10. ho iniziato a creare il sw dove su commutatore pos1 visualizz 1, su seconda 2 e su terza 3, e fin qui tutto ok. Ho implementato aggiungendo il tm1637 , mi sono assicurato che conti ma qui arrivano i problemi: i numeri 1-2-3 non appaiono e se appaiono i segmenti lampeggiano. fatto varie prove, modifiche ore e ore a rivedere anche tutorial ma non riesco a farlo funzionare. qualcuno può darmi info su cosa posso sbagliare?

//*****************      CONTAPEZZI CON DISPLAY TM1632           *****************//
//*****************                                              *****************//
//********************************************************************************//
// 1 ingresso per contare
// 1 ingresso NC per Resettare
// ingressi a negativo con abilitazione resistenze pull_up interne
// 2 uscite per rele e led

/****************  IMPOSTAZIONE DISPLAY    *****************/

#include <TM1637Display.h>
#define CLK    2                    // pin a cui è attaccato il pin CLK
#define DIO    3                    // pin a cui è attaccato il pin DIO
TM1637Display display(CLK, DIO);

#define rele           11           //rele attaccato al pin 11
#define led            12           //led attaccato al pin 12

const int buttonPin1 = 15;          //ingresso per impostare la cifra macchina
const int buttonPin2 = 16;          //ingresso per impostare la cifra macchina
const int buttonPin3 = 17;          //ingresso per impostare la cifra macchina
const int buttonPin4 = 19;

const int segA = 4;                 //segmento A display
const int segB = 5;                 //segmento B display
const int segC = 6;                 //segmento C display
const int segD = 7;                 //segmento D display
const int segE = 8;                 //segmento E display
const int segF = 9;                 //segmento F display
const int segG = 10;                //segmento G display

int buttonState1 = 0;               // variabile per la lettura dello stato del selettore
int buttonState2 = 0;               // variabile per la lettura dello stato del selettore
int buttonState3 = 0;               // variabile per la lettura dello stato del selettore
int buttonState4 = 0;               // variabile per la lettura del pulsante per contare
int countapezzi = 0;


void setup() {
  Serial.begin (9600);

  display.setBrightness(4);              // imposto la luminosita del display

  pinMode(13,  INPUT_PULLUP);            //  reset     pulsante di reset display
  pinMode(buttonPin1,  INPUT_PULLUP);    //  pin 1 per impostare dove prendo il segnale per contare
  pinMode(buttonPin2,  INPUT_PULLUP);    //  pin 2 per impostare dove prendo il segnale per contare
  pinMode(buttonPin3,  INPUT_PULLUP);    //  pin 3 per impostare dove prendo il segnale per contare
  pinMode(buttonPin4,  INPUT_PULLUP);

  pinMode(segA,  OUTPUT);                //  imposto pin come uscita per segA display
  pinMode(segB,  OUTPUT);                //  imposto pin come uscita per segB display
  pinMode(segC,  OUTPUT);                //  imposto pin come uscita per segC display
  pinMode(segD,  OUTPUT);                //  imposto pin come uscita per segD display
  pinMode(segE,  OUTPUT);                //  imposto pin come uscita per segE display
  pinMode(segF,  OUTPUT);                //  imposto pin come uscita per segF display
  pinMode(segG,  OUTPUT);                //  imposto pin come uscita per segG display

  pinMode(rele, OUTPUT);                 // imposto pin  come uscita per il rele
  pinMode(led, OUTPUT);                  // imposto pin  come uscita per il led
}
int contapezzi, prevcontapezzi ;       // qui creo delle variabili di ingresso e uscita


void loop() {

  buttonState1 = digitalRead (buttonPin1);       //qui leggo lo stato del selettore
  buttonState2 = digitalRead (buttonPin2);       //qui leggo lo stato del selettore
  buttonState3 = digitalRead (buttonPin3);       //qui leggo lo stato del selettore
  buttonState4 = digitalRead (buttonPin4);       //qui leggo lo stato del pulsante

  int contapezzi = digitalRead(buttonPin4);      // ingresso NO per contare

  display.showNumberDec(countapezzi);
  delay(100);

  if (!contapezzi && prevcontapezzi ) {          // qui incremento
    countapezzi++;
    delay (50);
  }
  if (digitalRead (13))                  // se premo azzero
    countapezzi = 0;                    // l'ingresso deve essere NC a negativo lo faccio con 1 rele esterno
  {
    prevcontapezzi = contapezzi;           // contapezzi su
  }


  ///////////////////////////////////////////////////////
  //*****     VISUALIZZO NUMERO 1 NEL DISPLAY     *****//
  ///////////////////////////////////////////////////////

  if (buttonState1 == HIGH) {

    digitalWrite(segB, LOW);     // Accendo il segmento B
    digitalWrite(segC, LOW);     // Accendo il segmento C
  } else {
    digitalWrite(segB, HIGH);    // Spengo il segmento B
    digitalWrite(segC, HIGH);    // Spengo il segmento C
  }
  delay(10);


  ///////////////////////////////////////////////////////
  //*****     VISUALIZZO NUMERO 2 NEL DISPLAY     *****//
  ///////////////////////////////////////////////////////

  if (buttonState2 == HIGH) {
    digitalWrite(segA, LOW);     // Accendo il segmento A
    digitalWrite(segB, LOW);     // Accendo il segmento B
    digitalWrite(segD, LOW);     // Accendo il segmento D
    digitalWrite(segE, LOW);     // Accendo il segmento E
    digitalWrite(segG, LOW);     // Accendo il segmento G
  } else {
    digitalWrite(segA, HIGH);    // Spengo il segmento A
    digitalWrite(segB, HIGH);    // Spengo il segmento B
    digitalWrite(segD, HIGH);    // Spengo il segmento D
    digitalWrite(segE, HIGH);    // Spengo il segmento E
    digitalWrite(segG, HIGH);    // Spengo il segmento G
  }
  delay(10);

  ///////////////////////////////////////////////////////
  //*****     VISUALIZZO NUMERO 3 NEL DISPLAY     *****//
  ///////////////////////////////////////////////////////

  if (buttonState3 == HIGH) {
    digitalWrite(segA, LOW);     // Accendo il segmento A
    digitalWrite(segB, LOW);     // Accendo il segmento B
    digitalWrite(segC, LOW);     // Accendo il segmento C
    digitalWrite(segD, LOW);     // Accendo il segmento D
    digitalWrite(segG, LOW);     // Accendo il segmento G
  } else {
    digitalWrite(segA, HIGH);    // Spengo il segmento A
    digitalWrite(segB, HIGH);    // Spengo il segmento B
    digitalWrite(segC, HIGH);    // Spengo il segmento C
    digitalWrite(segD, HIGH);    // Spengo il segmento D
    digitalWrite(segG, HIGH);    // Spengo il segmento G
    delay(10);
  }
}

Hai pubblicato nella sezione inglese del forum. Per favore scrivi in inglese o posta nella sezione italiana.

scusa ferroviere, non sono pratico di queste cose, io apro il forum e mi appare tutto in italiano

come faccio a spostarlo?

@Railroader Hai anche infranto le regole del forum postando in italiano nella sezione inglese, amico mio! Fortunatamente ho spostato questo argomento in una categoria italiana e ora possiamo tirare un sospiro di sollievo :)

@passatempo:

Allora, intanto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... come richiesto al punto 7 del succitato regolamento, per favore edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento, nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. ;)

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

scusa GPB01, ma nessuno mi ha mai insegnato queste cose, purtroppo capisco che il mondo non ammette ignoranza, ma quando frequentavo, i computer erano con windows 3, poi da elettricista non era proprio questo il campo di lavoro. Ora per hobby cerco di divertirmi e purtroppo se non ci sbatto la testa e nessuno me le spiega mi rimane un po’ difficile.

mi pare di capire che devo copiare il mio programma, poi nel forum cliccare su code e copiarlo li in mezzo

premendo sul tasto CODE non succede nulla

Intanto devi "indentarlo" correttamente come detto ...

... quindi, nell'IDE, dove hai scritto il programma, usa ctrlT per "indentarlo" come si deve.
Una volta che è a posto, lo copi e lo incolli al posto di quello che hai messo ...

... dopo di che lo selezioni tutto e premi l'icona <code/> nella barra degli strumenti per contrassegnarlo come codice. e vedrai che quanto hai scritto assume una forma simile a questo che segue:

...
...
int buttonState4 = 0; // variabile per la lettura del pulsante per contare
int countapezzi = 0;

void setup() {
   Serial.begin (9600);
   display.setBrightness(4); // imposto la luminosita del display
   ...
   ...

Guglielmo

grazie Guglielmo provvederò al più presto

cosi ho fatto giusto?

... perfetto, grazie :slightly_smiling_face:

Guglielmo

Nota come countapezzi è una variabile globale diversa dalla variabile locale contapezzi.

Dichiari globale anche contapezzidopo il setup ma la variabile locale oscura (si dice così) quella globale.

Consiglio: scegli per il nome delle variabili e funzioni la lingua, cioè o tutto in Inglese o tutto in Italiano, ad esempio: pieceCounter sarebbe l’equivalente di contatorePezzi.

Contatore si può abbreviare con cnt. In aggiunta considera che un contatore è un accumulatore, per cui pieceAccu potrebbe essere un buon nome di variabile.

Ciao.

Nel setup c’è: pinMode(13, INPUT_PULLUP); quindi quella if restituisce true e azzera la variabile countapezzi. Il blocco di codice {…} non è collegato alla if per cui non ha senso e lo devi rimuovere per evitare confusione in chi legge e analizza il codice al fine di aiutarti.

Ciao.

grazie Maurotec, in effetti le graffe non avevano senso, ma ancora non capisco perchè i segmenti del display lampeggiano

Dal momento che ci sono in gioco due diversi display e pilotati in modo differente, direi che serve codice aggiornato e schema elettrico esatto....

Come ti ha già fatto notare @Maurotec se l'ingresso è a pull-up, l'if è sempre vero e quindi resetti ad ogni loop la variabile countapezzi.

Siccome subito dopo vai di nuovo a chiamare

  display.showNumberDec(countapezzi);
  delay(100);

l'effetto finale percepito è quello del lampeggio.

quindi come posso risolverlo?

Devi chiarire come lo hai collegato.

Il pull-up farebbe pensare che l'ingresso è "attivo" quando chiude su GND, ma il commento che hai messo nel blocco dell'if lascia intendere che stai usando un contatto NC di un relé...

Se colleghi il pin 13 a gnd dovrebbe contare correttamente, dovrebbe poiché ho provato il tuo codice al simulatore non avendo fisicamente un display TM1637.

Ciao.

grazie Maurotech, il problema non è sul tm1637 ma sul display a 7 cifre, il TM conta benissimo, e si resetta con un contatto NC a negativo sul pin 13

Se porto a negativo il pin 15 il numero 1 lampeggia con intensità molto bassa visibile in ambiente con pochissima luce, con ingresso negativo su pin 16 il i segmenti del numero 2 stessa situazione con differenza del segmento E che e alla sua massima intensità, con ingresso negativo su pin 17 il numero 3 è perfettamente acceso