Arduino Soda Shot 2

files.catbox.moe/7v9j6g.mp4

Pending Version 3.0 Mod(s):
1. Ounce Selection (+Data Adj.)
2. Laser Alignment
3. More Accessible Can Frame
4. Shot Glass Sensor
5. Can Sensor
6. Servo Top Limit Switch
7. Purge Sensor
8. Linux Applet
9. Blade Design 7.0
10. Peristaltic Pump




  1. // soda shot two
  2. // vgmlr
  3. /*
  4. 0 rx nodemcu 1 tx
  5. 2 step x 3 step y
  6. 4 step z 5 direction x
  7. 6 direction y 7 direction z
  8. 8 step enable 9 limit x
  9. 10 limit y 11 limit z
  10. 12 rgb leds (7) 13 limit shot
  11. 14 (A0) servo 15 (A1) limit servo
  12. 16 (A2) button 17 (A3) relay
  13. 18 (A4) SDA oled 19 (A5) SCL oled
  14. */
  15. // stepper values
  16. #include < AccelStepper.h >
  17. #include < MultiStepper.h >
  18. const int xstep = 2;
  19. const int xdir = 5;
  20. const int xlimit = 9;
  21. const int ystep = 3;
  22. const int ydir = 6;
  23. const int ylimit = 10;
  24. const int zstep = 4;
  25. const int zdir = 7;
  26. const int zlimit = 11;
  27. const int motortype = 1;
  28. AccelStepper xstepper = AccelStepper(motortype, xstep, xdir);
  29. AccelStepper ystepper = AccelStepper(motortype, ystep, ydir);
  30. AccelStepper zstepper = AccelStepper(motortype, zstep, zdir);
  31. const int enable = 8; // low=on
  32. const int xopenpos = -2030;
  33. const int xpourpos = -610;
  34. const int yfrontpos = -2100;
  35. const int ysetpos = -1400;
  36. const int ztoppos = 960;
  37. const int zopenpos = 210;
  38. int plate_homing;
  39. // servo values
  40. #include < Servo.h >
  41. Servo pourservo;
  42. const int servopin = 14;
  43. const int servoup = 86;
  44. const int servostop = 90;
  45. const int servodown = 92;
  46. const int servolimit = 15;
  47. const int servotime = 7300;
  48. // rgb values
  49. #include "FastLED.h"
  50. #define NUM_LEDS 7
  51. #define LED_TYPE WS2812B
  52. #define COLOR_ORDER GRB
  53. CRGB leds[NUM_LEDS];
  54. const int rgb = 12;
  55. // display
  56. #include < Wire.h >
  57. #include < Adafruit_SSD1306.h >
  58. #include < Adafruit_GFX.h >
  59. #define OLED_ADDR 0x3C
  60. Adafruit_SSD1306 display(-1);
  61. // misc
  62. const int button = 16;
  63. const int shotlimit = 13;
  64. const int relay = 17;
  65. const int oneoztime = 3100;
  66. const int primetime = 350;
  67. const int purgetime = 3100;
  68. int state;
  69. int ounces;
  70. int purge;
  71. int remote;
  72. void setup() {
  73. Serial.begin(115200);
  74. Serial1.begin(115200);
  75. // declare display
  76. display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  77. display.clearDisplay();
  78. display.display();
  79. display.setTextSize(1);
  80. display.setTextColor(WHITE);
  81. display.setCursor(26, 4);
  82. display.print("Soda Shot 2.1");
  83. display.display();
  84. display.setTextSize(2);
  85. display.setTextColor(WHITE, BLACK);
  86. display.setCursor(29, 15);
  87. display.print("Homing");
  88. display.display();
  89. // declare and detach
  90. pinMode(enable, OUTPUT);
  91. digitalWrite(enable, HIGH); // off
  92. pourservo.attach(servopin);
  93. pourservo.write(servostop);
  94. pourservo.detach();
  95. // declare rgb
  96. FastLED.addLeds< LED_TYPE, rgb, COLOR_ORDER >(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  97. // purple (loading)
  98. rgbshow(120, 0, 150);
  99. // declare the rest
  100. pinMode(xlimit, INPUT_PULLUP);
  101. pinMode(ylimit, INPUT_PULLUP);
  102. pinMode(zlimit, INPUT_PULLUP);
  103. pinMode(servolimit, INPUT_PULLUP);
  104. pinMode(shotlimit, INPUT_PULLUP);
  105. pinMode(button, INPUT_PULLUP);
  106. pinMode(relay, OUTPUT);
  107. digitalWrite(relay, LOW);
  108. // home x
  109. digitalWrite(enable, LOW);
  110. delay(100);
  111. xhoming();
  112. // home and raise z
  113. zhoming();
  114. zstepper.setMaxSpeed(800);
  115. zstepper.setAcceleration(800);
  116. zstepper.moveTo(ztoppos);
  117. zstepper.runToPosition();
  118. delay(5);
  119. // home and forward y
  120. yhoming();
  121. ystepper.setMaxSpeed(1600);
  122. ystepper.setAcceleration(1600);
  123. ystepper.moveTo(yfrontpos);
  124. ystepper.runToPosition();
  125. digitalWrite(enable, HIGH);
  126. // home and raise servo
  127. servohoming();
  128. servoupfunc();
  129. // green (ready)
  130. rgbshow(0, 255, 0);
  131. }
  132. void loop() {
  133. if (state == 0) {
  134. display.clearDisplay();
  135. display.display();
  136. display.setTextSize(1);
  137. display.setTextColor(WHITE);
  138. display.setCursor(26, 4);
  139. display.print("Soda Shot 2.1");
  140. display.display();
  141. display.setTextSize(2);
  142. display.setTextColor(WHITE, BLACK);
  143. display.setCursor(17, 15);
  144. display.print("Load Can");
  145. display.display();
  146. while (digitalRead(button) == HIGH) {
  147. delay(2);
  148. }
  149. display.clearDisplay();
  150. display.display();
  151. display.setTextSize(1);
  152. display.setTextColor(WHITE);
  153. display.setCursor(26, 4);
  154. display.print("Soda Shot 2.1");
  155. display.display();
  156. display.setTextSize(2);
  157. display.setTextColor(WHITE, BLACK);
  158. display.setCursor(23, 15);
  159. display.print("Loading");
  160. display.display();
  161. sodaload();
  162. state = 1;
  163. ounces = 0;
  164. } else if (state == 1) {
  165. while (digitalRead(button) == HIGH || remote == 1) {
  166. // wifi remote
  167. // add pour size variable
  168. // add pour size display value
  169. if (Serial1.available()) {
  170. remote = Serial1.read();
  171. }
  172. }
  173. pour();
  174. ounces++;
  175. remote = 0;
  176. if (ounces == 13) {
  177. // no display change
  178. } else if (ounces > 9 && ounces < 12) {
  179. display.clearDisplay();
  180. display.display();
  181. display.setTextSize(1);
  182. display.setTextColor(WHITE);
  183. display.setCursor(26, 4);
  184. display.print("Soda Shot 2.1");
  185. display.display();
  186. display.setTextSize(2);
  187. display.setTextColor(WHITE, BLACK);
  188. display.setCursor(17, 15);
  189. display.print(ounces);
  190. display.display();
  191. display.setTextSize(2);
  192. display.setTextColor(WHITE, BLACK);
  193. display.setCursor(53, 15);
  194. display.print("of 12");
  195. display.display();
  196. } else {
  197. display.clearDisplay();
  198. display.display();
  199. display.setTextSize(1);
  200. display.setTextColor(WHITE);
  201. display.setCursor(26, 4);
  202. display.print("Soda Shot 2.1");
  203. display.display();
  204. display.setTextSize(2);
  205. display.setTextColor(WHITE, BLACK);
  206. display.setCursor(23, 15);
  207. display.print(ounces);
  208. display.display();
  209. display.setTextSize(2);
  210. display.setTextColor(WHITE, BLACK);
  211. display.setCursor(47, 15);
  212. display.print("of 12");
  213. display.display();
  214. }
  215. if (ounces == 12) {
  216. display.clearDisplay();
  217. display.display();
  218. display.setTextSize(1);
  219. display.setTextColor(WHITE);
  220. display.setCursor(26, 4);
  221. display.print("Soda Shot 2.1");
  222. display.display();
  223. display.setTextSize(2);
  224. display.setTextColor(WHITE, BLACK);
  225. display.setCursor(35, 15);
  226. display.print("Purge");
  227. display.display();
  228. purge = 1;
  229. }
  230. if (ounces == 13) {
  231. exhume();
  232. state = 0;
  233. purge = 0;
  234. ounces = 0;
  235. remote = 0;
  236. }
  237. }
  238. }
  239. void xhoming() {
  240. xstepper.setCurrentPosition(0);
  241. xstepper.setMaxSpeed(300);
  242. xstepper.setAcceleration(300);
  243. plate_homing = 1;
  244. while (!digitalRead(xlimit)) {
  245. xstepper.moveTo(plate_homing);
  246. xstepper.run();
  247. plate_homing++;
  248. }
  249. xstepper.setCurrentPosition(0);
  250. }
  251. void yhoming() {
  252. ystepper.setCurrentPosition(0);
  253. ystepper.setMaxSpeed(300);
  254. ystepper.setAcceleration(300);
  255. plate_homing = 1;
  256. while (!digitalRead(ylimit)) {
  257. ystepper.moveTo(plate_homing);
  258. ystepper.run();
  259. plate_homing++;
  260. }
  261. ystepper.setCurrentPosition(0);
  262. }
  263. void zhoming() {
  264. zstepper.setCurrentPosition(0);
  265. zstepper.setMaxSpeed(300);
  266. zstepper.setAcceleration(300);
  267. plate_homing = 1;
  268. while (!digitalRead(zlimit)) {
  269. zstepper.moveTo(plate_homing);
  270. zstepper.run();
  271. plate_homing--;
  272. }
  273. zstepper.setCurrentPosition(0);
  274. }
  275. void servohoming() {
  276. pourservo.attach(servopin);
  277. while (digitalRead(servolimit) == HIGH) {
  278. pourservo.write(servodown);
  279. }
  280. pourservo.write(servostop);
  281. pourservo.detach();
  282. }
  283. void servoupfunc() {
  284. pourservo.attach(servopin);
  285. pourservo.write(servoup);
  286. // no limit - timed
  287. delay(servotime);
  288. pourservo.write(servostop);
  289. pourservo.detach();
  290. }
  291. void sodaload() {
  292. // red (active)
  293. rgbshow(255, 0, 0);
  294. digitalWrite(enable, LOW);
  295. // move y to set position
  296. ystepper.setMaxSpeed(1600);
  297. ystepper.setAcceleration(1600);
  298. ystepper.moveTo(ysetpos);
  299. ystepper.runToPosition();
  300. // move x to open
  301. xstepper.setMaxSpeed(1600);
  302. xstepper.setAcceleration(1600);
  303. xstepper.moveTo(xopenpos);
  304. xstepper.runToPosition();
  305. // move z to open
  306. display.setTextSize(2);
  307. display.setTextColor(WHITE, BLACK);
  308. display.setCursor(17, 30);
  309. display.print("Pop Fizz");
  310. display.display();
  311. zstepper.setMaxSpeed(500);
  312. zstepper.setAcceleration(500);
  313. zstepper.moveTo(zopenpos);
  314. zstepper.runToPosition();
  315. delay(5);
  316. // move z to top
  317. zstepper.setMaxSpeed(800);
  318. zstepper.setAcceleration(800);
  319. zstepper.moveTo(ztoppos);
  320. zstepper.runToPosition();
  321. delay(5);
  322. // move x to pour
  323. xstepper.moveTo(xpourpos);
  324. xstepper.runToPosition();
  325. // move z to lid
  326. display.clearDisplay();
  327. display.display();
  328. display.setTextSize(1);
  329. display.setTextColor(WHITE);
  330. display.setCursor(26, 4);
  331. display.print("Soda Shot 2.1");
  332. display.display();
  333. display.setTextSize(2);
  334. display.setTextColor(WHITE, BLACK);
  335. display.setCursor(23, 15);
  336. display.print("Sealing");
  337. display.display();
  338. zhoming();
  339. delay(5);
  340. digitalWrite(enable, HIGH);
  341. // move servo down
  342. display.clearDisplay();
  343. display.display();
  344. display.setTextSize(1);
  345. display.setTextColor(WHITE);
  346. display.setCursor(26, 4);
  347. display.print("Soda Shot 2.1");
  348. display.display();
  349. display.setTextSize(2);
  350. display.setTextColor(WHITE, BLACK);
  351. display.setCursor(23, 15);
  352. display.print("Tapping");
  353. display.display();
  354. servohoming();
  355. // prime
  356. display.clearDisplay();
  357. display.display();
  358. display.setTextSize(1);
  359. display.setTextColor(WHITE);
  360. display.setCursor(26, 4);
  361. display.print("Soda Shot 2.1");
  362. display.display();
  363. display.setTextSize(2);
  364. display.setTextColor(WHITE, BLACK);
  365. display.setCursor(23, 15);
  366. display.print("Priming");
  367. display.display();
  368. digitalWrite(relay, HIGH);
  369. delay(primetime);
  370. digitalWrite(relay, LOW);
  371. rgbshow(0, 0, 255);
  372. display.clearDisplay();
  373. display.display();
  374. display.setTextSize(1);
  375. display.setTextColor(WHITE);
  376. display.setCursor(26, 4);
  377. display.print("Soda Shot 2.1");
  378. display.display();
  379. display.setTextSize(2);
  380. display.setTextColor(WHITE, BLACK);
  381. display.setCursor(23, 15);
  382. display.print("0 of 12");
  383. display.display();
  384. }
  385. void exhume() {
  386. // red
  387. rgbshow(255, 0, 0);
  388. // lift servo
  389. servoupfunc();
  390. // lift z
  391. digitalWrite(enable, LOW);
  392. zstepper.setMaxSpeed(800);
  393. zstepper.setAcceleration(800);
  394. zstepper.moveTo(ztoppos);
  395. zstepper.runToPosition();
  396. // home x
  397. xhoming();
  398. // forward y
  399. ystepper.setMaxSpeed(1600);
  400. ystepper.setAcceleration(1600);
  401. ystepper.moveTo(yfrontpos);
  402. ystepper.runToPosition();
  403. digitalWrite(enable, HIGH);
  404. rgbshow(0, 255, 0);
  405. }
  406. void pour() {
  407. digitalWrite(relay, HIGH);
  408. if (purge == 1) {
  409. delay(purgetime);
  410. } else {
  411. // change here for size var
  412. delay(oneoztime);
  413. }
  414. digitalWrite(relay, LOW);
  415. }
  416. void rgbshow(int r, int g, int b) {
  417. for (int v = 0; v < NUM_LEDS; v++) {
  418. leds[v] = CRGB(r, g, b);
  419. FastLED.show();
  420. }
  421. }
Update(s)-
1. ptmr | 343025 [Changelog]
10:22 343 025
Dev-
1. TVShow (227) 'CSA'
2. Wedge (Miter) 1.0.0
3. TVShow (228) 'APT'
4. TVProgram (83) 'BXT'
11:51 339 025

Menu
Index
Engineering
Entertainment
Literature
Miscellaneous
Contact
Search
tiktok.com/@vgmlr
youtube.com/@vgmlr
Miter
@vgmlr
=SUM(parts)
86 miters
131 tenons
Subscribe
0.00115