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