Arduino-Based Medication Alert System with RTC Integration

Greetings everyone, welcome back to Techatronic. In this latest article, we’re presenting a highly beneficial project known as the Medicine Reminder. This particular creation aims to assist individuals who require medication. Essentially, it comprises a box equipped with multiple drawers, three of which have the capability to open and close.

In today’s world, many individuals have essential medications that must be taken at specific times, making timely consumption crucial. To address this need, we’ve developed an exceptional Medicine Reminder project utilizing Arduino. Once the medicine schedule is set, this innovative system automatically prompts medication reminders by opening and closing designated drawers, accompanied by an audible buzzer signal.

Introduction

The medication reminder project holds significant importance for patients requiring consistent and timely intake of prescribed medicines. Our Automatic Medicine Reminder utilizing Arduino functions akin to an alarm system, displaying the specific medicine names. Often, we tend to forget medication, which can be detrimental for certain medical conditions. Hence, this project serves as a valuable aid in such scenarios.

The Medicine Reminder features an LCD screen that exhibits the medicine names scheduled for consumption at designated times.

Upon system activation, it prompts the user to configure medicine reminders, allowing for three set times: once, twice, or thrice a day, with the option to add more through the code. Using four buttons, the user sets the timing for each reminder. Upon setting the times, the clock initiates, continually comparing the current time with the user-entered data to trigger reminders accordingly.

We’ll provide a detailed guide comprising all the necessary steps to create this medicine reminder project. It’s essential to follow each step diligently to successfully complete this project. Additionally, we recommend referring to specific articles to gain a foundational understanding of Arduino and how to establish connections between an RTC and Arduino before initiating this project.

Construction

During the construction phase, understanding the project flow is essential. Initially, we’ll compile a list of necessary components.

Material Required for Medicine Reminder

  • Arduino Mega

This serves as a microcontroller development board, functioning as the central controller in this project. If you seek information about Arduino, you can refer to the article available on our website.

  • RTC3231 Module

The RTC3231 is a real-time clock system built around a chip known as rtc3231. Equipped with a coin battery, it consistently provides power to the module, allowing it to retain the set time consistently.

  • 4- push button

Push buttons represent some of the most commonly used switches that establish or interrupt a circuit when pressed.

  • jumper wires

they use to make the connection over the breadboard

  • buzzer

It makes noise whenever we power it. basically, it converts electrical energy into sound energy.

  • 16×2 LCD display

16×2 displays are common uses in the project there are 16 columns and 2 rows that’s why it is known as 16×2 LCD.

  • Breadboard

if you want to learn

Circuit Diagram for Medicine Alarm:-

Code For medicine reminder project


//Medicine Reminder using Arduino Uno

// Reminds to take medicine at 8am, 2pm, 8pm

/* The circuit:

LCD RS pin to digital pin 12

LCD Enable pin to digital pin 11

LCD D4 pin to digital pin 5

LCD D5 pin to digital pin 4

LCD D6 pin to digital pin 3

LCD D7 pin to digital pin 2

LCD R/W pin to ground

LCD VSS pin to ground

LCD VCC pin to 5V

10K resistor:

ends to +5V and ground

wiper to LCD VO pin (pin 3)*/

#include

#include

#include

#include

int pushVal = 0;

int val;

int val2;

int addr = 0;

RTC_DS3231 rtc;

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // lcd pins

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#define getWellsoon 0

#define HELP_SCREEN 1

#define TIME_SCREEN 2

//bool pushPressed; //flag to keep track of push button state

int pushpressed = 0;

const int ledPin = 13; // buzzer and led pin

int ledState = LOW;

int Signal = 0;

int buzz = 13;

int push1state, push2state, push3state, stopinState = 0; //

int push1Flag, push2Flag, Push3Flag = false; // push button flags

int push1pin = 9;

int push2pin = 8;

int push3pin = 7;

int stopPin = A0;

int screens = 0; // screen to show

int maxScreen = 2; // screen count

bool isScreenChanged = true;

long previousMillis = 0;

long interval = 500; // buzzing interval

unsigned long currentMillis;

long previousMillisLCD = 0; // for LCD screen update

long intervalLCD = 2000; // Screen cycling interval

unsigned long currentMillisLCD;

// Set Reminder Change Time

int buzz8amHH = 8; // HH – hours ##Set these for reminder time in 24hr Format

int buzz8amMM = 00; // MM – Minute

int buzz8amSS = 00; // SS – Seconds

int buzz2pmHH = 14; // HH – hours

int buzz2pmMM = 00; // MM – Minute

int buzz2pmSS = 00; // SS – Seconds

int buzz8pmHH = 20; // HH – hours

int buzz8pmMM = 00; // MM – Minute

int buzz8pmSS = 00; // SS – Seconds

int nowHr, nowMin, nowSec; // to show current mm,hh,ss

// All messeges

void gwsMessege(){ // print get well soon messege

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Stay Healthy :)”); // Give some cheers

lcd.setCursor(0, 1);

lcd.print(“Get Well Soon :)”); // wish

}

void helpScreen() { // function to display 1st screen in LCD

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Press Buttons”);

lcd.setCursor(0, 1);

lcd.print(“for Reminder…!”);

}

void timeScreen() { // function to display Date and time in LCD screen

DateTime now = rtc.now(); // take rtc time and print in display

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Time:”);

lcd.setCursor(6, 0);

lcd.print(nowHr = now.hour(), DEC);

lcd.print(“:”);

lcd.print(nowMin = now.minute(), DEC);

lcd.print(“:”);

lcd.print(nowSec = now.second(), DEC);

lcd.setCursor(0, 1);

lcd.print(“Date: “);

lcd.print(now.day(), DEC);

lcd.print(“/”);

lcd.print(now.month(), DEC);

lcd.print(“/”);

lcd.print(now.year(), DEC);

}

void setup() {

Serial.begin(9600); // start serial debugging

if (! rtc.begin()) { // check if rtc is connected

Serial.println(“Couldn’t find RTC”);

while (1);

}

if (rtc.lostPower()) {

Serial.println(“RTC lost power, lets set the time!”);

}

// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // uncomment this to set the current time and then comment in next upload when u set the time

rtc.adjust(DateTime(2019, 1, 10, 7, 59, 30)); // manual time set

lcd.begin(16, 2);

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Welcome To”); // print a messege at startup

lcd.setCursor(0, 1);

lcd.print(“Circuit Digest”);

delay(1000);

pinMode(push1pin, INPUT_PULLUP); // define push button pins type

pinMode(push2pin, INPUT_PULLUP);

pinMode(push3pin, INPUT_PULLUP);

pinMode(stopPin, INPUT_PULLUP);

pinMode(ledPin, OUTPUT);

delay(200);

Serial.println(EEPROM.read(addr));

val2 = EEPROM.read(addr); // read previosuly saved value of push button to start from where it was left previously

switch (val2) {

case 1:

Serial.println(“Set for 1/day”);

push1state = 1;

push2state = 0;

push3state = 0;

pushVal = 1;

break;

case 2:

Serial.println(“Set for 2/day”);

push1state = 0;

push2state = 1;

push3state = 0;

pushVal = 2;

break;

case 3:

Serial.println(“Set for 3/day”);

push1state = 0;

push2state = 0;

push3state = 1;

pushVal = 3;

break;

}

}

void loop() {

push1(); //call to set once/day

push2(); //call to set twice/day

push3(); //call to set thrice/day

if (pushVal == 1) { // if push button 1 pressed then remind at 8am

at8am(); //function to start uzzing at 8am

}

else if (pushVal == 2) { // if push button 2 pressed then remind at 8am and 8pm

at8am();

at8pm(); //function to start uzzing at 8mm

}

else if (pushVal == 3) { // if push button 3 pressed then remind at 8am and 8pm

at8am();

at2pm(); //function to start uzzing at 8mm

at8pm();

}

currentMillisLCD = millis(); // start millis for LCD screen switching at defined interval of time

push1state = digitalRead(push1pin); // start reading all push button pins

push2state = digitalRead(push2pin);

push3state = digitalRead(push3pin);

stopinState = digitalRead(stopPin);

stopPins(); // call to stop buzzing

changeScreen(); // screen cycle function

}

// push buttons

void push1() { // function to set reminder once/day

if (push1state == 1) {

push1state = 0;

push2state = 0;

push3state = 0;

// pushPressed = true;

EEPROM.write(addr, 1);

Serial.print(“Push1 Written : “); Serial.println(EEPROM.read(addr)); // for debugging

pushVal = 1; //save the state of push button-1

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Reminder set “);

lcd.setCursor(0, 1);

lcd.print(“for Once/day !”);

delay(1200);

lcd.clear();

}

}

void push2() { //function to set reminder twice/day

if (push2state == 1) {

push2state = 0;

push1state = 0;

push3state = 0;

// pushPressed = true;

EEPROM.write(addr, 2);

Serial.print(“Push2 Written : “); Serial.println(EEPROM.read(addr));

pushVal = 2;

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Reminder set “);

lcd.setCursor(0, 1);

lcd.print(“for Twice/day !”);

delay(1200);

lcd.clear();

}

}

void push3() { //function to set reminder thrice/day

if (push3state == 1) {

push3state = 0;

push1state = 0;

push2state = 0;

// pushPressed = true;

EEPROM.write(addr, 3);

Serial.print(“Push3 Written : “); Serial.println(EEPROM.read(addr));

pushVal = 3;

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Reminder set “);

lcd.setCursor(0, 1);

lcd.print(“for Thrice/day !”);

delay(1200);

lcd.clear();

}

}

void stopPins() { //function to stop buzzing when user pushes stop push button

if (stopinState == 1) {

// stopinState = 0;

// pushPressed = true;

pushpressed = 1;

lcd.clear();

lcd.setCursor(0, 0);

lcd.print(“Take Medicine “);

lcd.setCursor(0, 1);

lcd.print(“with Warm Water”);

delay(1200);

lcd.clear();

}

}

void startBuzz() { // function to start buzzing when time reaches to defined interval

// if (pushPressed == false) {

if (pushpressed == 0) {

Serial.println(“pushpressed is false in blink”);

unsigned long currentMillis = millis();

if (currentMillis – previousMillis >= interval) {

previousMillis = currentMillis; // save the last time you blinked the LED

Serial.println(“Start Buzzing”);

if (ledState == LOW) { // if the LED is off turn it on and vice-versa:

ledState = HIGH;

} else {

ledState = LOW;

}

digitalWrite(ledPin, ledState);

}

}

else if (pushpressed == 1) {

Serial.println(“pushpressed is true”);

ledState = LOW;

digitalWrite(ledPin, ledState);

}

}

void at8am() { // function to start buzzing at 8am

DateTime now = rtc.now();

if (int(now.hour()) >= buzz8amHH) {

if (int(now.minute()) >= buzz8amMM) {

if (int(now.second()) > buzz8amSS) {

/////////////////////////////////////////////////////

startBuzz();

/////////////////////////////////////////////////////

}

}

}

}

void at2pm() { // function to start buzzing at 2pm

DateTime now = rtc.now();

if (int(now.hour()) >= buzz2pmHH) {

if (int(now.minute()) >= buzz2pmMM) {

if (int(now.second()) > buzz2pmSS) {

///////////////////////////////////////////////////

startBuzz();

//////////////////////////////////////////////////

}

}

}

}

void at8pm() { // function to start buzzing at 8pm

DateTime now = rtc.now();

if (int(now.hour()) >= buzz8pmHH) {

if (int(now.minute()) >= buzz8pmMM) {

if (int(now.second()) > buzz8pmSS) {

/////////////////////////////////////////////////////

startBuzz();

/////////////////////////////////////////////////////

}

}

}

}

//Screen Cycling

void changeScreen() { //function for Screen Cycling

// Start switching screen every defined intervalLCD

if (currentMillisLCD – previousMillisLCD > intervalLCD) // save the last time you changed the display

{

previousMillisLCD = currentMillisLCD;

screens++;

if (screens > maxScreen) {

screens = 0; // all screens over -> start from 1st

}

isScreenChanged = true;

}

// Start displaying current screen

if (isScreenChanged) // only update the screen if the screen is changed.

{

isScreenChanged = false; // reset for next iteration

switch (screens)

{

case getWellsoon:

gwsMessege(); // get well soon message

break;

case HELP_SCREEN:

helpScreen(); // instruction screen

break;

case TIME_SCREEN:

timeScreen(); // to print date and time

break;

default:

//NOT SET.

break;

}

}

}

 


About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:
LinkedinTwitter

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top