Newer
Older
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
What will it do?
**Goal is to create a kitchen appliance that can wash and dry greens and other vegetables via a pre set cycle both saving time (and potentially water)**
**Who's done what beforehand?**
So far I only found limited similar project within the fab academy community and a few outside.
Fab Academy projects
1) [here](https://fab.cba.mit.edu/classes/863.13/people/jfduval/final.html)
Outside of fab academy:
1. I like the automated spinning salad dryer that the You Tuber The Practical Engineer designed
<iframe width="560" height="315" src="https://www.youtube.com/embed/hfGojmXrGfc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
I think that he has a good spinner design and using this approach can allow me to allow users to put in
any colander they wish.
2. Commercial solution are mainly ultrasonic, manual or focused on drying (salad spinners)
[Here](https://www.amazon.com/dp/B0BCVW1DPR?pd_rd_i=B0BCVW1DPR&pf_rd_p=b000e0a0-9e93-480f-bf78-a83c8136dfcb&pf_rd_r=SXKKN0NRSWW8SSBCYA6G&pd_rd_wg=yaMUE&pd_rd_w=RtpxZ&pd_rd_r=91c7961a-a2a2-4e3e-a877-a44317f81a64) are some examples



**What will you design?**
I will design all aspect of the project with 4 major components
1) The box / frame of the machine and water reservoir
2) The spinning mechanism
3) The machine lid and water dispensing mechanism
4) Control board electronics - main board, pump breakout board, motor breakout board, button breakout board
**What materials and components will be used?**
The main materials are
1) T Rails + Plexiglass
2) 3D print filament - TPU, PLA and XTC3D finishing resin
3) Electronic components and PCB boards, motor/ESC and pump
4) Molding plastic / rubber
Below is a full BOM
**Where will come from?**
Most are either provided by lab, purchased from Digi key or Amazon
**How much will they cost?**

**What parts and systems will be made?**
Washbasin/box/frame, drain/skirt, spinning plate, lid, water reservoir, electronics boards.
Only things not made are:
Motor + ESC, pump, salad spinner bowl, water tube, sprinkler head, power supply
**What processes will be used?**
- 3D print
- Laser cutting
- PCB Board milling
- Molding and casting / resin
- System integration
**What questions need to be answered?**
- Spinning mechanism - chain/band vs. direct drive (already answered)
- Frame materials - (already answered - TRail )
- Water drainage approach - TPU printed sloped base
**How will it be evaluated?**
- does it wash and clean greens / veggies
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
## Project description
{: style="height:360px;width:720px"}
{: style="height:300px;width:300px"}
Here is a first cut at the base:

**There are 4 main parts to the appliance**
1. Water reservoir
2. Main container (Wash basin)- base is designed to have a gravity fed drain
3. Lid with build in sprinkler
4. Vegetable holding bowel that sites in the Wash basin and spins to dry
**There are 2 Motor/pump used**
1. Water pump to move water from reservoir to sprinkler head
2. Motor to spin Vegetable bowel
**There are 2 potential sensors**
1. Lid sensor - stop operation if lid is open mid cycle
2. Water level sensor to alert if reservoir is empty
**Microcontroller usage**
1. Control sequencing of pumps / motors
2. Interrupt operation if sensor is triggered
3. Manage GUI
**GUI**
- Wash only
- Dry only
- Wash/dry
Here is a another view of the merging design

158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
| Weekly topics | Parts |
| ----------- | ----------- |
| Computer controlled cutting | Outbox / wash basin holder |
| Electronics production | Controller, motor ESC, Sensors |
| 3D Scanning and printing | Motor housing, water connectors, sprinkler head, sproket/chain for motor drive|
| Electronics design | sensors / controller board / Motor ESC |
| Computer controlled machining | Controller board |
| Embedded programming | Cycle design / User input |
| Molding and casting | Drain / Spinning plate |
| Input devices | GUI buttons / Sensors |
| Output devices | Screen |
Key component breakdown
Outer box - Plexiglass
Wash basin holder - Plexiglass / 3d print
Water reservoir - molding / buying
Electronic housing - 3D print
spinner mechanism - 3D print
Bowel - Molding / casting
Lid - 3D Print
Water pump / sprinkler mechanism - 3D print / electronics
Sensors - 1) Lid sensor 2) Water level sensor
Controller board -
Display/Buttons
Water connections - 3 Print or buy
My build split into the physical build and the electronics

I decided to use a similar method that we used in machine week of T rails for the outside frame and then 1/4 inch plexiglass for the water tight box and water reservoir that are both mounted in side the frame

Using a chop saw and aluminum cutting blade I got all the pieces ready for assembly


3D printed bracket will be key together with T Rail M5 screws and bolts
To make the water proof interior box I decided to use 1/4 plexiglass that I will laser cut and then use cement and possible silicon to water proof
I used the big epilog laser at the fab lab. Setting for 1/4 inch plexi glass was 100% power and 10% speed.
I first cut and assembled a cardboard set to make sure it all worked well as I only have 1 sheet of plexiglass. I made sure the mounting holes for the motor were positioned correctly
Now it was time to cut the plexiglass

4 of the five panels cut fine on the left side but the right side of the laser did not cut through. I refocused the laser on the right side and ran the cut for the 5th panel with 3 passes. Discussing with the person in charge of maintaining the laser it seems like they were having a focus issue they were working through.
Now I needed to glue it together and so I used a plexiglass cement with the following [data sheet](https://assemblyadhesives.com/SDS/WELD-ON%204SC%20Low%20VOC%20Solvent%20Cement%20for%20Acrylic%20US_EN_v2.pdf)
I only did used it in the garage with the car door open to ensure enough ventilation

This applicator was very useful

I used clamps to keep it together until the cement dried

The lid assemble was a smaller version of the box assembly with an addition of a hinge and a Door Lift Stay Support Hinge Damper [](https://www.amazon.com/gp/product/B01N5GQZK2/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1)
Now it is time to fabricate the internal plexiglass box
First I cut out the shape from cardboard to make sure it would fit

Looks good

Now cut the plexiglass

Clean cut

Here you can see the water pump mounted and another hole for the water tube to go into the lid
First I set up some user parameters I will use in sizing the spinning plate and it base


To create the shape of the base I will create a new sketch on the top of the base leg. I then
create a circle and replicate it using the circular pattern tool followed but a cut.

I then sketched on top again and created a circle to create the plate itself

Here I made a mistake as I did not select the whole plate and where the handy timeline
tool come into play

And we are back on track. I wanted to create a downward facing lip in order to provide some water
protection for the spinning mechanism during the dry cycle.
To do this I am going to draw a sketch of the lip and have it rotate around the plate center axis
Start with sketch

Then used the revolve to create the lip and set it to join the plate base.

and there you go a first cut at the base plate


After 5 hours, here it is:
When I put it up to the salad spinner bowel I have it seemed to me that the overall size of the machine \
can be much smaller then I originaly planned.
I think a good approach is the max the size of the plate I can print on the MK3S

The original size had a 320mm diameter but I am going to resize it to a 200mm diameter

I used the scale command leaving the Z as is and scaling the X and Y to 62.5% of the original
Now that I liked that size in order to make every thing work in fusion I had to go back and resize the plate in fusion to match.


Now we are ready to create the bowel holders
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
See below for discussion on the motor drive selection and decision to move to a direct drive mount on a outrunner motor. I am used a D3548.

I found a model of the motor I am planning to use on GrabCad

This an out runner and I would like to cut its shape into the bottom of the spinner to test a direct drive
As the CAD was made of many many pieces it was easier to create a similar shaped body. I traced the profile and used the revolved function to create an new body
s


Now I used the combined command to cut this out of the base of the plate for a direct mount

Creating a nice mount for the plate - i also think i do not need the spinner base any more.

I knew there was going to be a lot of stress on this when the plate spins so I filet everything I could to strength the joints.

Got it ready to 3D print

451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
Initially I printed a basic arm to get a physical sense of the shape and size

After have a basic shape in the early design I needed to have a pieces that was help in place on the plate.
I started by adding a wedge at the plate level and tweaking the shape but it was very unstable

I decided to use to features to do that.
1) Redesign the base to snugly fit on the shape of the plate


2) Create a threaded rod on the bottom and print a nut that will hold the are in place





<iframe width="560" height="315" src=../../images/Finalproject/Bowlfly.mp4 frameborder="0" allowfullscreen></iframe>
When discussing my progress with my local instructure Dr. Fagan, the feedback I got is the need to have a screw to hold the plate to the motor shaft


Once the design looked goo it is time to reprint the plate.
<iframe width="560" height="315" src=../../projects/Plate/newplate.mp4 frameborder="0" allowfullscreen></iframe>
To ensure the spinner bowel does not fly out I need to add a hooks that will connect to the top of the plate arms and hols the bowel in place
I decided to go with a simple 3D printed design
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555

Got them 3D printed

And istalled

## Box: Water reservoir
I had decided to use a square water container as the water reservoir

I wanted to build a holder that will attached ot the back of the frame and hold the water bottle

I added strong support to try and only connect it on the bottom rail

And we are ready to print

My plan for water profing the motor and providing a gravity based drainage is to create a sloped rubber base for box with a rasied skirt.
The skirt will go between the motor and the plate lip thus stopping any water for getting into the motor.
I started with a fusion design

Added the drainage slopes

Unfortunately my Prusa is too small to print the whole things at one so I had to cut it to be printed in parts


Printing in TPU is slow if you do not want stringing It is a 23 hour print !!

Here it is in progress

Fully printed

Printing went well but remove the print from the plate was nearly impossible and ended up destrying the plate.
This did not happen to me in smaller prints I did but after going back and reviewing the Prusa [materials guide](https://help.prusa3d.com/materials#_ga=2.250429327.883239654.1684193727-1420350994.1684193726) as well as reading some user form it seems that I missed the need to either
1) Add a layer of glue stick
2) Put down blue tape the print on
After reivew it seems that Loctite 406 is a recommended glu for TPU so that is what I am going to use to turn these 3 parts into 1. But before I do that I can see 2 things that I need to add and adjust:
1. Add a drain connection
2. Expand the neck to fit the screw that I added to the plate

I created a drain connection / edge

Ready to print

Here it is

I also cut the next of the skirt to fit the new screw placemen.
I needed to connect the different parts of the bottom into one

Some reaserch showed that for TPU loctite 406 is a good option.

I used ducktape on the bottom hold the pieces together until the glue dried


after some more tests that drain was working well.
<iframe width="560" height="315" src=../../projects/Plate/draintest.mp4 frameborder="0" allowfullscreen></iframe>
The drain worked well but i still got a lot of water under the TPU base from all the side.

I decided to use some clear silicon to waterproof the edges and funnel all the water into the drain

And we are ready to go

1. 12-24V power supply
2. 12-24V / 80W DC Motor
3. 12-24V Motor ESC

The ESC is controlled by a Potentiometer and once I got them connected they all worked well together. When
I turned the knob the motor speed changed.
I want to be able to control the ESC with the microcontroller so I can adjust the speed for the wash and
dry cycles.
First I need to understand how the Potentiometer works with the ESC. There is a plug with power and ground on either side
the middle wire voltage change based on the potentiometer position ranging from 0.5V to 3.6V.


I was not sure how to approach this, my initial plan was to use 2 resistors and some relays to switch between
2 speeds. After reviewing Dr. Gershenfeld class and reflecting on the transistor discussion I came up with the
idea of used a transistor to replace the potentiometer and a capacitor to smooth out the control signal from the microcontroller.
I ran this by our local instructor Mr. Dubick and my classmate Adam Durrett that have strong electronics background and they
agreed it should work!!!
I decided the set up the board to control both the motor the spin the Vesgtable Basket as well as the Water pump even
though my focus this week was on the motor.
For each I would have a control signal come in from the micro controller on the main board. I would change the frequency of
the signal the change the speed, putting a capacitor on the line would smooth it and would replace the line in with the
potentiometer.

Not to get things a bit more organized. It is a relatively simple circuit

Not pushed it to the 2B Board and started tracing

Pushed to the 3D board get ready to mill


When I reviewing the milling it was very tight due to the tracing.



I reviewed the connectors and saw that by switch a few things around I could simplify the tracing
and provide more space between traces to make for easier milling


739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
Now I was ready to mill. I used the same set up with my Genmitsu 3020-Pro-Max from last week [here](https://fabacademy.org/2023/labs/charlotte/students/dan-stone/assignments/week09/#tool-path-set-up)
The tool path looked good

Got to cutting using a 0.8mm end mill


I deburred and washed the board

Now we are ready to stuff and solder

Here are all the components

And we are ready to test

After stripping the connectors on a number of boards and after rethinking the machine design I decided the break this board into
2 one for the motor and one for the pump.
I also increased the side of my traces to 30mil and replace the pad for my connector with A better connector from
the fab library
I started testing the board and it seemed like now matter what I did the Sources and Drain of the transistor was always connected.
I checked for shorts, I added a pull down resistor to ensure the gate is 0 and not joy. The source and drain are connected.
I went back to the lab and got another 2 transisotr (the lab only had 3 of them) and they all seemed to do that same.
I reviewed them with my instructure and fellow student who is an electrical engineer and they could not find why it was
acting this way other then it may be a bad batch of transistors. We put in an order for some more and for now this part
of the project is on hold until the arrive.
While this effort was on hold we completed Machine Building week and that changed my mind on how to set up the motor.
After a success full machine week I got appreciation for the out runner motor capabilities and so I decided to try and mount the plat directly on a out runner motor and see if that work.
I had a outrunner motor in the lab that was bigger then the one we used in machine week and I think would work well.
Here is it spec:

I coupled that with a large ESC with the following [user manual](https://www.rcelectricparts.com/classic-esc-user-guide.html#03)
I decided to test the motor using a potentiometer to control the speed so I can find out what are good speeds for my final project.
I set up the mounting bracket on the motor

I used a scrap piece of wood to mount the motor onto the frame

Power: The motor will connect directly to the 0-24V power supply I have

ESC control: the ESC will be connect to the BOD via 3 wires: 5V / GND / and PMW from pin 9
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
I wired a potentiometer to analog input A1 and the 5V/GND and ran the following code:
```c
# include <Servo.h>
// create a Servo object to control the ESC
Servo esc;
int potVal;
void setup() {
// set the baud rate for serial communication
Serial.begin(9600);
// attach the ESC to pin 9
esc.attach(9, 1000, 2000); // the second and third parameters are the minimum and maximum pulse widths
int potVal;
esc.write(0); //arm ESP
delay(1000);
}
void loop() {
// set the speed to half of the maximum (which is 180)
potVal = analogRead(A1); // read input from potentiometer.
int speed = map(potVal,0, 1023, 0, 180); // maps potentiometer values to PWM val
// send the speed to the ESC
esc.write(speed);
// print the speed to the serial monitor
Serial.print("Speed: ");
Serial.println(speed);
// pause for a moment before starting again
}
```
This will both printout in the serial monitor the speed variable so I can see the which value I would want to use in the final code.
When you plug the ESC in for the first time it need to go via a calibration process.
1) You put it to full throttle
2) Connect motor to power
3) Move to zero throttle
You can see the motor first run
<iframe width="560" height="315" src=../../images/Finalproject/ESCcalib.mp4 frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src=../../images/Finalproject/spiningplate.mp4 frameborder="0" allowfullscreen></iframe>
I started moving the potentiometer while look at the serial monitor to see the speed.
<iframe width="560" height="315" src=../../images/Finalproject/speed.mp4 frameborder="0" allowfullscreen></iframe>
Answer is pretty straight forward.
The lowest speed that will run is with the Servo Angle value of 24.
A good increased speed for drying is 40.
These will be the two value I will use in the cycles
After a while I decided to move to a working iwht th eRP2040
I am going to follow the same break out board design and so I started to work on a schematic. I am planning to use
4 pin wire to board connectors and 2 pin for the power as an alternative to the USBC.

I have the 2D Board set up

Now we are ready to mill

Here we are in action

954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
I used this board in a number of weeks but decided to redo it so that we have clean wire to board connector set up for each breakout board (and make a shape of a vegetable).
At this point I already made the breakout board and used the the systems map at the top as a guide to which pins need to connect to each board.
I created a new schematic

Layout was pretty straight forward but had to use a jumper for GND to one of the sockets

3D board ready to mill

I had to adjust to spacing betweek the pads for the 0.5mm milling bit I have.

I made the same mistake using the pads that are too big for the sockets

A quick replacement to fit the sockets

And we are ready to mill

Here we go

And we are ready to stuff and solder

996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
To connected the control button, lid sensor and water level sensor I created a break out board.
I started with a basic schematic

I think routed the board and decided to make the board the shape of a carrot.

I had to shorten the carrot so it fit on the PCB I had.

And now it is ready to mill

Here we go

No we just have to clean it up

I soldered the wire for the button as well as the 4 pin connector to the button board

1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
I initialy toughts this should be pretty traight forward.
Breakout board would drive a relay with a GPIO from the main board that would be activated but the button push similar to the motor. The relay would connect the pump to the 12V power supply.

I decided to use a mushroom design

got it ready to cut


I misjudged the size and so after overshotting

I redesigned the board


Got it cut

1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104

Got it stuffed and soldered

When I pressed the button the motor turned byut instead of the rely switching to turn on the pump nothing happened.
I got out the multimeter and saw that when not connected to the relay the D1 pin went up to 3.3V when I pressed the button but when connected to the relay it only went to 1.8V and the relay did not activate.
I researched this I found out the RP2040 GPIO do not have enough current to drive the relay so I needed to make a driver.
I found this basic driver schematic on the [raspberrypi forum](https://forums.raspberrypi.com//viewtopic.php?t=63578&p=470362#p470625)

I only had through hole components to make this and so decided to make a through hole board for this. I never made one and so was interested to see how it worked.
First I tested it on a breadboard to make sure it worked

Updated the schematic to include the driver.

Retraced everything

Got it ready to mill
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137

Milling took a few attempts as this was the first time I was using the drilling function and I kept setting the Z too low (this is a manual process on my mill) and the drill would break the trace

I got a hang of the calibration needed and we have a board

Added components

Soldered

And we are ready to test

The test showed me that I ended up connected to the Normally open legs of the relay vs. the Normally closed and so the pump ran contently. The mistake was due to my not flipping the components to the other side of the board for the drill through layout.
I ended up cutting that trace with a knife and added a jumper which worked well.

I also redesigned the board and will remill once if needed later

Now we are ready to test it .... we have water flow!
<iframe width="560" height="315" src=../../projects/pumpboard/pumptest.mp4 frameborder="0" allowfullscreen></iframe>
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
I decided to make a box that will mount on to the side of the machines and will have the control board and breakout board in it.

I added screw holds for mounting the board / ESC and some holes for wires to come in and out

Ready to print

Added some M3 bolts to secure the boards

It fits onto the side nicely

1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
**Lid Sensor**
The open lid sensor is a simple mounted switch
I used the M3 T nuts I had to mount the switch directly onto the frame.

I used the casted plastic mushroom I casted from Molding and Casting week as the counter edge on the LID


The wiring is run through the button break out board

And here you can see it in action
<iframe width="560" height="315" src=../../projects/pumpboard/openlid.mp4 frameborder="0" allowfullscreen></iframe>
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
## Electronics: Water level sensor
I got a few of the following sensors off [Amazon](https://www.amazon.com/Digital-Barometric-Pressure-Controller-0-40KPa/dp/B07KNV8MM6/ref=asc_df_B07KNV8MM6/?tag=hyprod-20&linkCode=df0&hvadid=652711367439&hvpos=&hvnetw=g&hvrand=14152749531030453154&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9060248&hvtargid=pla-2064138829849&psc=1&gclid=CjwKCAjw1MajBhAcEiwAagW9MZCg0d33zEdap16ME273bfZya4pu-qdxR3aOl-s-AuyUNDDcdfNLiRoC2HEQAvD_BwE):

Unfortunately there was not documentation or links on amazon to documentation. I used google lens to search for the picture of the sensor and found a good [tutorial](https://www.youtube.com/watch?v=NOTMb165jMU)
Turns out this is a HX710
I got it wired into the I2C on the board and used the following test code to read the measurements.
```c
const int HX_OUT_PIN = D4;
const int HX_SCK_PIN = D5;
enum HX_MODE { NONE, DIFF_10Hz, TEMP_40Hz, DIFF_40Hz};
const byte HX_MODE = DIFF_40Hz;
void setup() {
pinMode(HX_SCK_PIN, OUTPUT);
pinMode(HX_OUT_PIN, INPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(readHX());
}
unsigned long readHX() {
// pulse clock line to start a reading
for (char i = 0; i < HX_MODE; i++) {
digitalWrite(HX_SCK_PIN, HIGH);
digitalWrite(HX_SCK_PIN, LOW);
}
// wait for the reading to finish
while (digitalRead(HX_OUT_PIN)) {}
// read the 24-bit pressure as 3 bytes using SPI
byte data[3];
for (byte j = 3; j--;) {
data[j] = shiftIn(HX_OUT_PIN, HX_SCK_PIN, MSBFIRST);
}
data[2] ^= 0x80; // see note
// shift the 3 bytes into a large integer
long result;
result += (long)data[2] << 16;
result += (long)data[1] << 8;
result += (long)data[0];
return result;
}
```
I then got it wired up

I used some heat shrink to connect a air pump hose to the sensor tip

And here it is ready to go into water reservoir

and here it is in action as I drain the water reservoir
<iframe width="560" height="315" src=../../projects/pumpboard/S3.mp4 frameborder="0" allowfullscreen></iframe>


1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
## Code basic set up
To keep this week in sync with my final project I decided to test a set up for the basic VMS functionality
replacing the water pump and motor with LED and the sensors with buttons.
Here is the functionality I was aiming for:
| Button | Label | FUnctionality |
|---|---|---|
| Button 1 | Wash cycle | 1. Check Lid / Water sensor -> 2. Turn on Water pump and motor for a set time |
| Button 2 | Dry cycle | 1. Check Lid -> 2. Turn on motor for a set time |
| Button 3 | Total cycle | 1. Run Wash cycle -> 2. Run Dry cycle |
| Sensors | If either sensor is triggered then stop and turn on error LED | |
Here is my updated code:
```c
// Define the pin numbers for the sensors and actuators
const int LED_PIN = 7;
const int WASH_BUTTON_PIN = 11;
const int DRY_BUTTON_PIN = 10;
const int FULL_BUTTON_PIN = 9;
const int WATER_SENSOR_PIN = 2;
const int LID_SENSOR_PIN = 3;
const int DRUM_PIN = 4;
const int WATER_PUMP_PIN = 5;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(WASH_BUTTON_PIN, INPUT);
pinMode(DRY_BUTTON_PIN, INPUT);
pinMode(FULL_BUTTON_PIN, INPUT);
pinMode(WATER_SENSOR_PIN, INPUT);
pinMode(LID_SENSOR_PIN, INPUT);
pinMode(DRUM_PIN, OUTPUT);
pinMode(WATER_PUMP_PIN, OUTPUT);
}
void loop() {
// Wait for the wash button press
if (digitalRead(WASH_BUTTON_PIN) == HIGH) {
// Check the water level and lid status
if (digitalRead(WATER_SENSOR_PIN) == LOW && digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the wash cycle
digitalWrite(DRUM_PIN, HIGH);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(600);
digitalWrite(DRUM_PIN, LOW);
digitalWrite(WATER_PUMP_PIN, LOW);
delay(400);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(400);
digitalWrite(WATER_PUMP_PIN, LOW);
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
}
}
// Wait for the dry button press
if (digitalRead(DRY_BUTTON_PIN) == HIGH) {
// Start the slow spin
if (digitalRead(LID_SENSOR_PIN) == LOW) {
digitalWrite(DRUM_PIN, HIGH);
delay(600);
// Start the fast spin
digitalWrite(DRUM_PIN, LOW);
delay(300);
digitalWrite(DRUM_PIN, HIGH);
delay(300);
digitalWrite(DRUM_PIN, LOW);
} else {
Serial.println("lid is open.");
digitalWrite(LED_PIN, HIGH);
}
}
// Wait for the full cycle button press
if (digitalRead(FULL_BUTTON_PIN) == HIGH) {
// Perform the wash cycle
if (digitalRead(WATER_SENSOR_PIN) == LOW && digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the wash cycle
digitalWrite(DRUM_PIN, HIGH);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(600);
digitalWrite(DRUM_PIN, LOW);
digitalWrite(WATER_PUMP_PIN, LOW);
delay(400);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(400);
digitalWrite(WATER_PUMP_PIN, LOW);
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
return;
}
// Perform the dry cycle
// Start the slow spin
if (digitalRead(LID_SENSOR_PIN) == LOW) {
digitalWrite(DRUM_PIN, HIGH);
delay(200);
// Start the fast spin
digitalWrite(DRUM_PIN, HIGH);
delay(200);
digitalWrite(DRUM_PIN, LOW);
delay(200);
digitalWrite(DRUM_PIN, HIGH);
delay(100);
digitalWrite(DRUM_PIN, LOW);
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
return;
}
}}
```
Here is the basic circuit I am planning

I followed this diagram (except for the different colored wires) and it went pretty smoothly
Here is the one I built in action:
<iframe width="560" height="315" src=../../images/Finalproject/VMS.mp4 frameborder="0" allowfullscreen></iframe>
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
## Final code
Here is the final code once I got all the wiring, pins and sensors locked in
```c
# include <Servo.h>
// Define the pin numbers for the sensors and actuators
const int LED_PIN = 7;
const int WASH_BUTTON_PIN = D6;
const int DRY_BUTTON_PIN = D5;
const int FULL_BUTTON_PIN = D4;
const int WATER_SENSOR_PIN = D3;
const int LID_SENSOR_PIN = D1;
const int DRUM_PIN = D0;
const int WATER_PUMP_PIN = D2;
const int DRUM_SLOW = 24;
const int DRUM_FAST = 30;
const int DRUM_STOP = 0;
int potVal;
Servo esc;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(WASH_BUTTON_PIN, INPUT_PULLUP);
pinMode(DRY_BUTTON_PIN, INPUT_PULLUP);
pinMode(FULL_BUTTON_PIN, INPUT_PULLUP);
pinMode(WATER_SENSOR_PIN, INPUT_PULLUP);
pinMode(LID_SENSOR_PIN, INPUT_PULLUP);
pinMode(DRUM_PIN, OUTPUT);
pinMode(WATER_PUMP_PIN, OUTPUT);
Serial.begin(9600);
esc.attach(DRUM_PIN, 1000, 2000); // the second and third parameters are the minimum and maximum pulse widths
esc.write(DRUM_STOP); //arm ESP
delay(1000);
}
void loop() {
// Wait for the wash button press
if (digitalRead(WASH_BUTTON_PIN) == LOW) {
// Check the water level and lid status
if (digitalRead(WATER_SENSOR_PIN) == HIGH && digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the wash cycle
esc.write(DRUM_SLOW);
Serial.println("wash");
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(800);
esc.write(DRUM_STOP);
digitalWrite(WATER_PUMP_PIN, LOW);
delay(400);
digitalWrite(WATER_PUMP_PIN, HIGH);
esc.write(DRUM_FAST);
delay(800);
digitalWrite(WATER_PUMP_PIN, LOW);
esc.write(DRUM_STOP);
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
}
}
// Wait for the dry button press
if (digitalRead(DRY_BUTTON_PIN) == LOW) {
// Check the water level and lid status
if (digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the dry cycle
esc.write(DRUM_SLOW);
Serial.println("Dry");
delay(1000);
esc.write(DRUM_FAST);
delay(1000);
esc.write(DRUM_STOP);
} else {
Serial.println("lid is open.");
digitalWrite(LED_PIN, HIGH);
}
}
// Wait for the full button press
if (digitalRead(FULL_BUTTON_PIN) == LOW) {
// Check the water level and lid status
if (digitalRead(WATER_SENSOR_PIN) == HIGH && digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the wash cycle
esc.write(DRUM_SLOW);
Serial.println("washfull");
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(800);
esc.write(DRUM_STOP);
digitalWrite(WATER_PUMP_PIN, LOW);
delay(400);
digitalWrite(WATER_PUMP_PIN, HIGH);
esc.write(DRUM_FAST);
delay(800);
digitalWrite(WATER_PUMP_PIN, LOW);
esc.write(DRUM_STOP);
delay(800);
esc.write(DRUM_SLOW);
Serial.println("Dryfull");
delay(1000);
esc.write(DRUM_FAST);
delay(1000);
esc.write(DRUM_STOP);
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
}
}
}
```