problema potenziometro che gestisce un sequenza di led

Buongiorno a tutti, avendo bisogno di monitorare delle posizioni precise di un potenziometro, ho messo dei led che mi segnalano l’effettiva posizione e con un relè che mi comanda due file di led per la scala dei valori e cioè semplicemente con uno scambio del relè invio il negativo in base a quale fila voglio la visualizzazione, fin qui tutto ok solo che ho un malfunzionamento quando commuto il relè e cioè: se ho il relè quindi l’uscita RELECAMBIOSCALA basso, sul serial monitor, ruotando il potenziometro, ho valori da 0 a 1023, se invece RELECAMBIOSCALA alto i valori vanno da 90 a 980 circa e non capisco il motivo.
Altra cosa, fin quando esegue questo

if (statof >=0 and statof <64) {
  digitalWrite (LED6V, HIGH);
  } else {
  digitalWrite (LED6V, LOW);  
  }
  if (statof >64 and statof <128) {
  digitalWrite (LED6R, HIGH);
  } else {
  digitalWrite (LED6R, LOW);  
  }

la luminosità dei led sono ok, ma quando esegue questo

if (statof >128 and statof <192) {
  digitalWrite (LED5R, HIGH);
  } else {
  digitalWrite (LED5R, LOW);  
  }

la luminosità è dimezzata, lo fanche su questo

if (statof >320 and statof <384) {
  digitalWrite (LED4R, HIGH);
  } else {
  digitalWrite (LED4R, LOW);  
  }

anche su questo

if (statof >512 and statof <576) {
  digitalWrite (LED3R, HIGH);
  } else {
  digitalWrite (LED3R, LOW);  
  }

anche su questo

if (statof >704 and statof <768) {
  digitalWrite (LED2R, HIGH);
  } else {
  digitalWrite (LED2R, LOW);  
  }

anche su questo

if (statof >896 and statof <960) {
  digitalWrite (LED1R, HIGH);
  } else {
  digitalWrite (LED1R, LOW);  
  }

praticamente il led rosso prima di ogni led verde considerando che i led sono bicolor a tre pin e negativo comune
non spiegandomi il motivo chiedo a voi aiuto
grazie in anticipo
questo è il listato completo

#define LED6V 13 
#define LED6R 12
#define LED5V 11
#define LED5R 10 
#define LED4V 9 
#define LED4R 8
#define LED3V 7 
#define LED3R 6 
#define LED2V 5 
#define LED2R 4
#define LED1V 3 
#define LED1R 2
#define BUTTON1 15
#define RELECAMBIOSCALA 16

int statof = 0;

int ledState5 = LOW;
int buttonState4;
int lastButtonState4 = HIGH;
long lastDebounceTime4 = 0;
long debounceDelay4 = 50;

void setup() {
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(15, INPUT);
  pinMode(16, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  statof = analogRead (A0);
  Serial.println(statof);
  delay (100);
  if (statof >=0 and statof <64) {
  digitalWrite (LED6V, HIGH);
  } else {
  digitalWrite (LED6V, LOW);  
  }
  if (statof >64 and statof <128) {
  digitalWrite (LED6R, HIGH);
  } else {
  digitalWrite (LED6R, LOW);  
  } 
  if (statof >128 and statof <192) {
  digitalWrite (LED5R, HIGH);
  } else {
  digitalWrite (LED5R, LOW);  
  }
  if (statof >192 and statof <256) {
  digitalWrite (LED5V, HIGH);
  } else {
  digitalWrite (LED5V, LOW);  
  }
  if (statof >256 and statof <320) {
  digitalWrite (LED5R, HIGH);
  } else {
  digitalWrite (LED5R, LOW);  
  }
  if (statof >320 and statof <384) {
  digitalWrite (LED4R, HIGH);
  } else {
  digitalWrite (LED4R, LOW);  
  }
  if (statof >384 and statof <448) {
  digitalWrite (LED4V, HIGH);
  } else {
  digitalWrite (LED4V, LOW);  
  }
  if (statof >448 and statof <512) {
  digitalWrite (LED4R, HIGH);
  } else {
  digitalWrite (LED4R, LOW);  
  }
  if (statof >512 and statof <576) {
  digitalWrite (LED3R, HIGH);
  } else {
  digitalWrite (LED3R, LOW);  
  }
  if (statof >576 and statof <640) {
  digitalWrite (LED3V, HIGH);
  } else {
  digitalWrite (LED3V, LOW);  
  }
  if (statof >640 and statof <704) {
  digitalWrite (LED3R, HIGH);
  } else {
  digitalWrite (LED3R, LOW);  
  }
  if (statof >704 and statof <768) {
  digitalWrite (LED2R, HIGH);
  } else {
  digitalWrite (LED2R, LOW);  
  }
  if (statof >768 and statof <832) {
  digitalWrite (LED2V, HIGH);
  } else {
  digitalWrite (LED2V, LOW);  
  }
  if (statof >832 and statof <896) {
  digitalWrite (LED2R, HIGH);
  } else {
  digitalWrite (LED2R, LOW);  
  }
  if (statof >896 and statof <960) {
  digitalWrite (LED1R, HIGH);
  } else {
  digitalWrite (LED1R, LOW);  
  }
  if (statof >960 and statof <=1023) {
  digitalWrite (LED1V, HIGH);
  } else {
  digitalWrite (LED1V, LOW);  
  }
  
  int reading4 = digitalRead(BUTTON1);
  if (reading4 != lastButtonState4) {
    lastDebounceTime4 = millis();
  }
  if ((millis() - lastDebounceTime4) > debounceDelay4) {
    if (reading4 != buttonState4) {
      buttonState4 = reading4;
      if (buttonState4 == HIGH) {
        ledState5 = !ledState5;
      }
    }
  }
  digitalWrite (RELECAMBIOSCALA, ledState5);
  lastButtonState4 = reading4;
}

Evidentemente la corrente assorbita dal relè va ad abbassare la tensione sull'estremo alto del potenziometro.

grazie DATMAN era proprio il relè che assorbiva e quindi mi dava il mal funzionamento resta però il fatto dell'abbassamento della luminosità
ho provato con quest'altro sketch

#define LED6V 13 
#define LED6R 12
#define LED5V 11
#define LED5R 10 
#define LED4V 9 
#define LED4R 8
#define LED3V 7 
#define LED3R 6 
#define LED2V 5 
#define LED2R 4
#define LED1V 3 
#define LED1R 2
#define BUTTON1 15
#define RELECAMBIOSCALA 16

int statof = 0;

int ledState5 = LOW;
int buttonState4;
int lastButtonState4 = HIGH;
long lastDebounceTime4 = 0;
long debounceDelay4 = 50;

void setup(){
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(15, INPUT);
  pinMode(16, OUTPUT);
  Serial.begin(9600);
  }
void loop(){
  
  statof = analogRead(A0); 
  Serial.println(statof);

switch (statof) {

   case 0 ... 64:
  digitalWrite(LED6V, HIGH);
  delay(10);
  digitalWrite(LED6V, LOW);
  break;
 
   case 65 ... 128:
  digitalWrite(LED6R,HIGH);
  delay(10);
  digitalWrite(LED6R,LOW);
  break;
 
   case 129 ... 192:
  digitalWrite(LED5R,HIGH);
  delay(10);
  digitalWrite(LED5R,LOW);
  break;

   case 193 ... 256:
  digitalWrite(LED5V,HIGH);
  delay(10);
  digitalWrite(LED5V,LOW);
  break;

   case 257 ... 320:
  digitalWrite(LED5R,HIGH);
  delay(10);
  digitalWrite(LED5R,LOW);
  break;

   case 321 ... 384:
  digitalWrite(LED4R,HIGH);
  delay(10);
  digitalWrite(LED4R,LOW);
  break;

   case 385 ... 448:
  digitalWrite(LED4V,HIGH);
  delay(10);
  digitalWrite(LED4V,LOW);
  break;

   case 449 ... 512:
  digitalWrite(LED4R,HIGH);
  delay(10);
  digitalWrite(LED4R,LOW);
  break;

   case 513 ... 576:
  digitalWrite(LED3R,HIGH);
  delay(10);
  digitalWrite(LED3R,LOW);
  break;

   case 577 ... 640:
  digitalWrite(LED3V,HIGH);
  delay(10);
  digitalWrite(LED3V,LOW);
  break;

   case 641 ... 704:
  digitalWrite(LED3R,HIGH);
  delay(10);
  digitalWrite(LED3R,LOW);
  break;

   case 705 ... 768:
  digitalWrite(LED2R,HIGH);
  delay(10);
  digitalWrite(LED2R,LOW);
  break;

   case 769 ... 832:
  digitalWrite(LED2V,HIGH);
  delay(10);
  digitalWrite(LED2V,LOW);
  break;

   case 833 ... 896:
  digitalWrite(LED2R,HIGH);
  delay(10);
  digitalWrite(LED2R,LOW);
  break;

   case 897 ... 960:
  digitalWrite(LED1R,HIGH);
  delay(10);
  digitalWrite(LED1R,LOW);
  break;

   case 961 ... 1023:
  digitalWrite(LED1V,HIGH);
  delay(10);
  digitalWrite(LED1V,LOW);
  break;

  }

  int reading4 = digitalRead(BUTTON1);
  if (reading4 != lastButtonState4) {
    lastDebounceTime4 = millis();
  }
  if ((millis() - lastDebounceTime4) > debounceDelay4) {
    if (reading4 != buttonState4) {
      buttonState4 = reading4;
      if (buttonState4 == HIGH) {
        ledState5 = !ledState5;
      }
    }
  }
  digitalWrite (RELECAMBIOSCALA, ledState5);
  lastButtonState4 = reading4;
  
}

non me lo fa più tranne che su questo

 case 897 ... 960:
  digitalWrite(LED1R,HIGH);
  delay(10);
  digitalWrite(LED1R,LOW);
  break;

è una cosa incredibile booo

Per ora, noto che:

  • l'i/o 2 non è impostato come uscita
  • i define usali anche per il pinMode, altrimenti fai prima con un for!
  • negli if gli estremi non sono definiti

ok ok apposto avevo solo omesso pinMode(2, OUTPUT);
per il resto funziona tutto benissimo, alle volte la soluzione la sia ha sotto agli occhi ma non la si vede
un grazie infinite a DATMAN
ecco lo sketch definitivo e funzionante

#define LED6V 13 
#define LED6R 12
#define LED5V 11
#define LED5R 10 
#define LED4V 9 
#define LED4R 8
#define LED3V 7 
#define LED3R 6 
#define LED2V 5 
#define LED2R 4
#define LED1V 3 
#define LED1R 2
#define BUTTON1 15
#define RELECAMBIOSCALA 16

int statof = 0;

int ledState5 = LOW;
int buttonState4;
int lastButtonState4 = HIGH;
long lastDebounceTime4 = 0;
long debounceDelay4 = 50;

void setup(){
  
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(15, INPUT);
  pinMode(16, OUTPUT);

  }
void loop(){
  
  statof = analogRead(A0); 

switch (statof) {

   case 0 ... 64:
  digitalWrite(LED6V, HIGH);
  delay(10);
  digitalWrite(LED6V, LOW);
  break;
 
   case 65 ... 128:
  digitalWrite(LED6R,HIGH);
  delay(10);
  digitalWrite(LED6R,LOW);
  break;
 
   case 129 ... 192:
  digitalWrite(LED5R,HIGH);
  delay(10);
  digitalWrite(LED5R,LOW);
  break;

   case 193 ... 256:
  digitalWrite(LED5V,HIGH);
  delay(10);
  digitalWrite(LED5V,LOW);
  break;

   case 257 ... 320:
  digitalWrite(LED5R,HIGH);
  delay(10);
  digitalWrite(LED5R,LOW);
  break;

   case 321 ... 384:
  digitalWrite(LED4R,HIGH);
  delay(10);
  digitalWrite(LED4R,LOW);
  break;

   case 385 ... 448:
  digitalWrite(LED4V,HIGH);
  delay(10);
  digitalWrite(LED4V,LOW);
  break;

   case 449 ... 512:
  digitalWrite(LED4R,HIGH);
  delay(10);
  digitalWrite(LED4R,LOW);
  break;

   case 513 ... 576:
  digitalWrite(LED3R,HIGH);
  delay(10);
  digitalWrite(LED3R,LOW);
  break;

   case 577 ... 640:
  digitalWrite(LED3V,HIGH);
  delay(10);
  digitalWrite(LED3V,LOW);
  break;

   case 641 ... 704:
  digitalWrite(LED3R,HIGH);
  delay(10);
  digitalWrite(LED3R,LOW);
  break;

   case 705 ... 768:
  digitalWrite(LED2R,HIGH);
  delay(10);
  digitalWrite(LED2R,LOW);
  break;

   case 769 ... 832:
  digitalWrite(LED2V,HIGH);
  delay(10);
  digitalWrite(LED2V,LOW);
  break;

   case 833 ... 896:
  digitalWrite(LED2R,HIGH);
  delay(10);
  digitalWrite(LED2R,LOW);
  break;

   case 897 ... 960:
  digitalWrite(LED1R,HIGH);
  delay(10);
  digitalWrite(LED1R,LOW);
  break;

   case 961 ... 1023:
  digitalWrite(LED1V,HIGH);
  delay(10);
  digitalWrite(LED1V,LOW);
  break;

  }

  int reading4 = digitalRead(BUTTON1);
  if (reading4 != lastButtonState4) {
    lastDebounceTime4 = millis();
  }
  if ((millis() - lastDebounceTime4) > debounceDelay4) {
    if (reading4 != buttonState4) {
      buttonState4 = reading4;
      if (buttonState4 == HIGH) {
        ledState5 = !ledState5;
      }
    }
  }
  digitalWrite (RELECAMBIOSCALA, ledState5);
  lastButtonState4 = reading4;
  
}

ho bisogno adesso di pilotare un display o a 7 segmenti e 4 cifre oppure uno lcd, ho provato con l'opzione dell'uscita pwm e quindi leggere la tensione ma mi risulta sballato ogni volta che ruoto il potenziometro, in pratica vorrei che se ledState5 è basso i valori devono andare da 0,025Volt a 0,250Volt e se ledState è alto i valori devono andare da 0,250Volt a 2,5Volt, di funzionare funziona ma è impreciso, secondo voi coem posso avere una stabilità nel sistema?

questa è la modifica che ho apportato

if (ledState5 == LOW) {
   int tensionec = map(statoc, 0, 1023, 15,56);
    analogWrite(3, tensionec/4);
  } 
  if (ledState5 == HIGH) {
   int tensionec = map(statoc, 0, 1023, 56,521);
    analogWrite(3, tensionec/4);
  }

e secondo voi esiste un metodo per far si che ad una determinata resistenza del potenziometro corrisponda un valore preciso scelto da me in pwm?

oppure sempre leggendo il valore in resistenza ma assegnare al display (quindi non un display voltmetro ma pilotare con arduino un display) un determinato valore al display sceldo e impostato da me?

ne listato ho cambiato statof con statoc

if (ledState5 == LOW) {
   int tensionec = map(statoc, 0, 1023, 15,60);
    analogWrite(3, tensionec/4);
  } else {
   int tensionec = map(statoc, 0, 1023, 56,521);
    analogWrite(3, tensionec/4);
  }

semplificazione con esle