Advertisement
britneybeatey

Final Project Code

Jun 29th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.28 KB | None | 0 0
  1. /*
  2. * Britney Beatey
  3. * Final Project Code
  4. * 6/30/17
  5. */
  6.  
  7. #include <Button.h>
  8. #include <LiquidCrystal.h>
  9. #include <FSM.h>
  10.  
  11. const byte liquidVal = 2;
  12. const byte measurementVal = 2;
  13.  
  14. //I/O
  15. LiquidCrystal lcd (12,6,5,4,3,2);
  16. int pumpControlPin = A1;
  17. int scaleVoltagePin = 11;
  18. int stimulatorPin = 7;
  19.  
  20. //Control Buttons
  21. int backButtonPin = 9;
  22. Button backButton = Button(backButtonPin, PULLUP);
  23.  
  24. int forwardButtonPin = 10;
  25. Button forwardButton = Button(forwardButtonPin, PULLUP);
  26.  
  27. int acknowledgeButtonPin = 13;
  28. Button ackButton = Button(acknowledgeButtonPin, PULLUP);
  29.  
  30. int activateButtonPin = 7;
  31. Button activateButton = Button(activateButtonPin, PULLUP);
  32.  
  33. int cancelButtonPin = 11;
  34. Button cancelButton = Button(cancelButtonPin, PULLUP);
  35.  
  36. //Finite State Machine
  37. State Nav = State(empty, navUpdate, cleanDisplay);
  38.  
  39. State LiquidDispenseSelect = State(cleanBottomLine, liquidDispenseSelectUpdate, empty);
  40. State LiquidMeasurementSelect = State(empty, liquidMeasurementSelectUpdate, cleanDisplay);
  41. State LiquidAmountSelect = State(empty, liquidAmountSelectUpdate, cleanDisplay);
  42. State LiquidStart = State(empty, liquidStartUpdate, empty);
  43.  
  44. FSM measureMachine = FSM(Nav);
  45.  
  46. char liquids[2][18] = {" Water ->"};
  47.  
  48.  
  49. char measurements[2][18] = {" Cups ->",
  50. " Tbls ->"};
  51.  
  52. char tbls[6][18] = {" 1/8 tsp ->",
  53. " 1/4 tsp ->",
  54. " 1/2 tsp ->",
  55. " 1 tsp ->",
  56. " 1/2 tbls ->",
  57. " 1 tbls ->"};
  58.  
  59. double tblsEquiv[6] = {0.41,
  60. 0.83,
  61. 0.16,
  62. 0.33,
  63. 0.5,
  64. 1};
  65.  
  66. int liquidIdx = 0;
  67. int liqMeasureIdx = 0;
  68. int tblsIdx = 0;
  69. int liqStartTime;
  70. double liqEndTime;
  71. double liqAmount = 0.0;
  72. bool liquidActive = false;
  73. bool pumping = false;
  74. bool stimulating = false;
  75.  
  76.  
  77. void setup() {
  78. Serial.begin(9600);
  79. pinMode(pumpControlPin, OUTPUT);
  80. pinMode(scaleVoltagePin, INPUT);
  81. pinMode(stimulatorPin, OUTPUT);
  82.  
  83. //LCD Initialization
  84. lcd.begin(16, 2);
  85. lcd.clear();
  86. }
  87.  
  88. void loop() {
  89. dispenseLiquid();
  90. measureMachine.update();
  91. }
  92.  
  93. //Utility Functions
  94. void navUpdate() {
  95. if(forwardButton.uniquePress()) {
  96. measureMachine.transitionTo(LiquidDispenseSelect);
  97. }
  98. lcd.setCursor(0,0);
  99. lcd.print(" Measuring Liquid");
  100. lcd.setCursor(0,1);
  101. lcd.print("Water");
  102. }
  103.  
  104. void empty() {
  105. }
  106.  
  107. void reset() {
  108. liqAmount = 0.0;
  109. liquidIdx = 0;
  110. liqMeasureIdx = 0;
  111. cleanDisplay();
  112. }
  113.  
  114. /***********************************
  115. * LIQUID
  116. ***********************************/
  117.  
  118. /////////LIQUID DISPENSE SELECT
  119. void liquidDispenseSelectUpdate() {
  120. if(cancelButton.uniquePress()) {
  121. reset();
  122. measureMachine.transitionTo(Nav);
  123. }
  124.  
  125. if(backButton.uniquePress()) {
  126. liquidIdx = --liquidIdx % liquidVal;
  127. }
  128.  
  129. if(forwardButton.uniquePress()) {
  130. liquidIdx = ++liquidIdx % liquidVal;
  131. }
  132.  
  133. if(ackButton.uniquePress()) {
  134. measureMachine.transitionTo(LiquidMeasurementSelect);
  135. }
  136.  
  137. lcd.setCursor(0,0);
  138. lcd.print(liquids[liquidIdx]);
  139. }
  140.  
  141.  
  142. //////////LIQUID MEASUREMENT SELECT
  143. void liquidMeasurementSelectUpdate() {
  144. if(cancelButton.uniquePress()) {
  145. reset();
  146. measureMachine.transitionTo(Nav);
  147. }
  148.  
  149. if(backButton.uniquePress()) {
  150. liqMeasureIdx = --liqMeasureIdx % measurementVal;
  151. }
  152.  
  153. if(forwardButton.uniquePress()) {
  154. liqMeasureIdx = ++liqMeasureIdx % measurementVal;
  155. }
  156.  
  157. if(ackButton.uniquePress()) {
  158. measureMachine.transitionTo(LiquidAmountSelect);
  159. }
  160.  
  161. lcd.setCursor(0,1);
  162. lcd.print(measurements[liqMeasureIdx]);
  163. }
  164.  
  165. //////////AMOUNT SELECT
  166. void liquidAmountSelectUpdate() {
  167. if(cancelButton.uniquePress()) {
  168. reset();
  169. measureMachine.transitionTo(Nav);
  170. }
  171.  
  172. if(ackButton.uniquePress()) {
  173. measureMachine.transitionTo(LiquidStart);
  174. }
  175.  
  176. lcd.setCursor(0,0);
  177. lcd.print("How much?");
  178.  
  179. switch(liqMeasureIdx) {
  180. //Cups
  181. case 0:
  182. if(backButton.uniquePress()) {
  183. if(liqAmount > 0) {
  184. liqAmount -= 0.25;
  185. }
  186. }
  187.  
  188. if(forwardButton.uniquePress()) {
  189. if(liqAmount < 2) {
  190. liqAmount += 0.25;
  191. }
  192. }
  193.  
  194. lcd.setCursor(0,1);
  195. lcd.print(liqAmount);
  196. break;
  197.  
  198. //Spoons
  199. case 1:
  200. if(backButton.uniquePress()) {
  201. if(liqAmount > 0) {
  202. liqAmount -= 1;
  203. }
  204. }
  205.  
  206. if(forwardButton.uniquePress()) {
  207. if(liqAmount < 6) {
  208. liqAmount += 1;
  209. }
  210. }
  211. lcd.setCursor(0,1);
  212. lcd.print(tbls[(int)liqAmount]);
  213. break;
  214. }
  215. }
  216.  
  217. //////////AMOUNT SELECT
  218. void liquidStartUpdate() {
  219. if(cancelButton.uniquePress()) {
  220. reset();
  221. measureMachine.transitionTo(Nav);
  222. }
  223.  
  224. if(activateButton.uniquePress()) {
  225. liquidActive = true;
  226. measureMachine.transitionTo(Nav);
  227. }
  228.  
  229. lcd.setCursor(0,0);
  230. lcd.print("Press Green Btn ");
  231. lcd.setCursor(0,1);
  232. lcd.print("to begin");
  233. }
  234.  
  235.  
  236. /***********************************
  237. * UTILITY
  238. ***********************************/
  239. void cleanBottomLine() {
  240. lcd.setCursor(0,1);
  241. lcd.print(" ");
  242. }
  243.  
  244. void cleanDisplay() {
  245. lcd.clear();
  246. }
  247.  
  248. /***********************************
  249. * DISPENSING
  250. ***********************************/
  251.  
  252. void dispenseLiquid() {
  253. double tbls;
  254. switch(liqMeasureIdx) {
  255. //Cups
  256. case 0:
  257. beginLiquidDispenseCups(liqAmount);
  258. break;
  259.  
  260. //Spoons
  261. case 1:
  262. tbls = tblsEquiv[(int)liqAmount];
  263. beginLiquidDispenseSpoons(tbls);
  264. break;
  265. }
  266. }
  267.  
  268. void beginLiquidDispenseCups(double amountIn) {
  269. if(liquidActive) {
  270. double dispenseAmount = amountIn;
  271. if(!pumping) {
  272. startTimingLiquid();
  273. calculateEndTimeLiquidCups(dispenseAmount);
  274. digitalWrite(pumpControlPin, HIGH);
  275. } else {
  276. if(millis() - liqStartTime >= liqEndTime) {
  277. pumping = false;
  278. digitalWrite(pumpControlPin, LOW);
  279. liquidActive = false;
  280. }
  281. }
  282. } else {
  283. digitalWrite(pumpControlPin, LOW);
  284. }
  285. }
  286.  
  287. void beginLiquidDispenseSpoons(double amountIn) {
  288. if(liquidActive) {
  289. double dispenseAmount = amountIn;
  290. if(!pumping) {
  291. startTimingLiquid();
  292. calculateEndTimeLiquidSpoons(dispenseAmount);
  293. digitalWrite(pumpControlPin, HIGH);
  294. } else {
  295. if(millis() - liqStartTime >= liqEndTime) {
  296. pumping = false;
  297. digitalWrite(pumpControlPin, LOW);
  298. liquidActive = false;
  299. }
  300. }
  301. } else {
  302. digitalWrite(pumpControlPin, LOW);
  303. }
  304. }
  305. void startTimingLiquid() {
  306. liqStartTime = millis();
  307. pumping = true;
  308. }
  309.  
  310. void calculateEndTimeLiquidCups(double amountIn) {
  311. double duration = (amountIn * 237)/(1.21);
  312. Serial.println(duration);
  313. duration = duration * 1000;
  314. liqEndTime = duration;
  315. Serial.println(liqEndTime);
  316. }
  317.  
  318. void calculateEndTimeLiquidSpoons(double amountIn) {
  319. double duration = (amountIn * 14)/(1.21);
  320. duration = duration * 1000;
  321. Serial.println(duration);
  322. liqEndTime = duration;
  323. Serial.println(liqEndTime);
  324. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement