Problema gestione pulsanti

Salve a tutti, ho problemi con un progetto a cui sto lavorando. L'obbiettivo è quello di rappresentare un numero decimale da 0 a 9 in binario con 4 led. Il numero può essere incrementato o decrementato con i pulsante sinistro e destro. Il pulsante centrale serve a spegnere tutti i led o a riaccenderli.

Non riesco a capire perché le lampade si accendano in modo casuale, se invece uso un delay che aumenta il numero ogni tot funziona tutto perfettamente.

Questo è il mio sketch

const int Button1 = 7;
const int Button2 = 6;
const int Button3 = 5;
const int Led1 = 11;
const int Led2 = 10;
const int Led3 = 9;
const int Led4 = 8;

int ButtonState1=0;
int ButtonState2=0;
int ButtonState3=0;
int X=0;
int N=0;
int S=1;
int Y=1;
void setup() 
{
 // put your setup code here, to run once:
 pinMode(Led1, OUTPUT);
 pinMode(Led2, OUTPUT);
 pinMode(Led3, OUTPUT);
 pinMode(Led4, OUTPUT);
 pinMode(Button1, INPUT);
 pinMode(Button2, INPUT);
 pinMode(Button3, INPUT);
}

void loop() 
{
 // put your main code here, to run repeatedly:
 ButtonState1 = digitalRead(Button1);
 ButtonState2 = digitalRead(Button2);
 ButtonState3 = digitalRead(Button3);

 
 if(ButtonState1 == HIGH)
   if(X>0)
     X=X-1;
 if(ButtonState2 == HIGH)
   if(S==0)
     S=1;
   else
     S=0;
 if(ButtonState3 == HIGH)
   if(X<9)
     X=X+1;
 //conversione in binario
 if(S==1)
 {
   N=X;
   if(N%2==0)
   {
     N=N/2;
     digitalWrite(Led1, LOW);
   }
   else
   {
     N=(N-1)/2;
     digitalWrite(Led1, HIGH);
   }
   if(N%2==0)
   {
     N=N/2;
     digitalWrite(Led2, LOW);
   }
   else
   {
     N=(N-1)/2;
     digitalWrite(Led2, HIGH);
   }
   if(N%2==0)
   {
     N=N/2;
     digitalWrite(Led3, LOW);
   }
   else
   {
     N=(N-1)/2;
     digitalWrite(Led3, HIGH);
   }
   if(N%2==0)
   {
     N=N/2;
     digitalWrite(Led4, LOW);
   }
   else
   {
     N=(N-1)/2;
     digitalWrite(Led4, HIGH);
   }
 }
 else
 {
   digitalWrite(Led1, LOW);
   digitalWrite(Led2, LOW);
   digitalWrite(Led3, LOW);
   digitalWrite(Led4, LOW);
 }  
}

In allegato ho messo lo schema di montaggio.

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Hai messo i pullup (o pulldown, dipende da come hai collegato i pulsanti) ed i condensatori di debounce sui tasti ? ...

Ciao,
prementto che non sono un esperto, ma se hai fatto i collegamenti come da disegno con i pulsanti aperti gli ingressi della CPU rimangono flottanti; forse è proprio per questo che i led lampeggiano un po' come vogliono....

Qui sotto il pezzo del tuo schema che non mi sembra molto corretto...

Secondo me se metti a posto il pull-down, dovresti ottenere quanto richiesto...


(praticamente sposti le resistenze sulla breadboard di due buchi a destra...)

...poi puoi implementare il debouncing hardware (e qui lascio la palla a chi è più bravo di me) o il debouncing software.

debounce hardware (le resistenze in serie si possono anche eliminare, volendo)

Grazie a tutti per le vostre risposte, ho risolto con un Debouncer software e prima di incrementare la variabile ho messo un delay superiore al debouncer.