Contrôle fermeture des portes du Frigo/Congélateur Sans prétentions

Un sujet déjà visité je pense, mais je voulais le voir sous un nouvel angle. D'autant que je débute sur l'Arduino.
Donc, j'ai un Uno, deux LDR accolés à des résistances de 10K, une diode rouge avec sa résistance de 220 Ohms .
L'idée est de placer les deux LDR dans le frigo et dans le congélateur. Tant que ces LDR détectent de la lumière (donc portes ouvertes) la diode rouge est allumée.
L'ensemble me donne entière satisfaction, c'est la raison pour laquelle je voulais le partager. Merci pour votre retour pour optimiser ce projet.

int monCapteur1=A0;
int monCapteur2=A1;
int monLED1=11;

int sum=0;

float Capteur1value =0;
float Capteur2value =0;

void setup() {
 Serial.begin (9600);
 while(!Serial);

 pinMode(monCapteur1,INPUT);
 pinMode(monCapteur2,INPUT);
 pinMode(monLED1,OUTPUT);

}

void loop() {
 int mapped1Value = map(analogRead (A0),0,1023,0,255);
  int mapped2Value = map(analogRead (A1),0,1023,0,255);
  Capteur1value = analogRead(A0);
  Capteur2value = analogRead(A1);
    Serial.println(mapped1Value);
    Serial.println(mapped2Value);
    delay (500);

 sum = (mapped1Value)+(mapped2Value);{ 
Serial.println(sum);
delay(500);

if (sum>1){
digitalWrite(monLED1,HIGH);  
}
  else {
  digitalWrite (monLED1,LOW);
}
  delay(300);
}}
1 Like

Ces lignes ne servent à rien, les 2 valeurs ne sont pas utilisées dans le programme.

Je suppose que vous n’avez pas un écran connecté sur le port série donc pas la peine de conserver les traces de debug.

Les pins sont mieux en constantes et si vous le faites utilisez les…

Map() est coûteux (même si ici ce n’est pas gênant) - autant comparer directement la valeur lue à 4 plutôt que la valeur divisée par 4 avec 1

Les delay() créent une latence

const byte pinCapteur1=A0; // ou mieux pinCapteurRefrigerateur
const byte pinCapteur2=A1; // ou mieux pinCapteurCongelateur
const byte pinLed =11;
const int valeurSeuil = 5; // affiner ce seuil

void setup() {
  pinMode(pinLed, OUTPUT);
}

void loop() {
  int v1 = analogRead(pinCapteur1);
  int v2 = analogRead(pinCapteur2);
  if (v1+v2 > valeurSeuil) {
    digitalWrite(pinLed, HIGH); 
  } else {
    digitalWrite(pinLed, LOW);
  }
}

(Tapé depuis mon iPhone directement sur le forum donc attention aux fautes de frappe).

Bien sûr on peut se passer des variables intermédiaires

On peut aussi se passer d’arduino et faire cela juste avec deux détecteurs et un OU sur leurs sorties pour définir l’état de la LED.

Merci pour ces retours et la pédagogie qu'ils renferment.
Dans l'idée, bien sûr on peu se passer de l'Arduino en posant des commutateurs plafonniers de voitures. Mais l'Arduino, le composant LDR et la LEd viennent s'intégrer sans toucher à la structure existante du meuble frigo/congel.
On peut aussi regretter et se demander pourquoi cet équipement n'est pas inclus dans le produit de base. Ici il s'agît d'un meuble plutôt "haut de gamme". Mais bon, ceci est une autre histoire.
Merci en tous cas pour vos conseils. Si souhaité par la communauté, je pourrai documenter avec une ou deux photos, sans vouloir alourdir le forum.
Bonnes Fêtes !

Heureusement, puisque les variables sont déclarées en float

Bonsoir,
Alors après 3 semaines d'utilisation je dois m'atteler à une extension. Le voyant rouge ne suffit pas. Je vais tenter de compléter avec un buzzer qui me fera une mélodie sympa si le led est allumée depuis plus de x minutes.
J'ai la mélodie générique sur une portée, je planche sur le code et je reviens avec.
Bonne soirée

Bonsoir,

Je poursuis mon projet. Donc dans un premier temps (après avoir pigé (entre autre) que tout ce qui était Serial.println, n'avait aucun sens dans mon plan et qu'il était aussi très important de chercher les variables les plus "légères" , j'ai donc repris la leçon en y ajoutant la musique.
Cela donne, et c'est très sympa :

#include "pitches.h"
// notes in the melody:

const byte pinCapteurRefrigerateur=A0;
const byte pinCapteurCongelateur=A1;
const byte pinLed=11;
const int BUZZER=8;
const int valeurSeuil=10;

int melody[] = {
  NOTE_C5, NOTE_C5, NOTE_G5, NOTE_G5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_G5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_E5, NOTE_D5, NOTE_D5, NOTE_C5};
int duration = 50;  // durée des notes


void setup() {
 pinMode(pinLed,OUTPUT);
 pinMode (BUZZER,OUTPUT);
}

void loop() {   
 for (int thisNote = 0; thisNote < 15; thisNote++)   {
 int v1 = analogRead (pinCapteurRefrigerateur);
 int v2 = analogRead (pinCapteurCongelateur);

  if (v1+v2>valeurSeuil){

 digitalWrite(pinLed,HIGH);
 tone (BUZZER,melody[thisNote], duration); 
 delay(250); }
else {
 digitalWrite (pinLed,LOW);
 noTone (BUZZER);
}}    }
  

Mais en ce qui concerne la temporisation (je voudrai installer un délai) la musique doit venir si une des deux portes reste ouverte plus de 3 minutes, alors dans ce cas, j'atteins mes limites :frowning: de débutant avec ce code que je n'arrive pas à rendre correct :

#include "pitches.h"
// notes de la musique

const byte pinCapteurRefrigerateur = A0;
const byte pinCapteurCongelateur = A1;
const byte pinLed = 11;
const int Buzzer = 8;
const int valeurSeuil = 5;
unsigned long openTime  = 0;
int melody[] = {
  NOTE_C5, NOTE_C5, NOTE_G5, NOTE_G5, NOTE_A5, NOTE_A5, NOTE_G5, NOTE_G5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_E5, NOTE_D5, NOTE_D5, NOTE_C5
};
int duration = 50;  // durée des notes


void setup() {
  pinMode(pinLed, OUTPUT);
  pinMode (Buzzer, OUTPUT);
}

void loop() {
  for (int thisNote = 0; thisNote < 15; thisNote++) 
  int v1 = analogRead (pinCapteurRefrigerateur);
  int v2 = analogRead (pinCapteurCongelateur);
  
  if (v1+v2>valeurSeuil){
  {
  digitalWrite(pinLed, HIGH);     //une des deux porte est encore ouverte
  {
  openTime = millis();
  } 
  if (millis() - openTime > 30000) //après 3 minutes la musique arrive
  {
    digitalWrite(pinLed, HIGH);
    tone (Buzzer, melody[thisNote], duration);
        delay(250);}
else                                //portes fermées
  {
    noTone(buzzer);                   // la musique s'arrête
    digitalWrite(pinLed, LOW);     // et la led s'éteint
    
  }}
  }   

Si vous pouvez m'aiguiller vers la meilleure solution. Merci

Ta boucle principale est celle de la mélodie, ça n'a pas de sens. En fait, le plus efficace serait de faire une machine d'état, @J-M-L a fait un très bon tuto sur le sujet.

L'idée est de surveiller en permanence le changement d'état des capteurs. Supposons pour simplifier qu'il n'y a qu'un seul capteur.

  • S'il passe de fermé à ouvert, tu détectes une ouverture : tu lances le chrono openTime = millis();
  • Si le capteur rechange d'état, tu arrêtes le chrono, par exemple en faisant openTime = 0;
  • Sinon, tu surveilles le chrono : s'il dépasse la durée maximale (3 minutes ? 30 secondes plutôt), tu commences à jouer la musique.

Mais comme il faut pouvoir arrêter la musique si le capteur passe d'ouvert à fermé, c'est là que la machine d'état trouve son intérêt.

  • Tu prends une variable qui compte les notes thisNote et tu joues cette note.
  • Puis tu surveilles le chrono : s'il dépasse les 250ms, tu incrémentes thisNote et tu joues la note suivante, etc. Tout ça en surveillant le capteur pour arrêter la musique s'il passe d'ouvert à fermé.
  • Si tu arrives à la fin de la musique, tu recommences à zéro (avec la fonction modulo : le %).

Est-ce clair ?
La machine d'état est un peu complexe à concevoir, mais une fois que tu l'auras fait, ce sera simple à programmer.

Bon courage !!!

Bon, ben c'est clair comme tu dis. C'est juste une question de formation de base. Allez, je vais voir çà !!
Merci pour la route !!

Je viens de voir 'sur le forum) que vous aviez le même soucis il y a quelques années.
Pour info je compte poser le Uno à l'extérieur, alimenté direct en 5v uniquement dans la journée. Le soir, lorsque le dernier ferme les pièces, (communes) toutes le veilleuses sont coupés. Donc le Uno est à l'extérieur et les deux LDR sont positionnés avec des connections plates, à l'intérieur de chacun de portes.
Bon, j'ai réussi le timer délai déclanchement musique, reste la machine à état pour la gestion de la musique. Je reviens bientôt avec un code.
Merci.

Bonjour

Je me suis arrangé pour faire pencher mon réfrigérateur légèrement en arrière et très légèrement vers le côté opposé à l'axe de la porte.

De cette façon, la porte se referme toute seule tant qu'elle n'est pas ouverte à plus de 90°

Bien sûr, mais d'une part il n'est pas souhaitable qu'un frigo ne soit pas rigoureusement droit sur les trois axes (efficacité du moteur, circulation des fluides, économies d'énergies) mais de plus la partie congélateur est dotée sur mon modèle d'un verrouillage de porte manuel. Je suis comme toi pas du genre à faire le tour du rond point si je vais tout droit, mais là il n'y avait pas d'autre solution !! :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.