Skip to content

FINAL PROJECT

MINUTES

FINAL VIDEO

Below i have explained the making of the both the modules seperately which could be used as a reference .

What will it do?

This productivity timer application will help users manage their time effectively by implementing the Pomodoro Technique. It will feature customizable work and break intervals, task tracking capabilities, and visual/audio notifications. The application will run on multiple platforms and integrate with existing task management systems.The submodule could be used as an addon for the Minutes pomodoro so that people could be aware that you are BUSY .

What sources will you use?

Below i have listed the sources that helped me in the project for reference .

Instructubles

Github

hacksterio

How much will they cost?

Product Cost (Rs)
Xiao ESP32 C6 * 2 555
Rotary Encoder 39
Buzzer 18
E-ink Display 1,599
OLED Display 224
LiPo Battery 409
MP3 Module 112
Total 3,511

MINUTES TAG MODULE

This is the CAD Model that I made

Below I have attached the schematic that I used to design the small PCB for the display module that could be kept as an indicator.

Then I routed the PCB design so I could mill the PCB.

Then I checked the 3D view to check the alignment and I decided where to keep my OLED display.

Then I placed a hole in a way that my display module is in the center so it suits the circular design that I am going to make. For that, I used Fusion and exported the DXF with the OLED placing and aligned the through hole accordingly.

Then i have made the Pcb and soldered the componennts then i noticed there was an error (that i have forgotted about 2 via holes for the battery connection module . so for that my instructor saheen suggested an idea to vinyl print and took the connection out ) so we did that .

for that we have made jig for the pcb using cardboard .

Then i have pasted vinyl on back of pcb as shown below .

Then to engrave the traces i have used xtools .

This week i have 3d printed some parts of my case .

DESIGN INSPIRATIONS (5).jpg

DESIGN INSPIRATIONS (6).jpg

        #include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeMono9pt7b.h>

    #define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for SSD1306 display connected using I2C (SDA, SCL pins)
#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
Serial.begin(115200); // Initialize Serial for debugging

// initialize with the I2C addr 0x3C (for most OLEDs)
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
}
display.clearDisplay();

display.drawRect(10, 9, 106, 44, SSD1306_WHITE);

display.setTextColor(SSD1306_WHITE);
display.setTextWrap(false);
display.setFont(&FreeMono9pt7b);
display.setCursor(39, 29);
display.print("IN A");

display.setCursor(25, 43);
display.print("MEETING");

display.display();
}

void loop() {
// Nothing needed here for static display
}``

MINUTES PRODUCTIVITY TIMER MAIN MODULE

These are the buttons that i have 3d printed for the Minutes Module .

Below i have attached the 3d printed front face of the Module .

here i am checking the button with the front face .

This is the final back body that i have 3d printed

The final Assembly viw of the product from inside .

A more closeup shot . here you could see how i have placed the mp3 module . The mp3 module is placed on a 3D printed sliding mechanism where i screwed the module and the 3d print .

This is the final photo of Minutes Module After Assembly .

#define pushButton D0
// ntp server code

#include <WiFi.h>
#include "time.h"

#include <Arduino.h>
#include <RotaryEncoder.h>


#define PIN_IN1 D2
#define PIN_IN2 D3


#define ROTARYSTEPS 2
#define ROTARYMIN 0
#define ROTARYMAX 16

RotaryEncoder encoder(PIN_IN1, PIN_IN2, RotaryEncoder::LatchMode::TWO03);

int lastPos = -1;

// Replace these with your Wi-Fi credentials
const char* ssid = "FabGuest";
const char* password = "4fabGUEST";

// NTP server and time zone settings (IST for Kochi, Kerala, India)
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 19800;  // GMT+5:30 = 5*3600 + 30*60 = 19800 seconds
const int daylightOffset_sec = 0;

int HOUR, MINUTE, SECOND;


// display code

#include <GxEPD2_BW.h>
#include <Fonts/FreeMonoBold24pt7b.h>
#include <SPI.h>

// Pin definitions
#define EPD_SCK_PIN 19
#define EPD_MOSI_PIN 18
#define EINK_CS 17
#define EINK_RST 23
#define EINK_DC 16
#define EINK_BUSY 22

// Instantiate display class for 2.7" GDEY027T91 (V2)
GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT>
display(GxEPD2_270_GDEY027T91(EINK_CS, EINK_DC, EINK_RST, EINK_BUSY));

SPIClass spi = SPIClass(SPI);  // Use VSPI for custom pins

void setup() {
pinMode(pushButton, INPUT);
Serial.begin(115200);
encoder.setPosition(10 / ROTARYSTEPS);  // start with the value of 10.
// Initialize SPI with your custom pins
spi.begin(EPD_SCK_PIN, -1, EPD_MOSI_PIN, EINK_CS);


// Link SPI to display
display.epd2.selectSPI(spi, SPISettings(4000000, MSBFIRST, SPI_MODE0));

display.init(115200);
display.setRotation(1);
display.setFont(&FreeMonoBold24pt7b);
display.setTextColor(GxEPD_BLACK);





WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
}
Serial.println("\nWiFi connected.");

// Initialize and get the time from NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

int PrevMin;
void loop() {
int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(1);
static char timeStr[9];  // "HH:MM:SS" + null terminator
struct tm timeinfo;
if (getLocalTime(&timeinfo)) {
    HOUR = timeinfo.tm_hour;
    MINUTE = timeinfo.tm_min;
    SECOND = timeinfo.tm_sec;

} else {
    Serial.println("Failed to obtain time");
}

if (PrevMin != SECOND) {
    display.setPartialWindow(19, 50, 223, 31);
    display.firstPage();
    do {
    sprintf(timeStr, "%02d:%02d:%02d", HOUR, MINUTE, SECOND);
    display.fillRect(19, 50, 223, 31, GxEPD_WHITE);
    display.setCursor(19, 78);
    display.print(timeStr);
    } while (display.nextPage());

    display.hibernate();
    PrevMin = SECOND;
}

encoder.tick();

// get the current physical position and calc the logical position
int newPos = encoder.getPosition() * ROTARYSTEPS;

if (newPos < ROTARYMIN) {
    encoder.setPosition(ROTARYMIN / ROTARYSTEPS);
    newPos = ROTARYMIN;

} else if (newPos > ROTARYMAX) {
    encoder.setPosition(ROTARYMAX / ROTARYSTEPS);
    newPos = ROTARYMAX;
}  // if

if (lastPos != newPos) {
    Serial.print(newPos);
    Serial.println();
    lastPos = newPos;
}  // if
}

FILES

CAD SUB MODULE

PCB SUB MODULE

CAD MAIN MODULE

PCB MAIN MODULE

Minutes a Pomodoro Timer © 2025 by Abin Mathew is licensed under CC BY-NC-SA 4.0


Last update: June 18, 2025