Display 7 segmentos Cambio

Hola expongo mi pequeño gran problema:
Estoy fabricando un display para el cambio de marchas que va desde neutro hasta 6ª velocidad, después de mucho buscar he encontrado una galería que entiendo "un poco" pero no lo suficiente para poder realizar el proyecto al 100 X 100.
He modificado algo lo que he encontrado en internet y lo he probado con un potenciometro en la protboard y todo de lujo, mi sorpresa es la siguiente el potenciometro de la caja de velocidades no varia en voltaje para las distintas velocidades (no es lineal) de primera a segunda varia 0.5v de segunda a tercera 0.8v de tercera a cuarta 0.5v de cuarta a quinta 1.1v...
Mi pregunta es la siguiente puedo programar que con cada voltaje de entrada me muestre el numero en la pantalla correspondiente?
y la otra pregunta es: el neutro puedo hacer que me muestre una n minúscula con los segmentos e, g, c?
Saludos.

#include "SevSeg.h" 

SevSeg sevseg; 

int refreshTime = 100; //how many seconds should it wait before it checks and displays the temp again? 1000 = 1 second 
int verde = A1;
int neutro = 0;
unsigned long timer; 
float cambio = 0; 
int potenciometro = 0;
float se = 0;

void setup() 
{ 
byte numDigits = 1;   
  byte digitPins[] = {2};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};

  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(100);
  pinMode(A1,OUTPUT);
} 

void loop() 
{ 
    cambio = analogRead(potenciometro); 
    cambio = ((5 * cambio * 2 )/1024)-2; 

    se = analogRead(potenciometro);
    se = (5 * se)/1024;

unsigned long mils=millis(); 
if (mils-timer>=refreshTime) { 
timer=mils; 

sevseg.setNumber(cambio,(byte) 0); 
} 
sevseg.refreshDisplay();

}

de primera a segunda varia 0.5v
de segunda a tercera 0.8v
de tercera a cuarta 0.5v
de cuarta a quinta 1.1v...

Lo que no dices si eso es acumulativo, o siempre ves diferncias.
Les 1 a 2 0.5 y luego 0.5 mas 0.8 y asi?

Hola surbyte, gracias por contestar.
No guarda un orden entre cambio y cambio.
1= 0.6v
2= 0.9V
3= 1.7v
4=2.2v
5= 3.3v
6= 4.1V
N= 4.4V
R= 5V

Pensaba que entre marcha y marcha había 0.62v por eso con el potenciometro me funcionaba de Lujo.
pero al montarlo me he dado cuenta de que no es cierto y que el cambio que se muestra en el display no corresponde con el cambio engranado.
pensaba hacerlo con.
if y else, pero no se como aplicarlo a esta galeria y si es posible claro.

No importa pero tu fijas comparaciones entre medio y lo tienes todo cubierto asi.

#define PRIMERA 0.75  // 0.6
#define SEGUNDA 1.3   // 0.9
#define TERCERA 1.95
#define CUARTA 2.75
#define QUINTA 3.7
#define SEXTA  4.25
#define NEUTRAL 4.6
#define REVERSE 4.8

float valor;
String cambio;
   
void loop() {
// lo que corresponda
  valor = analogRead(A0) * 5.0/1023.0;
  
  if (valor > REVERSA) // > 4.8 entonces REVERSA
      cambio = "REVERSA";
  else if (valor > NEUTRAL) // 
          cambio = "NEUTRAL";
  else if (valor > QUINTA) //  
          cambio = "QUINTA";
  else if (valor > CUARTA) //  
          cambio = "CUARTA";
  else if (valor > TERCERA) // 
          cambio = "TERCERA";
  else if (valor > SEGUNDA) // 
          cambio = "SEGUNDA";
  else if (valor > PRIMERA) // 
          cambio = "PRIMERA";

Mira a ver si trabaja mas o menos bien.

Creo que lo he entendido.
Que tengo que usar para que me lo muestre en el display?

sevseg.setNumber( ? ,(byte) 0);

o tengo que modicar algo?

Saludos

Una solución para cubrir el expediente podría ser modificar en la librería SevSeg el dígito 0. Para ello bastaría con modificar el SevSeg.cpp, en la línea 309, sustituyendo B00111111 por el correspondiente a tu "n" (no estoy seguro, pero prueba a ver con B01010100). Como supongo que ya tenías asignado 0 a neutral, no deberías hacer nada más.

Lo he hecho como me ha dicho surbyte, creo que mas o menos correcto.

#include "SevSeg.h" 

SevSeg sevseg; 

#define PRIMERA 0.75  // 0.6
#define SEGUNDA 1.3   // 0.9
#define TERCERA 1.95
#define CUARTA 2.75
#define QUINTA 3.7
#define SEXTA  4.25
#define NEUTRAL 4.6
#define REVERSE 4.8


int refreshTime = 100; //how many seconds should it wait before it checks and displays the temp again? 1000 = 1 second 
unsigned long timer;  
float valor;


void setup() 
{ 
byte numDigits = 1;   
  byte digitPins[] = {2};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};

  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(1);
  pinMode(A1,OUTPUT);
} 

void loop() { 

valor = analogRead(A0) * 5.0/1023.0;
 
     if (valor > REVERSA) // > 4.8 entonces REVERSA
      cambio = "REVERSA";
  else if (valor > NEUTRAL) // 
          cambio = "NEUTRAL";
  else if (valor > QUINTA) //  
          cambio = "QUINTA";
  else if (valor > CUARTA) //  
          cambio = "CUARTA";
  else if (valor > TERCERA) // 
          cambio = "TERCERA";
  else if (valor > SEGUNDA) // 
          cambio = "SEGUNDA";
  else if (valor > PRIMERA) // 
          cambio = "PRIMERA";

unsigned long mils=millis(); 
if (mils-timer>=refreshTime) { 
timer=mils; 

sevseg.setNumber(valor,(byte) 0); 
} 
sevseg.refreshDisplay();

}

Ahora no se como tengo que hacer para que imprima cada numero en el Display.

Ahh yo te puse para que mostrara una etiqueta y luego tu la vieras en el Monitor Serie cuando lo probabas con tu potenciometro.
Ahora en lugar de eso o agrega una variable del tipo byte por ejemplo
byte marcha;
y con cada if ajustas su valor y luego haz lo que dice @noter.

#include "SevSeg.h" 

SevSeg sevseg; 

#define PRIMERA 0.75  // 0.6
#define SEGUNDA 1.3   // 0.9
#define TERCERA 1.95
#define CUARTA  2.75
#define QUINTA  3.7
#define SEXTA   4.25
#define NEUTRAL 4.6
#define REVERSE 4.8


int refreshTime = 100; //how many seconds should it wait before it checks and displays the temp again? 1000 = 1 second 
unsigned long timer;  
float valor;
byte marcha, marchaAnt = 0;
byte numDigits     = 1;   
byte digitPins[]   = {2};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};

void setup() { 
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(1);
  pinMode(A1,OUTPUT);
  Serial.begin(9600); // para poder ver en el monitor serie que pasa al igual que el display
} 

void loop() { 

valor = analogRead(A0) * 5.0/1023.0;
 
    if (valor > REVERSA) { //> 4.8 entonces REVERSA
        cambio = "REVERSA";
        marcha = 7;
    }
	else if (valor > NEUTRAL) { //
	         cambio = "NEUTRAL";
	         marcha = 0;
	 	 }
	else if (valor > SEXTA) { // 
	         cambio = "SEXTA";
	         marcha = 6;
	 	 }
	else if (valor > QUINTA) { // 
	         cambio = "QUINTA";
	         marcha = 5;
	 	 }
	else if (valor > CUARTA) { // 
	         cambio = "CUARTA";
	         marcha = 4;
	 	 }
	else if (valor > TERCERA) { //
	         cambio = "TERCERA";
	         marcha = 3;
	 	 }
	else if (valor > SEGUNDA) { //
	         cambio = "SEGUNDA";
	         marcha = 2;
	 	 }
	else if (valor > PRIMERA) { //
	         cambio = "PRIMERA";
	         marcha = 1;
	 	 }

	unsigned long mils = millis(); 
	if (mils-timer > refreshTime) { 
		timer = mils; 
     	sevseg.setNumber(marcha,(byte) 0); 
     	if (marcha != marchaAnt)
     		Serial.prinln(cambio);
     	marchaAnt = marcha;
	} 
	sevseg.refreshDisplay();

}

Buenas noches.
La verdad que solo puedo decir que muchas muchas gracias.
Display funcionando correcto.
Saludos a todos.

X nada y luego me cuentas de donde has leido esos datos de tensión en tu vehículo. No lo sabía.

Hola tengo montada una caja secuencial.
Y dispone de un potenciómetro interior que devuelve el votaré según la marcha engranada.
Como puedo cambiar el título del post para sí algún forero más lo llega a usar?

Posiciónate en el post#0, luego ve a More (abajo a la derecha) luego Modify y ya puedes editar todo lo que quieras incluído el título. Agrega [SOLUCIONADO]

Que vehículo es?

Un Honda.