E paper clock+calander — Esp32 Devkit C V4 simulation

An interactive Esp32 Devkit C V4 circuit simulation you can run free in your browser on Velxio, by tareq-neoaz.

Components

Sketch code

#include <SPI.h>
#include <GxEPD2_BW.h>
#include <Wire.h>
#include <RTClib.h>
#include <Fonts/FreeSansBold24pt7b.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>

// --- E-PAPER SETUP ---
#define EPD_CS 5
#define EPD_DC 17
#define EPD_RST 16
#define EPD_BUSY 4

GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> display(
  GxEPD2_750_T7(/*CS=*/ EPD_CS, /*DC=*/ EPD_DC, /*RST=*/ EPD_RST, /*BUSY=*/ EPD_BUSY));

// --- RTC SETUP ---
RTC_DS3231 rtc;

const char* days[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
const char* months[] = {"JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"};

int lastDrawnMinute = -1;

void setup() {
  Serial.begin(115200);
  
  display.init(115200);
  display.setRotation(3); // Vertical mode (480x800)
  display.setFullWindow();
  
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); 
  
  display.fillScreen(GxEPD_WHITE);
  display.display();
}

void loop() {
  DateTime now = rtc.now();
  
  if (now.minute() != lastDrawnMinute) {
    lastDrawnMinute = now.minute();
    
    display.setFullWindow();
    display.firstPage();
    do {
      display.fillScreen(GxEPD_BLACK); 
      display.setTextColor(GxEPD_WHITE); 
      
      // --- TOP SECTION: TIME & DATE ---
      char timeString[6];
      sprintf(timeString, "%02d:%02d", now.hour(), now.minute());
      display.setFont(&FreeSansBold24pt7b);
      display.setCursor(30, 80); 
      display.print(timeString);
      
      display.setFont(&FreeSansBold12pt7b);
      display.setCursor(30, 130); 
      display.print(days[now.dayOfTheWeek()]);
      
      char dateString[20];
      sprintf(dateString, "%s %d", months[now.month() - 1], now.day());
      display.setFont(&FreeSans9pt7b);
      display.setCursor(30, 160); 
      display.print(dateString);
      
      display.drawLine(30, 190, 450, 190, GxEPD_WHITE);
      
      // --- MIDDLE SECTION: CALENDAR ---
      display.setFont(&FreeSansBold12pt7b);
      display.setCursor(30, 230);
      display.print(months[now.month() - 1]);
      display.setCursor(280, 230);
      display.print(now.year());
      
      display.setFont(&FreeSans9pt7b);
      const char* dayHeaders[] = {"S", "M", "T", "W", "T", "F", "S"};
      for (int i = 0; i < 7; i++) {
        display.setCursor(40 + (i * 60), 270);
        display.print(dayHeaders[i]);
      }
      
      int daysInMonth = 31; 
      if (now.month() == 4 || now.month() == 6 || now.month() == 9 || now.month() == 11) daysInMonth = 30;
      if (now.month() == 2) daysInMonth = 28; 
      
      DateTime firstDay(now.year(), now.month(), 1, 0, 0, 0);
      int startDayOfWeek = firstDay.dayOfTheWeek(); 
      
      int currentDay = 1;
      int x = 35; 
      int y = 300; 
      
      for (int row = 0; row < 6; row++) {
        for (int col = 0; col < 7; col++) {
          if ((row == 0 && col < startD

More projects by tareq-neoaz