Updated: Aug 18, 2022
I constantly forget to take my medication, I've always wanted some kind of a pill dispenser so that I don't forget.
but looking around the only pill dispensers that come up are ones that are just cheap plastic
containers that make me feel like a pensioner
and on the other end some of them cost more than 3 times my rent, there are also some subscription models but I like many don't appreciate having to pay a monthly subscription to a physical object.
so I decided to design my own one, and after a lot of tests and revisions.
you can learn more about the development process in the dedicated YouTube video
but here we're just going to skip to the point this is version 6 of the automatic pill dispenser
The D1 Mini is running esphome which let me control it through home assistant,
The Raspberry Pi Pico is hard coded to to dispense a pill check if the vibration sensor went off, if it hasn't try again until it does and then moved to another pill.
the code can be improved hugely eventually I'm planning for it to have a web interface to schedule pills being dispensed but I'm much better at designing than I am programming.
here is the code for the Pico
from machine import Pin, PWM, ADC, from time import sleep import utime button = Pin(4, Pin.IN, Pin.PULL_DOWN) analog_value = ADC(26) servo0Pin = PWM(Pin(16)) servo0Pin.freq(40) servo1Pin = PWM(Pin(17)) servo1Pin.freq(40) servo2Pin = PWM(Pin(18)) servo2Pin.freq(40) def dropcheck(): raw = analog_value.read_u16() hellow = 0 + (raw - 0) * (1 - 0) / (60000 - 0) if int(hellow) == 1: return True else: return False def servo0(): print('servo0') servo0Pin.duty_u16(6866) sleep(1) servo0Pin.duty_u16(2333) sleep(1) servo0Pin.duty_u16(1000) sleep(0.5) servo0Pin.duty_u16(0) if dropcheck() == False: servo0() else: return def servo1(): print('servo1') servo1Pin.duty_u16(6866) sleep(1) servo1Pin.duty_u16(2333) sleep(1) servo1Pin.duty_u16(1000) sleep(0.5) servo1Pin.duty_u16(0) if dropcheck() == False: servo1() else: return def servo2(): print('servo2') servo2Pin.duty_u16(6866) sleep(1) servo2Pin.duty_u16(2333) sleep(1) servo2Pin.duty_u16(1000) sleep(0.5) servo2Pin.duty_u16(0) if dropcheck() == False: servo2() else: return while True: if button.value(): servo0() servo1() servo2()
the STLs are available