Advertisement
Guest User

send help

a guest
Jan 24th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.78 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement