Problema pulsanti led millis

Questa è la funzione da richiamare ogni secondo:

void updateDisplay() {

  sevseg.setNumber(pellet); //  stampiamo la lettura del sensore a ultrasuoni sul display
  Serial.print(pellet); // stampiamo la lettura del sensore ad ultrasuoni sul pannello di arduino
  Serial.println("cm");

  sevseg.refreshDisplay();

// queste misure possono essere cambiate sostituendo i numeri e metterli a vostro piacere
// modificato come da suggerimento di Arco_500
  if (pellet <= 40) { // accendiamo il primo led se la misura è sotto i 40 cm
    digitalWrite (ledGreen, LOW);
    digitalWrite (ledYellow, HIGH);
    digitalWrite (ledRed, HIGH);
  }

  else if (pellet <= 41 && pellet >= 64) { // tra i 41 e i 64 cm facciamo accendere il secondo led
    digitalWrite (ledGreen, HIGH);
    digitalWrite (ledYellow, LOW);
    digitalWrite (ledRed, HIGH);
  }

  else if (pellet > 65) { //dopo i 65 cm facciamo accendere il terzo led
    digitalWrite (ledGreen, HIGH);
    digitalWrite (ledYellow, HIGH);
    digitalWrite (ledRed, LOW);

  }
}

Qui invece la chiamata di updateDisplay():

if (millis() - timer >= 1000) { //sfruttando la funzione millis facciamo in modo che ogni 1000 ms dal reset della scheda
   timer += 1000; // (o dall'avvio) avvenga una lettura del sensore di distanza
   pellet = sr04.Distance();
   updateDisplay();
 }
if (millis() - timer >= 1000) { //sfruttando la funzione millis facciamo in modo che ogni 1000 ms dal reset della scheda
   timer += 1000; // (o dall'avvio) avvenga una lettura del sensore di distanza
   pellet = sr04.Distance();
   updateDisplay();
 }

ho provato a fare cosi ma al display mi si accendono solo delle linee e non mi legge la cifra

infatii modificando cosi' ho risolto

if (millis() - timer >= 1000) { //sfruttando la funzione millis facciamo in modo che ogni 1000 ms dal reset della scheda
   timer += 1000; // (o dall'avvio) avvenga una lettura del sensore di distanza
   pellet = sr04.Distance();
}
   updateDisplay();

che poi sarebbe lo stesso di prima pma più ordinato

Ma questa if non ha le condizioni "rovescie"?

else if (pellet <= 41 && pellet >= 64)

Commenta la chiamata a

  sevseg.refreshDisplay();

che si trova dentro la funzione updateDisplay().
La chiamata a deve essere eseguita tante volte al secondo quindi la puoi inserire nella funzione loop fuori da ogni condizione if, tipo così:

if (millis() - timer >= 1000) { //sfruttando la funzione millis facciamo in modo che ogni 1000 ms dal reset della scheda
   timer += 1000; // (o dall'avvio) avvenga una lettura del sensore di distanza
   pellet = sr04.Distance();
   updateDisplay();
 }
  sevseg.refreshDisplay();

Capisci che aggiorni la variabile pellet ogni secondo e non ha molto senso ripetere milioni di volte al secondo le altre parti di codice che usano la variabile pellet.

PS: correggi anche ciò che ti ha fatto notare @frat

finalmente ci sono riuscito, riposto il codice completo e corretto grazie ai vostri aiuti.
se a qualcuno potrebbe servire almeno lo trova visto che in giro lo vendono a sui 100 euro

//programma lettura pellet nel silos
#include "SevSegShift.h"

#define TRIG_PIN 14 // ingresso A0 di arduino nano utilizzato come ingresso digitale
#define ECHO_PIN 15 // ingresso A1 di arduino nano utilizzato come ingresso digitale

#include <SR04.h>
SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN); //inseriamo un oggetto di tipo SRO4, lo chiamiamo sr04 e gli diamo come parametri i pin utilizzati per TRIG ed ECHO


#define SHIFT_PIN_SHCP 4 // va collegato al 4 di arduino e al 14 del 74HC595
#define SHIFT_PIN_STCP 5 // va collegato al 5 di arduino e al 12 del 74HC595
#define SHIFT_PIN_DS   6 // va collegato al 6 di arduino e al 11 del 74HC595

SevSegShift sevseg(SHIFT_PIN_DS, SHIFT_PIN_SHCP, SHIFT_PIN_STCP);

//led di controllo sensore ultrasuoni
#define ledGreen 7
#define ledYellow 8
#define ledRed 9

//led sensori IR E18-D80NK
#define LedYellowSens 10
#define LedRedSens 11

// Ingresso sensori IR E18-D80NK
#define SensMezzo 2
#define SensFine  3

// variabili Debounce

long t = 0;
long debounce_delay = 2000;

int stato = 1;

// variabili lampeggio led
unsigned long ritardo;
int led = 0;

int pellet;

void setup() {
  pinMode (ledGreen, OUTPUT);
  pinMode (ledYellow, OUTPUT);
  pinMode (ledRed, OUTPUT);
  pinMode (LedYellowSens, OUTPUT);
  pinMode (LedRedSens, OUTPUT);
  pinMode (SensMezzo, INPUT);
  pinMode (SensFine, INPUT);




  // impostiamo la libreia sevseg con i relativi parametri.
  byte numDigits = 4;
  byte digitPins[] = {1, 2, 3, 4}; // of ShiftRegister(s) | 8+x (2nd Register)
  byte segmentPins[] = {8 + 0, 8 + 1, 8 + 2, 8 + 3, 8 + 4, 8 + 5, 8 + 6, 8 + 7 }; // of Shiftregister(s) | 8+x (2nd Register)
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_CATHODE; // See README.md for options
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = true; // Use 'true' if your decimal point doesn't exist or isn't connected

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
               updateWithDelays, leadingZeros, disableDecPoint);
  sevseg.setBrightness(90);


}


void loop() {

  static unsigned long timer = millis();

  if (millis() - timer >= 1000) { //sfruttando la funzione millis facciamo in modo che ogni 1000 ms dal reset della scheda
    timer += 1000; //(o dall'avvio) avvenga una lettura del sensore di distanza
    pellet = sr04.Distance();
    Display();
  }  
  sevseg.refreshDisplay();


  if ((millis() - t) > debounce_delay) { // ritardo lettura sensori 
    int sens1 = digitalRead(SensMezzo); //sensore a ultrasuoni posto a metà della cassa del pellet
    int sens2 = digitalRead(SensFine);  //sensore a ultrasuoni posto alla fine della cassa del pellet
    t = millis();


    switch (stato) { // se i sensori sono tutti e 2 attivi i led sono spenti
      case 1:
        digitalWrite(LedYellowSens, HIGH);
        digitalWrite(LedRedSens, HIGH );
        //cambio di stato se:
        if (sens1 && !sens2) stato = 2; // se il primo sens1 e spento e il sens2 e attivo si sposta allo stato 2
        break;

      case 2: // il led giallo e attivo e il led rosso è spento
        digitalWrite(LedYellowSens, LOW);
        digitalWrite(LedRedSens, HIGH);
        //cambio di stato se:
        if (sens1 && sens2) stato = 3;    // se i sensori sono tutti e 2 spenti si passa allo stato 3
        if (!sens2 && !sens1) stato = 1;  // se i sensori sono tutti e 2 attivi i led sono spenti e si ritorna allo stato 1
        break;

      case 3: // il led giallo e spento e il led rosso e acceso lampeggiante
        digitalWrite(LedYellowSens, HIGH);
        if (millis() - ritardo > 500) {
          led = !led; // il valore stato cambia ogni volta che l'if è vero
          ritardo = millis(); // azzero il valvore di ritardo
        }

        digitalWrite(LedRedSens, led); // accendo e spengo il led in funzionae di "stato"

        if (sens1 && !sens2) stato = 2; //se il primo sens1 e spento e il sens2 e attivo si sposta allo stato 2

        break;
    }
  }
}



void Display(){
sevseg.setNumber(pellet); //  stampiamo la lettura del sensore a ultrasuoni sul display
  Serial.print(pellet); // stampiamo la lettura del sensore ad ultrasuoni sul pannello di arduino
  Serial.println("cm");

  

// queste misure possono essere cambiate sostituendo i numeri e metterli a vostro piacere
  if (pellet <= 40) { // accendiamo il primo led se la misura è sotto i 40 cm
    digitalWrite (ledGreen, LOW);
    digitalWrite (ledYellow, HIGH);
    digitalWrite (ledRed, HIGH);
  }

  else if (pellet >= 41 && pellet <= 64) { // tra i 41 e i 64 cm facciamo accendere il secondo led
    digitalWrite (ledGreen, HIGH);
    digitalWrite (ledYellow, LOW);
    digitalWrite (ledRed, HIGH);
  }

  else if (pellet >= 65) { //dopo i 65 cm facciamo accendere il terzo led
    digitalWrite (ledGreen, HIGH);
    digitalWrite (ledYellow, HIGH);
    digitalWrite (ledRed, LOW);

  }
}