Detecteur de porte mal fermée pour réfrigérateur

Bonjour à tous !

je souhaite installer un détecteur de porte pour frigo. Il y a 2 mini interrupteur qui seront installé, 1 sur la porte du frigo et l’autre sur le congélateur.

j’ai fait des tests mais cela marche mal, j’aurais besoin de vos idées :slight_smile:

//Systeme d'alarme porte ouverte de frigo avec avertisseur mp3 (tts french free)

#include <SoftwareSerial.h>    // <softwareserial.h>
#include <DFPlayer_Mini_Mp3.h> // <dfplayer_mini_mp3.h>
int porteFrigo = 2;    //  interrupteur fin de course sur le frigo
int porteCongel = 6;   //  interrupteur fin de course sur Congel
int ledPorteGreen = 3; //  porte fermée
int ledPorteRed = 4;   //  porte ouverte

int valPorte = LOW;
int valPorte2 = LOW;



void setup() {
  // put your setup code here, to run once:

Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module 
mp3_set_volume (10);     // volume 10
pinMode(porteFrigo, INPUT);
pinMode(porteCongel, INPUT);
pinMode(ledPorteGreen, OUTPUT);
pinMode(ledPorteRed, OUTPUT);

digitalWrite(porteFrigo, LOW);
digitalWrite(porteCongel, LOW);

}

void loop() {
  valPorte = digitalRead(porteFrigo);
 if  (valPorte == HIGH)   // ouvert
 
  {
  digitalWrite(ledPorteGreen, LOW);
  digitalWrite(ledPorteRed, HIGH);
  delay(30*1000);  // 30s   temps avant déclenchement alarme

  }
  valPorte = digitalRead(porteFrigo);
  
  if (valPorte == HIGH)

   {
  mp3_play (1); //play 0001.mp3   // porte frigo ouverte
  delay (6000); 
  //delay(3000);
  mp3_play (1); //play 0001.mp3   // porte frigo ouverte
  delay (6000); 
  
  }

else
{
 digitalWrite(ledPorteRed, LOW);
 digitalWrite(ledPorteGreen, HIGH);

}



 valPorte2 = digitalRead(porteCongel);
 if (valPorte2 == HIGH)
  {
  digitalWrite(ledPorteGreen, LOW);
  digitalWrite(ledPorteRed, HIGH);
  delay(30*1000);  // 30s   temps avant déclenchement alarme
 
   valPorte2 = digitalRead(porteCongel);
  
  if (valPorte2 == HIGH)
  {
  mp3_play (2); //play 0002.mp3   // porte frigo ouverte
  delay (6000); 
  //delay(3000);
  mp3_play (2); //play 0002.mp3   // porte frigo ouverte
  delay (6000); 

}

else 


 {
 
  digitalWrite(ledPorteGreen, HIGH);
  digitalWrite(ledPorteRed, LOW);
  
 }
}
}

merci à vous !

j’utilise une nano

Bonjour

j'ai fait des tests mais cela marche mal,

c'est à dire ?

Bonjour,

lorsque j'active un interrupteur, la led red ne s'allume pas immédiatement, j'ai branché chaque interrupteur aux pin 2 et 6 et les pin au GND de la carte.

Il faut alimenter en 3.3v ou 5v les interrupteurs ?

pour info j'attends des interrupteur mini en NC et NO, pour les tests j'utilise de simple interrupteurs ON /OFF

pinMode(porteFrigo, INPUT);

Je parie à 10 contre 1 pour un problème de pullups :smiling_imp:

giga-77:
lorsque j'active un interrupteur, la led red ne s'allume pas immédiatement

C'est normal tu attends 30 s avant de réagir !

Par ailleurs, tu fais deux fois exactement les même taches (allumer les LED, vérifier une porte) pour le Frigo et Pour le Congelo. Au lieu de recopier le même code, fais des fonctions.

Ce qui rend la chose un peu plus complexe est que tu veux surveiller 2 portes.
Avec une seule, ça pourrait être simple, avec des delay() bloquants, ça ne gênerait pas. Mais comprends que quand tu appelles delay() pour temporiser l'alarme sur porte 1, tu ne fais plus rien, en particulier tu ne surveilles plus la porte 2.

Il va falloir gérer ton attente de 30s autrement. Soit en utilisant la fonction millis() (que tout le monde adore :slight_smile: ), soit en cadençant ta loop() à une seconde (suffit d'y mettre delay(1000) ) et en comptant 30 passages entre la détection et l'alarme.

Va aussi falloir gérer le retour à la normale (ainsi que les rebonds des contacts)

Si c'est trop d'un coup, commence par faire un prog pour une seule porte, en essayant de pas tout bloquer pendant 30s.

Bonjour,

merci pour les informations, je vais faire une porte, pour le moment.

Bonjour a tous,
j'ai eu exactement le meme probleme a resoudre sur le frigo chez ma fille.
Voici ma solution :
un Arduino Atiny (8pins)
un buzzer
une pile CR2032
un mico-switch et c'est tout.

Quand la porte du frigo s'ouvre, le micro-switch se ferme l'Arduino est alimente.
Un petit "beep" pour prouver que la batterie n'est pas morte.
Une attente reglable dans le soft (20 ou 30 sec) puis "beep" "beep" sans arret.
Simple, efficace, pas de probleme d'autonomie.

Je crois que j'avais ajoute la possibilite de delai reglable avec des straps sur les pins libres.

Jacques

Pour une seule porte:
Je conseille d'utiliser une machine à états. Dans une telle machine, il y a des états, et des événements qui font passer (ou pas) d'un état à l'autre. C'est très utilisé en programmation, il faut connaître ça.

Dans ton cas, pour une seule porte :

  • Il y a 2 états : OUVERTE et FERMEE.
  • Il y a 3 événements :
  • détection ouverture,
  • détection fermeyure,
  • time-out de l(attente avant alarme.

Maintenant, tu prends un papier et un crayon (si, si, ça existe)
tu traces 2 patates, dans l'une tu écrit OUVERTE, dans l'autre tu écris FERMEE.
Ouis tu prens tes événement 1 par 1, et tu te demandes ce qu'il doit se passer si l'évenement survient, et ceci pour chaque état.
L'évement peut faire changer d'état, ou pas. Pour chaque événemnet tu trace un flèche qui,part de l'état étudié, et qui aboutit à l'état suivant. Ce peut être un autrte état, ou la flèche revient vers la m^me patate si l'evnmt. ne provoque pas d changement d'état. Sur la flèche, tu écris le type d'évenement et la liste des actions à faire dans cette transition.

on y va:


(j'ai un peu honte par rapports aux schémas que fait J-M-L, mais y veut pas dire comment y fait :slight_smile: )
Voilà, avec ça tu peux commencer la programmation, c'est du solide (vérifie qd même, j'ai fait vite)