/* Hand_sanitizer_dispenser.ino Note : For video recording and demostration purpose, the max. number of pump was set to 3, therefore after three pumps, the stepper motor will be activated to rotate the base and change to the next bottle. Componenets used : 1. Arduino Uno R3 board 2. Infrared Proximity Sensor 3. Servo motor 4. 28BYJ-48 Stepper motor and ULN2003 motor driver 5. 2 LEDs The work is provided for academic purpose for Fab Academy 2020. Users accept all as is, no warranty is provided, no call/email from users will get a response. Users accept all liability. */ #include #include #define END_STATE 3 //max compression // for 28BYJ-48 stepper motor with ULN2003 driver #define motorPin1 8 // IN1 on the ULN2003 driver #define motorPin2 9 // IN2 on the ULN2003 driver #define motorPin3 10 // IN3 on the ULN2003 driver #define motorPin4 11 // IN4 on the ULN2003 driver int sensor_pin = 2;//IR sensor at pin 2 int tap_servo_pin = 3;//tap servo at pin 3 int val = 0;//variable for IR sensor int count = 0;//variable for counting compression Servo tap_servo; // Create stepper motor object // MotorInterface 4 for 4-wire in full step mode AccelStepper baseMotor(4, motorPin1, motorPin3, motorPin2, motorPin4); void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); digitalWrite(5,LOW); digitalWrite(6,LOW); pinMode(sensor_pin, INPUT); tap_servo.attach(tap_servo_pin); tap_servo.write(0); // for 28BYJ-48 stepper motor with ULN2003 driver baseMotor.setMaxSpeed(1000); // The desired maximum speed in steps per second baseMotor.setSpeed(150); // The desired constant speed in steps per second, use with runSpeed() baseMotor.setAcceleration(90); // The desired acceleration in steps per second per second baseMotor.setCurrentPosition(0); // Set the current position to 0: } void loop() //main code run repeatedly { val = digitalRead(sensor_pin); //read IR sensor if (val==0) //IR sensor detected object { delay(800);// wait for sensor to stabilize if (val==0)//check again for object detected { digitalWrite(5,HIGH); //red led turn on to indicate object is detected digitalWrite(6,LOW); //green led turn off to indicate tap servo is not ready to turn tap_servo.write(80); //tap servo is turning to 60 degree i.e. executing compression delay(800); tap_servo.write(0); //tap servo is turning to 0 degree i.e. release compression delay(800); count++; //counting compression executed by tap servo } } while(val==0) //no executing compression if object remain detected { tap_servo.write(0); //tap servo remain at 0 degree delay(200); val = digitalRead(sensor_pin); //read IR sensor } digitalWrite(5,LOW); //reset red led digitalWrite(6,HIGH); //reset green led //check counter for max compression on a bottle used, when max is reached than change bottle if (count==END_STATE) { delay(500); baseMotor.moveTo(3446); // Set the target position: baseMotor.runToPosition(); // Run to target position with set speed and acceleration/deceleration for(int x = 0;x<=5;x++) //blink LEDs x times during servo turning to 180 degree { digitalWrite(5,HIGH); digitalWrite(6,LOW); delay(100); digitalWrite(5,LOW); digitalWrite(6,HIGH); delay(100); } baseMotor.setCurrentPosition(0); // Set the current position to 0: for(int x = 0;x<=5;x++) //blink LEDs x times during servo turn to 0 degree { digitalWrite(5,HIGH); digitalWrite(6,LOW); delay(100); digitalWrite(5,LOW); digitalWrite(6,HIGH); delay(100); } count=0; //reset counter after bottle changed } }