indicatore marcia inserita analogico

Ciao a tutti, apro nuovo post perchè il progetto è fatto da 0 e poi per non caricare altre discussioni passate.
Per ora è tutto su breadbord per sviluppare completamente lo sketch prima di montarlo sulla moto.
Come dicevo, nuovo perchè l’utilizzo di installare finecorsa fisici poi potrebbero molto facilmente tornare errori; quindi il tutto si basa sui dati prelevati da tachimetro e contagiri rapportati.
Ogni marcia ha un rapporto fisso tra i due, quindi più preciso.
Ho utilizzato una scheda arduino uno, 2 shift register 74hc595, un display 7 segmenti e una barra di led recuperata.
Uno shift register pilota il display, l’altro i led; i due non son connessi a cascata ma singolarmente ad arduino.

La parte led funziona senza problemi, il display no.
Per il display ho provato due procedure differenti:

  1. Mappare i valori dell’array dei byte corrispondenti ai caratteri con il valore di rapporto tra tachimetro
    e contagiri. Questa da un lato funziona ma ovviamente non è precisa.
  2. Creare una condizione per ogni valore del rapporto e inviare il byte corrispondente al carattere allo
    shift register. Teoricamente è quella ideale però i caratteri sul display si accavallano, nel senso che
    lo shift register invia gli impulsi su pin che in quel momento dovrebbero rimanere spenti.
    Per comodità di chi avrà pazienza di spender un pò di tempo nell’aiutarmi allego sketch e foto.
    Spero che la cosa si risolva positivamente così da dar modo ad altri che come me vogliono realizzarlo.
//
//  Contamarce basato su arduino uno rev.3
//  e 2 shift register 74HC595 per gestione
//  barra led e display led 7 segmenti


int latchPin = 5;   //    connessioni primo shift
int clockPin = 6;   //    register che controlla
int dataPin = 4;    //    la barra led

int latchPin1 = 11;   // connessioni secondo shift
int clockPin1 = 12;   // register che controlla
int dataPin1 = 10;    // display 7 segmenti

// definizione array byte numeri
byte numero[7] = {0b11010101,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001};
// definizione byte led barra led
byte leds = 0;


int currentled = 0; // variabile identificazione led attualmente attivo
int n = 0;          // variabile identificazione del numero da visualizzare
int folle = 7;      // pin su arduino assegnato per posizione folle
int friz = 8;       // pin su arduino assegnato per rilevare l'innesto della frizione

void setup() {
  // impostazione modalità dei pin
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
 
  pinMode(latchPin1, OUTPUT);
  pinMode(clockPin1, OUTPUT);
  pinMode(dataPin1,OUTPUT);

  pinMode (folle, INPUT);
  pinMode (friz, INPUT);

  leds = 0;
  
  Serial.begin(9600);   // attivato per monitorare i dati in ingresso
                        // dei pin digitali
  

 }

void loop() {
   
    int pot_val = analogRead(A0);          // ingresso analogico dati tachimetro
    int pot_val1 = analogRead(A1);         // ingresso analogico dati contagiri
    int val = map (pot_val1,1050,0,0,9);   // mappatura valori per comandare i led
    int rg = ((pot_val / pot_val1)*10);    // variabile basata sul rapporto tra velocit
                                           // e giri moltiplicata per avere valori 
                                           // significativi

    // prova mapppando la variabile per assegnare
    // un valoore del rapporto alla rispettiva lettera
                                           
   /*int n = map (rg,0,1023,1,7);           

     digitalWrite(latchPin, LOW); 
     shiftOut(dataPin, clockPin, LSBFIRST, numero[n]);
     digitalWrite(latchPin, HIGH);
*/
// set di istruzioni per variare l'accensione dei led
// al variare dei giri

 if ( currentled <= val) {
      currentled++;
      bitSet(leds, currentled);
      updateShiftRegister();
      
      }

    for (val != 0; currentled >= val; currentled--) {
          
          bitWrite(leds, currentled, 0);
          
          updateShiftRegister();
    
      
      }   
    
// set istruzioni per assegnare la lettera n
// al variare dei giri con tachimetro a 0
// con relativa istruzione per inviare i byte
// al primo shift register

if (rg == 0) {
 digitalWrite(latchPin, LOW); 
 shiftOut(dataPin, clockPin, LSBFIRST, numero[0]);
 digitalWrite(latchPin, HIGH);
}
//do {                  // ciclo do-while per abilitare il ciclo
                        // con frizione attivata 8per ora ignorato)

// prova di variazione dell'array dei numeri su display
// utilizzando valori definiti di rg con relativa
// istruzione per inviare il set di byte al primo
// shift register

if (50 < rg <= 80) {
   
   digitalWrite(latchPin, LOW); 
   shiftOut(dataPin, clockPin, LSBFIRST, numero[1]);
   digitalWrite(latchPin, HIGH);
}

if (rg == 2.20) {
   digitalWrite(latchPin, LOW); 
   shiftOut(dataPin, clockPin, LSBFIRST, numero[2]);
   digitalWrite(latchPin, HIGH);
}
if (rg == 2.80) {
   digitalWrite(latchPin, LOW); 
   shiftOut(dataPin, clockPin, LSBFIRST, numero[3]);
   digitalWrite(latchPin, HIGH);
}
if (rg == 3.00) {
   digitalWrite(latchPin, LOW); 
   shiftOut(dataPin, clockPin, LSBFIRST, numero[4]);
   digitalWrite(latchPin, HIGH);
}
if (rg == 3.70) {
   digitalWrite(latchPin, LOW); 
   shiftOut(dataPin, clockPin, LSBFIRST, numero[5]);
   digitalWrite(latchPin, HIGH);
}
if (rg == 4.20) {
   digitalWrite(latchPin, LOW); 
   shiftOut(dataPin, clockPin, LSBFIRST, numero[6]);
   digitalWrite(latchPin, HIGH);
}
//while (friz == HIGH);

// definizione delle variabili da visualizzare
// su monitor seriale utiliizzato nella prova a banco
    Serial.println(pot_val1);
    Serial.print("   ");
    Serial.print(pot_val);
    Serial.print("   ");
    Serial.print(rg);
    Serial.print("   ");
   
   
}

// procedura per definire i byte da utilizzare nel
// secondo shift register

   void updateShiftRegister()
    {
       digitalWrite(latchPin1, LOW);
       shiftOut(dataPin1, clockPin1, LSBFIRST, leds);
       digitalWrite(latchPin1, HIGH);
    }

Questo il linguaggio C non lo accetta (anche se compila):

if (50 < rg <= 80) {

Questo si, usando and ( and logico, non and sui bit):

if (50 < rg  && rg <= 80) {

Trovato l'inghippo forse, ora provo. Grazie per la dritta ;)

ottimo ora funziona :D :D :D :D

grazie nid69ita per la dritta, sistemo un pò e pulisco codice. Monto data logger così da risalire ai rapporti esatti che ha la moto, inserisco e testo il tutto. Una volta che ho la certezza che funzioni tutto posto sketch così da metterlo a disposizione. Spero che a qualcuno serva e mi basta avere un feedback in caso.

Punto della situazione: Ho scoperto che sebbene la moto sia a carburatori comunque la gestione dell'alimentazione è elettronica. Col datalogger infatti i dati tachimetro e giri sono costanti. Quindi i segnali sono digitali. Ora, come li misuro visto che sono a 12v?

Provato ad abbassare tensione da 12v a 5v sia con resistenze che con circuito di condensatori e l7805 ma la strumentazione rimane a 0 quindi nessun dato campionato da arduino.