Cirkit Designer Logo
Cirkit Designer
Your all-in-one circuit design IDE
Home / 
Project Documentation

Arduino UNO Based Automated Pill Dispenser with GSM Notifications and RTC Scheduling

Image of Arduino UNO Based Automated Pill Dispenser with GSM Notifications and RTC Scheduling

Circuit Documentation

Summary

This circuit is designed to operate as a medical pill dispenser with a real-time clock (RTC) for timekeeping, an LCD for user interface, servos for dispensing pills, a GSM module for sending SMS alerts, and a buzzer for audible notifications. The Arduino UNO serves as the central microcontroller, interfacing with the various components to control the dispensing mechanism and communicate with the user.

Component List

Arduino UNO

  • Microcontroller board based on the ATmega328P
  • Provides digital and analog I/O pins
  • Used for controlling the overall operation of the circuit

DS3231 RTC

  • Highly accurate I2C real-time clock
  • Maintains timekeeping with a battery backup
  • Used for scheduling pill dispensing events

Tower Pro SG90 Servo (x3)

  • Small and lightweight servo motor
  • Provides precise control of angular position
  • Used to actuate the pill dispensing mechanism

I2C LCD 16x2 Screen

  • Alphanumeric liquid crystal display
  • I2C interface for reduced pin usage
  • Displays time and user messages

Sim800l

  • GSM/GPRS module
  • Allows sending SMS messages for alerts and confirmations
  • Interfaces with the Arduino via serial communication

Piezo Buzzer

  • Electronic buzzer for producing sound
  • Used for audible alerts and reminders

Pushbutton (x2)

  • Simple tactile switch
  • Used for user input to confirm actions

Wiring Details

Arduino UNO

  • 5V and GND are used to power the connected components.
  • A4 (SDA) and A5 (SCL) are connected to the I2C bus for communication with the RTC and LCD.
  • Digital pins D8, D7, D9, D10, D11, D12, and D13 are used to interface with the buzzer, buttons, servos, and GSM module.

DS3231 RTC

  • SCL and SDA for I2C communication with the Arduino.
  • VCC and GND for power supply.

Tower Pro SG90 Servo

  • Signal pin connected to a designated digital pin on the Arduino for control signals.
  • +5V and GND for power supply.

I2C LCD 16x2 Screen

  • SCL and SDA for I2C communication with the Arduino.
  • VCC (5V) and GND for power supply.

Sim800l

  • RXD and TXD connected to digital pins on the Arduino for serial communication.
  • VCC and GND for power supply.

Piezo Buzzer

  • One pin connected to a digital pin on the Arduino for control signals.
  • The other pin connected to GND.

Pushbutton

  • One pin connected to a digital pin on the Arduino for input signals.
  • The other pin connected to GND.

Documented Code

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <DS3231.h>
#include <SoftwareSerial.h>

// Pin definitions
#define BUZZER_PIN 8
#define BUTTON_PIN 7
#define SERVO_PIN_1 9
#define SERVO_PIN_2 10
#define SERVO_PIN_3 11

// GSM Module pins
#define GSM_TX 12
#define GSM_RX 13

// Servo and RTC objects
Servo pillServo1;
Servo pillServo2;
Servo pillServo3;
DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Adjust the address if needed

// GSM module
SoftwareSerial gsm(GSM_TX, GSM_RX);

// Variables
bool pillTaken = false;
int dispensingHour[3] = {8, 14, 20}; // Hardcoded times: 8 AM, 2 PM, 8 PM

void setup() {
  // Setup the servos
  pillServo1.attach(SERVO_PIN_1);
  pillServo2.attach(SERVO_PIN_2);
  pillServo3.attach(SERVO_PIN_3);
  
  // Setup the LCD
  lcd.begin();
  lcd.backlight();
  
  // Setup the RTC
  rtc.begin();
  
  // Setup the GSM module
  gsm.begin(9600);
  delay(1000); // Allow time for GSM module to initialize
  sendSMS("Medical dispenser started.");
  
  // Setup the buzzer and button
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  DateTime now = rtc.now();
  lcd.setCursor(0, 0);
  lcd.print("Time: ");
  lcd.print(now.hour());
  lcd.print(":");
  lcd.print(now.minute());
  
  for (int i = 0; i < 3; i++) {
    if (now.hour() == dispensingHour[i] && now.minute() == 0 && !pillTaken) {
      dispensePill(i);
      pillTaken = true;
      sendSMS("Pills dispensed. Please take them.");
      startReminderTimer();
    }
  }
  
  // Reset pillTaken at the end of the hour
  if (now.minute() > 0) {
    pillTaken = false;
  }
  
  // Manual pill-taking confirmation
  if (digitalRead(BUTTON_PIN) == LOW) {
    pillTaken = true;
    lcd.setCursor(0, 1);
    lcd.print("Pill Taken       ");
    sendSMS("Pill taken confirmation received.");
    delay(1000);
  }
  
  delay(1000); // Loop every second
}

void dispensePill(int timeSlot) {
  if (timeSlot == 0) {
    pillServo1.write(90); // Adjust this value according to the dispenser mechanism
    delay(1000); // Wait for the pill to be dispensed
    pillServo1.write(0); // Return to original position
  } else if (timeSlot == 1) {
    pillServo2.write(90);
    delay(1000);
    pillServo2.write(0);
  } else if (timeSlot == 2) {
    pillServo3.write(90);
    delay(1000);
    pillServo3.write(0);
  }
  
  lcd.setCursor(0, 1);
  lcd.print("Pill Dispensed   ");
}

void sendSMS(String message) {
  gsm.print("AT+CMGF=1\r"); // Set SMS to text mode
  delay(100);
  gsm.print("AT+CMGS=\"+1234567890\"\r"); // Replace with your phone number
  delay(100);
  gsm.print(message); 
  delay(100);
  gsm.write(26); // Send SMS (CTRL+Z)
  delay(1000); 
}

void startReminderTimer() {
  long reminderTime = millis() + 600000; // 10 minutes reminder timer
  while (millis() < reminderTime) {
    if (pillTaken) return; // Exit if pill taken
    if (millis() >= reminderTime) {
      tone(BUZZER_PIN, 1000, 2000); // Buzzer alert
      sendSMS("Reminder: Please take your pills.");
    }
  }
}

This code is responsible for controlling the medical pill dispenser. It initializes the servos, LCD, RTC, and GSM module in the setup() function. The loop() function checks the current time against predefined dispensing hours and actuates the corresponding servo to dispense pills. It also listens for button presses to confirm pill intake and sends SMS alerts for various events. The sendSMS() function is used to send text messages, and startReminderTimer() sets up a reminder for the user to take their medication.