Salut.. je suis entrain de bosser sur un projet de fin d'etude:domotique avec arduino mais je suis un peu bloquer quelque part. l'utilisateur lorsqu'il a entree 3 fois mot de passe incorrect. xa declenche directement une alarme ou quand le systeme detecte le feux xa declenche automatiquement l'alarme===> le probleme je ne sais toujours pas comment arreter l'alarme(buzzer).
//DIRECTIVES DE PREPROCESSEUR
#include <Password.h>
#include <Keypad.h>
#include <Wire.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <dht.h>
//LES VARIABLES ET CONSTANTES
#define FLAME 12 //pin pour le detecteur de flame
#define ALARME 11 //pin pour le led(alarm)
#define LedB A2 //pin pour le led(alarm)
#define dht_apin A1 //pin connecté à la broche analogique A0
dht DHT;
Servo servo; //declaration du servo
Password password = Password("1234"); // password pour activer le systeme ou desactiver le systeme
bool statut = 0; //statut alarme
int i;
int cpt=0;
int buzzer = 13;//pin pour le buzzer
const byte ROWS = 4; // rows
const byte COLS = 4; // cols
char keys[ROWS][COLS] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {6,7,8,9}; //connecter to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad
LiquidCrystal_I2C lcd(0x27,16,2); //initialisation du lcd
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//***********PROTOTYPES*************
void affichage();
void fonctions();
void alarm();
void activer();
void desactiver();
void checkPassword();
void codeInvalide();
void TempHum();
void flame();
void ventillation();
void chauffage();
void setup()
{
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
pinMode(FLAME,INPUT);
pinMode(LedB,INPUT);
affichage();
keypad.addEventListener(keypadEvent);
//servo commandé dans sa position initiale
}
void loop()
{
fonctions();
flame();
}
void fonctions(){
keypad.getKey();
}
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:
int i;
for( i = 1; i <= 1; i++ )
{
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
delay(50);
}
lcd.print("*");
Serial.println(eKey);
switch (eKey){
case '#': //# pour valider le password
checkPassword(); //verification du mot de passe s'il est correct ou non
break;
case '*': //* pour réinitialiser
password.reset();
break;
default:
password.append(eKey);
}
}
}
void checkPassword(){ // pour verifier si le PIN est correct
if (password.evaluate())
{
int i;
for( i = 1; i <= 2; i++ )
{
digitalWrite(buzzer, HIGH);
delay(70);
digitalWrite(buzzer, LOW);
delay(70);
}
if(statut == 0)
{
activer();
}
else if(statut ==1) {
desactiver();
}
}
else {
codeInvalide();
}
}
void activer() //activer le systeme si le pin entre est correct et afficher un message a l'ecran
{
digitalWrite(ALARME, HIGH);
digitalWrite(LedB, HIGH);
lcd.setCursor(0,0);
lcd.print(" << BIENVENU >>");
lcd.setCursor(0,1);
lcd.print("SYSTEME ACTIVE");
delay(2000);
lcd.clear();
servo.attach(10);//servo connecté sur la broche D10
lcd.print("PORTE OUVERTE");
servo.write(90);
delay(4000);
servo.write(0);
TempHum();
flame();
statut = 1;
password.reset();
delay(2000);
}
void desactiver()
{
digitalWrite(ALARME, LOW);
digitalWrite(LedB, HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SYSTEME DESACTIVE");
statut = 0;
password.reset();
delay(5000);
affichage();
}
void codeInvalide() // afficher le message si PWD est incorrect
{
password.reset();
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" <<INCORRECT>>");
cpt+=1;
delay(2000);
digitalWrite(ALARME, LOW);
digitalWrite(LedB, HIGH);
delay(1000);
affichage();
if (cpt>=3){
alarm();
}
}
void affichage() // afficher
{
lcd.init();// initialize the lcd
lcd.backlight();
lcd.setCursor(1,0);
lcd.print(" SMART HOUSE");
lcd.setCursor(0,1);
lcd.print("CODE PIN: ");
}
void alarm(){
password.reset();
statut = 1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" ALARME ACTIVEE");delay(100);
fonctions();
affichage();
for(int note=2000;note>=700;note++){
tone(buzzer,note,125);
delay(200);
}delay(2000);
}
void TempHum(){
DHT.read11(dht_apin);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Humid:");
lcd.print(DHT.humidity);
lcd.print("%");
//si l'humidity est inferieur 15% declencher le systeme de chauffage
if((DHT.humidity) > 75.0){
chauffage();
}else{Serial.println("Taux d'Humidite Normal");}
lcd.setCursor(0,1);
lcd.print(" Temp:");
lcd.print(DHT.temperature);
lcd.print("C");
//si la temperature est superieure a 24°c declencher la ventillation
if((DHT.temperature) > 27.0){
ventillation();
}else{Serial.println("Temperature Normale");}
delay(1000);
}
void flame(){
int FIRE=digitalRead(FLAME); //lire le flamme
if(FIRE==HIGH){
digitalWrite(ALARME,HIGH);
Serial.println("FIRE FIRE FIRE!!!");
lcd.clear();
statut=1;
lcd.setCursor(0,1);
lcd.print("Attention !!");
lcd.setCursor(1,0);
lcd.print("!! Feu !!");
alarm();
delay(500);
}else{
Serial.println("flame: NORMAL");
}
delay(200);
}
void chauffage(){
Serial.println("le chauffage est en marche");
}
void ventillation(){
Serial.println("la ventillation est en marche");
}
alors utilise le bouton </> de l'éditeur pour le code, c'est plus lisible.
Sinon pour ton problème tu peux désactiver l'alarme après x secondes. En gros quand tu détectes le problème tu réinitialise un timer qui va compter x temps avant de s'éteindre
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub