code erreur condition IF ou et avec laser et LDR

Bonjour afin de renforcer la sécurité de ma porte de garage pour mes petits enfants j’ai fait un petit dispositif qui enclenche un relais et le contact du relais libre de potentiel agit sur la porte uniquement lorsqu’elle descend.
le problème que lorsque les contactes des bornes 4 ou 5 sont au niv bas la led donc le relais s’enclenche et se déclenche quand même alors qu’il ne devrait rien se passer. Quelqu’un a une idée pour moi, voici le code:

//déclaration des pins

int photocellPin = A1;// cellule LDR recevant la lumière du laser si celui-ci n'est pas couper par une présence.
int photocell2Pin = A2;// cellule LDR qui prend la lumière lorsque le moteur est enclenché pas encore opérationel dans ce montage
int photocellReading;
int ledpin = 11;//ici c'est une led mais qui sera remplacée par le contact du relais
int descenteporte = 4;//ici fin de course fermé uniquement si la porte descend
int fincours = 5;//ici fin de course fermé uniquement si la porte descend
int lazerpin = 6;//alimentation laser

void setup(void)
//déclaration des entrées sorties
{
  Serial.begin(9600);
  pinMode (11, OUTPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, OUTPUT);
  digitalWrite(lazerpin, HIGH);
  digitalWrite(ledpin, LOW);
}

void loop(void){
  photocellReading = analogRead(photocellPin);
  if (digitalRead(4) == LOW | digitalRead(5)== LOW)// si fin de course sont au niveau bas rien à faire
  {
    Serial.println("porte_Arretee");
    digitalWrite(ledpin, LOW);// led remplace relais donc relais déclenché
  }
 
 
  else if (digitalRead(4) == HIGH && digitalRead(5)== HIGH)//si les 2 fins de courses sont au niveau haut la porte descend
  {
   
    delay(100);
    if (photocellReading >= 1000)//seuil attribué à la valeur que renvoie la LDR, ici laser non interrompu donc personne n'est détecté
    {
    Serial.println(photocellReading);
    Serial.println("personne");
    digitalWrite(ledpin, LOW);
    }
   
    if (photocellReading < 800)// ici cette valeur est rencontrée si la ser interrompu
    {
    Serial.println("Quelqu'un");
    digitalWrite(ledpin, HIGH);//le relais s'enclenche et arrrête la porte.
    }
  }
 
 
  photocellReading = 1023 - photocellReading;
  delay(100);
}

Le ou logique c’est || pas |
Pourquoi déclarez vous des variables pour les N° de pins et vous ne les utilisez pas ?
Avez vous des PULL-UP / DOWN sur 4 et 5? Comment gérez vous les rebonds ?
(Mais ce n’est pas votre souci)

Il est vrai que j'ai fait au plus vite sur une breadboard. Les contacts sont de simples fils que je branche au+ pour les niv haut. Effectivement il y a des déclarations pour une possible extension et pas utilisée actuellement mais non contraignante pour le bon fonctionnement. Le ou || je vais modifier et reviens vers vous demain matin je suis étonné que le logiciel ne m'a pas renvoyé d'erreur pour le ou. Merci pour votre aide.

(digitalRead(4) == LOW | digitalRead(5)== LOW)

il ne faut pas mettre un &&?

(digitalRead(4) == LOW && digitalRead(5)== LOW)

Le compilateur est OK pour faire un OU binaire (instruction dénotée par la simple barre verticale |) sur les bits.

Vous avez deux expressions autour qui renvoient un booléen et ensuite vous faites une opération binaire donc les booléens sont promus en entiers et vous faites un OU bit à bit. comme les booléens ne valent que 0 ou 1 le OU bit à bit à le même effet qu’un OU logique

Si vous avez câblé à l’arrache utilisez au moins un INPUT_PULLUP sur vos pins pour fixer le potentiel par défaut sinon elle vont flotter et ça va vous faire des valeurs qui oscillent

es contactes des bornes 4 ou 5 sont au niv bas la led donc le relais s'enclenche

Vous avez raison c'est un OU.