/* code de Didiersee modifié et adapte avec mon materiel. Le code original venant du site http://blog.arduinosensors.nl/2016/11/04/arduino-pir-motion-alarm-4x4-keypad/ */ // les différentes fonctions void dans l'ordre de défilement sont: // --------------------------------------------------------------- // void sendSMS(String message) --------déclaration pour envoie de sms avec modul sim900 // void SendAlarm() --------------------envoie un sms alarme dans ma maison // void displayCodeBlock()--------------affiche cod pour activer et attend le code // void keypadEvent(KeypadEvent eKey)---détecte que l'on touche le clavier // void alarmTriggered()----------------enclenchement alarme sirène et tout... // void StrokeLight()-------------------enclenche clignotement led // void checkPassword()-----------------controle si pass bon // void invalidCode()-------------------renvoie erreur code invalid // void ledInvalid()--------------------enclenche led invalide // void activate()----------------------déclare alarme activée // void deactivate()--------------------déclare alarme désactivée // void displayCodeUnBlock()------------attend code pcq alarme enclenchée et affichage de la zone d'intrusion #include //http://playground.arduino.cc/Main/LiquidCrystal #include //http://playground.arduino.cc/Code/Keypad #include //http://playground.arduino.cc/Code/Password #include #include #define I2CADDR 0x20 //========================== DEBUT CODE GSM ========================================== // Inclu library to communicate with GSM #include // Configure le port de communication serie SoftwareSerial SIM900(11, 10); // TX => pin 11 RX => pin 10 // Variable to store text message String textMessage; // Create a variable to store etatAlarm state String etatAlarm = "LOW"; // alarme déclenchée par défaut et information memorisee // led connected to pin 52 // Variable to store text to send message "Alarme maison zone 1 ou 2 ou 3 ou 4 ou 5" char msg; char call; //========================== FIN CODE GSM ========================================== // d'activation de la tempo //----------------------------- unsigned long previousMillis = 0; const long interval = 15000; // (15 secondes) // fin de la déclaration de la tempo //---------------------------------- int passwd_pos = 7; Password password = Password("1111"); // mot de passe enregistre LiquidCrystal_I2C lcd(0x27, 16, 2);// initialisation LCD en mode 4 bits // declaration du clavier 4x4 (lignes et colonnes) //------------------------------------------------ const byte ROWS = 4; //four rows const byte COLS = 4; //four columns //define the cymbols on the buttons of the keypads char keys[ROWS][COLS] = { {'1','4','7','*'}, {'2','5','8','0'}, {'3','6','9','#'}, {'A','B','C','D'} }; byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad //initialize an instance of class NewKeypad //Keypad keypad = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR); Keypad_I2C keypad = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR ); // code origine Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // declaration des numeros de borne arduino aux differents materiels //------------------------------------------------------------------ const int pirPin = 6; const int pirPin2 = 7; const int pirPin3 = 4; const int pirPin4 = 5; const int contactgarage = 8; const int Relay = 38; const int redPin = 12; const int greenPin = 40; const int ledPin = 52; int compteur; // count seconds //const int ledError = 50; const int buzzer = 13; int alarmStatus = 0; int alarmActive = 0; int DetectIntrus = 0; //////////////// VOID SETUP /////////////////////////////// void setup(){ //digitalWrite(initialise, LOW); // impose etat bas sur la pin 3 initialise qui est un reset general Arduino //keypad.begin( ); // GDY120705 compteur=15;// impose le chiffre maximum de 15sec pour decompte avant activation alarm digitalWrite(buzzer, LOW); // obligatoire si panne de courant car arrête buzzer quand courant revient // Initialisation du port série Serial.begin(19200); ////////////////////////////////////// debut code GSM///////////////////////////////////// // Activer automatiquement le module GSM sim 900 pour qu'il accroche le réseau digitalWrite(9, HIGH); //borne 9 modul GSM et 9 Arduino Mega raccordee ensemble delay(1000); digitalWrite(9, LOW); delay(5000); pinMode(ledPin, OUTPUT); // By default the ledPin is off digitalWrite(ledPin, LOW); // Initializing serial commmunication SIM900.begin(19200); // Give time to your GSM shield log on to network delay(5000); Serial.print("SIM900 ready..."); // AT command to set SIM900 to SMS mode SIM900.print("AT+CMGF=1\r"); SIM900.print("AT+CMGD=1,4"); //efface tous les sms stockés sur la carte sim delay(100); // Définir le module pour envoyer les données SMS à la sortie série lors de la réception SIM900.print("AT+CNMI=2,2,0,0,0\r"); delay(100); /////////////////////// FIN CODE GSM///////////////////////////////////////////// lcd.init(); // initialisation de l'afficheur delay(10); // pause rapide pour laisser le temps initialisation lcd.backlight();/* active retro-eclairage sans cette ligne pas de retro-eclairage */ lcd.begin(16,2); // confirmation afficher en 16 caractères sur 2 lignes (afficheur LCD) // declaration des entrees sorties du materiel pinMode(pirPin, INPUT); pinMode(pirPin2, INPUT); pinMode(pirPin3, INPUT); pinMode(pirPin4, INPUT); pinMode(contactgarage, INPUT); pinMode(Relay, OUTPUT); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(ledPin, OUTPUT); pinMode(buzzer, OUTPUT); //pinMode(initialise, OUTPUT); keypad.addEventListener(keypadEvent); // demarrage de sequence affiche sur LCD system alarm arduino cree par Didier Thys lcd.setCursor(0,0); lcd.print("system Alarme"); lcd.setCursor(0,1); lcd.print("Arduino"); delay(1600); lcd.clear(); lcd.setCursor(0,0); lcd.print("Cree par"); lcd.setCursor(0,1); lcd.print("Didiersee"); delay(2000); //pause 2 sec digitalWrite(greenPin, HIGH); // déclaration de la led verte à 1 displayCodeBlock(); // appel la procedure void displayCodeBlock attente pour entrer pass } //////////////////// DEBUT VOID LOOP//////////////////////////////////// void loop(){ ////////////////////////////////DEBUT CODE GSM//////////////////////////////////// if(SIM900.available()>0){ textMessage = SIM900.readString(); Serial.print(textMessage); delay(10); } if(textMessage.indexOf("ON")>=0){ //si le SMS que j'envoie de mon GSM est "ON" j'active l'alarme digitalWrite(ledPin, HIGH); etatAlarm = "on"; Serial.println("ledPin set to ON"); textMessage = ""; compteur=5; // ici place le compteur à zéro pour activer alarme 5 sec et pas 15 sec activate(); // commande void qui Active l'alarme Serial.println("etatAlarm state resquest"); } if(textMessage.indexOf("OFF")>=0){ //si le SMS que j'envoie de mon GSM est "OFF" je desactive l'alarme et je sauvegarde l'état de Alarme digitalWrite(ledPin, LOW); etatAlarm = "off"; Serial.println("ledPin set to OFF"); textMessage = ""; digitalWrite(buzzer, HIGH); delay(100); digitalWrite(buzzer, LOW); deactivate(); // commande void qui desactive l'alarme Serial.println("etatAlarm state resquest"); } if(textMessage.indexOf("STATE")>=0){ //si le SMS que j'envoie de mon GSM est "STATE" l'alarme me répond si elle est "ON" activée ou "OFF" désactivée String message = "Alarm est " + etatAlarm; sendSMS(message); Serial.println("etatAlarm state resquest"); textMessage = ""; } ////////////////////Fin code GSM///////////////////////////////////////////////*/ // si alarme active et capt PIR 1 ou 2 ou 3 ou 4 ou contactgarage = HAUT donne l'Alarme keypad.getKey(); //char key = keypad.getKey(); // Lecture de la touche actionnée if (alarmActive == 1) { if (digitalRead(pirPin) == HIGH || digitalRead(pirPin2) == HIGH || digitalRead(pirPin3) == HIGH || digitalRead(pirPin4) == HIGH || digitalRead(contactgarage) == HIGH) { DetectIntrus = 1; tone(13, 1000, 500); } } unsigned long currentMillis = millis(); if (DetectIntrus == 0) // Si pas de détection intrusion, on ne démarre pas la tempo { //Serial.println("on ne compte pas"); (code test) previousMillis = currentMillis; // previousMillis est toujours égal à currentMillis, si DetectIntrus n'est pas = 0 on commence à compter } if (currentMillis - previousMillis >= interval) // Si le temps est écoulé { Serial.println("Temps écoulé"); alarmTriggered(); //Appel de la fonction après 15 sec sauf si condition retombe à 0 sendSMS("Intrusion chez Didier !"); DetectIntrus = 0; } } //=================================== DEBUT code GSM commande Alarm maison =========================== // Fonction qui envoie des SMS pour la commande a distance de alarme par GSM void sendSMS(String message){ // Commande AT pour régler le SIM900 en mode SMS SIM900.print("AT+CMGF=1\r"); delay(100); // Remplacer le numéro ci-dessous par le votre // Utiliser le format international pour encoder votre numero de gsm SIM900.println("AT + CMGS = \"+32494258897\""); delay(100); // Send the SMS SIM900.println(message); delay(100); // Fin commande AT avec un ^ Z, code ASCII 26 SIM900.println((char)26); delay(100); SIM900.println(); // Donne au module le temps d'envoyer des SMS delay(2000); } ///////////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------- void SendAlarm(){ SIM900.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode delay(1000); // Delay of 1000 milli seconds or 1 second SIM900.println("AT+CMGS=\"+32xxxx\"\r"); // Replace x with mobile number delay(1000); //SIM900.println("Alarme Maison didier");// The SMS text you want to send if (digitalRead(pirPin) == HIGH){ SIM900.println("Alarme Maison zone UN");// The SMS text you want to send } if (digitalRead(pirPin2) == HIGH){ SIM900.println("Alarme Maison zone DEUX");// The SMS text you want to send } if (digitalRead(pirPin3) == HIGH){ SIM900.println("Alarme Maison zone TROIS");// The SMS text you want to send } if (digitalRead(pirPin4) == HIGH){ SIM900.println("Alarme Maison zone QUATRE");// The SMS text you want to send } if (digitalRead(contactgarage) == HIGH){ SIM900.println("Alarme Maison zone CINQ");// The SMS text you want to send } delay(100); SIM900.println((char)26);// ASCII code of CTRL+Z delay(1000); } // ici boucle de demande pass pour desactiver sirene et encore 1x pour reactiver alarm void displayCodeBlock(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Code:"); lcd.setCursor(0,1); lcd.print("Cod pour Activer"); } //=================================== FIN code GSM send message Alarm maison ======= //declaration de l evenement quand je touche au clavier void keypadEvent(KeypadEvent eKey){ switch (keypad.getState()){ case PRESSED: Serial.print("touche appuyée: "); Serial.println(eKey); if (passwd_pos - 15 >= 5){ return ; } lcd.setCursor((passwd_pos++),0); switch (eKey){ case '#': // touche a appuyer quand mot de passe entre et termine passwd_pos = 7; checkPassword(); break; case '*': password.reset(); passwd_pos = 7; break; default: password.append(eKey); lcd.print("*"); // affiche une etoile pour chaque touche entree pour le mot de passe } } } // ici alarme declenchee et enlenchement du relais et de la led rouge void alarmTriggered(){ password.reset(); alarmStatus = 0; digitalWrite(Relay, HIGH); digitalWrite(redPin, HIGH); digitalWrite(greenPin, LOW); lcd.clear(); displayCodeUnBlock(); //modified SendAlarm(); // ici envoie le message d'alarme sur GSM en précisant la zone StrokeLight();{ } } // enclenchement du clignotement de la led void StrokeLight(){ for (int i=0; i<=10; i++){ if(i%2){ digitalWrite(redPin, HIGH); } else{ digitalWrite(redPin, LOW); } //delay(ledError); } for (int i=0; i<=10; i++){ if(i%2){ digitalWrite(greenPin, HIGH); } else{ digitalWrite(greenPin, LOW); } //delay(ledError); } digitalWrite(redPin, HIGH); delay(100); } // ici si pass est incorrect alors impossible d'armer ou de desarmer alarm void checkPassword(){ if (password.evaluate()){ if(alarmActive == 0 && alarmStatus == 0){ activate(); } else if( alarmActive == 1 || alarmStatus == 1){ deactivate(); } } else{ invalidCode(); } } // ici envoie du message acces refuse pcq code faux void invalidCode(){ digitalWrite(greenPin, LOW); password.reset(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Acces Refuse"); ledInvalid(); } void ledInvalid(){ for (int i=0; i<=10; i++){ if(i%2){ digitalWrite(redPin, HIGH); } else{ digitalWrite(redPin, LOW); } //delay(ledError); } // autre condition si alarm active ou desactive avec pass correct if(alarmActive == 0 && alarmStatus == 0){ digitalWrite(Relay, LOW); digitalWrite(greenPin, HIGH); digitalWrite(redPin, LOW); delay(200); displayCodeBlock(); } else if( alarmActive == 1 || alarmStatus == 1){ digitalWrite(Relay, HIGH); digitalWrite(redPin, HIGH); digitalWrite(greenPin, LOW); delay(200); } } // declaration de alarme active avec pass correct void activate(){ alarmActive = 1; password.reset(); digitalWrite(greenPin, LOW); digitalWrite(redPin, HIGH); lcd.clear(); lcd.setCursor(0,0); lcd.print("Alarm Activee"); lcd.setCursor(0,1); lcd.print("dans"); // ici affiche le decompte de 15 sec sur LCD avant d'activer l'alarme //====================================================================== while(compteur != 0) //tant que compteur est different de 0 { delay(900); compteur=compteur-1; // le compteur fait -1 à chaque passage tant que la valeur du compteur n'est pas a zero lcd.setCursor(5,1); if (compteur<10){// affichage de la valeur du compteur sur le LCD de 0 à 9 lcd.print(compteur); lcd.setCursor(6,1); lcd.print(" "); //efface les digits après la valeur du chiffre de décompte sinon il reste des 0 après le 9 digitalWrite (buzzer,HIGH); // juste après affichage LCD le buzzer emet un bip de 1/10 de seconde delay(100); digitalWrite (buzzer,LOW); } else { lcd.print(compteur);// affichage de la valeur du compteur sur le LCD de 10 à 15 lcd.setCursor(8,1); lcd.print(" ");//efface les digits après la valeur du chiffre de décompte digitalWrite (buzzer,HIGH); // juste après affichage LCD le buzzer emet un bip de 1/10 de seconde delay(100); digitalWrite (buzzer,LOW); } } compteur=15; // on remet le compteur a 15 sec pour la prochaine introduction du code //========================================================================== //fin du decompte de 15sec----------------------- lcd.clear(); lcd.setCursor(0,0); lcd.print("ACTIVEE"); // à partir d'ici l'alarme est activée lcd.setCursor(0,1); lcd.print("Cod=> Desactiver");// pour désactiver l'alarme il faut introduire le code } // declaration de alarme desactivee avec pass correct void deactivate(){ alarmStatus = 0; alarmActive = 0; password.reset(); digitalWrite(Relay, LOW); digitalWrite(greenPin, HIGH); digitalWrite(redPin, LOW); lcd.clear(); lcd.setCursor(0,0); lcd.print("Alarm desactivee"); digitalWrite(buzzer, LOW); delay(1000); displayCodeBlock(); } // ici message intrusion envoye venant du PIR, 1, 2, 3, 4 ou contactgarage et enclenchement sirene void displayCodeUnBlock(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Code:"); lcd.setCursor(0,1); digitalWrite(buzzer, HIGH); if (digitalRead(pirPin) == HIGH){ lcd.print("Intrusion 1"); } if (digitalRead(pirPin2) == HIGH){ lcd.print("Intrusion 2"); } if (digitalRead(pirPin3) == HIGH){ lcd.print("Intrusion 3"); } if (digitalRead(pirPin) == HIGH){ lcd.print("Intrusion 4"); } if (digitalRead(contactgarage) == HIGH){ lcd.print("Intrusion 5"); } } // ----------------fin du code----------------------------