Brandon KohKrisnakievSebastien Wu
Published

Smart Pill Locker

Our aim is to reduce the number of errors made during distribution of pills, as overworking leads to nurses making potentially fatal mistake

BeginnerShowcase (no instructions)8 hours73
Smart Pill Locker

Things used in this project

Hardware components

M5Stack FIRE V2.7
M5Stack FIRE V2.7
×2
Time-of-Flight (ToF) VL53L0X Laser Ranging Unit (MCP4725/)
M5Stack Time-of-Flight (ToF) VL53L0X Laser Ranging Unit (MCP4725/)
×1
SG90 Micro-servo motor
SG90 Micro-servo motor
FEETECH Standard Servo FS5106B https://www.pololu.com/product/3425
×1
Mini RFID Unit RC522 Module Sensor
M5Stack Mini RFID Unit RC522 Module Sensor
×1
M5Stack RGB Unit with NeoPixel RGB LED (SK6812)
M5Stack RGB Unit with NeoPixel RGB LED (SK6812)
×1
I2C Hub 1 to 6 Expansion TCA9548A Module
M5Stack I2C Hub 1 to 6 Expansion TCA9548A Module
×2

Software apps and online services

M5Stack UIFlow

Hand tools and fabrication machines

Multitool, Screwdriver
Multitool, Screwdriver
Tape, Double Sided
Tape, Double Sided
Tape, Clear
Tape, Clear
Hot glue gun (generic)
Hot glue gun (generic)

Story

Read more

Schematics

Main m5 Stack

Normal operating dispenser

Sufficient stock display

Low stock dispenser

Main Block Diagram

Secondary Block Diagram

Master Flow Chart

2nd M5Stack Flow Chart

Code

Master Code

Python
from m5stack import *
from m5ui import *
from uiflow import *
import time
import espnow
import wifiCfg
import unit

setScreenColor(0x222222)
rfid_1 = unit.get(unit.RFID, unit.PORTA)


timer = None
patient_data = None
lockernumber = None
mode = None
addid = None
scanrfid = None

wifiCfg.wlan_ap.active(True)
wifiCfg.wlan_sta.active(True)
espnow.init()

label0 = M5TextBox(10, 112, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
label1 = M5TextBox(10, 67, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
A = M5TextBox(58, 213, "A", lcd.FONT_Default, 0xFFFFFF, rotate=0)
B = M5TextBox(154, 213, "B", lcd.FONT_Default, 0xFFFFFF, rotate=0)
C = M5TextBox(239, 213, "C", lcd.FONT_Default, 0xFFFFFF, rotate=0)
label2 = M5TextBox(10, 160, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)

from numbers import Number




patient_data = {}
lockernumber = 0
mode = 0
timer = 20
while True:
  if btnC.wasPressed():
    mode = 0
    A.setText('A')
    B.setText('B')
    C.setText('C')
  if btnA.wasPressed():
    mode = 1
  if btnB.wasPressed():
    mode = 2
  if mode == 0:
    label0.setText('Button B: Search database for patient ID')
    label1.setText('Button A: Add patient ID to database')
    label2.setText('')
    A.setText('A')
    B.setText('B')
    C.setText('C')
  if mode == 1:
    label0.setText('Please scan patient ID')
    label1.setText('Adding to database...')
    C.setText('Back')
    if rfid_1.isCardOn():
      addid = rfid_1.readUid()
      label1.setText(str((str('Patient ID:') + str(addid))))
      label0.setText('Please hold ID in place until done')
      wait(2)
      while rfid_1.isCardOn():
        label1.setText(str((str('Locker number:') + str(lockernumber))))
        label0.setText('Please assign a locker number ')
        label2.setText('(For demo purposes, choose locker no.1)')
        A.setText('+')
        B.setText('-')
        C.setText('')
        if btnA.wasPressed():
          lockernumber = (lockernumber if isinstance(lockernumber, Number) else 0) + 1
        if btnB.wasPressed():
          lockernumber = (lockernumber if isinstance(lockernumber, Number) else 0) + -1
      patient_data[addid] = lockernumber
      label0.setText('Successfully added to database')
      label2.setText('')
      wait(1)
      mode = 0
  if mode == 2:
    label0.setText('Please scan patient ID')
    label1.setText('Searching the database...')
    label2.setText('')
    A.setText('A')
    B.setText('B')
    C.setText('Back')
    if rfid_1.isCardOn():
      scanrfid = rfid_1.readUid()
      label1.setText(str((str('Patient ID:') + str(addid))))
      label0.setText('Please hold ID in place...')
      if scanrfid in patient_data.keys():
        if lockernumber == 1:
          while rfid_1.isCardOn():
            espnow.add_peer('98:f4:ab:6b:9f:c5', id=1, channel=0, ifidx=1, encrypt=False)
            espnow.send(id=1, data=str('on'))
            label0.setText(str((str('Locker number:') + str(lockernumber))))
            for count in range(20):
              label2.setText(str((str(((str('Locker is open for:') + str(timer)))) + str('s'))))
              wait(1)
              timer = (timer if isinstance(timer, Number) else 0) + -1
            espnow.send(id=1, data=str('off'))
        else:
          while rfid_1.isCardOn():
            label0.setText(str((str('Locker number:') + str(lockernumber))))
            label2.setText('Locker number invalid')
      else:
        while rfid_1.isCardOn():
          label2.setText('patient ID not in database')
        label2.setText('')
  wait_ms(2)

2nd M5 Stack Code

Python
from m5stack import *
from m5ui import *
from uiflow import *
import espnow
import wifiCfg
import time
import unit

setScreenColor(0x222222)
servo_7 = unit.get(unit.SERVO, unit.PORTB)
tof_4 = unit.get(unit.TOF, unit.PAHUB1)
pbhub_1 = unit.get(unit.PBHUB, unit.PAHUB0)


receive_data = None
sender_address = None
flag = None
timer = None

wifiCfg.wlan_ap.active(True)
wifiCfg.wlan_sta.active(True)
espnow.init()

title0 = M5Title(title="Title", x=3, fgcolor=0xFFFFFF, bgcolor=0x0000FF)
label0 = M5TextBox(27, 175, "Text", lcd.FONT_DejaVu24, 0xff0000, rotate=0)
label1 = M5TextBox(20, 50, "Locker Number : 1", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
label2 = M5TextBox(20, 107, "Medication: Panadol", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)

from numbers import Number




def recv_cb(_):
  global receive_data,sender_address,flag,timer
  sender_address, _, receive_data = espnow.recv_data(encoder='str')
  flag = 1
  if receive_data == 'on':
    pbhub_1.setColorPos(0, 1, 0x33ff33)
    servo_7.write_angle(90)
    for count in range(20):
      label0.setText(str((str(((str('Locker open for: ') + str(timer)))) + str('s'))))
      wait(1)
      timer = (timer if isinstance(timer, Number) else 0) + -1
    pbhub_1.setColorPos(0, 1, 0x000000)
    servo_7.write_angle(0)
    label0.setText('Sufficient Stock')
    flag = 0

  pass
espnow.recv_cb(recv_cb)



flag = 0
timer = 20
title0.setTitle(str(espnow.get_mac_addr()))
label0.setText('Sufficient Stock')
label0.setColor(0xffffff)
while True:
  if flag == 0:
    if int(((tof_4.distance) / 10)) > 20:
      pbhub_1.setColorPos(0, 1, 0xff0000)
      label0.setText('Low Stock Supply')
      label0.setColor(0xff0000)
      wait(1)
      pbhub_1.setColorPos(0, 1, 0x000000)
      wait(1)
    else:
      label0.setText('Sufficient Stock')
      label0.setColor(0xffffff)
  wait_ms(2)

Credits

Brandon Koh
1 project • 0 followers
Krisna
1 project • 0 followers
kiev
2 projects • 0 followers
Sebastien Wu
1 project • 0 followers

Comments