Contapezzi (Il mio primo progetto e non funziona)

Salve a tutti, per la prima volta mi sono avvicinato alla programmazione dell'arduino per realizzare un contapezzi. In realtà sono tre contapezzi, che a seconda dell'ingresso selezionato, visualizza il conteggio dei pezzi associati a quel determinato ingresso. Il conteggio avviene mediante una fotocellula posta su un altro ingresso dell'arduino.
Il reset del specifico contatore avviene selezionando l'ingresso associato a quel contatore e piggiando il tasto reset (altro ingresso dell'arduino).
Purtroppo il soft che ho realizzato non funziona. Potreste darmi un aiuto a capire dove ho sbagliato?
Grazie

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int SelettoreA;
int SelettoreB;
int SelettoreC;
int Reset_pezzi;
int F_Cellula;


int pezziA = 0;
int pezziB = 0;
int pezziC = 0;
int pausa=100;

void setup ()
{
  lcd.begin(16, 2);
  
  pinMode (0, INPUT);
  pinMode (10, INPUT);
  pinMode (11, INPUT);
  pinMode (12, INPUT);
  pinMode (13, INPUT);
  
  lcd.setCursor(0, 0);
  lcd.print("conteggio");
  lcd.setCursor(0, 1);
  lcd.print("pezzi");
  delay(3000);
  lcd.clear();
 }
  
  void loop ()
 {
  SelettoreA=digitalRead(0);
  SelettoreB=digitalRead(10);
  SelettoreC=digitalRead(11);
  Reset_pezzi=digitalRead(12);
  F_Cellula=digitalRead(13);
  
  //__________________________________________________________
  if (SelettoreA==HIGH){
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO A");
  }
  if ((SelettoreA==HIGH) && (F_Cellula==HIGH)){
  pezziA++;
  lcd.setCursor(0, 1); 
  lcd.print(pezziA);
  delay(pausa);
  }
  //__________________________________________________________
  if (SelettoreB==HIGH){
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO B");
  }
  if ((SelettoreB==HIGH) && (F_Cellula==HIGH)){
  pezziB++;
  lcd.setCursor(0, 1); 
  lcd.print(pezziB);
  delay(pausa);
  }
  //__________________________________________________________
  if (SelettoreC==HIGH){
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO C");
  }
  if ((SelettoreC==HIGH) && (F_Cellula==HIGH)){
  pezziC++;
  lcd.setCursor(0, 1); 
  lcd.print(pezziC);
  delay(pausa);
  }
  //__________________________________________________________
  if ((SelettoreA==HIGH) && (Reset_pezzi==HIGH)){
  pezziA=0;
  delay(pausa);
  }
  if ((SelettoreB==HIGH) && (Reset_pezzi==HIGH)){
  pezziB=0;
  delay(pausa);
  }
  if ((SelettoreC==HIGH) && (Reset_pezzi==HIGH)){
  pezziC=0;
  delay(pausa);
  }
  }

ciao
ho realizzato qualcosa di simile, intanto però potresti indicare cosa non funziona nello specifico

stefano

Anch'io pensavo a cosa non gli funziona.... ma così a occhio su un contapezzi i delay non mi piacciono :slight_smile:

ciao

Per semplificare un attimo le cose consiglio di testare il programma con un solo contapezzi, una volta che lo sketch funziona è un attimo ad aggiungere gli altri 2.
Ciao

Per capire cosa non funziona ho aggiunto la seriale. Ora il codice è questo:

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int SelettoreA;
int SelettoreB;
int SelettoreC;
int Reset_pezzi;
int F_Cellula;


int pezziA = 0;
int pezziB = 0;
int pezziC = 0;
int pausa=100;

void setup ()
{
  lcd.begin(16, 2);
  
  Serial.begin(9600);
  
  pinMode (0, INPUT);
  pinMode (10, INPUT);
  pinMode (11, INPUT);
  pinMode (12, INPUT);
  pinMode (13, INPUT);
  
  lcd.setCursor(0, 0);
  lcd.print("conteggio");
  lcd.setCursor(0, 1);
  lcd.print("pezzi");
  delay(3000);
  lcd.clear();
 }
  
  void loop ()
 {
  SelettoreA=digitalRead(0);
  SelettoreB=digitalRead(10);
  SelettoreC=digitalRead(11);
  Reset_pezzi=digitalRead(12);
  F_Cellula=digitalRead(13);
  
  //__________________________________________________________
  if (SelettoreA==HIGH){
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO A");
  Serial.print("Pezzi TIPO A");
  Serial.print("\n\r");
  }
  if ((SelettoreA==HIGH) && (F_Cellula==HIGH)){
  pezziA++;
  lcd.setCursor(0, 1); 
  lcd.print(pezziA);
  Serial.print(pezziA);
  Serial.print("\n\r");
  delay(pausa);
  }
  //__________________________________________________________
  if (SelettoreB==HIGH){
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO B");
  Serial.print("Pezzi TIPO B");
  Serial.print("\n\r");
  }
  if ((SelettoreB==HIGH) && (F_Cellula==HIGH)){
  pezziB++;
  lcd.setCursor(0, 1); 
  lcd.print(pezziB);
  Serial.print(pezziB);
  Serial.print("\n\r");
  delay(pausa);
  }
  //__________________________________________________________
  if (SelettoreC==HIGH){
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO C");
  Serial.print("Pezzi TIPO C");
  Serial.print("\n\r");
  }
  if ((SelettoreC==HIGH) && (F_Cellula==HIGH)){
  pezziC++;
  lcd.setCursor(0, 1); 
  lcd.print(pezziC);
  Serial.print(pezziC);
  Serial.print("\n\r");
  delay(pausa);
  }
  //__________________________________________________________
  if ((SelettoreA==HIGH) && (Reset_pezzi==HIGH)){
  pezziA=0;
  Serial.print("Reset Pezzi TIPO A");
  Serial.print("\n\r");
  delay(pausa);
  }
  if ((SelettoreB==HIGH) && (Reset_pezzi==HIGH)){
  pezziB=0;
   Serial.print("Reset Pezzi TIPO B");
   Serial.print("\n\r");
  delay(pausa);
  }
  if ((SelettoreC==HIGH) && (Reset_pezzi==HIGH)){
  pezziC=0;
   Serial.print("Reset Pezzi TIPO C");
   Serial.print("\n\r");
  delay(pausa);
  }
  }

Aprendo il serial monito mi appare questo:

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Pezzi TIPO C

Reset Pezzi TIPO A

Reset Pezzi TIPO B

Reset Pezzi TIPO C

Pezzi TIPO A

Pezzi TIPO B

Come se tutti gli ingressi fossero ad "1"
Io però ho aggiunto delle resistenze da 10K tra i pin interessati e il GND
Cosa mi sfugge?

in effetti qualcosa ti sfugge http://arduino.cc/forum/index.php/topic,91560.0.html
lo sketch non lo carichiamo in memoria cerebrale, spiega meglio i passaggi e come ottieni certi risultati, un listato senza spiegazione dei passaggi non significano nulla

ciao

Che segnale Ti da la fotocellula?
Ciao Uwe

Ok, ho commentato il codice, sperando di essermi riuscito a spiegare bene.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
/* Ho 3 ingressi che vengono selezionati da un selettore per 
definire quale dei tre contatori devo invrementare,(Selezione manuale).
un ingresso per il reset del contatore che ho selezionato mediante il selettore ed una
fotocellula per incrementare il contatore che ho selezzionato
*/
int SelettoreA;
int SelettoreB;
int SelettoreC;
int Reset_pezzi;
int F_Cellula;

//De finisco le variabbili che conterranno il valore accumulato (Pezzi contati)
int pezziA = 0;
int pezziB = 0;
int pezziC = 0;

//Pausa per antiribbalzo
int pausa=100;

void setup ()
{
  // Definisco il tipo di display
  lcd.begin(16, 2);
  //Inizzializzo la seriale
  Serial.begin(9600);
  //definisco i pin che utilizzo per i miei ingressi
  pinMode (0, INPUT); // Selettore in posizione 1
  pinMode (10, INPUT); // Selettore in posizione 2
  pinMode (11, INPUT); // Selettore in posizione 3
  pinMode (12, INPUT); // Pulsante reset
  pinMode (13, INPUT); //Fotocellula per il conteggio
  // Messaggio iniziale
  lcd.setCursor(0, 0); //Posizione il cursore nella prima riga al primo carattere
  lcd.print("conteggio");
  lcd.setCursor(0, 1); //Posizione il cursore nella seconda riga al primo carattere
  lcd.print("pezzi");
  delay(3000); //Attendo tre secondi
  lcd.clear(); //Cancello tutto
 }
  
  void loop ()
 {
   //Leggo ciclicamente gli ingressi digitali e li assogio alle varibbili
  SelettoreA=digitalRead(0); //Ingresso ad 1 se il selettore si trova in questa posizione
  SelettoreB=digitalRead(10); //Ingresso ad 1 se il selettore si trova in questa posizione
  SelettoreC=digitalRead(11); //Ingresso ad 1 se il selettore si trova in questa posizione
  Reset_pezzi=digitalRead(12); //Ingresso ad 1 se il pulsante reset è piggiato 
  F_Cellula=digitalRead(13); //Ingresso ad 1 se il pezzo è dinanzi alla fotocellula
  
  //__________________________________________________________
  if (SelettoreA==HIGH){ // Se il selettore si trova in posizione A visualizzo sul display che voglio contare i pezzi tipo A
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO A");
  Serial.print("Pezzi TIPO A"); // Scrivo in seriale monitor
  Serial.print("\n\r");  // Vado d'accapo in seriale monitor
  }
  /* Se il selettore si trova in posizione A ed il pezzo è dinanzi alla fotocellula incremento il
  valore di una unità nella varibbile pezziA
 */ 
  if ((SelettoreA==HIGH) && (F_Cellula==HIGH)){
  pezziA++; //Incremento di uno
  lcd.setCursor(0, 1); //Setto la posizione del cursore sull'LCD
  lcd.print(pezziA); //Scrivo il valore contenuto in pezziA sull'LCD
  Serial.print(pezziA); // Scrivo anche in serial monitor
  Serial.print("\n\r"); // Vado accapo
  delay(pausa); //Pausa anti ribbalzo
  }
  //__________________________________________________________
  if (SelettoreB==HIGH){ // Se il selettore si trova in posizione A visualizzo sul display che voglio contare i pezzi tipo B
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO B");
  Serial.print("Pezzi TIPO B");// Scrivo in seriale monitor
  Serial.print("\n\r"); // Vado d'accapo in seriale monitor
  }
  /* Se il selettore si trova in posizione B ed il pezzo è dinanzi alla fotocellula incremento il
  valore di una unità nella varibbile pezziB
 */ 
  if ((SelettoreB==HIGH) && (F_Cellula==HIGH)){
  pezziB++; //Incremento di uno
  lcd.setCursor(0, 1); //Setto la posizione del cursore sull'LCD
  lcd.print(pezziB); //Scrivo il valore contenuto in pezziA sull'LCD
  Serial.print(pezziB); // Scrivo anche in serial monitor
  Serial.print("\n\r"); // Vado accapo
  delay(pausa);//Pausa anti ribbalzo
  }
  //__________________________________________________________
  if (SelettoreC==HIGH){ // Se il selettore si trova in posizione A visualizzo sul display che voglio contare i pezzi tipo C
  lcd.setCursor(0, 0); 
  lcd.print("Pezzi TIPO C");
  Serial.print("Pezzi TIPO C"); // Scrivo in seriale monitor
  Serial.print("\n\r");  // Vado d'accapo in seriale monitor
  }
   /* Se il selettore si trova in posizione C ed il pezzo è dinanzi alla fotocellula incremento il
  valore di una unità nella varibbile pezziC
 */ 
  if ((SelettoreC==HIGH) && (F_Cellula==HIGH)){
  pezziC++; //Incremento di uno
  lcd.setCursor(0, 1);//Setto la posizione del cursore sull'LCD
  lcd.print(pezziC);//Scrivo il valore contenuto in pezziA sull'LCD
  Serial.print(pezziC);// Scrivo anche in serial monitor
  Serial.print("\n\r");// Vado accapo
  delay(pausa);//Pausa anti ribbalzo
  }
  //__________________________________________________________
  /*Se il selettore si trova in posizione A ed il tasto reset è piggiato resetto il contatore A */
  if ((SelettoreA==HIGH) && (Reset_pezzi==HIGH)){
  pezziA=0;
  Serial.print("Reset Pezzi TIPO A");
  Serial.print("\n\r");
  delay(pausa);
  }
  /*Se il selettore si trova in posizione A ed il tasto reset è piggiato resetto il contatore B */
  if ((SelettoreB==HIGH) && (Reset_pezzi==HIGH)){
  pezziB=0;
   Serial.print("Reset Pezzi TIPO B");
   Serial.print("\n\r");
  delay(pausa);
  }
   /*Se il selettore si trova in posizione C ed il tasto reset è piggiato resetto il contatore C */
  if ((SelettoreC==HIGH) && (Reset_pezzi==HIGH)){
  pezziC=0;
   Serial.print("Reset Pezzi TIPO C");
   Serial.print("\n\r");
  delay(pausa);
  }
  }

Che segnale Ti da la fotocellula?

Al momento non ho la fotocellula, ma ho collegato dei pulsanti. In futuro utilizzerò una fotocellula con contatto NA

se usi la seriale non puoi usare il pin 0.

Non utilizzare il Pin 0. E' utilizzato dalla Seriale. Usa il 2, il 3, il 4, il 5...ecc ecc.
Ma non usare i Pin 0 e 1.

Dovresti migliorare il Debounce e, inoltre, crearti una funzione invece di avere il codice triplicato.

Ciao!
Secondo me è un problema di hardware: il codice è sicuramente migliorabile, però se non schiacci niente non ti dovrebbe dare niente, non ci sono santi che tengano. Per selettore intendi 3 bottoni?

Riesci a postare lo schema o una foto della breadboard?