problema con compilazione loop non capisco dove sbaglio......

Ciao a tutti, causa problemi vari sono riuscito solo oggi a ributtarmi dietro al progetto del cambio elettronico per moto.
Alla fine ho deciso di aggiungere un trim e un display a 7 segmenti per poter gestire in maniera analogica il periodo di tempo in millisecondi durante il quale non deve arrivare corrente al motore.
praticamente le posizioni del trim che indicano sul display da 0 a 9 determinano uno stacco da 20 a 50 millisecondi (0= 20,1=23,2=26,3=30,4=33,5=36,6=40,7=43,8=46,9=50).
ho eseguito questo sketch ma il problema è che non riesco nei vari case a far coesistere il numero sul display e la funzione di stacco attacco. Se tolgo il comando del numero quindi per esempio se tolgo uno(); e carico funziona per i millisec chiesti ma chiaramente non me lo indica sul display......
Avete qualche idea su come si possa risolvere? grazie
(code tags please!)

void loop(){
  posizionepot = analogRead (potenziometro); 
  gruppo = (posizionepot & 1020)/102;     // suddivido in 10 gruppi
  
  switch (gruppo) {
  case 0:
  zero();                                             // dico di accendere lo "0"
   lettura = digitalRead (bottone);           
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(20);                                        // questo è il tempo di cambiata e quindi i millisec di stacco
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
  break;
  case 1:
  uno();
  lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(23);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
  break;
   case 2:
  due();
  
  lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(26);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
  
  break;
  case 3:
  tre();
  lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(30);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
  break;
   case 4:
  quattro();
   lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(33);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
  break;
   case 5:
   cinque();
   lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(36);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
   break;
   case 6:
   six();
   lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(40);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
   break;
   case 7:
   sette();
    lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(43);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
   break;
   case 8:
   otto();
   lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(46);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
   break;
   case 9:
   nove();
   lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(50);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
   break;
  }  
  delay (10);
}

ciao
Troppo codice ridondante. Il tempo di ritardo lo memorizzi in una variabile; nello switch case imposti questa variabile come ti serve e dopo vai a verificare (una sola volta nel loop) se il bottone è premuto.

int gruppo;
int ritardo;
int stato =0;
int rele = 12; //messo a caso
int potenziometro = A0; // messo a caso
int bottone = 5; // messo a caso
void setup() {
}
void loop() {
  int posizionepot = analogRead (potenziometro);
  gruppo = map(posizionepot, 0, 1023, 0, 10); // suddivido in 10 gruppi

  switch (gruppo) {
    case 0:
      //zero();                                             // dico di accendere lo "0"
      ritardo = 20;
      break;
    case 1:
      //uno();
      ritardo = 23;
      delay (10);
      break;
    case 2:
      //due();
      ritardo = 26;
      break;
    case 3:
      //tre();
      ritardo = 30;
      break;
    case 4:
      // quattro();
      ritardo = 33;
      break;
    case 5:
      //cinque();
      ritardo = 36;
      break;
    case 6:
      //six();
      ritardo = 40;
    case 7:
      // sette();
      ritardo = 43;
      break;
    case 8:
      //otto();
      ritardo = 46;
      break;
    case 9:
      // nove();
      ritardo = 50;
      break;
  }


  int lettura = digitalRead (bottone);
  if ( lettura == HIGH)
  {
    if (stato == 0)
    { stato = 1;
      digitalWrite(rele, HIGH);
      delay(ritardo);
      digitalWrite (rele, LOW);
      delay(500);
    }
  }
  else
  {
    stato = 0;
  }


}

Ho commentato i vari uno() ecc. perchè non li hai messi nello sketch.
le variabili inizzializzate prima del void setup() anche quelle sono messe a caso per poter testare il codice.
La prossima volta allega tutto il codice >:( >:( >:(

ciao
pippo72

ops scusa era cosi':

int G=2;
int F=3;
int A=4;
int B=5;
int DP=6;
int C=7;
int D=8;
int E=9;
int rele = 10; 
const int  bottone = 11;
int lettura;
int stato = 0;
int potenziometro = 1;
int posizionepot;
int gruppo;

void setup(){
 pinMode(G, OUTPUT);
 pinMode(F, OUTPUT);
 pinMode(A, OUTPUT);
 pinMode(B, OUTPUT);
 pinMode(E, OUTPUT);
 pinMode(D, OUTPUT);
 pinMode(C, OUTPUT);
 pinMode(DP, OUTPUT);
 pinMode (rele, OUTPUT);
 pinMode (bottone, INPUT);
}

void zero(){
 digitalWrite(G, LOW);
 digitalWrite(F, HIGH);
 digitalWrite(A, HIGH);
 digitalWrite(B, HIGH);
 digitalWrite(E, HIGH);
 digitalWrite(D, HIGH);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);

 
}
void uno(){
 digitalWrite(G, LOW);
 digitalWrite(F, LOW);
 digitalWrite(A, LOW);
 digitalWrite(B, HIGH);
 digitalWrite(E, LOW);
 digitalWrite(D, LOW);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);
 
}
void due(){
 digitalWrite(G, HIGH);
 digitalWrite(F, LOW);
 digitalWrite(A, HIGH);
 digitalWrite(B, HIGH);
 digitalWrite(E, HIGH);
 digitalWrite(D, HIGH);
 digitalWrite(C, LOW);
 digitalWrite(DP, LOW);
 
}
void tre(){
 digitalWrite(G, HIGH);
 digitalWrite(F, LOW);
 digitalWrite(A, HIGH);
 digitalWrite(B, HIGH);
 digitalWrite(E, LOW);
 digitalWrite(D, HIGH);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);
 
}
void quattro(){
 digitalWrite(G, HIGH);
 digitalWrite(F, HIGH);
 digitalWrite(A, LOW);
 digitalWrite(B, HIGH);
 digitalWrite(E, LOW);
 digitalWrite(D, LOW);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);

}
void cinque(){
 digitalWrite(G, HIGH);
 digitalWrite(F, HIGH);
 digitalWrite(A, HIGH);
 digitalWrite(B, LOW);
 digitalWrite(E, LOW);
 digitalWrite(D, HIGH);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);
 
}
void six(){
 digitalWrite(G, HIGH);
 digitalWrite(F, HIGH);
 digitalWrite(A, HIGH);
 digitalWrite(B, LOW);
 digitalWrite(E, HIGH);
 digitalWrite(D, HIGH);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);
 
}
void sette(){
 digitalWrite(G, LOW);
 digitalWrite(F, LOW);
 digitalWrite(A, HIGH);
 digitalWrite(B, HIGH);
 digitalWrite(E, LOW);
 digitalWrite(D, LOW);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);

}
void otto(){
 digitalWrite(G, HIGH);
 digitalWrite(F, HIGH);
 digitalWrite(A, HIGH);
 digitalWrite(B, HIGH);
 digitalWrite(E, HIGH);
 digitalWrite(D, HIGH);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);
}
void nove(){  
 digitalWrite(G, HIGH);
 digitalWrite(F, HIGH);
 digitalWrite(A,HIGH);
 digitalWrite(B, HIGH);
 digitalWrite(E, LOW);
 digitalWrite(D, HIGH);
 digitalWrite(C, HIGH);
 digitalWrite(DP, LOW);
 
}

void loop(){
 posizionepot = analogRead (potenziometro);
 gruppo = (posizionepot & 1020)/102;
 
 switch (gruppo) {
 case 0:
 zero();
  lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(20);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
 break;
 case 1:
 uno();
 lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(23);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
 break;
  case 2:
 due();
 
 lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(26);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
 
 break;
 case 3:
 tre();
 lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(30);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
 break;
  case 4:
 quattro();
  lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(33);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
 break;
  case 5:
  cinque();
  lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(36);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
  break;
  case 6:
  six();
  lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(40);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
  break;
  case 7:
  sette();
   lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(43);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
  break;
  case 8:
  otto();
  lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(46);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
  break;
  case 9:
  nove();
  lettura = digitalRead (bottone);    
 if( lettura == HIGH)
 {
   if (stato == 0)
 {stato = 1;
   digitalWrite(rele,HIGH);
 delay(50);
 digitalWrite (rele,LOW);
 delay(500);
 }
 }
 else
 {stato = 0;}
 
 delay (10);
  break;
 }  
 delay (10);
}

cmq mille grazie domattina provo a correggere tutto e verifico... :wink:

@ willy196 : Sei arrivato a 50 post e ancora NON hai letto il regolamento ? ? ? :smiling_imp: :smiling_imp: :smiling_imp:

... punto 7 ... il codice DEVE ESSERE racchiuso negli appositi TAG CODE ... modifica il tuo post, grazie.

Guglielmo

sorry :kissing: :kissing: :kissing:

ok ragazzi ho fatto tutte le modifiche del caso ma alla pressione del bottone non ho nessun riscontro sul rele', se invece gli carico uno sketch che non prevede il display funziona tutto perfettamente..... Avete qualche idea?
ora c'è caricato questo. Mi sembra che (grazie al vostro aiuto) sia tutto corretto pero' il rele' è ammutolito......

int G=2;
int F=3;
int A=4;
int B=5;
int DP=6;
int C=7;
int D=8;
int E=9;
int rele = 10; 
const int  bottone = 11;
int lettura;
int stato = 0;
int potenziometro = 1;
int posizionepot;
int gruppo;
int ritardo;
 
void setup(){
  pinMode(G, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(DP, OUTPUT);
  pinMode (rele, OUTPUT);
  pinMode (bottone, INPUT);
}
 
void zero(){
  digitalWrite(G, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
 
  
}
void uno(){
  digitalWrite(G, LOW);
  digitalWrite(F, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
  
}
void due(){
  digitalWrite(G, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(DP, LOW);
  
}
void tre(){
  digitalWrite(G, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
  
}
void quattro(){
  digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
 
}
void cinque(){
  digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(E, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
  
}
void six(){
  digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
  
}
void sette(){
  digitalWrite(G, LOW);
  digitalWrite(F, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
 
}
void otto(){
  digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
}
void nove(){  
  digitalWrite(G, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(A,HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(DP, LOW);
  
}
 
void loop(){
  posizionepot = analogRead (potenziometro);
  
  gruppo = map(posizionepot, 0, 1023, 0, 10);
  
  switch (gruppo) {
  case 0:
  zero();
  ritardo=20;
  break;
  case 1:
  uno();
 ritardo=23;
  break;
   case 2:
  due();
  ritardo=26;  
  break;
  case 3:
  tre();
  ritardo=30;
  break;
   case 4:
  quattro();
  ritardo=33;
  break;
   case 5:
   cinque();
   ritardo=36;
   break;
   case 6:
   six();
  ritardo=40;
   break;
   case 7:
   sette();
    ritardo=43;
   break;
   case 8:
   otto();
  ritardo=46;
   break;
   case 9:
   nove();
  ritardo=50;
   break;
  }  
   lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
    digitalWrite(rele,HIGH);
  delay(ritardo);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}
  
  delay (10);
  
}

e' come se prendesse solo l'istruzione del display senza considerare tutto il resto........

Forse il relé non si muove se lo azioni per una decina di mS.
Ciao Uwe

no no senza il display funziona....
e' come se impartito il comando del numero non facesse altro....

ciao

Come è collegato il pulsante? Hai messo una resistenza di pulldown?

ciao
pippo72

si, al pulsante va il positivo, l'altro va al pin e a una resistenza che va a massa.
se tolgo il numero dallo sketch funziona..... se lascio il numero per farlo indicare sul display no......

ragazzi mi è venuto un dubbio......
Ora io sto provando tramite usb... Non è che non va semplicemente perchè con questa alimentazione sono scarso? E quando tolgo il numero dal case invece funziona alla perfezione....
Secondo voi se lo volessi collegare direttamente alla batteria della moto basta mettere il +12v sul vin e il - sul ground? oppure devo interporre qualcosa al collegamento?

ciao

Ora io sto provando tramite usb...

Allora approfitta della seriale e utilizzala per fare un po' di debug:
all'interno del setup aggiungi

Serial.begin(9600);
delay(2000);
Serial.println("pronto");

poi all'intrerno del controllo del pulsante aggiungi

 lettura = digitalRead (bottone);    
  if( lettura == HIGH)
  {
    if (stato == 0)
  {stato = 1;
  Serial.println("premuto"); // <<--- parte aggiunta  
  digitalWrite(rele,HIGH);
  delay(ritardo);
  digitalWrite (rele,LOW);
  delay(500);
  }
  }
  else
  {stato = 0;}

carica lo sketch e subito dopo apri il monitor seriale(icona a forma di lente un alto a dx nell'IDE) e controlla di avere la velocità a 9600. Quando premi il pulsante deve apparirti nel monitor seriale la scritta "premuto". Se così non è il problema è nel programma, altrimenti è il relè che non va.

ciao
pippo72

ciao, si appare premuto ogni volta che schiaccio il bottone.........
A questo punto credo che c'entri il fatto che anzichè 5v il rele' è 6v.... dici che è possibile cio'? come tolgo i numeri va, come è acceso anche il display non va piu'.........
In ogni caso è giusto dargli il +12v sul vin e il - della batteria su ground?

ciao
probabilmente l'assorbimento dei led è sufficiente per dare quel piccolo calo di tensione che non permette più al relè (già fuori specifiche) di funzionare correttamente.
A questo punto penso ti convenga sostituire il relè con uno a 5 volt oppure (penso sia meglio) con uno a 12 volts che comanderai tramite un transistor.

willy196:
In ogni caso è giusto dargli il +12v sul vin e il - della batteria su ground?

Ni, dipende dall'assorbimento in gioco; il regolatore di tensione dissipa in calore la differenza di tensione (pessima spiegazione) qiundi potrebbe non riuscire a dissipare il calore prodotto.

Potresti eventualmente mettere uno step-down e portare la tensione in ingresso al vin a 7 volts.

ciao
pippo72