many things are the type, the LCD display are in Romanian, is not a problem if you put them in English ....
My code is as follows:
// ver. 1.0
#include "SoftwareSerial.h"
#include "NewSoftSerial.h"
#define LED_1 7 // led 1
#define LED_2 6 // led 2
#define TX_PIN 5 // TX for LCD
SoftwareSerial SerialLCD = SoftwareSerial(0, TX_PIN);
#define rxPin 2 // RX for ePIR
#define txPin 3 // TX for ePIR
NewSoftSerial mySerial(rxPin, txPin);
// datasheet messages
const char ACK = char(6); // ACK = 0x06 (ASCII ACK character)
const char NACK = char(21); // NACK = 0x15 (ASCII NACK character).
// The SBC will respond with a 'NACK'
// on all unrecognized commands, and when command requiring data (that is,
// Write, Clear, and Confirmation types) does not receive the required data
// within the inactivity timeout period
const char Cmd_a = char(97); // 0x61 - 'a' Read Motion Status
// // code
int codul[3];
int cod_corect[3]; //correct code
int primulCod; // first code
int autentificat; //authenticated
// Pini
const int button1 = 14; // pin A0 - button 1
const int button2 = 15; // pin A1 - button 2
const int button3 = 16; // pin A2 - button 3
const int contact = 17; // pin A3 - // magnetic contact
const int tempPin = 4; // pin A4 - //temperature
const int buttonTST = 19; // pin A5 - Panic Button
// Variables and initial values
int buttonState = HIGH; // // buttons are drawn up
int contactState = LOW; // //magnetic contact is pulled down
// //temperature
float tempInit;
float tempC;
long previousMillis = 0; // will store last time LED was updated
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 3000; // interval at which to blink (milliseconds)
void setup() {
autentificat = false;
// Cod corect
cod_corect[0] = 2;
cod_corect[1] = 1;
cod_corect[2] = 3;
// //Initialization code
codul[0] = 0;
codul[1] = 0;
codul[2] = 0;
// //The first entry code
primulCod = 0;
// //Read the initial temperature
tempInit = analogRead(tempPin); //read the value from the sensor
tempInit = (5.0 * tempInit * 100.0)/1024.0; //convert the analog data to temperature
// initialize the pushbutton pin as an input:
pinMode(contact, INPUT);
pinMode(buttonTST, INPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
pinMode(LED_1, OUTPUT);
digitalWrite(LED_1, HIGH);
pinMode(LED_2, OUTPUT);
digitalWrite(LED_2, HIGH);
pinMode(TX_PIN, OUTPUT);
SerialLCD.begin(9600);
// initializare ePIR
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
mySerial.begin(9600);
stergeLCD();
nivelIluminare(10);
mesaj_Armat(); // mesaj intampinare "Armat" - 5 sec pe urma trece in standby
Serial.begin(9600);
}
void loop(){
autentificat = false;
// 1. Read ePIR
mySerial.print(Cmd_a);
if (mySerial.available() > 0) {
char c = mySerial.read();
if (c == 'Y') {
while (!autentificat)
ev_ePIR();
}
}
// 2. temperature reading
tempC = analogRead(tempPin); //read the value from the sensor
tempC = (5.0 * tempC * 100.0)/1024.0; //convert the analog data to temperature
if (tempC > (tempInit + 2.5)) {
ev_temp();
}
// 3. reading magnetic contact
contactState = digitalRead(contact);
if (contactState == LOW) {
while (!autentificat)
ev_contact();
}
// 4. Read panic button
buttonState = digitalRead(buttonTST);
if (buttonState == LOW) {
ev_but_TST();
}
delay(300);
}
// message "armed" for 5 seconds - 5 sec
void mesaj_Armat(void) {
stergeLCD();
nivelIluminare(15);
mutaCursorLaPozitia(0, 0);
SerialLCD.print("Gata de lucru!");
cursorInvizibil();
mutaCursorLaPozitia(1, 0);
SerialLCD.print("Standby in 5 sec");
delay(5000); // delay 5 sec
stareStandby();
}
// 1. ePIR event
void ev_ePIR(void) {
stergeLCD();
nivelIluminare(20);
while (1) {
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, HIGH);
mutaCursorLaPozitia(0, 0);
SerialLCD.print("ALARMA! ");
mutaCursorLaPozitia(1, 0);
SerialLCD.print(" MISCARE!");
cursorInvizibil();
delay(500);
stergeLCD();
digitalWrite(LED_1, HIGH);
digitalWrite(LED_2, LOW);
delay(500);
}
}
// testing code introduced
void testare_cod(void) {
if ((codul[0] == cod_corect[0]) && (codul[1] == cod_corect[1]) &&
(codul[2] == cod_corect[2])) {
stare_Autentificat();
autentificat = true;
primulCod = 0;
}
else {
if (primulCod == 0) {
autentificat = false;
primulCod++;
}
else {
autentificat = false;
stare_Efractie();
}
}
}
// code has been correctly
void stare_Autentificat(void) {
stergeLCD();
nivelIluminare(25);
mutaCursorLaPozitia(0, 0);
SerialLCD.print("AUTENTIFICAT!");
cursorInvizibil();
delay(5000);
stergeLCD();
stareStandby();
// while (1) { }
}
// code was wrong
void stare_Efractie(void) {
ev_but_TST();
}
// 2. Event temperature
void ev_temp(void) {
stergeLCD();
nivelIluminare(25);
while (1) {
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, HIGH);
mutaCursorLaPozitia(0, 0);
SerialLCD.print("INCENDIU!");
cursorInvizibil();
delay(500);
stergeLCD();
digitalWrite(LED_1, HIGH);
digitalWrite(LED_2, LOW);
delay(500);
}
}
// 3. Event magnetic contact
void ev_contact(void) {
stergeLCD();
nivelIluminare(15);
mutaCursorLaPozitia(0, 0);
SerialLCD.print("FEREASTRA!!!");
cursorInvizibil();
mutaCursorLaPozitia(1, 0);
SerialLCD.print("COD:");
int cifra = 0;
int unu = 0;
int doi = 0;
int trei = 0;
long time=millis();
while (cifra < 3) {
if(millis()-time>10000){
stare_Efractie();
return ;
}
buttonState = HIGH;
if (unu == 0) {
buttonState = digitalRead(button1);
if (buttonState == LOW) {
codul[cifra] = 1;
cifra++;
unu = 1;
delay(500);
time=millis();
}
}
buttonState = HIGH;
if (doi == 0) {
buttonState = digitalRead(button2);
if (buttonState == LOW) {
codul[cifra] = 2;
cifra++;
doi = 1;
delay(500);
time=millis();
}
}
buttonState = HIGH;
if (trei == 0) {
buttonState = digitalRead(button3);
if (buttonState == LOW) {
codul[cifra] = 3;
cifra++;
trei = 1;
delay(500);
time=millis();
}
}
}
testare_cod();
}
// 4. Event panic button
void ev_but_TST(void) {
stergeLCD();
nivelIluminare(25);
while (1) {
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, HIGH);
mutaCursorLaPozitia(0, 0);
SerialLCD.print("ALARMA!");
cursorInvizibil();
delay(500);
stergeLCD();
digitalWrite(LED_1, HIGH);
digitalWrite(LED_2, LOW);
delay(500);
}
}
// LCD standby
void stareStandby (void) {
stergeLCD();
nivelIluminare(0);
}
//
// LCD preset functions begin
//
//level value between 0 and 29 including
void nivelIluminare(int nivel) {
SerialLCD.print(124, BYTE);
SerialLCD.print(128 + nivel, BYTE);
delay(100);
}
void selecteazaLiniaUnu(){
SerialLCD.print(254, BYTE);
SerialLCD.print(128, BYTE);
delay(100);
}
void selecteazaLiniaDoi(){
SerialLCD.print(254, BYTE);
SerialLCD.print(192, BYTE);
delay(100);
}
void stergeLCD(){
SerialLCD.print(254, BYTE);
SerialLCD.print(1, BYTE);
delay(100);
}
void mutaCursorDreapta(){
SerialLCD.print(254, BYTE);
SerialLCD.print(0x14, BYTE);
}
void mutaCursorStanga(){
SerialLCD.print(254, BYTE);
SerialLCD.print(0x10, BYTE);
}
//line 0 or 1, and the column between 0 and 16
void mutaCursorLaPozitia(int linie, int coloana){
SerialLCD.print(254, BYTE);
if (linie == 0) {
SerialLCD.print(128 + coloana, BYTE);
}
else {
SerialLCD.print(128 + 64 + coloana, BYTE);
}
}
void cursorTipLinieVizibil() {
SerialLCD.print(254, BYTE);
SerialLCD.print(0x0E, BYTE);
delay(100);
}
void cursorTipBaraVizibil() {
SerialLCD.print(254, BYTE);
SerialLCD.print(0x0D, BYTE);
delay(100);
}
void cursorInvizibil() {
SerialLCD.print(254, BYTE);
SerialLCD.print(0x0C, BYTE);
delay(100);
}
void scrollTextDreapta() {
SerialLCD.print(254, BYTE);
SerialLCD.print(0x1C, BYTE);
delay(100);
}
void scrollTextStanga() {
SerialLCD.print(254, BYTE);
SerialLCD.print(0x18, BYTE);
delay(100);
}
//
// END LCD preset functions
//