Go Down

Topic: Giochino (problema programmazione) *SPOSTATO* (Read 548 times) previous topic - next topic

Diga

Ho spostato il topic nella sezione giusta..
Il mio problema è quello di non riuscire a far rimanere accesi i display  per tutta la durate del programma, si accendono e si spengono con i led!
Posto il programma di seguito.. Grazie ancora in anticipo!
Code: [Select]

#include "pitches.h"

int led1=13;
int led2=12;

int pulsante1 = A1;
int pulsante2 = A2;
int preset = A0;
int Statop1 = 0;
int Statop2 = 0;
int Statopr = 0;
long rand1=0;

int dspl1;
int dspl2;
int valdspl1 = 0;
int valdspl2 = 0;

int GND1 = 2;
int GND2 = 3;

int A = 4;
int B = 5;
int C = 6;
int D = 7;
int E = 9;
int F = 10;
int G = 11;

void setup()
{
 pinMode(A,OUTPUT);
 pinMode(B,OUTPUT);
 pinMode(C,OUTPUT);
 pinMode(D,OUTPUT);
 pinMode(E,OUTPUT);
 pinMode(F,OUTPUT);
 pinMode(G,OUTPUT);
 pinMode(GND1,OUTPUT);
 pinMode(GND2,OUTPUT);
 pinMode(led1,OUTPUT);
 pinMode(led2,OUTPUT);
 pinMode(pulsante1,INPUT);
 pinMode(pulsante2,INPUT);
 pinMode(preset,INPUT);
 randomSeed (analogRead (0));
 
}


void loop()
{

 digitalWrite(led1,HIGH); digitalWrite(led2,HIGH);
 Statop1=digitalRead(pulsante1);
 Statop2=digitalRead(pulsante2);
 Statopr=digitalRead(preset);
 
 if(Statopr==HIGH)
 {
   dspl1=0;
   dspl2=0;
    digitalWrite(led1,LOW); digitalWrite(led2,LOW);
     }
    delay(rand1 = random (1000, 6000));
 }

 if(Statop1==HIGH)                
{  
  dspl1++;  
 digitalWrite(led1,LOW); digitalWrite(led2,LOW);
 delay(500);
 digitalWrite(led1,HIGH);      
 delay(100);                          
 digitalWrite(led1,LOW);            
 delay(100);                          
 digitalWrite(led1,HIGH);        
 delay(100);  
 digitalWrite(led1,LOW);  
 delay(100);                          
 digitalWrite(led1,HIGH);        
 delay(100);  
 digitalWrite(led1,LOW);
 delay(100);
 digitalWrite(led1,HIGH);      
 delay(100);                          
 digitalWrite(led1,LOW);            
 delay(100);                          
 digitalWrite(led1,HIGH);        
 delay(100);  
 digitalWrite(led1,LOW);  
 delay(rand1 = random (1000, 6000));
 }
 

 if(Statop2==HIGH)
{
  dspl2++;
 digitalWrite(led1,LOW); digitalWrite(led2,LOW);
 delay(500);
 digitalWrite(led2,HIGH);      
 delay(100);                          
 digitalWrite(led2,LOW);            
 delay(100);                          
 digitalWrite(led2,HIGH);        
 delay(100);  
 digitalWrite(led2,LOW);  
 delay(100);                          
 digitalWrite(led2,HIGH);        
 delay(100);  
 digitalWrite(led2,LOW);
 delay(100);
 digitalWrite(led2,HIGH);      
 delay(100);                          
 digitalWrite(led2,LOW);            
 delay(100);                          
 digitalWrite(led2,HIGH);        
 delay(100);  
 digitalWrite(led2,LOW);
 if(valdspl2!=2)
 {
 delay(rand1 = random (1000, 6000));
 }
 }

else(Statop1==LOW, Statop2==LOW);
{
}  

if(dspl1==0)
{
void zero();
{
 digitalWrite(GND1,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,HIGH);
 digitalWrite(E,HIGH);
 digitalWrite(F,HIGH);
 digitalWrite(G,LOW);
 delay(1);
 digitalWrite(GND1,HIGH);
 
}
}
if(dspl2==0)
{
void zero();
{
 digitalWrite(GND2,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,HIGH);
 digitalWrite(E,HIGH);
 digitalWrite(F,HIGH);
 digitalWrite(G,LOW);
 delay(1);
 digitalWrite(GND2,HIGH);

}
}

if(dspl1==1)
{
void uno();
{
 digitalWrite(GND1,LOW);
 digitalWrite(A,LOW);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,LOW);
 digitalWrite(E,LOW);
 digitalWrite(F,LOW);
 digitalWrite(G,LOW);
 delay(1);
 digitalWrite(GND1,HIGH);
}
}
if(dspl2==1)
{
void uno();
{
 digitalWrite(GND2,LOW);
 digitalWrite(A,LOW);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,LOW);
 digitalWrite(E,LOW);
 digitalWrite(F,LOW);
 digitalWrite(G,LOW);
 delay(1);
 digitalWrite(GND2,HIGH);
}
}

if(dspl1==2)
{
void due();
{
 digitalWrite(GND1,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,LOW);
 digitalWrite(D,HIGH);
 digitalWrite(E,HIGH);
 digitalWrite(F,LOW);
 digitalWrite(G,HIGH);  
 delay(1);
 digitalWrite(GND1,HIGH);
}
}
if(dspl2==2)
{
void due();
{
 digitalWrite(GND2,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,LOW);
 digitalWrite(D,HIGH);
 digitalWrite(E,HIGH);
 digitalWrite(F,LOW);
 digitalWrite(G,HIGH);  
 delay(1);
 digitalWrite(GND2,HIGH);
}
}

if(dspl1==3)
{
void tre();
{
 digitalWrite(GND1,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,HIGH);
 digitalWrite(E,LOW);
 digitalWrite(F,LOW);
 digitalWrite(G,HIGH);  
 delay(1);
 digitalWrite(GND1,HIGH);
}
}
if(dspl2==3)
{
void tre();
{
 digitalWrite(GND2,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,HIGH);
 digitalWrite(E,LOW);
 digitalWrite(F,LOW);
 digitalWrite(G,HIGH);  
 delay(1);
 digitalWrite(GND2,HIGH);
}
}
if(dspl1==4)
{
void quattro();
{
 digitalWrite(GND1,LOW);
 digitalWrite(A,LOW);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,LOW);
 digitalWrite(E,LOW);
 digitalWrite(F,HIGH);
 digitalWrite(G,HIGH);
 delay(1);
 digitalWrite(GND1,HIGH);
}
}
if(dspl2==4)
{
void quattro();
{
 digitalWrite(GND2,LOW);
 digitalWrite(A,LOW);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,LOW);
 digitalWrite(E,LOW);
 digitalWrite(F,HIGH);
 digitalWrite(G,HIGH);
 delay(1);
 digitalWrite(GND2,HIGH);
}
}

........ Ho tolto le procedure per la visualizzazione di numeri..

if(dspl1==9)
{
 {
 digitalWrite(led1,LOW); digitalWrite(led2,LOW);
 for(int ripetizione=0; ripetizione<5; ripetizione++)
 {
 digitalWrite(GND1,LOW);
 digitalWrite(G,LOW);
 digitalWrite(A,HIGH);
 delay(50);
 digitalWrite(A,LOW);
 delay(50);
 digitalWrite(B,HIGH);
 delay(50);
 digitalWrite(B,LOW);
 delay(50);
 digitalWrite(C,HIGH);
 delay(50);
 digitalWrite(C,LOW);
 delay(50);
 digitalWrite(D,HIGH);
 delay(50);
 digitalWrite(D,LOW);
 delay(50);
 digitalWrite(E,HIGH);
 delay(50);
 digitalWrite(E,LOW);
 delay(50);
 digitalWrite(F,HIGH);
 delay(50);
 digitalWrite(F,LOW);
 delay(50);
}
 digitalWrite(GND1,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,HIGH);
 digitalWrite(E,HIGH);
 digitalWrite(F,HIGH);
 digitalWrite(G,HIGH);
 delay(250);
 digitalWrite(GND1,HIGH);
 digitalWrite(A,LOW);
 digitalWrite(B,LOW);
 digitalWrite(C,LOW);
 digitalWrite(D,LOW);
 digitalWrite(E,LOW);
 digitalWrite(F,LOW);
 digitalWrite(G,LOW);
 
 for (int thisNote = 0; thisNote < 8; thisNote++)
 {
   int noteDuration2 = 1000/noteDurations2[thisNote];
   tone(8, melody2[thisNote],noteDuration2);
   int pauseBetweenNotes = noteDuration2 * 1.30;
   delay(pauseBetweenNotes);
   noTone(8);
   dspl1=0;
   dspl2=0;
 }
 delay(3500);
}
}

if(dspl2==9)
{
 {
 digitalWrite(led1,LOW); digitalWrite(led2,LOW);
 for(int ripetizione=0; ripetizione<5; ripetizione++)
 {
 digitalWrite(GND2,LOW);
 digitalWrite(G,LOW);
 digitalWrite(A,HIGH);
 delay(50);
 digitalWrite(A,LOW);
 delay(50);
 digitalWrite(B,HIGH);
 delay(50);
 digitalWrite(B,LOW);
 delay(50);
 digitalWrite(C,HIGH);
 delay(50);
 digitalWrite(C,LOW);
 delay(50);
 digitalWrite(D,HIGH);
 delay(50);
 digitalWrite(D,LOW);
 delay(50);
 digitalWrite(E,HIGH);
 delay(50);
 digitalWrite(E,LOW);
 delay(50);
 digitalWrite(F,HIGH);
 delay(50);
 digitalWrite(F,LOW);
 delay(50);
}
 digitalWrite(GND2,LOW);
 digitalWrite(A,HIGH);
 digitalWrite(B,HIGH);
 digitalWrite(C,HIGH);
 digitalWrite(D,HIGH);
 digitalWrite(E,HIGH);
 digitalWrite(F,HIGH);
 digitalWrite(G,HIGH);
 delay(250);
 digitalWrite(GND2,HIGH);
 digitalWrite(A,LOW);
 digitalWrite(B,LOW);
 digitalWrite(C,LOW);
 digitalWrite(D,LOW);
 digitalWrite(E,LOW);
 digitalWrite(F,LOW);
 digitalWrite(G,LOW);
 
 for (int thisNote = 0; thisNote < 8; thisNote++)
 {
   int noteDuration2 = 1000/noteDurations2[thisNote];
   tone(8, melody2[thisNote],noteDuration2);
   int pauseBetweenNotes = noteDuration2 * 1.30;
   delay(pauseBetweenNotes);
   noTone(8);
   dspl1=0;
   dspl2=0;
 }
 delay(3500);
}
}
}
 

PaoloP

#1
Jan 30, 2013, 05:49 pm Last Edit: Jan 30, 2013, 05:58 pm by PaoloP Reason: 1
Ciao Diga,
mi pare di capire che tu abbia un doppio display a 7 segmenti.
Mi spieghi cosa intendi per GND?
Code: [Select]
int GND1 = 2;
int GND2 = 3;

E' per caso il pin Enable?

Poi cosa sono queste funzioni?
Code: [Select]
void quattro();
Code: [Select]
 void tre();

Se volevi definire una porzione di codice da riutilizzare il modo non è corretto.

Hai messo le resistenze di pull-down nei pulsanti?

cece99

Io penso che gestisca i due display in multiplexing, ecco spiegati i deu gnd
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

PaoloP

Per gestire i display a 7 segmenti c'è questa libreria --> https://github.com/sparkfun/SevSeg

Diga

Esatto, i due GND servono per multiplexare, non conoscevo la libreria.. :P
Invece le funzioni "void" servivano per un altro conteggio sempre a display che avevo fatto e allora ho fatto copia incolla dal programma precedente!
La resistenza di pull-down l'ho messa, i pulsanti funzionano benissimo.. il problema è che quando si verifica un blocco del ciclo if, il programma ricomincia e allora tutti gli altri if, funzionano solo alla ripartenza.. questo penserete che non sia un problema, invece lo è perchè appena si accendono i led, i giocatori devono schiacciare più velocemente possibile il pulsante, per vincere e quando questo avviene, i 2 display che dovrebbero segnare il punteggio, si spengono incrementando il valore all accensione successiva che avviene contemporaneamente ai led! Cosi facendo, i giocatori non hanno il tempo di leggere il proprio punteggio che già devono premere il pulsante..
Spero di essermi spiegato altrimenti vi allego un video di quello che succede.

Diga

#5
Feb 04, 2013, 04:29 pm Last Edit: Feb 04, 2013, 04:32 pm by Diga Reason: 1
Ecco quello che mi succede, vi ho linkato nel video il problema effettivo... quando schiaccio i pulsanti per far spegnere i led verdi, si spengono anche i segnapunti, cosa che non vorrei accadesse... Soluzioni???

Go Up