Entrée sortie parking

Bonjour
étant débutant, j'ai un problème dans mon programme pour compter le nombre de places restantes dans un parking.
On utilise deux capteurs B1 et B2.
Mon erreur vient du temps qui s'écoule mais je n'arrive pas à résoudre ce problème.

int place_dispo = 16;//nombre de places disponibles sur le parking

void setup()
{
  pinMode(2, INPUT_PULLUP);//capteur entrée B1
  pinMode(3, INPUT_PULLUP);//capteur entrée B2
  Serial.begin(9600);
}

void loop()
{
  // si "capteur entrée B1 état 1" et "capteur sortie B2 état 0" PUIS  si "capteur entrée B1 état 0" et "capteur sortie B2 état 1" alors on retire une place
  if (digitalRead(2) == LOW and digitalRead(3) == HIGH)
  {
    delay(800);
    if (digitalRead(2) == HIGH and digitalRead(3) == LOW)
    {
      place_dispo -= 1;
    }

  }
  // si "capteur entrée B1 état 0" et "capteur sortie B2 état 1" PUIS  si "capteur entrée B1 état 1" et "capteur sortie B2 état 0" alors on ajoute une place
  if (digitalRead(2) == HIGH and digitalRead(3) == LOW)
  {
    delay(800);
    if (digitalRead(2) == LOW and digitalRead(3) == HIGH)
    {
      place_dispo += 1;
    }

  }
  Serial.println(place_dispo);
}

Et une image représentant les deux capteurs :

Amicalement

postez votre code ici ainsi que l'image du circuit (voir les recommandations listées dans "Les bonnes pratiques du Forum Francophone” pour bien mettre en forme votre demande)

On utilise deux capteurs...

.... Et s'il s'agit d'un travail scolaire il faut l'annoncer.

C'est étonnant mais dès que l'on voit le mot "Tinkercad" on pense de suite à un sujet de terminale.

@blondiaux : ici on n'utilise pas Thinkercad.
J'y ai jeté un œil et dès le départ ça se gâte : création d'un compte : rédhibitoire pour moi.

@68tjs : On peut voir le code et lancer la simulation sans être inscrit.

Mais de toutes les façons, ce n'est pas le but de ce forum que d'aller faire des simulations sur Tinkercad pour corriger ton code ou ton matériel.
Il est très largement préférable que toutes les informations soient présentes sur le forum pour la clarté des échanges car on a aucune certitude quand à la pérennité de Tinkercad.
Donc, pour rester dans l'esprit de ce qui est demandé dans Les bonnes pratiques du Forum Francophone il serait bon que tu publies ton code et une image de ton montage dans ce fil de discussion.

à la décharge des nouveaux venus, je crois qu'ils ont des restrictions sur ce qu'il peuvent poster

Bonsoir

Voilà le code:

int place_dispo = 16;//nombre de places disponibles sur le parking

void setup()
{
    pinMode(2, INPUT_PULLUP);//capteur entrée B1
    pinMode(3, INPUT_PULLUP);//capteur entrée B2
    Serial.begin(9600);
}

void loop()
{
 // si "capteur entrée B1 état 1" et "capteur sortie B2 état 0" PUIS  si "capteur entrée B1 état 0" et "capteur sortie B2 état 1" alors on retire une place
  if(digitalRead(2)==LOW and digitalRead(3)==HIGH)
  	{
    	delay(800);
   		if(digitalRead(2)==HIGH and digitalRead(3)==LOW)
  			{
   				place_dispo -= 1;
    		}
    
  	}
 // si "capteur entrée B1 état 0" et "capteur sortie B2 état 1" PUIS  si "capteur entrée B1 état 1" et "capteur sortie B2 état 0" alors on ajoute une place 
	if(digitalRead(2)==HIGH and digitalRead(3)==LOW)
  	{
    	delay(800);
   		if(digitalRead(2)==LOW and digitalRead(3)==HIGH)
  			{
   				place_dispo += 1;
    		}
    
  	}
  Serial.println(place_dispo);
}

Cordialement
jpbbricole

bonjour blondiaux

Ton problème vient du fait que quand une voiture entre, B1 == LOW, B2 == HIGH, tu décrémentes place_dispo, c'est juste.
Quand la voiture continue son avance de quelques mètres, on trouve la situation B1 == HIGH, B2 == LOW, condition d'une voiture qui sort!
Il faut que, avant de quitter la séquence entrée, que tu soit sûre que la voiture a bien quitté B2.
Tu auras le même problème en sortie.

Cordialement
jpbbricole

Il y a 2 problèmes dans ce code:

  1. Il faut gérer séparément le cas "entrée" et le cas "sortie" et non les traiter l'un derrière l'autre.
  2. Il faut attendre que les 2 capteurs soient revenus dans l'état inactif avant de reboucler.

Le plus simple serait de faire une machine à états pour gérer tout ça.

Il y a juste un hiatus ; c'est visiblement un sujet scolaire et l'utilisation de Tinkercad est peut-être obligatoire.
Le peu que j'en ai vu est que Tinkercad utilise la notion de classe, pas objet mais classe scolaire, pour le prof c'est probablement plus simple à gérer.

Attendons un retour du demandeur.

Bonsoir fdufnews

C'est vrai que c'en serait une excellente application!

Cordialement
jpbbricole

Bonsoir
Merci pour vos réponses et désolé si je n'ai pas respecté toutes les règles du FORUM.
C'est un projet choisit par des élèves en Bac Pro, je suis leur professeur de maths.
"une machine à états" c'est quoi ?

Je n'ai rien contre le fait que les personnes utilisent Tinkercad.
Ce que je défends, c'est le fait que les éléments de la discussion soient sur le forum.
Si demain Tinkercad ferme l'ensemble de ces échanges n'aura plus aucun sens.
Demander que les personnes mettent une copie du code et une image du montage ce n'est pas demander la lune.

Sur cette partie francophone il y a 3 sous fora dont un qui se nomme Tuto et Cours.
Dans ce sous forum il y a un message épinglé qui recense tous les tuto écrit par des membres.

Et justement J-M-L a écrit un tuto sur les "machines à états".

Je te conseille de le lire, de regarder aussi la liste des tutos qui commence à devenir conséquente et si tu as des questions sur un tuto n'hésites pas à les poser.

Bonsoir 68tjs
Ok, un grand MERCI.
Je vais regarder tout cela.

programmation par machine à états : cf mon tuto éventuellement

bonsoir J-M-L
je viens de lire votre tuto et d'essayer de le comprendre.
Dans un premier temps j'ai pensé à cela :
enum {RIEN, ENTRE, DEVANT, SORT} ;
RIEN : B1 et B2 sur HIGH
ENTRE : B1 sur LOW et B2 sur HIGH
DEVANT : B1 et B2 sur LOW (les capteurs sont écartés de 70 cm environ)
SORT : B1 sur HIGH et B2 sur LOW
mais le tuto comporte un seul bouton.
Là on est en présence de deux capteurs (j'ai mis deux boutons pour la simulation).
suis-je bien parti ?

Le tuto c'est un tuto, il ne peut pas couvrir toutes les applications.
Il se contente de présenter une technique de codage et les moyens de la mettre en oeuvre.

Evidemment que tu es bien parti, il faut effectivement 2 capteurs pour pouvoir déterminer le sens de déplacement.
Ensuite il faut faire le graphe des états et tu vas t'apercevoir qu'il y a plus d'états que ce que tu penses.
Il faut partir de l'état repos (ou RIEN selon ta terminologie).
Ensuite partant de cet état il faut étudier ce qui se passe si l'un des capteurs est activé et le nouvelle état dans lequel la machine va se trouver.

Il faudra aussi définir ce qu’est le système. Est-ce le tronçon de route entre les deux capteurs par exemple ? Les contraintes physiques - peut on avoir une voiture qui sort en même temps qu’on rentre ? Une voiture peut elle être si longue qu’elle déclenche les 2 capteurs, une voiture arrivant (mais pas encore au capteur) empêche-t-elle la voiture engagée entre les capteurs d’avancer etc….

Le petit dessin de l’énoncé n’est pas tout à fait suffisant donc il faudra définir le champ des possible.

Enfin on regarde quels sont les événements qui peuvent survenir (ici Activation ou désactivation des capteurs - le temps si on veut traiter éventuellement une panne ou détecter une voiture qui se serait arrêtée entre les 2 capteurs )

Une fois que cela est clarifié on part en effet de l’état au repos et on se demande quels sont les événements pertinents dans cet état et on met des flèches vers les états (n événements distincts peuvent engendrer de 1 à n états) suivants et on documente les actions à prendre lors de chaque transition. Puis pour chaque nouvel état on se repose la même question / fait le même process.

<blague>On compte que les voitures d'enfants?</blague>