SHARE
TWEET

send help

a guest Jan 24th, 2020 65 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //****************************************************************************************
  2. //Done by Wee Hoe(184320P)
  3. //Home gas sensor
  4. //****************************************************************************************
  5. #define mSTATE_1    1     //
  6. #define mSTATE_2    2     //
  7. #define mSTATE_3    3     //
  8. #define mSTATE_4    4     //
  9. #define mSTATE_5    5     // //
  10. #define WATER_SENSOR 2
  11. #define RLY_ELE          4                  
  12. #define RLY_GAS           6  
  13. #define DATA 8
  14. #define CLOCK 9
  15. #define buttonPin 10
  16. #define buzzer 12                                                              
  17. #define ELE_ON            digitalWrite(RLY_ELE, LOW)
  18. #define ELE_OFF           digitalWrite(RLY_ELE, HIGH)
  19. #define GAS_ON             digitalWrite(RLY_GAS, LOW)
  20. #define GAS_OFF            digitalWrite(RLY_GAS, HIGH)
  21. #define BON            digitalWrite(buzzer,HIGH)
  22. #define BOFF           digitalWrite(buzzer,LOW)
  23. #define WAIT_PWD          0                       // Wait for User to Input Password
  24. #define CORRECT_PWD       1                       // Correct Password
  25. #define WRONG_PWD         2                       // Wrong Password
  26. #define PASSWORD_LEN      6                       // Password Length to 6
  27. #define PASSWORD          "123456"                // Default Password
  28. #define ENABLE_KEYPAD      KEYPAD_ENABLE=true
  29. #define DISABLE_KEYPAD     KEYPAD_ENABLE=false
  30. #include <math.h>
  31. #include <Wire.h>
  32. #include <Digital_Light_TSL2561.h>
  33. #include <Grove_LED_Bar.h>
  34. #include <Keypad.h>
  35. #include <EleF_LiquidCrystal.h>
  36. unsigned int MACHINE_STATE;               // Variable to hold current machine state
  37. Grove_LED_Bar bar(CLOCK,DATA,0);                                                              // (Do NOT Remove).
  38. float Gas;                        
  39. int Water;
  40. unsigned int  KCOUNT = 0;                             // Record number of times a keypad is pressed
  41. char KUSER_PASSWORD[PASSWORD_LEN+1];                  // Record user password input
  42.  
  43. const byte KROWS = 4;                                 // Four rows
  44. const byte KCOLS = 4;                                 // Four columns
  45.  
  46. char keys[KROWS][KCOLS] = {                          // Define the Keymap
  47.   {'1','2','3', 'A'},
  48.   {'4','5','6', 'B'},
  49.   {'7','8','9', 'C'},
  50.   {'*','0','#', 'D'}
  51. };
  52.  
  53. byte KrowPins[KROWS] = { 39, 41, 43, 45 };            // Connect keypad ROW1, ROW2, ROW3 and ROW4 to these Arduino pins.
  54. byte KcolPins[KCOLS] = { 47, 49, 51, 53 };            // Connect keypad COL1, COL2, COL3 and COL4 to these Arduino pins.
  55. Keypad keypad = Keypad( makeKeymap(keys), KrowPins, KcolPins, KROWS, KCOLS ); // Create the Keypad
  56. EleF_LiquidCrystal lcd(0);                                                      
  57. unsigned int PASSWORD_STATUS;                 // Variable to store Password Status (WAIT_PASSWORD, CORRECT_PASSWORD, WRONG_PASSWORD)
  58. unsigned int buttonposition;                   // Variable to store Door Position Sensor Status (DOOR_OPEN, DOOR_CLOSE)
  59. boolean      KEYPAD_ENABLE;                   // Flag Variable to store Keypad Enable / Disable Signal (true, false)
  60.  
  61.  
  62. void setup()
  63. {
  64.   Wire.begin();
  65.   Serial.begin(9600);                     // Initialize serial port for debug.
  66.   pinMode(RLY_ELE, OUTPUT);             // Set GPIO pin to control Light Relay
  67.   pinMode(RLY_GAS, OUTPUT);              // Set GPIO pin to control Ceiling Fan Relay
  68.   pinMode(WATER_SENSOR, INPUT);
  69.   pinMode(buttonPin,INPUT);
  70.   pinMode(buzzer, OUTPUT);            // Set GPIO pin controlling BUZZER to OUTPUT.
  71.   TSL2561.init();                         // Initialize Grove Digital Light Sensor Module
  72.   bar.begin();                            // Initialize Grove LED Bar.
  73.   lcd.begin(16, 2);                           // Initialize LCD of 2 Rows and 16 Columns
  74.   lcd.clear();                                // Clear LCD
  75.   LCDPrintMessageStart("Password?", 1, true); // Display "Password?" on first row, first column of LCD
  76.   LCDPrintMessageStart(NULL, 2, false);       // Position cursor at second row, first column of LCD  
  77.   DISABLE_KEYPAD;
  78.                                           // Initial State Initialization - Begin
  79.                                           // Set Initial State Transition and Action.
  80.   MACHINE_STATE = mSTATE_1;
  81. //BUZZER = OFF;
  82.                                           //Initial State Initialization - End
  83. }
  84. void loop()  // put your main code here, to run repeatedly.
  85. {
  86. Water=digitalRead(WATER_SENSOR);
  87.   switch(MACHINE_STATE)                     //
  88.   {
  89.     case mSTATE_1:                          // State 1
  90.      Serial.println("STATE_1:S1");          // Debug message.
  91.      if(Water>0                                 )  // Transition: Check Condition.
  92.      {
  93.         MACHINE_STATE =2;                     // Transition: Loop back to current state.
  94.         ELE_OFF;                                    // Transition: Set Action.
  95.         GAS_OFF;                                    //
  96.         BON;                                    //
  97.         ENABLE_KEYPAD;
  98.      }
  99.      else if(buttonPin==HIGH            )  // Transition: Check Condition.
  100.      {
  101.         MACHINE_STATE =2;                     // Transition: Jump to Next State (mSTATE_2)
  102.         GAS_OFF;                                                      // if condition is valid.
  103.         ELE_OFF;                                    // Transition: Set Action.
  104.         ENABLE_KEYPAD;
  105.      }
  106.      else if(Gas>0.5)
  107.      {
  108.       MACHINE_STATE=2;
  109.       ELE_OFF;
  110.       GAS_OFF;
  111.       BON;
  112.       bar.setLed(1,1);
  113.       ENABLE_KEYPAD;
  114.      }
  115.      else if(Gas>0)
  116.      {
  117.       MACHINE_STATE=2;
  118.       ELE_OFF;
  119.       GAS_OFF;
  120.       BON;
  121.       bar.setLed(2,1);
  122.       ENABLE_KEYPAD;
  123.      }
  124.      else if(Water==0||buttonPin==HIGH)
  125.      {
  126.       MACHINE_STATE=1;        
  127.      }
  128.      else if(Gas==0)
  129.      {
  130.       MACHINE_STATE=1;
  131.       bar.setLed(3,1);
  132.      }
  133.      else
  134.      {}
  135.      break;
  136.  
  137.     case mSTATE_2:                          // State 1
  138.      Serial.println("STATE_2:S2");        // Debug message.
  139.     if(PASSWORD_STATUS==CORRECT_PWD) // Transition: (Condition)
  140.      {
  141.                                                                                        
  142.         MACHINE_STATE =mSTATE_3 ;                  
  143.         DISABLE_KEYPAD;
  144.      }
  145.      else if(PASSWORD_STATUS==WRONG_PWD) // Transition: (Condition)
  146.      {
  147.                                            
  148.         MACHINE_STATE =mSTATE_4 ;                  
  149.        
  150.                                      
  151.      }                      
  152.      else if(PASSWORD_STATUS==WAIT_PWD) // Transition: Check Condition
  153.      {
  154.  
  155.        MACHINE_STATE =mSTATE_2 ;                    // Transition: Jump to Next State                                      
  156.      }
  157.  
  158.      else
  159.      {}
  160.      break;
  161.     case mSTATE_3:                          // State 3
  162.      Serial.println("STATE_3:S3");          // Debug message.
  163.      if(Water!=0)  // Transition: Check Condition.
  164.      {
  165.         MACHINE_STATE =2;                     // Transition: Jump to Next State (mSTATE_5)
  166.         ENABLE_KEYPAD;                                    // if condition is valid.  
  167.                                             // Transition: Set Action.
  168.      }
  169.      else if(Gas>0.5                            )  // Transition: Check Condition.
  170.      {
  171.         MACHINE_STATE =2;                     // Transition: Jump to Next State (mSTATE_6)
  172.         bar.setLed(1,1);                                                      // if condition is valid.
  173.                                             // Transition: Set Action.
  174.      }
  175.      else if(Gas>0                            )  // Transition: Check Condition.
  176.      {
  177.         MACHINE_STATE =2;                     // Transition: Jump to Next State (mSTATE_6)
  178.         bar.setLed(2,1);                                                      // if condition is valid.
  179.                                             // Transition: Set Action.
  180.      }
  181.      else if(Gas==0||Water==0                            )  // Transition: Check Condition.
  182.      {
  183.         MACHINE_STATE =1;                     // Transition: Jump to Next State (mSTATE_6)
  184.         DISABLE_KEYPAD;                                                      // if condition is valid.
  185.         ELE_ON;
  186.         GAS_ON;
  187.         BOFF;// Transition: Set Action.
  188.      }
  189.      else
  190.      {}
  191.      break;
  192.  
  193.      case mSTATE_4:                          // State 4
  194.      Serial.println("STATE_4:S4");      // Debug message.                          
  195.      if(PASSWORD_STATUS==WAIT_PWD)  // Transition: (Condition)
  196.      {
  197.  
  198.       MACHINE_STATE =mSTATE_4 ;                    // Transition: Jump to Next State.
  199.      }
  200.      else if(PASSWORD_STATUS==CORRECT_PWD)  // Transition: (Condition)
  201.      {
  202.         MACHINE_STATE =mSTATE_3 ;                  // Transition: Jump to Next State.
  203.         DISABLE_KEYPAD;
  204.      }
  205.      else
  206.      {}
  207.      break;
  208.  
  209.          
  210.     default:                                //
  211.       MACHINE_STATE = mSTATE_1;             // Set the Initial State.
  212.   }                                         //
  213.                                             // Finite State Machine - End
  214.   delay(100);                               // Set Loop Refresh
  215.                                                                 // (Refresh rate of the Finite State Machine).
  216. }
  217.  
  218.  
  219. void MeasureGas()
  220. {
  221.     float vol;
  222.     int sensorValue = analogRead(A0);
  223.     vol=(float)sensorValue/1024;
  224.     Serial.print("The gas density is ");
  225.     Serial.println(vol);
  226.     delay(100);
  227. }
  228. void MeasureWater()
  229. {
  230.   Serial.println(digitalRead(WATER_SENSOR));
  231.   delay(500);
  232. }
  233. void LCDPrintMessageStart(const char* Message, unsigned int row, boolean clear)
  234. {
  235.   if(clear)
  236.   {
  237.     lcd.clear();                                // Clear LCD
  238.   }
  239.  
  240.   switch(row)
  241.   {
  242.     case 1:
  243.       lcd.setCursor(0, 0);                      // Set LCD cursor position to first row, first column
  244.       break;
  245.     case 2:
  246.       lcd.setCursor(0, 1);                      // Set LCD cursor position to second row, first column
  247.       break;
  248.     default:
  249.       lcd.setCursor(0, 0);                      // Set LCD cursor position to first row, first column
  250.  
  251.   }
  252.  
  253.   if(Message != NULL)
  254.   {
  255.     lcd.print(Message);                         // Print MESSAGE
  256.   }
  257.  
  258.   lcd.cursor();                                 // Turns on cursor
  259.   lcd.blink();                                  // Makes cursor blink
  260. }
  261.  
  262. void LCDPrintMessageFromLastPosition(const char* Message)
  263. {
  264.   lcd.print(Message);                           // Print MESSAGE to current LCD position
  265. }
  266.  
  267. //Function to get user password.
  268. unsigned int GetUserPassword (const char* Password, bool *KEYPAD_ENABLE)
  269. {
  270.     static boolean KEYPAD_DISABLED;
  271.     char key = keypad.getKey();
  272.    
  273.     if((KEYPAD_DISABLED) && (*KEYPAD_ENABLE))
  274.     {
  275.       KEYPAD_DISABLED = false;
  276.       LCDPrintMessageStart("Password?", 1, true);  
  277.       LCDPrintMessageStart(NULL, 2, false);
  278.     }
  279.  
  280.     if((key) && (*KEYPAD_ENABLE))
  281.     {      
  282.       KUSER_PASSWORD[KCOUNT] = key;
  283.       KCOUNT= KCOUNT + 1;
  284.       if(KCOUNT == PASSWORD_LEN)
  285.       {
  286.         KUSER_PASSWORD[KCOUNT] = '\0';
  287.         KCOUNT = 0;
  288.  
  289.         if(strcmp(Password, KUSER_PASSWORD) == 0)
  290.         {
  291.           LCDPrintMessageFromLastPosition("*");
  292.           LCDPrintMessageStart("Password OK!", 1, true);
  293.           return CORRECT_PWD;
  294.         }
  295.         else
  296.         {
  297.            LCDPrintMessageFromLastPosition("*");
  298.           LCDPrintMessageStart("Password ERROR!", 1, true);
  299.           delay (500);
  300.           LCDPrintMessageStart("Password?", 1, true);
  301.           LCDPrintMessageStart(NULL, 2, false);            
  302.           return WRONG_PWD;    
  303.         }
  304.       }
  305.       else
  306.       {
  307.         LCDPrintMessageFromLastPosition("*");
  308.         return WAIT_PWD;
  309.       }
  310.     }
  311.     else
  312.     {
  313.       if(*KEYPAD_ENABLE == false)
  314.       {
  315.           KEYPAD_DISABLED = true;  
  316.       }
  317.       return WAIT_PWD;
  318.     }
  319. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top