Mechanical Details:

The current mechanical design consists of nine primary components. The centerpiece being the misting mechanism. It utilizes a cam operated piston, which is actuated with a 28BYJ-48 5VDC Stepper Motor. The piston has a return function made possible by a compression spring rated for .15 lbs. It also acts as both a valve (fed sanitizer by the tank) and a fluid syringe. It is normally closed, but when opened, the piston allows sanitizer to enter the cylinder and when compressed it forces the liquid into a small orifice. In this case, the orifice should atomize the liquid such that a fine mist is expelled. Atomization is necessary to get an adequate coating on the handle to increase the efficacy of the device.

Below are some images of the current design. The next iteration will hopefully fix the piston which does not operate as intended and I have added more space for electronics.

Printed Base
This is the base without any components.
Assembled Base
This is the base with the cam, piston, motor, and spring attached.

Electrical Details:

To simplify the electrical prototyping and rapid manufacturability of the device, common components were selected (a detailed schematic has been included below). An Arduino UNO R3 micro-controller was used for prototyping; however, the final device will use an Arduino Nano to minimize cost and required space. The overall purpose of the electrical system is to detect when the handle has been used and execute the commands necessary to dispense the sanitizer. Detection is made possible by the use of an HC-SR04 Ultrasonic Transducer. The HC-SR04 is used to measure distance by emitting a high-frequency (in-audible) soundwave and measuring how long it takes to reflect back to a detector.


When movement is detected within a predefined range, the Arduino executes a routine which is programmed to signal the stepper to actuate the piston with the appropriate timing and order. There are also two LED indicators, which allow the user to see when the device is about to disinfect the handle. The current design uses a 9 volt battery; however, a 9 volt battery is not the optimal choice (9 Volt batteries will drain quickly with this circuit) so other power methods may be explored in the future. Currently there is also no power switch, one can be added quite easily and may be worth adding in the future. 


Programming Details:

The Arduino micro-controller was programmed with the Arduino IDE. The full code can be seen below.

NOTE: Two libraries are also required for the code involving the ULN2003 and HC-SR04 to function, both of which will be included in a downloadable file.

#include <Stepper.h> 

#include "SR04.h"

#define TRIG_PIN 2
#define ECHO_PIN 3 

SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);

float pingTime;  //Time for ping to travel from the sensor to the target and return
float handDistance; //Distance to hand in centimeters
float speedOfSound = 776.5; //Speed of sound in miles per hour

int in1Pin = 8;
int in2Pin = 9;
int in3Pin = 10;
int in4Pin = 11;
const int stepsPerRevolution = 256;// Number of steps per revolution (2048 steps = 1 full rotation)

//I used a 28BYJ-48 5VDC Stepper Motor, for this motor, you must set wiring sequence to (1-3-2-4) instead of (1-2-3-4)
Stepper motor(stepsPerRevolution, in1Pin, in3Pin, in2Pin, in4Pin); 
 
void setup()
{ 
  
  motor.setSpeed(17);  // Set stepper motor speed
    
  pinMode(5, OUTPUT);  //Yellow LED: Indicates that sanitization will commence in 5 seconds
  pinMode(6, OUTPUT);  //Green LED: Indicates that no handle use has been detected (Handle is clean)
}
 
void loop()
{ 
  digitalWrite(TRIG_PIN, LOW); //Set trigger pin low
  delayMicroseconds(2000); //Let signal settle
  digitalWrite(TRIG_PIN, HIGH); //Set trigPin high
  delayMicroseconds(15); //Delay in high state
  digitalWrite(TRIG_PIN, LOW); //Send ping
  delayMicroseconds(10); //Delay in high state

  pingTime = pulseIn(ECHO_PIN, HIGH);  //pingTime in microceconds
  pingTime = pingTime / 1000000; //convert pingTime to seconds by dividing by 1000000.
  pingTime = pingTime / 3600; //convert pingtime to hours by dividing by 3600.
  handDistance = speedOfSound * pingTime; //Speed of sound is in kilometers per hour; therefore, units are in Miles.
  handDistance = handDistance / 2; //Divide by 2 to get actual distance.
  handDistance = handDistance * 160934.4; //Convert miles to centimeters by multipling by 160934.4

   if (handDistance < 12) { //Note that handDistance is in centimeters

        subroutineSpray();
  }
   else {

        digitalWrite (6, HIGH); //Green LED on
  }
}

void subroutineSpray() {
  
  digitalWrite (6, LOW); //Green LED off
  digitalWrite (5, HIGH); //Yellow LED on
  delay(5000); //Gives time for the hand to be removed
  motor.step(stepsPerRevolution); //Rotate motor in clockwise direction to raise the piston
  delay(5000); //Allow cylinder to fill with sanitizer
  motor.step(-stepsPerRevolution); //Rotate motor in anticlockwise direction to spray sanitizer
  digitalWrite (5, LOW); //Yellow LED off

The flow chart below may also give a better understanding of the process.

This is still a work in progress and I will continue to update as I make changes.