Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //****************************************************************************************
- //Done by Wee Hoe(184320P)
- //Home gas sensor
- //****************************************************************************************
- #define mSTATE_1 1 //
- #define mSTATE_2 2 //
- #define mSTATE_3 3 //
- #define mSTATE_4 4 //
- #define mSTATE_5 5 // //
- #define WATER_SENSOR 2
- #define RLY_ELE 4
- #define RLY_GAS 6
- #define DATA 8
- #define CLOCK 9
- #define buttonPin 10
- #define buzzer 12
- #define ELE_ON digitalWrite(RLY_ELE, LOW)
- #define ELE_OFF digitalWrite(RLY_ELE, HIGH)
- #define GAS_ON digitalWrite(RLY_GAS, LOW)
- #define GAS_OFF digitalWrite(RLY_GAS, HIGH)
- #define BON digitalWrite(buzzer,HIGH)
- #define BOFF digitalWrite(buzzer,LOW)
- #define WAIT_PWD 0 // Wait for User to Input Password
- #define CORRECT_PWD 1 // Correct Password
- #define WRONG_PWD 2 // Wrong Password
- #define PASSWORD_LEN 6 // Password Length to 6
- #define PASSWORD "123456" // Default Password
- #define ENABLE_KEYPAD KEYPAD_ENABLE=true
- #define DISABLE_KEYPAD KEYPAD_ENABLE=false
- #include <math.h>
- #include <Wire.h>
- #include <Digital_Light_TSL2561.h>
- #include <Grove_LED_Bar.h>
- #include <Keypad.h>
- #include <EleF_LiquidCrystal.h>
- unsigned int MACHINE_STATE; // Variable to hold current machine state
- Grove_LED_Bar bar(CLOCK,DATA,0); // (Do NOT Remove).
- float Gas;
- int Water;
- unsigned int KCOUNT = 0; // Record number of times a keypad is pressed
- char KUSER_PASSWORD[PASSWORD_LEN+1]; // Record user password input
- const byte KROWS = 4; // Four rows
- const byte KCOLS = 4; // Four columns
- char keys[KROWS][KCOLS] = { // Define the Keymap
- {'1','2','3', 'A'},
- {'4','5','6', 'B'},
- {'7','8','9', 'C'},
- {'*','0','#', 'D'}
- };
- byte KrowPins[KROWS] = { 39, 41, 43, 45 }; // Connect keypad ROW1, ROW2, ROW3 and ROW4 to these Arduino pins.
- byte KcolPins[KCOLS] = { 47, 49, 51, 53 }; // Connect keypad COL1, COL2, COL3 and COL4 to these Arduino pins.
- Keypad keypad = Keypad( makeKeymap(keys), KrowPins, KcolPins, KROWS, KCOLS ); // Create the Keypad
- EleF_LiquidCrystal lcd(0);
- unsigned int PASSWORD_STATUS; // Variable to store Password Status (WAIT_PASSWORD, CORRECT_PASSWORD, WRONG_PASSWORD)
- unsigned int buttonposition; // Variable to store Door Position Sensor Status (DOOR_OPEN, DOOR_CLOSE)
- boolean KEYPAD_ENABLE; // Flag Variable to store Keypad Enable / Disable Signal (true, false)
- void setup()
- {
- Wire.begin();
- Serial.begin(9600); // Initialize serial port for debug.
- pinMode(RLY_ELE, OUTPUT); // Set GPIO pin to control Light Relay
- pinMode(RLY_GAS, OUTPUT); // Set GPIO pin to control Ceiling Fan Relay
- pinMode(WATER_SENSOR, INPUT);
- pinMode(buttonPin,INPUT);
- pinMode(buzzer, OUTPUT); // Set GPIO pin controlling BUZZER to OUTPUT.
- TSL2561.init(); // Initialize Grove Digital Light Sensor Module
- bar.begin(); // Initialize Grove LED Bar.
- lcd.begin(16, 2); // Initialize LCD of 2 Rows and 16 Columns
- lcd.clear(); // Clear LCD
- LCDPrintMessageStart("Password?", 1, true); // Display "Password?" on first row, first column of LCD
- LCDPrintMessageStart(NULL, 2, false); // Position cursor at second row, first column of LCD
- DISABLE_KEYPAD;
- // Initial State Initialization - Begin
- // Set Initial State Transition and Action.
- MACHINE_STATE = mSTATE_1;
- //BUZZER = OFF;
- //Initial State Initialization - End
- }
- void loop() // put your main code here, to run repeatedly.
- {
- Water=digitalRead(WATER_SENSOR);
- switch(MACHINE_STATE) //
- {
- case mSTATE_1: // State 1
- Serial.println("STATE_1:S1"); // Debug message.
- if(Water>0 ) // Transition: Check Condition.
- {
- MACHINE_STATE =2; // Transition: Loop back to current state.
- ELE_OFF; // Transition: Set Action.
- GAS_OFF; //
- BON; //
- ENABLE_KEYPAD;
- }
- else if(buttonPin==HIGH ) // Transition: Check Condition.
- {
- MACHINE_STATE =2; // Transition: Jump to Next State (mSTATE_2)
- GAS_OFF; // if condition is valid.
- ELE_OFF; // Transition: Set Action.
- ENABLE_KEYPAD;
- }
- else if(Gas>0.5)
- {
- MACHINE_STATE=2;
- ELE_OFF;
- GAS_OFF;
- BON;
- bar.setLed(1,1);
- ENABLE_KEYPAD;
- }
- else if(Gas>0)
- {
- MACHINE_STATE=2;
- ELE_OFF;
- GAS_OFF;
- BON;
- bar.setLed(2,1);
- ENABLE_KEYPAD;
- }
- else if(Water==0||buttonPin==HIGH)
- {
- MACHINE_STATE=1;
- }
- else if(Gas==0)
- {
- MACHINE_STATE=1;
- bar.setLed(3,1);
- }
- else
- {}
- break;
- case mSTATE_2: // State 1
- Serial.println("STATE_2:S2"); // Debug message.
- if(PASSWORD_STATUS==CORRECT_PWD) // Transition: (Condition)
- {
- MACHINE_STATE =mSTATE_3 ;
- DISABLE_KEYPAD;
- }
- else if(PASSWORD_STATUS==WRONG_PWD) // Transition: (Condition)
- {
- MACHINE_STATE =mSTATE_4 ;
- }
- else if(PASSWORD_STATUS==WAIT_PWD) // Transition: Check Condition
- {
- MACHINE_STATE =mSTATE_2 ; // Transition: Jump to Next State
- }
- else
- {}
- break;
- case mSTATE_3: // State 3
- Serial.println("STATE_3:S3"); // Debug message.
- if(Water!=0) // Transition: Check Condition.
- {
- MACHINE_STATE =2; // Transition: Jump to Next State (mSTATE_5)
- ENABLE_KEYPAD; // if condition is valid.
- // Transition: Set Action.
- }
- else if(Gas>0.5 ) // Transition: Check Condition.
- {
- MACHINE_STATE =2; // Transition: Jump to Next State (mSTATE_6)
- bar.setLed(1,1); // if condition is valid.
- // Transition: Set Action.
- }
- else if(Gas>0 ) // Transition: Check Condition.
- {
- MACHINE_STATE =2; // Transition: Jump to Next State (mSTATE_6)
- bar.setLed(2,1); // if condition is valid.
- // Transition: Set Action.
- }
- else if(Gas==0||Water==0 ) // Transition: Check Condition.
- {
- MACHINE_STATE =1; // Transition: Jump to Next State (mSTATE_6)
- DISABLE_KEYPAD; // if condition is valid.
- ELE_ON;
- GAS_ON;
- BOFF;// Transition: Set Action.
- }
- else
- {}
- break;
- case mSTATE_4: // State 4
- Serial.println("STATE_4:S4"); // Debug message.
- if(PASSWORD_STATUS==WAIT_PWD) // Transition: (Condition)
- {
- MACHINE_STATE =mSTATE_4 ; // Transition: Jump to Next State.
- }
- else if(PASSWORD_STATUS==CORRECT_PWD) // Transition: (Condition)
- {
- MACHINE_STATE =mSTATE_3 ; // Transition: Jump to Next State.
- DISABLE_KEYPAD;
- }
- else
- {}
- break;
- default: //
- MACHINE_STATE = mSTATE_1; // Set the Initial State.
- } //
- // Finite State Machine - End
- delay(100); // Set Loop Refresh
- // (Refresh rate of the Finite State Machine).
- }
- void MeasureGas()
- {
- float vol;
- int sensorValue = analogRead(A0);
- vol=(float)sensorValue/1024;
- Serial.print("The gas density is ");
- Serial.println(vol);
- delay(100);
- }
- void MeasureWater()
- {
- Serial.println(digitalRead(WATER_SENSOR));
- delay(500);
- }
- void LCDPrintMessageStart(const char* Message, unsigned int row, boolean clear)
- {
- if(clear)
- {
- lcd.clear(); // Clear LCD
- }
- switch(row)
- {
- case 1:
- lcd.setCursor(0, 0); // Set LCD cursor position to first row, first column
- break;
- case 2:
- lcd.setCursor(0, 1); // Set LCD cursor position to second row, first column
- break;
- default:
- lcd.setCursor(0, 0); // Set LCD cursor position to first row, first column
- }
- if(Message != NULL)
- {
- lcd.print(Message); // Print MESSAGE
- }
- lcd.cursor(); // Turns on cursor
- lcd.blink(); // Makes cursor blink
- }
- void LCDPrintMessageFromLastPosition(const char* Message)
- {
- lcd.print(Message); // Print MESSAGE to current LCD position
- }
- //Function to get user password.
- unsigned int GetUserPassword (const char* Password, bool *KEYPAD_ENABLE)
- {
- static boolean KEYPAD_DISABLED;
- char key = keypad.getKey();
- if((KEYPAD_DISABLED) && (*KEYPAD_ENABLE))
- {
- KEYPAD_DISABLED = false;
- LCDPrintMessageStart("Password?", 1, true);
- LCDPrintMessageStart(NULL, 2, false);
- }
- if((key) && (*KEYPAD_ENABLE))
- {
- KUSER_PASSWORD[KCOUNT] = key;
- KCOUNT= KCOUNT + 1;
- if(KCOUNT == PASSWORD_LEN)
- {
- KUSER_PASSWORD[KCOUNT] = '\0';
- KCOUNT = 0;
- if(strcmp(Password, KUSER_PASSWORD) == 0)
- {
- LCDPrintMessageFromLastPosition("*");
- LCDPrintMessageStart("Password OK!", 1, true);
- return CORRECT_PWD;
- }
- else
- {
- LCDPrintMessageFromLastPosition("*");
- LCDPrintMessageStart("Password ERROR!", 1, true);
- delay (500);
- LCDPrintMessageStart("Password?", 1, true);
- LCDPrintMessageStart(NULL, 2, false);
- return WRONG_PWD;
- }
- }
- else
- {
- LCDPrintMessageFromLastPosition("*");
- return WAIT_PWD;
- }
- }
- else
- {
- if(*KEYPAD_ENABLE == false)
- {
- KEYPAD_DISABLED = true;
- }
- return WAIT_PWD;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement