Introduction: Vintage Alarm to Remind Stuff for the Elderly (REMIND-INO) Automate YOU!

We all know at least one elderly person. Maybe family or friend. While aging, some of them belive that we don't care about them while we really love them.

A really big issue is that millions of them start to forget things, some very important like taking their medicines.

We could be all day telling them to do stuff but instead, we could delegate and automate this task.

Introducing Remind-Ino!

  • Its purpose is to remind people to make tasks at specific times, when you are not able.
  • It can also tell stories, read books, teach cooking recipes and even reproduce songs.
  • It has a vintage radio style to remember the good old days.

It has a simple interface, 1 speaker as output and 1 button as input to tell it to stop. If the user didn't hear it, Remindino will repeat it until he presses the button or 5 minutes have passed.

You only need to record the alarms, save them, program an arduino, connect cables, make a case and you are ready to go!

As always:

For all those who exalt themselves will be humbled, and those who humble themselves will be exalted.
Luke 14:11

Without God, this project wouldn't been possible. Thank you very much!

If you want to make a Remind-Ino, here is what you need:

Supplies

-1 x Arduino Nano

-1 x RTC module

-1 x MP3 module (DFrobot or TF-16P)

-1 x Button

-1 x 8[ohm] 0.5 [W] Speaker or similar

-4 x 1[Kohm] resistor

-1 x Mini breadboard

-Various male-female jumper wires

-1 x SD card (32 GB, depends of the size )

-Soldering iron

-FoamBoard and Tools or 3D Printer and Filament or anything you want to make the case out of.

Step 1: Alarms

For the alarms we only have 2 constraints: SD card storage capacity and they need to be mp3 files.

This mp3 files will be reproduced as the alarms are programmed. They could be recordings of yourself, family, friends, music, books, podcasts or whatever you want the alarm to sound. One thing to notice is that the alarms must be programmed for all the month. Something to consider is the next:

Every day there will be the same amount of alarms at the specified hours, but depending of the day, the mp3 file of the alarm could be the same or different. For example:

We define that there will be 4 alarms: Alarm 1 at 9:00, Alarm 2 at 10:30, Alarm 3 at 14:00 and Alarm 4 at 17:25.

But we can play different audios depending of the day:

1 of the Month:

Alarm 1 is Cheesecake Recipe (Ex.: mp3 file that explains how to make Cheesecake)

Alarm 2 is Take Medicines (Ex.: mp3 file that tells them what medicine must be taken)

2 of the Month:

Alarm 1 is Book of Astrology (Ex.: mp3 file that reads Chapter 1 of Astrology for Begginers)

Alarm 2 is Take Medicines (Ex.: mp3 file that tells them what medicine must be taken)

You get it?

So the steps to get the alarms done are the following:

  1. Define the times and which alarms are required for all the month
  2. Record and have all the mp3 files
  3. Make folders for all the days in the directory of the SD card (01,02,...,30,31)
  4. Save the mp3 files, depending of the day, in each folder like this: For folder 01 Cheesecake alarm must be saved as 001.mp3, Take Medicines alarm must be saved as 002.mp3. For folder 02 Astrology alarm must be saved as 001.mp3, Take Medicines alarm must be saved as 002.mp3 and so on.

Step 2: Circuit

The circuit is as simple as that.

Be carefull with the connections. I had trouble seaching a good tutorial on how to use th MP3 module, if something doesn't work it may be that you are using it upside down.

I also struggled searching how the mp3 files should be saved in the SD card, but I already explained how to do it in the Alarm Step.

The MP3 module also doesn't suppor 5V in for the communication, that is why I used a voltage divider with the resistors and it works just fine.

Step 3: Arduino Code

The code was implemented in the Arduino platform:

First, we need to install libraries to use the diferent modules. You can install them from the arduino manager board. Link on how to do it. Download the ones below

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Wire.h>
#include <RTClib.h>

Then we need to declare the generic variables that will be needed.

RTC_DS3231 rtc;
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

For the alarm variables, we have a little explanation:

//Here you need to put at what time the alarms will start to play. WARNING: Put more >= 10 minutes in between alarms!
//For example:
// 9:00 Alarm 1
// 11:25 Alarm 2
// 15:00 Alarm 3
// 19:30 Alarm 4
// Hours[]={9,11,15,19};
// Minutes[]={0,25,0,30};
// Sono[4];
// hour_reset=5; Earlier than the first alarm (9:00)

int Hours[]={21,21,21,21,21,21}; //Here you need to put the hours of the alarms in consecutive order
int Minutes[]={4,5,6,8,10,11}; //Here you need to put the minutes of the alarms in consecutive order
int Sono[6];//Here you need to put how many alarms you chose
int hour_reset=4;//Its the time where all the alarms will reset and start a new day. It must be earlier than your first alarm.

And some other variables.

boolean sonando = false;
boolean presionado=false;
int numero_alarma = 0;
int Day=1;

Then we have some functions like one that works with the interrupt when the button is pressed and another to make the mp3 module play an audio.

void tocar_alarma(int numero_alarma,int Day){
myDFPlayer.playFolder(Day,(numero_alarma+1));
}

void Button_Pressed(){
if(sonando=true){
presionado=true;
}
}

Then we have the setup, where we set the mp3 module, external interrupt and the RTC module. This is important. First you need to set your RTC module to the real time. You can follow this tutorial to do it. In the setup we also tell the arduino which alarm is next depending o the time.

void setup()
{

mySoftwareSerial.begin(9600);
Serial.begin(9600);


pinMode(3, INPUT);
attachInterrupt(1, Button_Pressed, RISING);


Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.setTimeOut(500);
myDFPlayer.volume(15); // Here you can set the volum of the speaker! (0-30)
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);


delay(3000);
if (! rtc.begin()){
Serial.println("No hay un módulo RTC");
while (1);
}


// *********** Check When We Are?

DateTime now = rtc.now();
int c=0;
while(Hours[c]!=0){
if(Hours[c]<now.hour()){
c++;
}else if(Hours[c]==now.hour()){
if(Minutes[c]<now.minute()){
c++;
}else if(Minutes[c]==now.minute()){
c++;
}else{
numero_alarma=c;
break;
}
}else{
numero_alarma=c;
break;
}
}
}

Next we have the loop where the checking of time and playing the alarm is made:

void loop()
{
// Get real time from RTC
DateTime now = rtc.now();
delay(1000);
Day=now.day();

Serial.println(now.minute());
Serial.println(now.second());
Serial.println(numero_alarma);

// Reset before the first alarm
if(now.hour()==hour_reset && now.minute()==0){
numero_alarma = 0;
sonando = false;
presionado=false;
int Sono[5];
}

// If its time of alarm, play the alarm
if(now.hour()==Hours[numero_alarma] && now.minute()==Minutes[numero_alarma] && Sono[numero_alarma]==0){
tocar_alarma(numero_alarma,Day);
Sono[numero_alarma]=1;
sonando = true;
}

// Check if in 5 minutes nobody pressed the button
int min_test=0;
int time_reset=5; // Time that button isn't pressed
if(Minutes[numero_alarma]>=(60-time_reset)){
min_test=time_reset-(60-Minutes[numero_alarma]);
}else{
min_test=Minutes[numero_alarma]+time_reset;
}
if(sonando==true && min_test<=now.minute()){
Serial.println("ENTRO!");
Serial.println(Minutes[numero_alarma]+5);
presionado=true;

// *********** Check When We Are?
DateTime now = rtc.now();
int c=0;
while(Hours[c]!=0){
if(Hours[c]<now.hour()){
c++;
}else if(Hours[c]==now.hour()){
if(Minutes[c]<now.minute()){
c++;
}else if(Minutes[c]==now.minute()){
c++;
}else{
numero_alarma=c;
break;
}
}else{
numero_alarma=c;
break;
}
}
}

// Check if the mp3 file of the alarm has finished
if (myDFPlayer.available()) {
if(myDFPlayer.readType()==DFPlayerPlayFinished){
if(presionado==true){
sonando=false;
numero_alarma=numero_alarma+1;
presionado=false;
}else{
tocar_alarma(numero_alarma,Day);
}
}
}
}

An that's it. It's great to check documentation and you can visit the pages of your module makers.

Full code:


//*********** ***********
//*********** Libraries ***********
//*********** ***********

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Wire.h>
#include <RTClib.h>

//*********** ***********
//*********** Variables ***********
//*********** ***********

RTC_DS3231 rtc;
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;




//********** **********
//********** Alarms **********
//********** **********
//Here you need to put at what time the alarms will start to play. WARNING: Put more >= 10 minutes in between alarms!
//For example:
// 9:00 Alarm 1
// 11:25 Alarm 2
// 15:00 Alarm 3
// 19:30 Alarm 4
// Hours[]={9,11,15,19};
// Minutes[]={0,25,0,30};
// Sono[4];
// hour_reset=5; Earlier than the first alarm (9:00)

int Hours[]={21,21,21,21,21,21}; //Here you need to put the hours of the alarms in consecutive order
int Minutes[]={4,5,6,8,10,11}; //Here you need to put the minutes of the alarms in consecutive order
int Sono[6];//Here you need to put how many alarms you chose
int hour_reset=4;//Its the time where all the alarms will reset and start a new day. It must be earlier than your first alarm.

boolean sonando = false;
boolean presionado=false;
int numero_alarma = 0;
int Day=1;



//*********** ***********
//*********** Functions ***********
//*********** ***********
void tocar_alarma(int numero_alarma,int Day){
myDFPlayer.playFolder(Day,(numero_alarma+1));
}

void Button_Pressed(){
if(sonando=true){
presionado=true;
}
}

//*********** ***********
//*********** Void Setup ***********
//*********** ***********

void setup()
{

mySoftwareSerial.begin(9600);
Serial.begin(9600);


pinMode(3, INPUT);
attachInterrupt(1, Button_Pressed, RISING);


Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.setTimeOut(500);
myDFPlayer.volume(15); // Here you can set the volum of the speaker! (0-30)
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);


delay(3000);
if (! rtc.begin()){
Serial.println("No hay un módulo RTC");
while (1);
}


// *********** Check When We Are?

DateTime now = rtc.now();
int c=0;
while(Hours[c]!=0){
if(Hours[c]<now.hour()){
c++;
}else if(Hours[c]==now.hour()){
if(Minutes[c]<now.minute()){
c++;
}else if(Minutes[c]==now.minute()){
c++;
}else{
numero_alarma=c;
break;
}
}else{
numero_alarma=c;
break;
}
}
}


//*********** ***********
//*********** Void Loop ***********
//*********** ***********


void loop()
{
// Get real time from RTC
DateTime now = rtc.now();
delay(1000);
Day=now.day();

Serial.println(now.minute());
Serial.println(now.second());
Serial.println(numero_alarma);

// Reset before the first alarm
if(now.hour()==hour_reset && now.minute()==0){
numero_alarma = 0;
sonando = false;
presionado=false;
int Sono[5];
}

// If its time of alarm, play the alarm
if(now.hour()==Hours[numero_alarma] && now.minute()==Minutes[numero_alarma] && Sono[numero_alarma]==0){
tocar_alarma(numero_alarma,Day);
Sono[numero_alarma]=1;
sonando = true;
}

// Check if in 5 minutes nobody pressed the button
int min_test=0;
int time_reset=5; // Time that button isn't pressed
if(Minutes[numero_alarma]>=(60-time_reset)){
min_test=time_reset-(60-Minutes[numero_alarma]);
}else{
min_test=Minutes[numero_alarma]+time_reset;
}
if(sonando==true && min_test<=now.minute()){
Serial.println("ENTRO!");
Serial.println(Minutes[numero_alarma]+5);
presionado=true;

// *********** Check When We Are?
DateTime now = rtc.now();
int c=0;
while(Hours[c]!=0){
if(Hours[c]<now.hour()){
c++;
}else if(Hours[c]==now.hour()){
if(Minutes[c]<now.minute()){
c++;
}else if(Minutes[c]==now.minute()){
c++;
}else{
numero_alarma=c;
break;
}
}else{
numero_alarma=c;
break;
}
}
}

// Check if the mp3 file of the alarm has finished
if (myDFPlayer.available()) {
if(myDFPlayer.readType()==DFPlayerPlayFinished){
if(presionado==true){
sonando=false;
numero_alarma=numero_alarma+1;
presionado=false;
}else{
tocar_alarma(numero_alarma,Day);
}
}
}
}

Next!

Step 4: Case (Vintage Radio)

The case was made thinking about the experience the final user would have. In this case, the final user would be an elderly person, in your case maybe it's different.

This part is totally creative!

As we said before, our end user is an elderly person, thats why it was decided that the case must have a Vintage Radio style. Because they liked that.

  • 1. A little reaserch was first done!
  • 2. Then the model was designed using the best 3D CAD modeling software: Autodesk Fusion 360 !!!

Here, you have to design your model dependig of the sizes of your componentes. You have to measure your buttons and speaker diameter to make the perfect holes. This part is really up to you. You can use the model and fix dimensions depending your measurments. You can 3D print your model or you can design it to make it on foam board like in my case.

  • 3. After your model is finished, you can 3D print it or you can print drawings of the parts as templates to cut it in foamboard. Tutorial on how to cut foamboard.
  • 4. Then you need to paint all the parts so you can give it the style you want. In my case, I saw this faux wood painting tutorials to give it a vintage and old good look.
  • 5. You can give it extra touches like putting decals, mesh fabric and also little extras that make it more appealing!

Step 5: Assemble and Testing

In this part you should put every component in the case and test how it sounds. You can check the alarms an if the user feels comfortable. You also need to check the volume in the void setup of the code.

Check all the connections, becasue if something is not connected right, the electronics can get damaged and burned and it won't work.

At this point, if everything goes exactly as planned, you should have your Remind-Ino ready!

🎉 🎉 🎉

Congratulations!!!

Step 6: WARNING: Important Things

This are important tips that could be really valuable:

  • Alarms with a minimun distance of 10 minutes
  • Alarms mp3 file duration must nos surpass the time available until the next alarm
  • Better if you unplug Remindino form powersource if you are not going to be there to push the button whe the alarm rings
  • Use only MP3 files, not WAV or M4A.
  • Check that your folders are named right(01,02,...,30,31) and your files also (001.mp3,002.mp3,...,015.mp3,...)
  • Check all the connections are well done
  • Check all the componentes separately to see if they aren't damaged before connecting them to Remind-Ino
  • Make an investigation of what the user needs and likes
  • Be creative!

ASK FOR HELP TO SOMEONE WHO KNOWS ABOUT ELECTRONICS !!!

Step 7: Conclusions and Greetings

This project solves a problem. Right now it just might be helping one, but maybe this could help millions of people. This was a fun and nice project of automation.

We achived what was proposed and a suggestion is that you should make your family and friends record audios, elderly people would really appreciate this and love it.

It looks like an easy project, and it is, but the real thing is that it has en excelent user interface because it is human center designed and of course it's simple and looks cool.

Thanks to God and all the people that contributed!

If you have any question, we are here to answer!

Automation Contest

Grand Prize in the
Automation Contest