Aidez un débutant SVP... idée boite aux lettres

Bonjour tout le monde.
Voila, je suis nouveau dans le monde de l'arduino, et l'apprentissage n'est pas si simple que je pensais.
Je viens donc vers vous pour un peu d'aide.

Voila mon idée: signaler la présence de courrier dans la boite aux lettres par une led.
3 interrupteurs, un arduino, et une led (dans mon principe).
Interrupteur 1 : porte avant; interrupteur 2: fente avant; interrupteur 3: porte arrière.
Dans l'idée, si le facteur ouvre soit la porte avant soit la fente, la led s'allume, et lorsque j'ouvre la porte arrière, ça s'éteint. Je pensais ça simple, mais je ne suis pas encore au niveau.

Si vous pouviez me donner un coup de main avec quelques explications pour que je comprenne comment tout cela fonctionne.
Merci beaucoup

J'allais oublier, voila ce que j'ai pondu pour le moment pour tester avec 2 boutons poussoirs sur ma planche. Si je peux faire quelque chose à partir de ça...

// Initialisation des constantes :
const int porteAv = 2;     // Numéro de la broche à laquelle est connecté le bouton poussoir
//const int fente = 3;
const int porteAr = 5;
const int led =  13;      // Numéro de la broche à laquelle est connectée la LED

// Déclaration des variables :
int etatPorteAv = 0;         // variable qui sera utilisée pour stocker l'état du bouton
//int etatFente = 0;
int etatPorteAr = 0;

// le code dans cette fonction est exécuté une fois au début
void setup() {
 // indique que la broche led est une sortie :
 pinMode(led, OUTPUT);      
 // indique que la broche bouton est une entrée :
 pinMode(porteAv, INPUT); 
//  pinMode(fente, INPUT);
 pinMode(porteAr, INPUT);    
}

// le code dans cette fonction est exécuté en boucle
void loop(){
 // lit l'état du bouton et stocke le résultat dans etatBouton
 etatPorteAv = digitalRead(porteAv);
//  etatFente = digitalRead(fente);
 etatPorteAr = digitalRead(porteAr);

 // Si etatBouton est à 5V (HIGH) c'est que le bouton est appuyé

//Début  

 if (etatPorteAv == HIGH && etatPorteAr == HIGH){     //Si la porte avant et arrière sont fermées
   digitalWrite(led, LOW);     //La led est éteinte
 }
 
//  else                          //Sinon

//Ouverture porte AV
 while
 if (etatPorteAv == LOW) {     //Si la porte avant est ouverte
   digitalWrite(led, HIGH);    //La led est allumée
 }
 if (etatPorteAr == HIGH) {    //Si la porte arrière est fermée
   digitalWrite(led, HIGH);     //La led est allumée
}

//Fermeture porte AV

 if (etatPorteAv == HIGH) {     //Si la porte avant est fermée
   digitalWrite(led, HIGH);    //La led est allumée
 }
 if (etatPorteAr == HIGH) {    //Si la porte arrière est fermée
   digitalWrite(led, HIGH);     //La led est allumée
}

//Ouverture porte AR

 if (etatPorteAv == HIGH) {     //Si la porte avant est fermée
   digitalWrite(led, LOW);     //La led est éteinte
 }
 if (etatPorteAr == HIGH) {    //Si la porte arrière est fermée
   digitalWrite(led, LOW);     //La led est éteinte
}

//Fermeture porte AR
}

Bonjour, ça ressemble à un va et vient, donc le besoin de l'arduino n'est pas flagrant. Mais pour apprendre c'est un bon projet. Je crois que des choses similaires ont déjà été faites. Cherche sur le forum, en utilisant l'icône en forme de loupe en haut

Tu as raison ça y ressemble fortement, mais ce qui m’intéresse surtout c'est le coté programmation. Et j'ai cherché pas mal, mais je ne trouve pas la réponse à mon questionnement. Sauf avec un système de relais, et sans le programme arduino....

. Si je peux faire quelque chose à partir de ça…

oui ce que tu peux faire c’est éditer ton message et mettre le code entre les balises CODE, la touche </>… :slight_smile:

Quelques remarques.

  • Pour mettre du code dans les fils de discussions voir là. Si tu ne places pas le code entre balises sa mise en forme est perdue et certains passage risquent d'être masqué par la mise en forme automatique des messages sur le forum.

  • Concernant ton code, tu as fait un méli-mélo de tests pas tous pertinents.
    Je pense que tu as tapé ton code directement sans avoir analysé sur le papier le fonctionnement attendu.
    C'est une étape qui peut paraître inutile pour un programme assez simple mais en fait cela évite souvent bien des soucis.
    Je t'invite à faire l'exercice.

Tu avais bien commencé

Dans l'idée, si le facteur ouvre soit la porte avant soit la fente, la led s'allume, et lorsque j'ouvre la porte arrière, ça s'éteint. Je pensais ça simple, mais je ne suis pas encore au niveau.

Mais si tu regardes ton code ce n'est pas ça que tu as codé.

Si on analyse ta description du besoin:
La LED doit s'allumer dans 2 cas possibles (une porte OU la fente).
Elle doit s’éteindre dans un cas seulement (l'autre porte).

Autre chose, tu ne décris pas ton montage.
Comment sont câblés tes interrupteurs?
As-tu mis des résistances de tirage au +5V sur ceux-ci?
Si ce n'est pas le cas, tu devrais modifier les lignes de configuration des entrées.

pinMode(porteAv, INPUT);

par

pinMode(porteAv, INPUT_PULLUP);

Sinon les entrées sont dans un état indéfini lorsque l'interrupteur est ouvert.

lesept:
oui ce que tu peux faire c’est éditer ton message et mettre le code entre les balises CODE, la touche </>… :slight_smile:

c’est fait, :wink:

Déjà, merci beaucoup pour la réponse, alors je vais essayer de répondre à tout.

En ce qui concerne le montage, j'ai fait l'équivalent de ça : https://fablab.coagul.org/images/thumb/1/13/BoutonDeclenchement_bb.png/684px-BoutonDeclenchement_bb.png en multipliant le nombre de boutons poussoirs et de résistances correspondantes.

Bizarrement, je l'ai mis sur papier :confused:

"Début:
-PorteAV/fente fermées; Porte AR fermée -> Led éteinte
Ouverture PorteAV/fente:
-PorteAV/fente ouverte(s); Porte AR fermée -> Led allumée
Fermeture PorteAV/fente:
-PorteAV/fente fermées; Porte AR fermée -> Led allumée
Ouverture Porte AR:
-PorteAV/fente fermées; Porte AR ouverte-> Led éteinte
Fermeture porte AR:
On recommence au début."

quelle est la différence entre "INPUT" et "INPUT_PULLUP"?

Oui mais en fait c'est beaucoup plus simple.
Si PorteAV ouverte OU Fente ouverte
LED allumée
Si PorteAR ouverte
LED éteinte

Noter que le cas où la porteAR et une autre des conditions seraient actives en même temps et géré par la seconde condition. Dans ce cas tu vois le facteur et la LED n'a pas besoin de s'allumer.
On peut éventuellement être plus rigoureux en écrivant
Si (PorteAV ouverte OU Fente ouverte) ET PorteAR fermée
LED allumée
Si PorteAR ouverte
LED éteinte

INPUT_PULLUP active une polarisation de l'entrée au +5V (comme une résistance qui serait située à l'intérieur du processeur). Cela permet de se passer d'une résistance externe. Mais comme cette "résistance interne" est relativement élevée elle n'est pas très efficace dans certains cas comme par exemple dans un environnement perturbé (comprendre où il y a des "parasites").

Bonjour,

Pour compléter le sujet, Denis BODOR dans Hackable magazine n°2 avait abordé sur une douzaine de pages, un article très didactique , "La boite à lettres qui tweet":

https://www.hackable.fr/?p=377

Les sources sont disponibles ici :

Amicalement,
J-F

Merci beaucoup pour le lien et l'idée JFF76!
Je vais prendre le temps de regarder ça. Mais je ne cherche pas quelque chose d'aussi complexe (en plus je n'ai pas tweeter ou ce genre de choses : :confused: ).
Alors pour te répondre fdufnews, j'avoue je n'avais pas pensé aussi simple pour commencer.
Mais j'ai peur de m’être mal exprimé dans mon cahier des charges.
En faite je pense mettre un "interrupteur de portes" dans ce genre: https://images.eclats-antivols.fr/images_eclats/jr/3920.jpg sur chaques portes, et un interrupteur à mercure sur la fente.
Donc des manières de fonctionner différentes (par ouverture et par fermeture si mes termes sont bons). Et le principe c'est qu'une fois les actions d'ouverture et de fermeture (donc une action sur un bouton poussoir et non un interrupteur) terminées, la led change d'état. (j'espere être clair dans mes explications).
Et vu que je suis chiant j'aimerais comprendre ce que je fais et non recopier un code "bêtement".

Encore merci

Le pseudo code que j'ai donné au-dessus fonctionne très bien avec des poussoirs.
Lorsque le poussoir de la porteAV s'active ou que celui de la fente bascule la LED s'allume. Elle ne s'éteindra que lorsque le poussoir de la porteAR s'activera.

Tu devrais pouvoir le coder en quelques lignes. Disons une quinzaine avec le setup(), loop() et les déclarations de variables.

Je vais essayer de coder quelque chose, et si je deviens fou je reviendrai demander un indice.

En tout cas merci.

On n'a pas souvenir d'un codeur devenu fou sur ce forum.
Du moins ce n'est jamais arrivé à une personne saine d'esprit à son arrivée sur le forum.

Bien le bonjour!
Et bien voila, le code est fonctionnel grâce à toi Fdufnews et tous tes indices.
Merci beaucoup.

Et t'es pas fou?

Je vais pas tarder à l'être, car j'ai essayé de pousser le vis un peu, en rajoutant un clignotement. Mais il s'effectue une fois et la led se coupe. alors la je fouine un peu pour ça, mais l'idée est mise de côté (pas pour bien longtemps... :slight_smile: )Et en voulant rajouter une led quand une des 2 portes est ouverte, alors le code fonctionne très bien seul, mais ne fonctionne plus quand j'associe les deux leds...(je ne sais pas si je suis bien clair...voici le code pour m'expliquer)

// Numéro des broches sur lesquelles sont connectées les boutons poussoir
const int PorteAv = 7;
const int Fente = 8;
const int PorteAr = 12;
const int Led =  2;     // Numéro de la broche à laquelle est connectée la LED présence
const int LedInt =  4;  // Numéro de la broche à laquelle est connectée la LED éclairage

// Déclaration des variables :
int etatPorteAv = 0;         // variable qui sera utilisée pour stocker l'état du bouton
int etatFente = 0;
int etatPorteAr = 0;

// le code dans cette fonction est exécuté une fois au début
void setup() {
  
  // indique que la broche led est une sortie :
  pinMode(Led, OUTPUT);  
  pinMode(LedInt, OUTPUT); 
   
  // indique que la broche bouton est une entrée :
  pinMode(PorteAv, INPUT_PULLUP);
  pinMode(Fente, INPUT_PULLUP);
  pinMode(PorteAr, INPUT_PULLUP);
}

// le code dans cette fonction est exécuté en boucle
void loop(){
  etatPorteAv = digitalRead(PorteAv);
  etatFente = digitalRead(Fente);
  etatPorteAr = digitalRead(PorteAr);

{
  if (etatPorteAv == LOW || etatPorteAr == LOW) //si porteAv ou porteAr ouverte
    digitalWrite(Led, HIGH); // Led présense allumée
    digitalWrite(LedInt, HIGH); // Led interieure allumée
      
  if (etatPorteAr == LOW) //si porteAr ouverte
    digitalWrite(Led, LOW); //Led présense éteinte

  if (etatPorteAv == HIGH && etatFente == HIGH && etatPorteAr == HIGH) //si porteAv et fente et porteAr fermées
    digitalWrite(LedInt, LOW); // Led interieure éteinte

}
}

Pourquoi te faire du mal en écrivant des tests compliqués.
Tu as un code qui fonctionne pour une LED.

Si ((PorteAV ouverte OU Fente ouverte) ET PorteAR) fermée
               LED allumée
Si PorteAR ouverte
               LED éteinte

Tu veux ajouter une autre pas de problème.
Lorsqu'on a une tâche qui fonctionne et qu'on désire en ajouter une autre indépendante, au lieu de compliquer un code qui fonctionne on ajoute une portion de code pour cette nouvelle fonctionnalité.

Si (PorteAV ouverte OU Fente ouverte) ET PorteAR fermée
               LED allumée
Si PorteAR ouverte
               LED éteinte

Si (PorteAV ouverte OU PorteAR ouverte)
               LEDint allumée
Si (PorteAV fermée ET PorteAR fermée
               LEDint éteinte

En plus ce découpage te permet d'avoir au final un code plus clair.
Tu peux même en faire des petites fonctions pour rendre ton code plus lisible
Un exemple de pseudo-code structuré, facile à lire et à modifier ou faire évoluer

gestion_temoin_courrier()
   Si (PorteAV ouverte OU Fente ouverte) ET PorteAR fermée
               LED allumée
   Si PorteAR ouverte
               LED éteinte

gestion_lumiere()
   Si (PorteAV ouverte OU PorteAR ouverte)
               LEDint allumée
   Si (PorteAV fermée ET PorteAR fermée
               LEDint éteinte

loop()
    gestion_temoin_courrier()
    gestion_lumiere()

Merci de ta réponse. Tu m'aides à comprendre que je me complique la vie.
J'aimerai un peu plus de détails sur le terme "gestion" que tu as mis. ce n'est pas une fonction?! comment ça s'utilise?
(encore désolé pour mes questions de GROS débutant)

En tout cas grâce à toi ça fonctionne presque en faisant :

Si (PorteAV ouverte OU Fente ouverte) ET PorteAR fermée
               LED allumée
Si PorteAR ouverte
               LED éteinte

Si (PorteAV ouverte OU PorteAR ouverte)
               LEDint allumée
Si (PorteAV fermée ET PorteAR fermée
               LEDint éteinte

Quand j’ouvre la porte av, le signal présence s’allume, mais pas au moment de l’ouverture de la fente. et je n’arrive pas à associer le OU et le ET. il y a un problème de syntaxe j’ai l’impression dans mon histoire.

Mais j’aimerai bien comprendre “gestion”, ça peut faciliter les choses à l’avenir

gestion_temoin_courrier et gestion_lumiere sont 2 fonctions qui sont appelée depuis loop

Met ton code pour voir ce qui ne va pas