Problème de Low(Arduino)=moins(électrique)

Bonjour,

Je sollicite votre aide, car j'ai voulu tester mon programme sur Tinkercad.
Et j'ai l'impression que l'arduino ne "comprend" pas que LOW veux dire relier au moins

Voici le lien de ma simulation

Les led verte, jaune, rouge, blanche,et bleu représente des relais, les relais verts jaune rouge sont câblé différemment des relais blanc et bleu

Les boutons A,B et D sont des récepteurs de télécommande

Interrupteur t/c est un interrupteur physique mais en réel il n'a que deux connecteurs

Le bouton et l'interrupteur cellule est une cellule de portails et j'ai représenté ainsi le retour du relais interne à la cellule (si le laser de la cellule est coupé alors c'était comme si le boulot été appuyez )

Le tout est un feu de départ avec cellule de faux départ

Le soucis que j'ai, c'est que sur la simulation, les Void //départ comp et //Départ training ce lance aléatoirement sans que l'on puisse choisir entre comp et training

Merci de votre aide

Le lien est inutilisable si on a pas de compte.

Je mets le code ici

//V  : relai LED Verte
//R  : relai LED Rouge
//J1 : relai LED Jaune1
//J2 : relai LED Jaune2
//F  : émeteur feux faut depart
//S  : relai cellule faut depart


//D  : recepteur telecomande test
//A  : recepteur telecomande depart
//I  : interrupteur Training / Comp
//C  : Cellule





//////////////////////////////PROG//////////////////////////

// C++ code
//
const int F = 12;
const int R = 11;
const int J2 = 10;
const int J1 = 9;
const int V = 8;
const int S = 7;
const int C = 5;
const int I = 4; 
const int D = 3;
const int A = 2; 

void setup() 
{  
 
pinMode(V, OUTPUT);
pinMode(J2, OUTPUT);
pinMode(J1, OUTPUT);
pinMode(F, OUTPUT);
pinMode(R, OUTPUT); 
pinMode(S, OUTPUT);
pinMode(C, INPUT_PULLUP);
pinMode(I, INPUT_PULLUP);  
pinMode(D, INPUT_PULLUP);
pinMode(A, INPUT_PULLUP);
  
  
  digitalWrite(S, LOW);
  digitalWrite(J1, HIGH);
  digitalWrite(J2, HIGH); 
  digitalWrite(V, HIGH);
  digitalWrite(R, LOW);
  digitalWrite(F, HIGH);
  delay(200);
  digitalWrite(R, HIGH);
  digitalWrite(F, LOW);
  delay(200);
  digitalWrite(R, LOW);
  digitalWrite(F, HIGH);
  delay(200);
  digitalWrite(R, HIGH);
  digitalWrite(F, LOW);
  delay(200);
  digitalWrite(R, LOW);
  digitalWrite(F, HIGH);
  delay(200);
  digitalWrite(R, HIGH);
  digitalWrite(F, LOW);
  delay(200);
  digitalWrite(R, LOW);
  digitalWrite(F, HIGH);
  delay(200);
  digitalWrite(R, HIGH);
  digitalWrite(F, LOW);
  delay(200);
  digitalWrite(R, LOW);
  digitalWrite(F, HIGH);
  delay(200);
  digitalWrite(R, HIGH);
  digitalWrite(F, LOW);
  delay(200);
  digitalWrite(R, LOW);
  digitalWrite(F, HIGH);
  delay(2000); 
  digitalWrite(R, HIGH);
  digitalWrite(F, LOW);  
}





void loop() 
{

int depart = digitalRead(A);
int T = digitalRead(D);
int C = digitalRead(C);
int I = digitalRead(I);

  
//test//
  
if(T==LOW) 
{
  digitalWrite(J1, LOW);
  digitalWrite(J2, LOW);
  digitalWrite(V, LOW);
  digitalWrite(R, LOW);
  digitalWrite(F, HIGH);
  delay(500);
  digitalWrite(J1, HIGH);
  digitalWrite(J2, HIGH); 
  digitalWrite(V, HIGH);
  digitalWrite(R, HIGH);
  digitalWrite(F, LOW);
}
 
  // depart Comp//
  
    if(depart==LOW && I==LOW) 
{
    delay(500);
  digitalWrite(S, HIGH);
  digitalWrite(J1, LOW);
  delay(1000);
  digitalWrite(J2, LOW);
  delay(1000);
  digitalWrite(V, LOW);
  digitalWrite(S, LOW);
  delay(700);
      
  if(C==LOW)
    
    {
     digitalWrite(V, LOW);
     delay(1300);
    }
      
  else if(C!=LOW)
    
    {
     digitalWrite(J1, HIGH);
     digitalWrite(J2, HIGH); 
     digitalWrite(V, HIGH); 
     digitalWrite(R, LOW);
     digitalWrite(F, HIGH);
     delay(2000);
     digitalWrite(R, HIGH);
     digitalWrite(F, LOW);
    }
      
  digitalWrite(J1, HIGH);
  digitalWrite(J2, HIGH); 
  digitalWrite(V, HIGH); 
  
}
  // depart Training//
  
    if(depart==LOW && I!=LOW) 
{
    delay(500);
  digitalWrite(J1, LOW);
  delay(1000);
  digitalWrite(J2, LOW);
  delay(1000);
  digitalWrite(V, LOW);
  delay(2000);
  digitalWrite(J1, HIGH);
  digitalWrite(J2, HIGH); 
  digitalWrite(V, HIGH); 
  
}
}

Et voilà la photo de la simulation

Si je peux te donner un conseil.
Donne des noms explicites à tes variables cela rend le code bien plus facile à comprendre et à maintenir.

Je pense que tes poussoirs sont mal câblés

Je ne comprends pas ce que tu fais avec le poussoir sur la plaque de droite alors je n'y ai pas touché mais il est aussi mal câblé.

Le poussoir à droite c'est pour simuler le retour du relais de la cellule laser qui est devant les voitures pour le faux départ en gros quand le faisceau lazer est coupé par une voiture le relais envoi le moins par ce câble jusqu'à la borne 5 de l'arduino

Si tu branches sur la borne 1 ou la borne 2 c'est pareil vue qu'elles sont reliés

Oui et justement c'est le problème, actuellement sur ton montage tu as 3 interrupteurs sur lesquels les fils arrivent sur 1 et 2 donc l'Arduino voit ses entrées à 0 et considère les poussoirs comme enfoncés.

Je n'avais pas remarqué hier mais en plus, il manque une connexion vers le GND de l'Arduino. Actuellement, la ligne commune dans le bas des breadboards est en l'air alors qu'elle devrait être reliée à GND

Oui mais je ne comprends pas pourquoi le poussoir et l'interrupteur à coté sont connectés sur la même entrée

Je dirai que c'est pour pouvoir simuler l'appui sur deux boutons poussoirs en simultané
Mais comme sur ordi avec une seule souris c'est compliqué il a mis un switch. Ou bien pour faire un appui prolongé sans rester appuyé. En tous cas je vois pas d'autre raison.

Mais je pense que tu as mis le doigt sur le problème : La masse commune.

Le GND dans tes circuits doit toujours être commun. TOUS les GND. Sinon les modules ne se partagent pas les mêmes références de potentiel et ça foire les communications, échanges de signaux ect

et le câblage des poussoirs qui actuellement envoient en permanence un 0 sur les entrées.

Les poussoirs me semblent correctement câblés. Et ils sont en input pullup alors je ne vois pas le problème ?

Au temps pour moi. Je me suis mélangé les pinceaux.

Tu ne peux pas coder de cette façon si tu appuies sur départ la condition i ne sera pas évaluée

J'ai pas compris ta remarque ?

S'il veut les deux à LOW ?

Et bien si justement.
Si tu appuies sur depart, depart est LOW donc le test d'égalité est évaluée vrai et on vérifie la seconde partie.

Mes excuses, la faim avait bloqué mes neurones!

En fait je voudrais que l'arduino choisisse entre les deux programmes départ suivant la position de l'interrupteur, es ce qu'il ne faudrait pas créé des Void séparé,

Void départ training ()
.....
Void départ comp()
.....

Puis dans void loop()

If (I==LOW)
{
Void départ comp()
}

If (I!=LOW)
{
Void départ training ()
{

Dans mon montage tout les - sont communs j'ai une Alimentation en 12v pour la partie puissance, un régulateur qui descend à 5v pour la partie commande et tout est branché sur un rampe + et -

Oui, mais il manque un GND sur la breadboard

On ne dit pas void mais fonction.
void cela veut dire rien.
Lorsqu'on écrit void ma_fonction(), par exemple, cela veut dire que l'on déclare une fonction qui ne retourne rien. Si on écrit int ma_fonction() cela veut dire que la fonction ma_fonction retournera un entier.

Pour répondre à ta question ce n'est pas une obligation mais cela rend le code plus facile à comprendre.
De même au lieu décrire

If (I==LOW)
{
     depart_comp()
}

If (I!=LOW)
{
     depart_training ()
{

il vaut mieux écrire

If (I==LOW)
{
     depart_comp()
}
else
{
     depart_training ()
{