[Risolto]indicatore di marcia codice Blinking arduino aiuto

Salve a tutti sono un nuovo utente mi chiamo Giuseppe e da poco tempo mi sono avvicinato al mondo dell'elettronica per sviluppare un mio progetto, premetto che non ho mai studiato elettronica e quelle pochissime informazioni le ho apprese su internet ma ho tanta manualità.
Volevo realizzare e alla fine ci sono riuscito un indicatore di marcia da montare su un volante logitech g27.
Per realizzare questo indicatore di marcia ho utilizzato un arduino nano collegato a due switch uno sale di marcia e l'altro scende ho saldato i vari collegamenti al display Display a sette segmenti e programmato il tutto con il programma arduino, fin qui tutto funziona e va perfettamente.
Andando in giro per il web ho visto un video di un indicatore di marcia che tra un cambio marcia e l'altro si visualizza per meno di un secondo una u al contrario( posto un video trovato per capire meglio Postazione G27 cockpit - YouTube ) chi di voi mi può aiutare a variare il codice blink dell'arduino?Sarei molto grato a chi mi potesse aiutare.
posto il codice inserito
grazie a presto Giuseppe
*/

#define BUTTON_DOWN 10
#define BUTTON_UP 12

int ledPinA =  6;    // LED connected to digital pin 3
int ledPinB =  9;    // LED connected to digital pin 4
int ledPinC =  4;    // LED connected to digital pin 5
int ledPinD =  3;    // LED connected to digital pin 6
int ledPinE =  2;    // LED connected to digital pin 7
int ledPinF =  7;    // LED connected to digital pin 8
int ledPinG =  8;    // LED connected to digital pin 9
int ledPinDP =  5;   // LED connected to digital pin 10

int val_down = 0;
int old_val_down = 0;
int val_up = 0;
int old_val_up = 0;
int state = 0;
int gear = 1;

// The setup() method runs once, when the sketch starts

void setup()   {            
pinMode(BUTTON_DOWN, INPUT);
pinMode(BUTTON_UP, INPUT);

// initialize the digital pin as an output:
pinMode(ledPinA, OUTPUT);
pinMode(ledPinB, OUTPUT);
pinMode(ledPinC, OUTPUT);
pinMode(ledPinD, OUTPUT);
pinMode(ledPinE, OUTPUT);
pinMode(ledPinF, OUTPUT);
pinMode(ledPinG, OUTPUT);  
pinMode(ledPinDP, OUTPUT);

// initialize serial communication:
Serial.begin(9600);
}

void led0()
{
digitalWrite(ledPinA,LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, LOW);  
digitalWrite(ledPinF, LOW);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}

void led1()
{
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, LOW);  
digitalWrite(ledPinF, LOW);  
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinDP, HIGH);
}

void led2()
{
digitalWrite(ledPinA, HIGH);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, HIGH);  
digitalWrite(ledPinF, HIGH);  
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinDP, HIGH);
}

void led3()
{
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, LOW);  
digitalWrite(ledPinF, HIGH);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}

void led4()
{
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, HIGH);  
digitalWrite(ledPinF, HIGH);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}


void led5()
{
digitalWrite(ledPinA, HIGH);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, HIGH);  
digitalWrite(ledPinF, LOW);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}

void led6()
{
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, HIGH);  
digitalWrite(ledPinF, LOW);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}

void led7()
{
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, LOW);  
digitalWrite(ledPinF, LOW);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}

void led8()
{
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, LOW);  
digitalWrite(ledPinF, LOW);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}

void led9()
{
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, HIGH);  
digitalWrite(ledPinF, LOW);  
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinDP, HIGH);
}

void ledDP()
{
digitalWrite(ledPinA, HIGH);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, HIGH);  
digitalWrite(ledPinF, HIGH);  
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinDP, LOW);
}

void setLed(int number)
{
switch (number) {
case 0:  
  led0();
  break;
case 1:  
  led1();
  break;
case 2:  
  led2();
  break;
case 3:  
  led3();
  break;
case 4:  
  led4();
  break;
case 5:  
  led5();
  break;
case 6:  
  led6();
  break;
case 7:  
  led7();
  break;
case 8:  
  led8();
  break;
case 9:  
  led9();
  break;
}
}
          
// the loop() method runs over and over again,
// as long as the Arduino has power

void oldloop()                    
{
ledDP();
delay(1000);                  // wait for a second
led0();
delay(1000);                  // wait for a second
led1();
delay(1000);                  // wait for a second
led2();
delay(1000);                  // wait for a second
led3();
delay(1000);                  // wait for a second
led4();
delay(1000);                  // wait for a second
led5();
delay(1000);                  // wait for a second
led6();
delay(1000);                  // wait for a second
led7();
delay(1000);                  // wait for a second
led8();
delay(1000);                  // wait for a second
led9();
delay(1000);                  // wait for a second
}

void loop()
{
val_up = digitalRead(BUTTON_UP);
if ((val_up == HIGH) && (old_val_up == LOW)) {
  gear += 1;
  Serial.print("gear number:  ");
  Serial.println(gear, DEC);
  delay(250);
}
old_val_up = val_up;

val_down = digitalRead(BUTTON_DOWN);
if ((val_down == HIGH) && (old_val_down == LOW)) {
  gear -= 1;
  Serial.print("gear number:  ");
  Serial.println(gear, DEC);
  delay(250);
}
old_val_down = val_down;

if (gear >= 7) {
  gear = 7;
}
if (gear <= 0) {
  gear = 0;
}

setLed(gear);
}

Indicatore_Buono2.ino (6.22 KB)

peppinosan:
( posto un video trovato per capire meglio Postazione G27 cockpit - YouTube )

Mitica Lancia Delta... prima che diventasse un uovo per trasporto famiglie.


Codice super-mega-lungo

Ahi, ahi, qua ci siamo scordati la regola del tre:

Three or more, use a for.

È molto più breve (per il cristiano che scrive/legge, non per l'arduino) se fai così:

const int ledPin[8] = {5,6,9,4,3,2,7,8}; // Prima DP, poi 1==A, ecc

void setup()
{
    for (byte i=0; i<8; i++) { pinMode(ledPin[i], OUTPUT) }
}

Dal video, a me sembra che quella U rovescia appaia per il tempo che l'asta del cambio fa contatto: non è così? Oppure deve indicare qualcos'altro? Dà informazioni in più o è solo un abbellimento nella transizione fra due cifre?

Grazie tante per la risposta e scusami se ho omesso regole o confuso qualcosa ma come dicevo mi sto avvicinando adesso all'elettronica. La u è solo un abbellimento compare velocemente quando avviane la cambiata e quindi una volta pigiato lo switch si intravede la u per pochissimo e poi passa alla marcia successiva il tutto credo avviene in un secondo al massimo 1,5 posto un'altro video

il codice dove devo inserirlo?

grazie a presto Giuseppe

peppinosan:
Grazie tante per la risposta e scusami se ho omesso regole o confuso qualcosa

Il mio voleva essere solo un suggerimeto per tua comodità: naturalmente puoi scrivere il codice come più ti garba, se poi funziona.

Ascoltando l'audio del secondo video, mi par di capire che si sentano due clic quando avviene la cambiata e fra un clic e l'altro venga visualizzata la U rovescia. Ma fare questo o metterla per un certo tempo fra una cifra e l'altra, credo che non abbia importanza ai fini pratici.

Per inserire la U, prima la devi mappare indicando in stato basso i pin dei segmenti C, E, G e alto gli altri (parliamo sempre di anodo comune). Poi, semplicemente visualizzi il tuo simbolo, aspetti 250 ms o giù di lì e poi visualizzi la nuova cifra.

Nel leggere la pressione del pulsante, prevedi un debouncing, sennò ti capiterà di cambiare due o tre marce in un colpo solo.

mi potrebbe fare un esempio? su ho copiato il codice che ho inserito se mi compili solo un primo passaggio tra marcia 1 e due al resto ci provo io :slight_smile: scusa ma sono una frana, per quanto riguarda il cambio marcia ho creato un circuito antirimbalzo quindi non salta, se è troppo complicato lascio tutto come sta.

Siccome tutta la faccenda mi ha incuriosito ho provato questo codice sulla mia scheda e fa il suo dovere. Naturalmente, così com'è è un sistema chiuso; devi poi interfacciarlo con il simulatore vero e proprio.

Ho inserito una funzione di lampeggio se si tenta di cambiare la marcia oltre il massimo/minimo.

Fammi sapere se funziona.

marce_simulatore.ino (2.68 KB)

Niente con il tuo codice non va ho inserito nuovamente il codice postato nel primo post e va perfettamente.
Facciamo un po di chiarezza.
Ho un arduino nano ATmega328 dove è stato collegato un 7segmenti e due switch uno per salire di marcia e l'altro per scendere.L' indicatore di marcia deve funzionare senza interagire con il gioco perchè la ps3 non permette collegamenti quindi essendo bloccata ho creato un cambio collegato al g27 un volante logitech che interagisce tranquillamente con la ps3 e dentro al cambio ho collegato i due switc dell'arduino.
post lo schema copiato uno con il collegamento arduino e l'altro per una modifica antirimbalzo.

antirimbalzo.pdf (17.1 KB)

schema indicatore di marcia .pdf (36.1 KB)

Che cos'è che non va esattamente?

Il tuo cablaggio mi sembra a posto, ma ovviamnete hai usato pin diversi dai miei. Hai cambiato le definizioni dei pin per adattarli al tuo schema? Hai posto la variabile anodo_comune = 1 ? Visto che hai usato tutti pin in successione per i segmenti puoi anche definirli con un for, ma ricorda di andare dal 9 al 2 con decremento, o avrai problemi con la funzione bitRead. Se cambi i define, basta fare così:

#define ledA 2
#define ledB 3
 
 // eccetera

Stessa cosa per gli input 10 e 12.

P.S. Come resistori, forse 220 Ω è pochino.

Ho provato ma niente non va ho fatto tutte le combinazioni che mi hai detto ma niente, ne sale ne scende di marcia visualizzo come primo solo una u al contrario posta sulla parte alta

Fatto ;D non avevo variato i pin degli switch funziona manca solo da sistemare la retro marcia che viene prima del numero 0 e poi su 1 ci provo.
Bello il lampeggio a fine marcia :slight_smile: grazie
speriamo di riuscire a inserire lo zero e la retro :wink:

Ciao scusa se ti tormento sono riuscito a cambiare alcune cose: appena si accende parte da - che rappresenta lo zero. Ho provato a inserire la retro con un simbolo E cambio il numero del cost byte a 14 appena inserisco u sballa tutto compare un nove nella cambiata ecc. devo variare altro?

Fra prima e retro, ti serve lo zero (o altro) per la folle? Se non ti serve, puoi semplicemente rimappare lo zero con E o un altro simbolo a scelta. Poi lascia che n possa andare a 0 nella funzione principale.

Se vuoi lo zero e poi la retromarcia, le cose si complicano un po': lascia che n vada fino a -1 e scrivi una funzione dedicata per mostrare il simbolo della retromarcia. Così è più facile che aggiungere un valore alla mappatura dei segmenti perché non devi pasticciare con gli indici del vettore "cifre".

Oppure, un trucco è di far scivolare tutti i valori di un posto in avanti, così l'elemento indice zero del vettore è la retro, l'uno è la folle, il due è la prima, ecc. Poi, basta invocare mostraCifra(1+n).

GRAZIE pasticciando ho risolto ho fatto slittare tutto di uno hai creato un codice semplice, leggibile e chiaro anche a chi non conosce il codice arduino. Indispensabile è stata la mappatura con traduzione a fianco :slight_smile: .
ps: è normale che se lascio lo switch pigiato rimane la u azionata? una volta lasciato lo switch va al numero successivo.Ho pasticciato qualcosa?
grazie ancora il lampeggio mi piace tantissimo ti postero il video :slight_smile:

peppinosan:
è normale che se lascio lo switch pigiato rimane la u azionata?

È normale. È un comportamento previsto da questo blocco:

while(stato_su) {
        delay(1);
        stato_su = digitalRead(SU);
    } // while

Senza questo codice, se schiaccio il tasto per un tempo > ritardo_cambiata il display va avanti di più marce in una volta sola. Se il tasto è ancora premuto dopo che è trascorso ritardo_cambiata, aspetto ancora un millisecondo e controllo di nuovo e così via.


Sono impaziente di vedere il video con l'applicazione pratica!

Ciao ieri sera mi sono divertito fino a tardi a fare varie prove con l'effetto lampeggiante se mi invii in privato la tua email ti mando i video con http://wetransfer.com/ . hai suggerimenti per caricare i video?
A presto

prima prova

seconda prova

terza prova

quale preferisci ?

I video li hai pubblicati come PRIVATI, non si possono vedere :stuck_out_tongue:

Fatto adesso sono pubblici

peppinosan:
quale preferisci ?

Il migliore mi sembra il primo.