Bonjour, je souhaiterais créer un système d’alarme avec un arduino mega, capteur de porte, relais sur le qu’elle serait brancher une sirène, buzzer, clavier 4x4, lcd 16x2 et c’est tout il me semble… j’ai donc trouvé un code sur internet et commencer a l’adapter mais j’aurais besoin d’aide car quand j’active l’alarme il y as une temporisation de 30 secondes mais quand une porte est détectée ouverte l’alarme s’enclenche directement mais j’aimerais qu’il y est une temporisation de 15secondes au dela de quoi seulement le relais et le buzzer s’activeraient. Je pense que ce n’est pas compliqué mais je n’y arrive pas, j’ai trouvé sur internet un code qui fait ca mais je ne sais pas comment l’adapter… je vous mets les deux codes ci-joint.
Code avec la tempo que je ne sait pas comment adapter a mon code:
//Importation des bibliothèques nécessaires au projet
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Password.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //L'adresse de l'lcd pourrait etre différente de 0x27 -> si besoin lancez un code pour scanner les périphériques I2C (I2C Scanner)
//On spécifie les pins sur lesquelles sont connectés le détecteur, la led et le buzzer
int detecteurMouvement = 8;
int led = 9;
int buzzer = 10;
const byte lignes = 4; //Nombre de lignes et colonnes sur le clavier
const byte colonnes = 4;
char boutons[lignes][colonnes] = { //Matrice de caractères correspondant à chacun des boutons du clavier
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pinsLignes[lignes] = {7, 6, 5, 4}; //On spécifie les pins où sont branchés les fils correspondant aux lignes du clavier
byte pinsColonnes[colonnes] = {3, 2, 1, 0}; //On spécifie les pins où sont branchés les fils correspondant aux colonnes du clavier
Keypad clavier = Keypad(makeKeymap(boutons), pinsLignes, pinsColonnes, lignes, colonnes);
char bouton; //Variable permettant de stocker le caractère du bouton sur lequel on a appuyé
boolean alarme = false; //Variable permettant de savoir si l'alarme est activée ou désactivée
boolean code = false; //Variable permettant de controler si le code entré est correct ou non
boolean detection = false; //Variable permettant de savoir si un mouvement à été détecté
boolean timeout = false; //Variable permettant de savoir si on a dépassé le temps dans l'état ALERTE et qu'on doit passer en MODE SIRENE
boolean tempsMort = true; //Variable qui permet de gérer l'inactivité du détecteur de mouvement
int etape = 1; //Variable permettant de contrôler les événements dans le loop()
unsigned long tempoSirene = 0; //Variable compteur permettant de savoir quand activer le buzzer dans le MODE SIRENE tout en évitant les delay() qui sont bloquant !!
int compteur = 0; //Variable compteur permettant de compter le nombre de bip dans le MODE ALERTE
long temps; //Variable utilisée pour des mesures de temps locales lorsque l'alarme est en MODE ALERTE
int posLCD = 12; //Position sur l'LCD (colonne) où on print le 1er caractère du code
Password motDePasse = Password("1234"); //Mot de passe permettant d'activer et désactiver l'alarme
void setup() {
//Déclaration des pins de l'Arduino en sortie pour la led et le buzzer et en entrée pour le détecteur
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(detecteurMouvement, INPUT);
//Initialisation de l'LCD et activation du rétro-éclairage
lcd.init();
lcd.backlight();
//Appel de la fonction (voir plus bas dans le code) qui gère l'affichage de l'état de l'alarme sur l'LCD -> par défaut l'alarme est désactivée
ecranEtatAlarme();
}
void loop() {
bouton = clavier.getKey(); //On lit le clavier et on stocke le résultat dans la variable bouton
if (bouton != NO_KEY) {
switch (bouton)//On exécute une action en fonction de la touche qui a été appuyée
{
case '*' : reinitialiserCode(); break; //Si on appuye sur *, on efface le code sur l'LCD
case '#' : verifierCode(); break; //Si on appuye sur #, on vérifie que le code entré par l'utilisateur = mot de passe de l'alarme
case 'A' : break; //On ne fait rien lorsqu'il s'agit des 4 lettres
case 'B' : break;
case 'C' : break;
case 'D' : break;
default : ajouter(); //Si on appuye sur un chiffre, on l'ajoute au code utilisateur (concaténation) et on print sur l'LCD
}
}
//ETAT 1
//Si l'alarme vient d'être ACTIVEE,on attend 15 secondes et puis on commence à prendre des mesures avec le détecteur de mouvement
//Dès que le capteur a détecté un mouvement, l'alarme passe en MODE ALERTE
if (alarme == true && etape == 1) {
if (tempsMort) {
delay(15000);
tempsMort = false;
}
else {
if (digitalRead(detecteurMouvement) == HIGH) {
detection = true;
etape = 2;
}
}
}
//ETAT 2 (MODE ALERTE)
//On émet un bip toutes les secondes pendant environ 10 secondes (=tant que compteur <=10)
//On utilise la fonction millis pour la mesure du temps à la place d'un delay (bloquant) qui rendrait le clavier indisponible or on veut lire le clavier à tout moment
if (detection == true && etape == 2) {
if ((millis() - temps) > 1000)
{
tone(buzzer, 1000, 50);
temps = millis();
compteur = compteur + 1;
if (compteur > 10) {
timeout = true;
etape = 3;
compteur = 0;
}
}
}
//ETAT 3 (MODE SIRENE)
//On active le buzzer pendant 10000 tours de boucle et on le désactive pendant 10000 autres tours
//Le choix du nombre de boucle s'est fait par essai-erreur jusqu'à obtenir le résultat sonore souhaité
//Une fois de plus, on évite la fonction delay grâce à une nouvelle astuce
if (timeout == true) { //L'alarme passe en MODE SIRENE
if (tempoSirene < 10000) {
tone(buzzer, 1000, 50);
}
else {
noTone(buzzer);
}
tempoSirene = tempoSirene + 1;
if (tempoSirene > 20000) {
tempoSirene = 0;
}
}
}
//----------FONCTIONS----------//
//Fonction qui change l'état de l'alarme sur l'écran LCD
void ecranEtatAlarme() {
if (alarme) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ACTIVEE");
lcd.setCursor(0, 1);
lcd.print("SAISIR CODE:");
}
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DESACTIVEE");
lcd.setCursor(0, 1);
lcd.print("SAISIR CODE:");
}
}
//Fonction qui affiche un écran de confirmation lorsqu'on valide le code
void ecranValiditeCode() {
if (code) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("---CORRECT---");
}
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("---INCORRECT---");
}
}
//Fonction qui change l'état de la LED statut en fonction de l'état de l'alarme
void etatLed() {
if (alarme) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}
//Fonction qui permet de réinitialiser le code et l'effacer de l'écran LCD
void reinitialiserCode() {
motDePasse.reset();
ecranEtatAlarme();
posLCD = 12;
}
//Fonction qui permet de tester si le code entré par l'utilisateur et correct
//Si c'est le cas, on change l'état de l'alarme (ACTIVEE->DESACTIVEE ou DESACTIVEE->ACTIVEE)
//On met à jour l'état de la led
//On réinitialise le code ainsi que les variables de contrôle
void verifierCode() {
if (motDePasse.evaluate()) {
code = true;
ecranValiditeCode();
delay(1000);
alarme = !alarme;
etatLed();
reinitialiserCode();
reinitialiserVariablesControle();
}
else {
code = false;
ecranValiditeCode();
delay(1000);
reinitialiserCode();
}
}
//On ajoute le chiffre sur lequel on a appuyé au code entré (concaténation)
//On l'affiche sur l'écran LCD
void ajouter() {
motDePasse.append(bouton);
lcd.setCursor(posLCD, 1);
lcd.print(bouton);
posLCD = posLCD + 1;
if (posLCD > 15) {
posLCD = 12;
}
}
//Fonction qui permet de réinitialiser les variables de contrôle
void reinitialiserVariablesControle() {
etape = 1;
detection = false;
timeout = false;
tempsMort = true;
compteur = 0;
}
Mon code:
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Keypad.h>
const uint8_t buzzer = 15;
int autoprot = 14;
int capt1 = 22;
int capt2 = 23;
int relais1 = 8;
int ledarm = 9;
uint32_t duration;
int screenOffMsg =0;
String password="0903";
String tempPassword;
boolean activated = false; // State of the alarm
boolean isActivated;
boolean activateAlarm = false;
boolean alarmActivated = false;
boolean enteredPassword; // State of the entered password to stop the alarm
boolean passChangeMode = false;
boolean passChanged = false;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
const int L4=0; //declaration constante de broche
const int L3=1; //declaration constante de broche
const int L2=2; //declaration constante de broche
const int L1=3; //declaration constante de broche
const int C4=4; //declaration constante de broche
const int C3=5; //declaration constante de broche
const int C2=6; //declaration constante de broche
const int C1=7; //declaration constante de broche
//define the cymbols on the buttons of the keypads
char keyMap[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {0, 1, 2, 3}; //Row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; //Column pinouts of the keypad
char keypressed;
LiquidCrystal lcd(16, 17, 18, 19, 20, 21); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
pinMode(buzzer, OUTPUT);
pinMode(relais1, OUTPUT);
pinMode(ledarm, OUTPUT);
pinMode(capt1, INPUT_PULLUP);
pinMode(capt2, INPUT_PULLUP);
pinMode(autoprot, INPUT_PULLUP);
delay (100);
digitalWrite(relais1, LOW);
}
void loop() {
if (activateAlarm) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Activation syst");
lcd.setCursor(0,1);
lcd.print("dans:");
int countdown = 30; // 9 seconds count down before activating the alarm
while (countdown != 0) {
lcd.setCursor(6,1);
lcd.print(countdown);
countdown--;
tone(buzzer, 700, 100);
delay(1000);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Alarme Activer");
activateAlarm = false;
alarmActivated = true;
}
if (alarmActivated == true){
digitalWrite(ledarm, HIGH);
if (digitalRead(capt1) == HIGH || digitalRead(capt2) == HIGH || digitalRead(autoprot) == HIGH) {
tone(buzzer, 1000); // Send 1KHz sound signal
digitalWrite(relais1, HIGH);
lcd.clear();
enterPassword();
}
}
if (!alarmActivated) {
if (screenOffMsg == 0 ){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A- Armer systeme");
lcd.setCursor(0,1);
lcd.print("B- Changer Code");
digitalWrite(relais1, LOW);
digitalWrite(ledarm, LOW);
screenOffMsg = 1;
}
keypressed = myKeypad.getKey();
if (keypressed =='A'){ //If A is pressed, activate the alarm
tone(buzzer, 1000, 200);
activateAlarm = true;
}
else if (keypressed =='B') {
lcd.clear();
int i=1;
tone(buzzer, 2000, 100);
tempPassword = "";
lcd.setCursor(0,0);
lcd.print("Code Actuel");
lcd.setCursor(0,1);
lcd.print(">");
passChangeMode = true;
passChanged = true;
while(passChanged) {
keypressed = myKeypad.getKey();
if (keypressed != NO_KEY){
if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
keypressed == '8' || keypressed == '9' ) {
tempPassword += keypressed;
lcd.setCursor(i,1);
lcd.print("*");
i++;
tone(buzzer, 2000, 100);
}
}
if (i > 5 || keypressed == '#') {
tempPassword = "";
i=1;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Code Actuel");
lcd.setCursor(0,1);
lcd.print(">");
}
if ( keypressed == '*') {
i=1;
tone(buzzer, 2000, 100);
if (password == tempPassword) {
tempPassword="";
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nouveau Code");
lcd.setCursor(0,1);
lcd.print(">");
while(passChangeMode) {
keypressed = myKeypad.getKey();
if (keypressed != NO_KEY){
if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
keypressed == '8' || keypressed == '9' ) {
tempPassword += keypressed;
lcd.setCursor(i,1);
lcd.print("*");
i++;
tone(buzzer, 2000, 100);
}
}
if (i > 5 || keypressed == '#') {
tempPassword = "";
i=1;
tone(buzzer, 2000, 100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nouveau Code");
lcd.setCursor(0,1);
lcd.print(">");
}
if ( keypressed == '*') {
i=1;
tone(buzzer, 2000, 100);
password = tempPassword;
passChangeMode = false;
passChanged = false;
screenOffMsg = 0;
}
}
}
}
}
}
}
}
void enterPassword() {
int k=5;
tempPassword = "";
activated = true;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" *** ALARME *** ");
lcd.setCursor(0,1);
lcd.print("Code>");
while(activated) {
keypressed = myKeypad.getKey();
if (keypressed != NO_KEY){
if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
keypressed == '8' || keypressed == '9' ) {
tempPassword += keypressed;
lcd.setCursor(k,1);
lcd.print("*");
k++;
}
}
if (k > 9 || keypressed == '#') {
tempPassword = "";
k=5;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" *** ALARME *** ");
lcd.setCursor(0,1);
lcd.print("Code>");
}
if ( keypressed == '*') {
if ( tempPassword == password ) {
activated = false;
alarmActivated = false;
noTone(buzzer);
digitalWrite(relais1, LOW);
screenOffMsg = 0;
}
else if (tempPassword != password) {
lcd.setCursor(0,1);
digitalWrite(relais1, HIGH);
lcd.print("Code Errone !");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" *** ALARME *** ");
lcd.setCursor(0,1);
lcd.print("Code>");
}
}
}
}